読者です 読者をやめる 読者になる 読者になる

mcommit's message

大阪でソフトウェア開発の仕事をしている simotinこと宮崎といいます。記事の内容でご質問やご意見がありましたらお気軽にコメントしてください\^o^/

raspberry pi ALSAを使ったサウンド出力

昨日は、シリアル通信が正しくできているかどうかを確かめることができました。
結果としてRubyのserialportを使ったシリアル受信処理に問題があることが分かったので万万歳です。
※原因がわかれば後は追っかけていくだけだ〜!

ということで、今日はシリアル通信側はいったん置いといてRaspberry piのサウンド出力の
プログラミングについて調べてみました。

Linuxでサウンド出力を行うプログラミングについては全く知識がなかったのですが、
ALSA(Advanced Linux Sound Architecture)というライブラリ(ミドルウェア相当でしょうか!?)
がありALSAAPIを使ってサウンド出力のプログラミングができるらしいです。

raspberry pi(raspbian)にはaplayというwavファイルを再生するコマンドが入っているのですが、
このコマンドはALSAを使っているようです。

■Rapberry pi上でのaplayを使ったサウンド出力テスト
※Rapberrypi本体のイヤホンジャックにスピーカーもしくは、ヘッドホンをつないだ状態で以下のコマンドを
実行します。


$sudo aplay /usr/share/sounds/alsa/Front_Center.wav
正しく動くと、英語で「フロント...センター」という声が再生されます。
※デバイスを扱う関係からだと思いますが一般ユーザ権限では動きませんでした。

さて音がでるのがわかったのですが、私がやりたいのは任意の周波数の音をスピーカー
から出力したいというものです。

いろいろネットで調べていて、
C program to play a WAV file
ALSAの叩き方
のページを参考にさせて頂き、無事音を出すことができました。

まずはALSAの開発環境をインストールします。


$sudo apt-get install libasound2 libasound2-dev

続いて動作確認用コードを書き、コンパイルします。
※とりあえずALSAの叩き方に書かれていたコードを流用させて頂きました。

実行すると、

「プー」という音がちゃんとでました!

音の出力部分をうまくライブラリ化して、センサとの入力と繋げれば
私のやりたかったテルミンもどきができそうです!

今日はALSAの方のコードをもう少しいじってから寝ようと思います。

ちなみに、サウンドプログラミングについてはあまり書籍などは出ていないようです。
OS毎にALSADirectXのようなライブラリ、ミドルウェアが異なるためニッチな内容になってしまうからかもしれません。

ALSAC言語でコーディングできますが、サウンドプログラミング入門――音響合成の基本とC言語
による実装という本を買ってみました。

サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)

サウンドプログラミング入門――音響合成の基本とC言語による実装 (Software Design plus)

が、タイトルにもあるように音響合成について主に触れられており内容ははっきり言って今の自分には難しかったです。。。
興味のある方は読んでみられるとよいかもしれません。(もう少しだけ初心者よりの本があれば買いたいです。)