そんなのMCIで誰かやってるんじゃないの〜?と軽い気持ちで調べたんですが…誰もやっていなかった。録音はよく見るんですけど不思議ですね。
というわけで、作ってみました。
; wave ファイルを作成するサンプル
;
; waveファイルのヘッダ部分だけをmciで作成して、データはbsaveで書き込みます。
fname = "record.wav"
secWaveLength = 10 ; 録音時間 [sec]
bitspersample = 16 ; 16 bit(8,16,24 を指定)
samplespersec = 44100 ; サンプリング周波数 44.1kHz
channels = 1 ; チャンネル数
bytespersec = samplespersec * bitspersample/8 * channels ; データ速度 byte/sec
blocksize = bitspersample/8 * channels ; ブロックサイズ byte
numData = samplespersec * secWaveLength ; データの個数
byteBufferSize = bitspersample / 8 * numData * channels ; バッファサイズ byte
sdim buf, byteBufferSize
dim data, numData, channels
; --------------------
; MCI を使ってwaveファイルのヘッダ部分を作る
; --------------------
; コマンドの順番に注意。順番を入れ替えると正しいヘッダファイルができない事があるみたいです。
; mci
; https://docs.microsoft.com/en-us/previous-versions//ms710815(v=vs.85)?redirectedfrom=MSDN
mci "open new type waveaudio alias mysound buffer 6"
s = "set mysound"
s += " alignment " + blocksize
s += " time format ms"
s += " bitspersample " + bitspersample
s += " bytespersec " + bytespersec
s += " channels " + channels
s += " samplespersec " + samplespersec
mci s
mci "save mysound " + fname
mci "close all"
; --------------------
; 保存したい波形データを作成
; --------------------
; 1000Hzのsin波を作成します。振幅は0.5。
f = 1000.0 ; Hz
df = 1.0 / double( samplespersec )
amp = 0.5 ; 音量
repeat channels
ch = cnt
repeat numData
; サンプルデータとして今回は 振幅値(-1.0〜1.0)で、データを作ります。
y = sin(2.0 * M_PI * f * df * cnt) * amp
; 保存するデータは 16bit : 32767〜-32768
data(cnt, ch) = int( y * 32768.0 )
loop
loop
; --------------------
; waveファイルに書き込み
; --------------------
; waveファイルフォーマットのデータ形式に変換
repeat numData
idx = cnt
repeat channels
ch = cnt
wpoke buf, idx * 2, data(idx, ch)
loop
loop
; ヘッダのファイルサイズ取得
sdim wavhead, 1
bload fname, wavhead, -1
byteWavhead = strsize
; waveファイルにデータを直接書き込む
; ヘッダのRIFFチャンクにサイズを書き込み
z = byteWavhead + byteBufferSize - 4
bsave fname, z, 4, 4
; ヘッダにデータサイズを書き込み
bsave fname, byteBufferSize, 4, byteWavhead - 4
; データを書き込み
bsave fname, buf, byteBufferSize, byteWavhead
pos 0,0
mes "完成!"
注意する点としては準備するデータの振幅範囲ですね。bitが変わると範囲も変わります。
一般的には、CD音質で 44.1kHz/16bit、ハイレゾ音源で 192kHz/24bit の設定が用いられているのでそのへんを参考に決めてください。
8bit : 0〜255(無音:128)
16bit : -32768〜32767(無音:0)
24bit : -8388608〜8388607(無音:0)
32bit : (float) -1.0f〜1.0f(無音:0)
64bit : (double) -1.0 〜1.0(無音:0)(※再生できません)
参考文献:
http://www.cactussoft.co.jp/Sarbo/divWaveCompReso.html
ところで、一応こんなのもあります。(宣伝)
mod_riffモジュール
http://mclab.uunyan.com/dl/dl39.htm
今見返すとこれに付属のWAVEファイル出力のサンプルは良くないですね。
後で変えとこう。