|
|
2008/12/26(Fri) 23:13:25|NO.21985
HSP上で、リアルタイムに矩形波音を生成することは可能でしょうか?
また、その周波数をリアルタイムで可変することは可能でしょうか?
・1周期が20ms、1.5msのオンと18.5msのオフの矩形歯
■ ■
____■__________■________
■:1.5ms
_:18.5ms
■の(ON時間の)、時間を可変する。
HSPでWAVファイルを再生などはわかったのですが、
HSPで、リアルタイムに周波数を変えるスクリプトなどできるのか?
気になったので、投稿をしてみました。
|
|
2008/12/26(Fri) 23:25:24|NO.21986
ずれてる・・・
____■__________■________
こんなかんじで。
|
|
2008/12/26(Fri) 23:45:29|NO.21987
あまり理解できなかったのだが、
要するに音を鳴らしながら、音の中に決まった周波数の音を入れて再生したいのだろうか?
それはできるか考えてみないといけないが、周波数を変えるのはDirectSoundを
使えばすぐにできる。
#include "e3dhsp3.as"
E3DInit 0,-1,0,16,0,scid,0,0
dialog "wav",16
E3DLoadSound refstr,snd
E3DPlaySound snd,1,DMUS_SEGF_BEAT
frqtime=100 //待ち時間
wait frqtime
E3DSetSoundFreqency snd,64000
|
|
2008/12/27(Sat) 03:16:18|NO.21996
こんなかんじのやつなら一応できますが、
精度が重要な場合(認知心理学の実験とか、なんかそれっぽいので)は他の言語で作った方が無難だと思います。
#uselib "winmm.dll"
#func waveOutOpen "waveOutOpen" sptr, sptr, sptr, sptr, sptr, sptr
#func waveOutPrepareHeader "waveOutPrepareHeader" sptr, sptr, sptr
#func waveOutWrite "waveOutWrite" sptr, sptr, sptr
#func waveOutReset "waveOutReset" sptr
#func waveOutUnprepareHeader "waveOutUnprepareHeader" sptr, sptr, sptr
#func waveOutClose "waveOutClose" sptr
#define SAMPRATE 10000 //サンプリングレート(変更可)
#define BITSPERSAMP 8 //量子化ビット数(変更不可)
#define NCHANNELS 1 //チャンネル数(変更不可)
#define BUFCNT 2 //多重バッファ数
oncmd gosub *OnWomDone, $000003BD/*MM_WOM_DONE*/
onexit *ExitProc
freq = 400
mes "Freqency(Hz)"
input freq, 100, 20
duration = 20
mes "Duration(ms)"
input duration, 100, 20
interval = 1000
mes "Interval(ms)"
input interval, 100, 20
button gosub "Start", *StartStop
stop
*StartStop
if flgPlay=0 {
gosub *StartProc
flgPlay=1
objprm 3, "Stop"
} else {
gosub *StopProc
flgPlay=0
objprm 3, "Start"
}
return
*StartProc
//WAVEFORMATEX構造体を用意
dim wfe, 5
wfe(0) = $00000001/*WAVE_FORMAT_PCM*/ + (NCHANNELS<<16) //wFormatTag + (nChannels<<16)
wfe(1) = SAMPRATE //nSamplesPerSec
wfe(2) = SAMPRATE*NCHANNELS*BITSPERSAMP/8 //nAvgBytesPerSec
wfe(3) = (NCHANNELS*BITSPERSAMP/8) + (BITSPERSAMP<<16) //nBlockAlign + (wBitsPerSample<<16)
wfe(4) = 18 //cbSize
//WAVEHDR構造体を用意
bufsize = (duration+interval)*int(SAMPRATE/1000)
sdim bWave, bufsize, BUFCNT //音声データ格納用バッファ
dim whdr, 8, BUFCNT
repeat BUFCNT
whdr(0, cnt) = varptr(bWave(cnt))
whdr(1, cnt) = bufsize
whdr(4, cnt) = $00000004|$00000008 //WHDR_BEGINLOOP|WHDR_ENDLOOP
whdr(5, cnt) = 1
loop
//波形データを作成
cycle = 1.0/freq*1000 //周期(ms)
repeat BUFCNT
bcnt = cnt
repeat bufsize
t = 1000.0/SAMPRATE*cnt //時刻(ms)
if t <= duration {
repeat
if t < cycle*(cnt+1) { //HSPでは実数の割り算での余りを求められないので自力で頑張る(遅すぎ)
t -= cycle*cnt+cycle/2
if t<=0 { val = 255 } else { val = 0 }
break
}
loop
} else {
val = 128
}
poke bWave(bcnt), cnt, val
loop
loop
//波形データ描画
color 255, 255, 255 : boxf 0, 400-256, ginfo_winx, ginfo_winy
pos 0, 400-128 : color
repeat bufsize
line cnt, 400-peek(bWave(0), cnt)
loop
//WaveOutの初期化
hWaveOut = 0
waveOutOpen varptr(hWaveOut), $FFFFFFFF/*WAVE_MAPPER*/, varptr(wfe), hwnd, 0, $00010000/*CALLBACK_WINDOW*/
repeat BUFCNT
waveOutPrepareHeader hWaveOut, varptr(whdr(0, cnt)), 32
loop
repeat BUFCNT
waveOutWrite hWaveOut, varptr(whdr(0, cnt)), 32
loop
return
*OnWomDone //バッファの再生が終了するごとに呼ばれる
waveOutWrite wparam, lparam, 32
return
*StopProc
//WaveOutの後始末
waveOutReset hWaveOut
repeat BUFCNT
WaveOutUnprepareHeader hWaveOut, varptr(whdr(0, cnt)), 32
loop
waveOutClose hWaveOut
buf_num = 0
return
*ExitProc
gosub *StopProc
end
| |
|
2008/12/27(Sat) 03:25:02|NO.21997
質問のものと波形が違うようなので適当に直してください^^
|
|
2008/12/28(Sun) 11:52:27|NO.22048
うーん。
PWMを作りたかったのです。
ちょっとがんばってみます・・・
|
|
2008/12/28(Sun) 17:41:22|NO.22068
だめかなぁ とは思うんですが
MIDIコントロールできるプラグインか何かがあれば、矩形波にピッチベンドかけてなんとかならないかなぁ…。
|
|
2008/12/28(Sun) 17:46:53|NO.22069
オーディオケーブルかなんかで信号を送るんですか?
おもしろそうなので作ってみました
#uselib "winmm.dll"
#func waveOutOpen "waveOutOpen" sptr, sptr, sptr, sptr, sptr, sptr
#func waveOutPrepareHeader "waveOutPrepareHeader" sptr, sptr, sptr
#func waveOutWrite "waveOutWrite" sptr, sptr, sptr
#func waveOutReset "waveOutReset" sptr
#func waveOutUnprepareHeader "waveOutUnprepareHeader" sptr, sptr, sptr
#func waveOutClose "waveOutClose" sptr
#define SAMPRATE 20000 //サンプリングレート(変更可)
#define BITSPERSAMP 8 //量子化ビット数(変更不可)
#define NCHANNELS 1 //チャンネル数(変更不可)
#define BUFCNT 5 //多重バッファ数、多い方が継ぎ目が目立たない(変更可)
#define CYCLESPERBUF 5 //1バッファあたりの周期、多い方が継ぎ目が目立たない(変更可)
oncmd gosub *OnWomDone, $000003BD/*MM_WOM_DONE*/
onexit *ExitProc
button gosub "左", *StartProc
button gosub "中", *StartProc
button gosub "右", *StartProc
button gosub "停止", *StopProc
stop
*StartProc
btn = stat
//前の音を止める
gosub *StopProc
//押されたボタンからオン時間(ms)を決める
switch btn
case 0
ontime = 1.0
title "左"
swbreak
case 1
ontime = 1.5
title "中"
swbreak
case 2
ontime = 2.0
title "右"
swbreak
swend
//WAVEFORMATEX構造体を用意
dim wfe, 5
wfe(0) = $00000001/*WAVE_FORMAT_PCM*/ + (NCHANNELS<<16) //wFormatTag + (nChannels<<16)
wfe(1) = SAMPRATE //nSamplesPerSec
wfe(2) = SAMPRATE*NCHANNELS*BITSPERSAMP/8 //nAvgBytesPerSec
wfe(3) = (NCHANNELS*BITSPERSAMP/8) + (BITSPERSAMP<<16) //nBlockAlign + (wBitsPerSample<<16)
wfe(4) = 18 //cbSize
//WAVEHDR構造体を用意
bufsizepercycle = 20*SAMPRATE/1000 //1周期あたりのバッファサイズ
bufsize = bufsizepercycle*CYCLESPERBUF //1周期のCYCLESPERBUF倍確保
sdim bWave, bufsize, BUFCNT //音声データ格納用バッファ
dim whdr, 8, BUFCNT
repeat BUFCNT
whdr(0, cnt) = varptr(bWave(cnt))
whdr(1, cnt) = bufsize
whdr(4, cnt) = $00000004|$00000008 //WHDR_BEGINLOOP|WHDR_ENDLOOP
whdr(5, cnt) = 1
loop
//波形データを作成
repeat BUFCNT
bcnt = cnt
repeat bufsize/CYCLESPERBUF //1周期分作る
t = 1000.0/SAMPRATE*cnt //時刻(ms)
if t <= ontime { val = 255 } else { val = 128 }
poke bWave(bcnt), cnt, val
loop
repeat CYCLESPERBUF //CYCLESPERBUF分コピー
memcpy bWave(bcnt), bWave(bcnt), bufsizepercycle, bufsizepercycle*cnt
loop
loop
//波形データ描画
color 255, 255, 255 : boxf 0, 400-256, ginfo_winx, ginfo_winy
pos 0, 400-128 : color
repeat bufsize
line cnt, 400-peek(bWave(0), cnt)
loop
//WaveOutの初期化
hWaveOut = 0
waveOutOpen varptr(hWaveOut), $FFFFFFFF/*WAVE_MAPPER*/, varptr(wfe), hwnd, 0, $00010000/*CALLBACK_WINDOW*/
repeat BUFCNT
waveOutPrepareHeader hWaveOut, varptr(whdr(0, cnt)), 32
loop
repeat BUFCNT
waveOutWrite hWaveOut, varptr(whdr(0, cnt)), 32
loop
return
*OnWomDone //バッファの再生が終了するごとに呼ばれる
waveOutWrite wparam, lparam, 32
return
*StopProc
//WaveOutの後始末
waveOutReset hWaveOut
repeat BUFCNT
WaveOutUnprepareHeader hWaveOut, varptr(whdr(0, cnt)), 32
loop
waveOutClose hWaveOut
title "停止"
return
*ExitProc
gosub *StopProc
end
| |
|
2008/12/28(Sun) 18:12:40|NO.22070
>>New Monkey
おおお、すげええええええ!!!近い!!!
これマウスとかの位置取得で、波形を切らず断続的に周波数をに変化させられないかな?
なんとなくわかったような気がするので、ハードを製作してきます。
|
|
2008/12/28(Sun) 18:49:25|NO.22072
再生中に波形データ書き換えていいのかは不明。
#uselib "winmm.dll"
#func waveOutOpen "waveOutOpen" sptr, sptr, sptr, sptr, sptr, sptr
#func waveOutPrepareHeader "waveOutPrepareHeader" sptr, sptr, sptr
#func waveOutWrite "waveOutWrite" sptr, sptr, sptr
#func waveOutReset "waveOutReset" sptr
#func waveOutUnprepareHeader "waveOutUnprepareHeader" sptr, sptr, sptr
#func waveOutClose "waveOutClose" sptr
#define SAMPRATE 20000 //サンプリングレート(変更可)
#define BITSPERSAMP 8 //量子化ビット数(変更不可)
#define NCHANNELS 1 //チャンネル数(変更不可)
#define BUFCNT 5 //多重バッファ数、多い方が継ぎ目が目立たない(変更可)
#define CYCLESPERBUF 5 //1バッファあたりの周期、多い方が継ぎ目が目立たない(変更可)
oncmd gosub *OnWomDone, $000003BD/*MM_WOM_DONE*/
oncmd gosub *SetData, $00000114/*WM_HSCROLL*/
onexit *ExitProc
//WAVEFORMATEX構造体を用意
dim wfe, 5
wfe(0) = $00000001/*WAVE_FORMAT_PCM*/ + (NCHANNELS<<16) //wFormatTag + (nChannels<<16)
wfe(1) = SAMPRATE //nSamplesPerSec
wfe(2) = SAMPRATE*NCHANNELS*BITSPERSAMP/8 //nAvgBytesPerSec
wfe(3) = (NCHANNELS*BITSPERSAMP/8) + (BITSPERSAMP<<16) //nBlockAlign + (wBitsPerSample<<16)
wfe(4) = 18 //cbSize
//WAVEHDR構造体を用意
bufsizepercycle = 20*SAMPRATE/1000 //1周期あたりのバッファサイズ
bufsize = bufsizepercycle*CYCLESPERBUF //1周期のCYCLESPERBUF倍確保
sdim bWave, bufsize, BUFCNT //音声データ格納用バッファ
dim whdr, 8, BUFCNT
repeat BUFCNT
whdr(0, cnt) = varptr(bWave(cnt))
whdr(1, cnt) = bufsize
whdr(4, cnt) = $00000004|$00000008 //WHDR_BEGINLOOP|WHDR_ENDLOOP
whdr(5, cnt) = 1
loop
winobj "msctls_trackbar32", "", , $50000000|$1, 200, 30
hbar = objinfo(stat, 2)
sendmsg hbar, $00000414/*TBM_SETTICFREQ*/, 50, 0
sendmsg hbar, $00000405/*TBM_SETPOS*/, 1, 50
button gosub "Start", *StartStop
stop
*SetData
//オン時間
sendmsg hbar, $00000400/*TBM_GETPOS*/, 0, 0
ontime = 1.5+(double(stat)-50)/50*0.5
//波形データを作成
repeat BUFCNT
bcnt = cnt
repeat bufsize/CYCLESPERBUF //1周期分作る
t = 1000.0/SAMPRATE*cnt //時刻(ms)
if t <= ontime { val = 255 } else { val = 128 }
poke bWave(bcnt), cnt, val
loop
repeat CYCLESPERBUF //CYCLESPERBUF分コピー
memcpy bWave(bcnt), bWave(bcnt), bufsizepercycle, bufsizepercycle*cnt
loop
loop
//波形データ描画
color 255, 255, 255 : boxf 0, 400-256, ginfo_winx, ginfo_winy
pos 0, 400-128 : color
repeat bufsize
line cnt, 400-peek(bWave(0), cnt)
loop
return
*StartStop
if flg=0 {
flg = 1
objprm 1, "Stop"
gosub *StartProc
} else {
flg = 0
objprm 1, "Start"
gosub *StopProc
}
return
*StartProc
gosub *StopProc
gosub *SetData
//WaveOutの初期化
hWaveOut = 0
waveOutOpen varptr(hWaveOut), $FFFFFFFF/*WAVE_MAPPER*/, varptr(wfe), hwnd, 0, $00010000/*CALLBACK_WINDOW*/
repeat BUFCNT
waveOutPrepareHeader hWaveOut, varptr(whdr(0, cnt)), 32
loop
repeat BUFCNT
waveOutWrite hWaveOut, varptr(whdr(0, cnt)), 32
loop
return
*OnWomDone //バッファの再生が終了するごとに呼ばれる
waveOutWrite wparam, lparam, 32
return
*StopProc
//WaveOutの後始末
waveOutReset hWaveOut
repeat BUFCNT
WaveOutUnprepareHeader hWaveOut, varptr(whdr(0, cnt)), 32
loop
waveOutClose hWaveOut
return
*ExitProc
gosub *StopProc
end
| |
|