書いてる人
エンジニアではありません(Qiitaの定義ならかろうじてエンジニア?)
ただのオーディオマニアです。
プログラミングについての教育は受けたことのない素人です。
はじめに
音声処理のプログラミングをすることが目的なので車輪の再発明は気にしません。
実用になるプログラムを目指します。
実用とは、オーディオマニアがそれなりのシステムで再生するのに実用になる、という意味で、音楽作成・録音や、売り物になるプログラムという意味ではありません。
やりたいことは簡単なのに...
例えばステレオ2ch音声をモノラル音声にするプログラムを書きたいとします(soxで簡単にできるけど)。
やることは簡単で、両チャンネルを(Lch+Rch)/2 にするだけです。
どうしたら良いでしょう?
入力ファイルはwav? flac? それともmic?
できればGUIで対象ファイルを選択したいし、インターネットラジオも再生したい。
サンプリング周波数は? BitDepthは?
考え出すとキリがありません。
どんどん面倒になっていきます。
入力再生は別のプログラムに任せよう!
やりたいのは音声信号を処理する部分だけなので、それ以外は別のプログラムに任せましょう。
それには別のプログラムからデータを受け取り、別のプログラムにデータを送る必要があります。
標準入出力
Unix系には標準入出力という便利なものがあります。データの入出力にはこれが一番簡単です。なんたって「標準」ですから。
Linuxで標準入出力ができる音声系プログラム
sox、aplay、arecord、mpd、bruteFIR など
標準入出力を使うだけで色々なプログラムと連携が取れます。
音声データのフォーマット
サンプリング周波数
よく使われるのは 32kHz、44.1kHz、48kHz、88.2kHz、96kHz、176.4kHz、192kHzなどです。DSDは面倒なので無視します。
BitDepth
音楽でよく使われるのは16bit・24bit・32bit (signed int)、最近なら32bit floatなんてのもある。
CDは16bitで十分な音質だけど、ディザをかけないと音質低下したりするので面倒。
24bitは十分な音質で対応DACも多いけど大抵のプログラミング言語には24bit整数がないのでやはり面倒。
というわけで32bit整数でやり取りするのが良さそう。
データの並び順
2ch 32bitのステレオデータは大抵の場合LittleEndianでLch,Rch,Lch,Rch...と交互にそれぞれ4byteが並びます。
ソフトによってはBigEndianが選べるものもあります。
実際の連携
例えばtest.flac を 自作のプログラム sampleprogram で処理するにはSoxの出力をパイプで受けてパイプでaplayに送れば再生できます。
自作プログラム入出力のの音声データフォーマットは32bit44.1kHzに決め打ちにして、前後のプログラムに対応してもらうことにします。
sox test.flac -r 44100 -t raw -c 2 -e s -b 32 - | sampleprogram | aplay -t raw -c 2 -r 44100 -f S32_LE
こんな感じにすればOKです。
次回は実際に簡単なプログラムを書いてみます。