読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

コマンドラインからwaveファイルを作る方法  (テキストを.wavに変換)

sound tool C言語


テキストファイルに数値を書き込むだけで,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フォーマットデータ 変換プログラム

ダウンロード → http://www.kk.iij4u.or.jp/~kondo/wave/txt2wav.c


この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