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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1226
Shooリアルタイムに矩形波音を出したい11解決


Shoo

リンク

2008/12/26(Fri) 23:13:25|NO.21985

HSP上で、リアルタイムに矩形波音を生成することは可能でしょうか?

また、その周波数をリアルタイムで可変することは可能でしょうか?



・1周期が20ms、1.5msのオンと18.5msのオフの矩形歯

    ■          ■
____■__________■________

■:1.5ms
_:18.5ms


■の(ON時間の)、時間を可変する。


HSPでWAVファイルを再生などはわかったのですが、
HSPで、リアルタイムに周波数を変えるスクリプトなどできるのか?
気になったので、投稿をしてみました。



この記事に返信する


Shoo

リンク

2008/12/26(Fri) 23:25:24|NO.21986

ずれてる・・・

____■__________■________

こんなかんじで。



check

リンク

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



New Monkey

リンク

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



New Monkey

リンク

2008/12/27(Sat) 03:25:02|NO.21997

質問のものと波形が違うようなので適当に直してください^^



Shoo

リンク

2008/12/28(Sun) 11:52:27|NO.22048

うーん。

PWMを作りたかったのです。

ちょっとがんばってみます・・・



Shoo

リンク

2008/12/28(Sun) 11:56:34|NO.22049

このような信号を作って、ラジコンサーボを振りたかったのです。

http://homepage1.nifty.com/rikiya/images/software/112ser3.gif
[図1、PWM]

DirectSound経由とかで、なんとかこの周波数をリアルタイムに変更できないか?
と思ったもので・・・・



hoo

リンク

2008/12/28(Sun) 16:55:05|NO.22065

↓のHSPプラグインを使えばリンクの波形を作ること自体は比較的かんたんです。
http://www.binzume.net/software/forhsp.html

波形を発生させるハードウエアはUSB又はParallelがつかえます。
波形の作り方は↓ここが参考になるかもしれません。
http://www.h6.dion.ne.jp/~garakuta/labo/StepMotor/stpmot.htm

但し音にするにはそれなりの工夫がいります。



SYAM

リンク

2008/12/28(Sun) 17:41:22|NO.22068

だめかなぁ とは思うんですが
MIDIコントロールできるプラグインか何かがあれば、矩形波にピッチベンドかけてなんとかならないかなぁ…。



New Monkey

リンク

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



Shoo

リンク

2008/12/28(Sun) 18:12:40|NO.22070

>>New Monkey
おおお、すげええええええ!!!近い!!!

これマウスとかの位置取得で、波形を切らず断続的に周波数をに変化させられないかな?


なんとなくわかったような気がするので、ハードを製作してきます。



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



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