【C言語】PCMデータのみ書かれたテキストデータをSUN(AU)オーディオファイルに変換するプログラム
タイトル通り、PCMデータのみ書かれたテキストデータをSUN(AU)オーディオファイルに変換するプログラムをC言語で作成しました。あまり気合の入ってるものでないので他の人にとっては結構不便さを感じると思いますが、僕が使うには十分なため改良する予定はありません。(笑)
動機
音声処理を行うということはPCMデータを扱うことになると思います。
PCMデータのWikipedia
PCMデータを取り出す方法はいくつかあると思いますし、様々なライブラリも豊富な昨今あまり困ることはないと思っていたのですが、私がC言語で音声処理やPCMデータをいじったりする上であまりいいライブラリやいいツールがぱっと見た感じ見当たらなかったので作成した次第です。
SUNオーディオファイルを使う理由
このファイルのいいところは、ヘッダファイルに楽曲の長さを記載しなくてもいい(データ長が不明でもいい)ことです。音声を扱う上で他に扱いやすい拡張子といえばWAVEファイルがありますが、WAVEファイルからPCMデータを取り出すのはヘッダの長さが決められているので割と簡単ですが、ヘッダを作成するのしてWAVEファイルにする時にはヘッダに楽曲の長さを記載しなければならずその処理を描くのが面倒でした。SUNオーディオファイルでは、下記コードで uint32_t au_data_size; にあたる部分が不明(0xffffffff)でも構わないとうことです。
SUNオーディオファイルのWikipedia
typedef struct au_filehdr {
uint32_t au_magic; /* マジックナンバー(.snd) */
uint32_t au_offset; /* オーディオデータが記録されているバイトオフセット */
uint32_t au_data_size; /* データ長(バイト) */
uint32_t au_encoding; /* エンコードの種別 */
uint32_t au_sample_rate; /* 一秒あたりのサンプル数 */
uint32_t au_channels; /* チャンネル数 */
}
使い方
Githubに書いてありますのでそちらからソースも合わせてどうぞ
後記
データの長さをヘッダに含める処理を書いていないので、サンプリングレートから適宜長さを自力で計算して設定してあげる必要があります。(例えばこのサンプルではPCMデータのサンプリングレートは11025、楽曲の長さは4秒なので11025×4=44100となります。Githubのソースの50行目で44100と書いてある理由はこれです。)