246903 音プログラム作成挑戦記(ポケベル)
初級者が、プログラムの作成に挑戦する記事の第三段の第一回です。
第三段では、音のプログラムに挑戦していきます。今回の題材は、DTMFです。
はじめに
今回のプログラムでは、DTMFという、電話のプッシュボタンを押したときに鳴るピポピポ音を出すための仕組みを、題材にしました。
プログラムの実行結果をnoteに音声記事としてアップロードしています。
アップロードした音声データは、ボーが16ぐらいなので速過ぎます。無音区間を計算に入れるのを忘れてました。
使用言語
今回もC言語です。その理由は、プログラムの作成にALSAというC言語向けのサウンドAPIを使用しているからです。
ですが、今になって思えばC言語である必要はありませんでした。
ALSAはオーディオデバイスを操作するためのAPIです。オーディオデバイスそれ自体は、音声データの作成に全く関係ありません。
つまり、Noteにアップロードする音声データを作成するだけなら、ALSAは不要でした。
新しい言語(今回の題材ならJuliaかな)に挑戦すればよかったです!
プログラムの機能
符号化機能
文字からDTMF信号を生成する機能です。
入力には、プッシュボタンの数字を入力するモードと、テキストを入力するモードがあります。テキストモードの場合、テキストがポケベルのコード(数字の組)に変換されます。なお、テキストに使用できる日本語は平仮名のみです。
出力先は、オーディオデバイスかファイルです。出力データの形式はPCMです。標本化周波数や量子化精度は変更可能にしましたが、エンディアンはリトルエンディアンで固定しました。
復号化機能
DTMF信号から文字を生成する機能です。
入力元は、ファイルだけです。オーディオデバイスからの入力も「一応は」コードを書いたものの、マイクを持っていないので動作確認が取れていません。
信号検出には、みんな大好き改良Goertzelを用いています。本来は、組込み向けのアルゴリズムですが、PCでは潤沢な計算資源を浪費できるので、手抜き実装しました。少し後ろめたいです。
苦労したところ
UTF-8
上述したように、ポケベルコードの元になるのは平仮名の文です。その平仮名の文字コードには、UTF-8を使っています。
UTF-8は、マルチバイトコードです。マルチバイトの文字をC言語で扱うのは、かなり面倒くさいです。
しかし、今回のプログラムは平仮名しか使わないので、使用する文字の種類はそれほど多くありません。
そこで、マルチバイト文字ではなく、符号なしの24ビットデータ(uint8_t[3])として扱うことにしました。泥臭いですが、実装がかなり楽になりました。
なお、新しい世代の言語を採用していれば、しなくていい苦労だった気がします。
まとめ
今回のプログラム作成には、集客できるプログラムの分野(題材)を調べるという目的もあります。
プログラム作成の記事は、当たり前ですが、学習記事に比べると大変な時間と労力が掛かります。なので、なるべく無駄がないように、興味を引きやすい題材を選ばなくてはやってられません。
その参考にするために、他の人の制作記事(プログラムに限らない)を色々と見てまわりました。やはり、動きのある記事は、それだけで惹きつけられます。
そこで、音声、動画といったマルチメディアのプログラムを作成することにしました。
ただ、動画は難易度が高そうなので、比較的簡単そうな音声から作りました。
そうして出来上がったのが、今回のキジです。ケーン。どうですか?
今後の予定
波形信号の処理にも少し馴れたので、もう二、三品ばかり音声の小物を作りたいと思います。