コマンドラインからwaveファイルを作る方法 (テキストを.wavに変換)
テキストファイルに数値を書き込むだけで,wave形式の音楽ファイルを生成する事ができる。
(1)WAVを作る事の従来の難しさ
MIDIのような楽譜演奏データは,単なる音階なので,記述+作成は簡単。
音階を記述してコンパイルするための言語として,MMLという専用文法がちゃんとある。
着メロも同じ。
しかし,wavは波形データなので,一瞬ごとの音声振動(振幅)をすべて保管しなければならない。
CD並みの音質を作るためには,1秒間あたり44100個分の波形データをバイナリ形式で用意する必要がある。
一応,wavファイルを作成するためのプログラミング用APIも存在する。
MMIOだとかMCIなどがその例だが,手軽ではない。
Delphiでmmio:
Waveファイルを作成する(その1)
http://homepage1.nifty.com/MADIA/delphi/Win32API/WaveCreate.htm
VB6.0でMCI:
Visual Basic 6.0 テクニック
http://homepage1.nifty.com/rucio/main/technique/teq_1.htm
手軽にやりたい場合,もちろん,SoundEngineなどのフリーソフトを使って,マイクから音声を録音してwavファイルとして保存するという手はある。
しかしその場合,もとになる音をPC内で「作る」事はできない。
PC内外で何か音がすれば録音されるが,録音したいデータの波形そのものを自由に作り出すことはできていないのだ。
(2)テキストファイルからwavを作ろう
下記のプログラムを使えば,任意の波形データをかんたんにwavファイルで保存できる。
ASCII テキストデータを WAVE 形式に変換します
http://www.kk.iij4u.or.jp/~kondo/wave/index.html
txt2wav テキストデータ -> wavフォーマットデータ 変換プログラム
このC言語のソースコードは,APIだの余計な物を使わずに,wavファイルのフォーマットそのものを直接書き出すという処理をしている。
使い方は下記の通り。
Visual C++ がPCにインストールされている状態で,
cl txt2wav.c
とコンパイルする。txt2wav.exeができあがる。
同じフォルダにメモ帳でテキストファイルを作って,例えば中身に
1
10
30
50
100
200
100
50
30
10
1
のように記述して保存。(a.txtとする)
この数値が波形を表す。
txt2wav.exe -1600 a.txt b.wav
と打ちこむと,1600ヘルツのサンプリングレートで b.wav という音声が生成される。
波形データに0から255までの数値だけを使い,1列で記述したので,8ビット・モノラルになる。ステレオの場合は2列にする。
このファイルはMedia Playerなどのプレーヤでふつうに再生できる。
(3)検証
wav生成時に,テキストに記述した通りの波形になっているのかどうか,検証してみよう。
440ヘルツの音を作って,「ラ」の音になっているかどうかを確かめればよい。
下記のような波形テキストを考える。
0
40
80
120
160
200
160
120
80
40
これは10行分だから,44回ほどコピペして,合計440行の波形データにする。(la.txt)
440行の中で,44回の山と谷の周期の繰り返しがあるわけだ。
さて,サンプリングレートを求める。
440ヘルツと言う事は1秒間に440回振動する。
ということは,上記の波形の44回の振動が「ラ」の音の場合,0.1秒分。
上記では0.1秒分のデータが440行で記述されているので,1秒分では4400行の見込みになる。
つまり,上記の波形テキストデータの「サンプリングレート」は,4400Hz(1秒間に4400回)である。
さっそくwavに変換しよう。
txt2wav.exe -4400 la.txt
完成した la.wav はこのような音になる。試聴してみてください。
波形を自作した「ラ」の音
http://www.name-of-this-site.org/coding/wave/txt2wav/la.wav
音階は,下記のFlash版オンラインピアノで鍵盤をクリックする事で確かめられる。
http://www10.plala.or.jp/musicmate/fp/
正確にスペクトル表示させて確かめたいと言う人は,FFT用のフリーソフトを使って短時間フーリエ変換してみよう。
wavemaster
http://www.vector.co.jp/soft/win95/art/se083942.html
wavファイルを開くと,画面上部に時系列でスペクトラムが出る。
上下矢印ボタンを使って表示範囲を切り替える。周波数領域のピークは440Hz付近に存在するのが見てとれるだろう。
なお,上で入力した波形データは20とか40とかキリのいい数字を使っており,ちゃんとした正弦波ではない。
(4)wavをテキストファイルに変換
上記では .txt から .wav を作ったが,逆に .wav の内容を波形データとして .txt ファイルに書き出すこともできる。
LaTeXで有名な奥村晴彦さんが作ったプログラムを使う。
WAVE ファイルの内容を調べる拙作プログラム dumpwave.c
http://oku.edu.mie-u.ac.jp/~okumura/wavefmt.html
同様にコンパイルしてから,
dumpwave.exe la.wav > la_dump.txt
のように実行。中身が数値で書きだされる。(ただし,0から255までの値ではなく,-128から+128までの範囲になる。)
これらのツールを組み合わせれば,
- 既存のWAVファイルの編集(切り貼りや合成,エフェクト)
- 既存のWAVファイルの解析(音階調査など)
- 新規WAVを作成して任意の音声波形を書き込む
といった操作が容易にできるだろう。
何より便利な点は
- バイナリではなく,ただのテキストデータの世界で済んでしまうこと
- そして,CUIだけで実行できてしまうこと
だ。
CGIや他のローカルアプリケーションからパイプで呼び出すこともできる。
なお,あえてGUIで作りたいと言う場合は,同じ「txt2wav」という名前でGUI版のソフトを作った方がいるのでそれを使うとよい。
txt2wav Version1.2
http://blog.livedoor.jp/arrowhead35/archives/28234164.html