初めに
ふとしたきっかけで、D言語で音を扱いたいなぁって思って調べていると
PortAudioを使ってD言語で波形を鳴らす
という記事を発見しました。
そこで、ビビビッときた僕はこれで上手いことやれば、コマンドラインで動く音楽プレーヤーが開発できるのでは...?と考えて手を動かしたところ、
出来ました。
こちらです: Github alphaKAI/yacmp
yacmp
という命名に関しては、Yet Anotoher Console Music Playerの各単語の頭文字をくっつけただけという安直なネーミングです。
技術的な話。
まずはじめに使っているライブラリとかについて。
PortAudio
を ウォルター先生がポーティングしてくださった、バインディングを用いて使っています。
バインディング : PortAudio D bindings
また、libsndfile
に関しては適当にdub
で検索していた所、以下のバインディングを見つけたのでそれを使いました。
derelict_extras-sndfile
次に、コードについて。
最初に断っておくと、あまり綺麗な実装では無いです。_
操作のためにマルチスレッドで色々としているのですが、とりあえず動けばいいや、といった考えで手を動かしていたらいつの間にかできていた、ということもあってフラグ管理とかが普通に甘いです。
多分適当に触ってると普通にバグを踏みそうです。(幾つかケースは想定できていますが、面倒なのでいつか時間があれば...)。
簡単に何が汚いかを書いておくと、
shared static
な変数を用いて関数間を横断して色々と情報を共有しています。
これ用のクラスを作って隠蔽して〜とかもやればよかったなぁとは思いますが、先ほど行ったとおりいつの間にかできていたので、はい。
実際の所、このプログラムはほとんどPortAudio
とlibsndfile
に関するサンプルをネットで検索している中で見つけたサンプルをD言語にコンバートしてチョットだけミュージックプレイヤーっぽくしただけ、というようなものです。
それ故に、コードに関する解説はあまり必要ないと思いますのでここでは言及しないことにします。
とりあえず、動くようになってはいるので
適当にforkするなどして、Dlang UI
等のGUIツールキットと組み合わせれば簡単にD言語でミュージックプレイヤーアプリケーションが開発できます。
また、最後に注意としては
音楽ファイルの読み込みにlibsndfile
を用いているのですが、READMEに
Supported formats
Supported formats are based on that of libsndfile.
と書いたとおり、読み込める音楽ファイルのフォーマットはlibsndfile
がサポートしているフォーマットに基づきます。
したがって、libsndfile
はMP3
に対応していないのでyacmp
もMP3
には対応していません。
何故、libsndfile
がMP3
をサポートしていないのかということはlibsndfile
の公式ページのFAQ
に書いてあります。
libsndfile : Frequently Asked Questions. / Q20 : Why doesn't libsndfile support MP3? Lots of other Open Source projects support it!
とりあえず、D言語でPortAudio
とlibsndfile
を叩いていたらいつの間にかコマンドラインで動く音楽プレーヤーができていたのでそれの紹介をしました。
(手を動かしていたらいつのまにか音楽プレーヤーができているとか、D言語ってやっぱり強力だなぁと思いました。)