意外に難しい・・・
HSPで鳴らしてる音だけでなく、パソコンで鳴らしてる全部の音がミックスされます。
#uselib "winmm.dll"
#func waveInOpen "waveInOpen" sptr, sptr, sptr, sptr, sptr, sptr
#func waveInPrepareHeader "waveInPrepareHeader" sptr, sptr, sptr
#func waveInAddBuffer "waveInAddBuffer" sptr, sptr, sptr
#func waveInStart "waveInStart" sptr
#func waveInStop "waveInStop" sptr
#func waveInUnprepareHeader "waveInUnprepareHeader" sptr, sptr, sptr
#func waveInClose "waveInClose" sptr
#define SAMPRATE 44100 //サンプリングレート
#define BITSPERSAMP 16 //量子化ビット数
#define NCHANNELS 2 //チャンネル数
#define FILENAME "Recording.wav" //保存ファイル名
#define BUFSIZE SAMPRATE //バッファサイズ
#define BUFCNT 2 //多重バッファ数(多重バッファにしないと音が途切れる)
oncmd gosub *OnWimData, $000003C0/*MM_WIM_DATA*/
onexit *ExitProc
button gosub "Start", *StartStop
stop
*StartStop
if flgRec=0 {
gosub *StartProc
flgRec=1
objprm 0, "Stop"
} else {
gosub *StopProc
flgRec=0
objprm 0, "Start"
}
return
*StartProc
sdim buf, 44
bsave FILENAME, buf : fpos=44 //Waveファイルのヘッダ(録音停止後に書き込む)部分をあけておく
//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構造体を用意
sdim bWave, BUFSIZE, BUFCNT //音声データ取得用バッファ
dim whdr, 8, BUFCNT
repeat BUFCNT
whdr(0, cnt) = varptr(bWave(cnt))
whdr(1, cnt) = BUFSIZE
loop
//WaveInの初期化
hWaveIn = 0
waveInOpen varptr(hWaveIn), $FFFFFFFF/*WAVE_MAPPER*/, varptr(wfe), hwnd, 0, $00010000/*CALLBACK_WINDOW*/
repeat BUFCNT
waveInPrepareHeader hWaveIn, varptr(whdr(0, cnt)), 32
loop
repeat BUFCNT
waveInAddBuffer hWaveIn, varptr(whdr(0, cnt)), 32
loop
waveInStart hWaveIn //録音開始
return
*OnWimData //バッファに音声データがたまるごとに呼ばれる
dupptr _whdr, lparam, 32
dupptr _bWave, _whdr(0), _whdr(2)
bsave FILENAME, _bWave, _whdr(2), fpos : fpos+=_whdr(2) //音声データをファイルに書き込み
waveInAddBuffer hWaveIn, lparam, 32
return
*StopProc
//WaveInの後始末
waveInStop hWaveIn //録音終了
waveInClose hWaveIn
repeat BUFCNT
WaveInUnprepareHeader hWaveIn, varptr(whdr(0, cnt)), 32
loop
//WAVファイルのヘッダを書き込む
a = "RIFF" : memcpy buf, a, 4, 0
a = fpos-8 : memcpy buf, a, 4, 4
a = "WAVE" : memcpy buf, a, 4, 8
a = "fmt " : memcpy buf, a, 4, 12
a = 16 : memcpy buf, a, 4, 16
memcpy buf, wfe, 16, 20
a = "data" : memcpy buf, a, 4, 36
a = fpos-44 : memcpy buf, a, 4, 40
bsave FILENAME, buf, 44, 0
return
*ExitProc
//WaveInの後始末
waveInStop hWaveIn
waveInClose hWaveIn
repeat BUFCNT
WaveInUnprepareHeader hWaveIn, varptr(whdr(0, cnt)), 32
loop
end