|
|
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は前使ったことあるんですが、これを使わない方法でお願いします…。
|
|
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
|
|
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
| |
|
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
|
|
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
| |
|
2023/12/19(Tue) 21:48:43|NO.100886
>usagiさん
おお、わざわざありがとうございます。
このスクリプトならbytebeatの音が全然違和感ないですね…。
このスクリプトを参考にしたいと思います。
|
|