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さん返信ありがとうございます
ちょうどこんな感じです!
このスレは解決とさせていただきます



記事削除

記事NO.パスワード
(質問が解決したスレッドは他の利用者に活用してもらうため、削除しないようお願いします)

NO.91918への返信

マスコット

好きなマスコットを選んでください。

名前

e-mail
HOME
  1. 初めて利用する方は、HSP3掲示板の使い方をお読みください。
  2. 不要部分の多い長いスクリプトの投稿は ご遠慮ください。
  3. 書き込みは自動改行されません。適度に改行を入れてください。
  4. スクリプトは小文字の<pre>〜</pre>で囲むと見やすく表示できます。

削除用パスワード

解決したら質問者本人がここをチェックしてください。

エラー発生時、再送信すると二重送信になることがあります。
回答が得られたら、お礼書き込み時に[解決]チェックしてください。
SPAM防止のためURLから始まる文章は投稿できません。
SPAM防止のため英文字のみの本文を投稿することはできません。

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