HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2023
0318
すもっぷHSPでbytebeatの音を出したい8解決


すもっぷ

リンク

2023/3/18(Sat) 17:26:36|NO.99175

Monoxide.exeみたいにHSPでbytebeatの音を出すことは可能でしょうか?
よろしくお願いします。



この記事に返信する


法貴藤五郎

リンク

2023/3/18(Sat) 20:53:41|NO.99176

求めてる音とは違うかもしれませんが、昔HSPでbytebeatっぽいことがしたいと思った時のコードです。

#include "kernel32.as" *main t++ n = t * 9 & t >> 1 beep n * 10, 10 await 16 goto *main



すもっぷ

リンク

2023/3/19(Sun) 07:11:28|NO.99177

beepは前使ったことあるんですが、これを使わない方法でお願いします…。



kinokawa

リンク

2023/3/22(Wed) 22:44:02|NO.99181

bytebeatをちゃんと再現できたかどうかわからないですが
それっぽいのが出来たような・・・

memfileを使って
wavファイルに直接書き込んで再生しています
音量に注意してください


#include "hsp3dish.as dim a,30000 dim b,100 b(0)= 0x52,0x49,0x46,0x46,0x68,0x69,0x00,0x00,0x57,0x41,0x56,0x45,0x66,0x6D,0x74,0x20 b(16)= 0x10,0x00,0x00,0x00,0x01,0x00,0x01,0x00,0x22,0x56,0x00,0x00,0x44,0xac,0x00,0x00 b(32)= 0x02,0x00,0x10,0x00,0x66,0x61,0x63,0x74,0x04,0x00,0x00,0x00,0x37,0x69,0x00,0x00 b(48)= 0x64,0x61,0x74,0x61,0x37,0x69,0x00,0x00 c=0 t1=0.0 repeat 56 poke a,c,b(c) : c++ loop repeat 100 d=56 repeat 20000 t1=t1+0.2 t=int(t1) data=(t&t+t/256)-t*(t>>15)&64 ;data=((t>>5&t)-(t>>5)+(t>>5&t))+(t*((t>>14)&14)) ;data=(t*((3+(1^t>>10&5))*(5+(3&t>>14))))>>(t>>8&3) ;data=t*(t>>((t&4096)|((t*t)/4096)|(t/4096)))|(t<<(t/256))|(t>>4) poke a,d,data d++ loop memfile a mmload "MEM:a.wav",1 mmplay 1 mmvol 1,-500 await 500 loop



ゆっくりXP元すもっぷ

リンク

2023/11/29(Wed) 18:41:40|NO.100694

こんな感じのようにwaveOutOpenを使用して、bytebeatの音を出すことは可能でしょうか?
https://youtu.be/kBwHqR8eWfY?feature=shared



usagi

リンク

2023/11/30(Thu) 04:20:05|NO.100696

こんにちわ。 標準で付いてる"winmm.as"をインクルードすれば可能ではないでしょうか。
dllの呼び出しはMSDN参考にすればよいかと思いますが、オーディオの信号処理の方がちょっと敷居が高いかもしれませんね。
一例ですがどうぞ

#module WaveOut #include "winmm.as" ; 波形出力の開始 #deffunc openWaveOut int _samplingRate, int _buffSize, label _callback callback = _callback count = 0 wfx = 1 | (1<<16), _samplingRate, _samplingRate, 1 | (8 << 16), 0 sdim buff, _buffSize, 3 sdim wh, 32, length(buff) oncmd gosub *ON_MM_WIM_DATA, 0x3BD waveOutOpen varptr(hwo), $FFFFFFFF, varptr(wfx), hwnd, 0, $10000 if stat { dialog "ERROR: waveOutOpne("+stat+")" : end } foreach buff lpoke wh.cnt, 0, varptr(buff.cnt) lpoke wh.cnt, 4, varsize(buff.cnt) waveOutPrepareHeader hwo, varptr(wh.cnt), 32 waveOutWrite hwo, varptr(wh.cnt), 32 loop return ; 波形出力の終了 #deffunc closeWaveOut onexit if hwo : return waveOutReset hwo foreach outbuff waveOutUnprepareHeader hwo, varptr(out_pwh), 32 loop waveOutClose hwo : hwo = 0 return ; 書き込み #deffunc writeWaveOut var _buff dupptr abuff, lpeek(awh, 0), lpeek(awh, 4), 2 memcpy abuff, _buff, lpeek(awh, 4) return ; コールバック *ON_MM_WIM_DATA dupptr awh, lparam, 32 gosub callback waveOutWrite hwo, lparam, 32 count+=lpeek(awh, 4) return #defcfunc getWaveOutCounter return count #global // サンプル screen 0, 512, 256 openWaveOut 16000, 512, *CBK_OUT sdim buff, 1024 stop *CBK_OUT repeat varsize(buff) t = double(getWaveOutCounter()+cnt)/16000 out = 0 ; 適当メロディー n = ((getWaveOutCounter()+cnt)>>12)\8 key = 3, 15, 3, 5, 15, 3, 7, 15 ; メロ f = 440.0 * powf(2,double(key(n))/12) out += (f*t*256\256-128) / 8 f = 440.0 * powf(2,double(key((n+2)\8))/12) out += (f*t*256\256-128) / 12 ; エコー key = 3, 15, 3, 15, 3, 15, 3, 15; ベース f = 440.0 * powf(2,double(key(n))/12) out += (f*t*32\256-128) / 4 if cnt\32=0 { kn = rnd(64)-32 } ; キック out +=(n\2=0)*kn if cnt\4 =0 { sn = rnd(48)-24 } ; スネア out +=(n\4=2)*sn if cnt\1 =0 { hn = rnd(32)-16 }; ハット n = ((getWaveOutCounter()+cnt)>>10)\8 out +=(n\4=0)*hn out += 128 poke buff, cnt, int(out) loop writeWaveOut buff gosub *DRAW return *DRAW redraw 0 color : boxf : color 255, 255, 255 pos 0,0 : mes getWaveOutCounter() pos 0,128 repeat varsize(buff) : line cnt, 256-peek(buff, cnt) : loop redraw 1 return



usagi

リンク

2023/11/30(Thu) 05:48:47|NO.100697

あっ、"bytebeatの音"というところが抜けてましたね。こんな感じかなぁ。。。
面白いですねコレ。※ラベルの部分差し替え

*CBK_OUT repeat varsize(buff) t = getWaveOutCounter()+cnt out = (t*(9&t>>12))+(t*((5&t>>11))&$CD)+(t*3)+((t>>10)\8=0)*(t*(t^t\9)) poke buff, cnt, out loop writeWaveOut buff gosub *DRAW return



usagi

リンク

2023/12/19(Tue) 20:57:22|NO.100885

古い未解決スレッドを上げるのも。。。と悩んだのですが、
ちょっとbytebeatとやらが面白過ぎたのと、
前回ミスがあったのでシンプルで使いやすい感じに書き直しました。
よろしかったらどうぞ。


#ifndef __BYTEBEAT__ #module __BYTEBEAT__ #uselib "WINMM.DLL" #func open "waveOutOpen" var,int,var,int,int,int #func close "waveOutClose" int #func reset "waveOutReset" int #func write "waveOutWrite" int,sptr,int #func ready "waveOutPrepareHeader" int,var,int #func clean "waveOutUnprepareHeader" int,var,int #deffunc playByteBeat int _rate, label _cb, var _o, var _t if hwo>0 { _stopByteBeat } wfx = 1 | (1<<16), _rate, _rate, 1 | (8 << 16), 0 open hwo, $FFFFFFFF, wfx, hwnd, 0, $10000 if stat { dialog "ERROR: "+stat : end } dup t, _t: dup o, _o: cb = _cb: sc = 0: sdim buf, 256, 3: sdim wh, 32, length(buf) oncmd gosub *L_UPDATE, 0x3BD foreach buf lpoke wh.cnt, 0, varptr(buf.cnt): lpoke wh.cnt, 4, varsize(buf.cnt) ready hwo, wh.cnt, 32: write hwo, varptr(wh.cnt), 32 loop return #define global stopByteBeat: _stopByteBeat: wait 0;終了対策 #deffunc _stopByteBeat onexit if hwo<=0 { return } reset hwo: foreach buf: clean hwo, wh.cnt, 32: loop close hwo: hwo = 0: cb = *NOP: gosub cb return *L_UPDATE dupptr awh, lparam, 32: dupptr abuf, lpeek(awh, 0), lpeek(awh, 4), 2 repeat varsize(abuf): t = sc+cnt: gosub cb: poke abuf, cnt, o : loop write hwo, lparam, 32: sc+=lpeek(awh, 4) return *NOP sc = 0: t = 0: o = 0: return #global #endif ; ↑こっから上はおまじないなので無視。モジュールとして外に出す想定。 ; サンプル 命令はシンプルに2つだけ。 ; 再生: playByteBeat 再生レート, ラベル, 出力変数, 時間変数 ; 停止: stopByteBeat button gosub "Play 1", *L_PLAY_1 button gosub "Play 2", *L_PLAY_2 button gosub "STOP", *L_STOP *L_MAIN title ""+t : await 16 : goto *L_MAIN *L_PLAY_1 playByteBeat 8000, *MELO_1, out, t : return *L_PLAY_2 playByteBeat 8000, *MELO_2, out, t : return *L_STOP stopByteBeat : return *MELO_1; 42メロディ out = t*(42&t>>10) : return *MELO_2; Examples(https://ossia.io/) out = (((t<<1)^((t<<1)+(t>>7)&t>>12))|t>>(4-(1^7&(t>>19)))|t>>7) : return



ゆっくりXP元すもっぷ

リンク

2023/12/19(Tue) 21:48:43|NO.100886

>usagiさん
おお、わざわざありがとうございます。
このスクリプトならbytebeatの音が全然違和感ないですね…。
このスクリプトを参考にしたいと思います。



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.99175への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

ONION software Copyright 1997-2023(c) All rights reserved.