音にこだわる
先日、RWH(Real World Haskell)の読書会で上京した折、淀で安いマイクと、音の本を 仕入れてきた。マイクと言っても、ヘッドフォンが付いたやつである。何でも、Skipe用 とか書いてあったけど、遊ぶには丁度よい値段であった。
何をやろうかと言うと、からおけ 100点を目指して、秘密の特訓。 ちょっとGoogle先生に聞いてみた所、 カラオケ装置における歌唱採点方法なんて言う、特許が出ている事を教えてもらったからだ。
やっぱりねぇ、周波数分析がからんでくるんだ。面白そうじゃん。
私のパソコンでは、音関係はどうなってる?
今までは、音だとか画像だとか、いわゆるAV系には興味が無かったので、設定する 事も無かったけど、この際だからちょっと探ってみる。
音を鳴らしたり、録音したりするには、サウンドドライバーを設定するんだな、ドライバは、FreeBSDの場合モジュールになっているので、どんなのがあるか、見てみる。
[sakae@fb ~]$ cd /boot/kernel [sakae@fb /boot/kernel]$ ls snd* snd_ad1816.ko* snd_envy24ht.ko* snd_sb16.ko* snd_als4000.ko* snd_es137x.ko* snd_sb8.ko* snd_atiixp.ko* snd_ess.ko* snd_sbc.ko* snd_cmi.ko* snd_fm801.ko* snd_solo.ko* snd_cs4281.ko* snd_hda.ko* snd_spicds.ko* snd_csa.ko* snd_ich.ko* snd_t4dwave.ko* snd_driver.ko* snd_maestro.ko* snd_uaudio.ko* snd_ds1.ko* snd_maestro3.ko* snd_via8233.ko* snd_emu10k1.ko* snd_mss.ko* snd_via82c686.ko* snd_envy24.ko* snd_neomagic.ko* snd_vibes.ko*
いろいろ、あるなあ! はて、どれを ロードしたものやら? こういう時は、OSに 良きに計らってもらうのがよさそうだ。 もしもの事(OSが落ちても被害がないように、開いているファイルはあらかじめ、閉じておく)が有っても泣かないようにした上で、
[root@fb /boot/kernel]# for f in snd* > do > kldload $f > done
当然、ロード出来ないモジュールもあるので、文句を言われるが、気にしない。 後は、dmesg して、OSが選んだものを調べればよい。私のは、
pcm0: <ESS Technology Allegro-1> port 0x1400-0x14ff irq 5 at device 4.0 on pci0
だった。後は、ドライバーを特定するため
[root@fb /boot/kernel]# man -k Allegro snd_maestro3(4) - ESS Maestro3/Allegro-1 bridge device driver
正体、見つけたり。嗚呼、われながら、ちから技だなぁ。 これで、/devの下に、相応のデバイスが用意された。ちゃんと、mixerも有効になったぞ。
[sakae@fb ~]$ mixer Mixer vol is currently set to 75:75 Mixer pcm is currently set to 75:75 Mixer speaker is currently set to 75:75 Mixer line is currently set to 75:75 Mixer mic is currently set to 0:0 Mixer cd is currently set to 75:75 Mixer rec is currently set to 0:0 Mixer igain is currently set to 0:0 Mixer phin is currently set to 0:0 Mixer phout is currently set to 0:0 Recording source: mic
録音するぞ、再生するぞ
パソコンを持っている人は、もれなく A/D や D/A も持っている事になっています。ああ、音関係者の間では、これらをコーディックって言うんですね。A/Dとか言うと、計測屋さんぽく聞こえるけど、コーディックと言うと、電話屋さんっぽく聞こえるから不思議だ。
さて、録音再生はどうすべ? 秋葉の本屋には、音関係の本も大分増えてきていて、audacity等を紹介していたけど、ちょっと機能が豊富すぎるなあ。もうちょっと、単機能のものでいいんだけど。
portsを探したら、wavplayという、シンプルなものが見つかった。
This is a port of wavplay from Linux. It can record from your sound card and play recorded sound.
録音するなら
[sakae@fb ~]$ wavrec -h Usage: wavrec [options] output_file Options: -h This info -q Quiet mode (no messages) -s rate Sampling rate -x Debug mode -S Stereo (undoes -M) -M Mono (undoes -S) -t secs Set time limit -b bits Set number of bits (8/16) -k key Set IPC Key for lock -R Remove and recreate semaphore locks. -l Lock for play. -u Unlock for play. -L Lock for record. -U Unlock for record. -d dev Override default of /dev/audio -V Display version and Copyright info WAV parameters are normally taken from the input file(s), but command line options can override them if required.
早速、録音
[sakae@fb ~]$ wavrec -R -t 5 -b 8 hoge [sakae@fb ~]$ ls -l hoge -rw-r--r-- 1 sakae kuma 110294 5 18 15:54 hoge [sakae@fb ~]$ file hoge hoge: RIFF (little-endian) data, WAVE audio, Microsoft PCM, 8 bit, mono 22050 Hz
どうやら、出来たっぽい。えっと、再生は
[sakae@fb ~]$ wavplay hoge Pathname: hoge Device: /dev/audio Sampling Rate: 22050 Hz Mode: Mono Samples: 110250 Bits: 8
さて、このファイルを Haskellを(無理に)に使って、分析出来るだろうか? えっと、分析と言うと、どんな分析方法があるだろうか? 冒頭の特許を参考に、
- 無音時間
- ある閾値を決め、それ以下なら無音だったとして、その時間を求める
- 強弱の差
- 一定時間毎にデータを分割し、その期間内での最大と最小値を求める
- エネルギー分布
- 一定時間間隔内でのエネルギー分布(パワースペクトラム?)
こんなのが、求められたら、面白い、かな?