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


HSPTV!掲示板


未解決 解決 停止 削除要請

2020
1212
Anvil-McHサンプル単位で音声を作成してその音声を再生/出力するには2解決


Anvil-McH

リンク

2020/12/12(Sat) 20:07:44|NO.91918

題名通りサンプル単位で音声を作成してその音声を再生やwav出力をするにはどうすればよいのでしょうか

配列変数に振幅の数値が入っていてそれをもとに音声を作っていく感じにしたいです。

わかる方返信お願いします



この記事に返信する


GENKI

リンク

2020/12/13(Sun) 15:04:53|NO.91920

そんなの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ファイル出力のサンプルは良くないですね。
後で変えとこう。



Anvil-McH

リンク

2020/12/13(Sun) 15:59:45|NO.91921

GENKIさん返信ありがとうございます
ちょうどこんな感じです!
このスレは解決とさせていただきます



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