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


HSPTV!掲示板


未解決 解決 停止 削除要請

2008
1220
アイマス21不可能じゃなければ・・・6解決


アイマス21

リンク

2008/12/20(Sat) 23:07:12|NO.21758

HSPで、今鳴らしているサウンドをファイルのコピーなどを行わずに、
別のファイルに保存するなんて琴はできるのでしょうか?
教えてください。



この記事に返信する


××

リンク

2008/12/20(Sat) 23:26:44|NO.21759

もう少し詳しく説明して(・ω・)



アイマス21

リンク

2008/12/21(Sun) 00:14:17|NO.21760

mmloadでよみこみ、mmplayで再生しているファイルの音情報を、
ファイルに書き込みたいのです。



tsuka

リンク

2008/12/21(Sun) 09:53:55|NO.21763

bcopyでコピーすればいいのでは?(的外れだったらごめんなさい



New Monkey

リンク

2008/12/21(Sun) 10:00:42|NO.21764

意外に難しい・・・
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



アイマス21

リンク

2008/12/21(Sun) 20:23:42|NO.21772

ありがとうございました。
録音はできましたが、かなり質は悪いですね・・・。



inovia

リンク

2008/12/21(Sun) 21:48:01|NO.21774

せっかくなのでMCIを使ったの方法も提示しておきます。


mci "open new alias rec type waveaudio" mci "set rec channels 2" mci "set rec bitspersample 16" mci "set rec samplespersec 44100" mci "record rec" wait 1000//10秒間録音 mci "stop rec" mci "save rec \"record.wav\"" mci "close rec" //MCIの方法だと作成されたWAVEヘッダに誤りがあるため直接修正 //28byte目から4byte(32bit)書き換えます。 sdim buf,64 lpoke buf,0,44100*2*2 bsave "record.wav",buf,4,28 end



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