音にこだわる

先日、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を(無理に)に使って、分析出来るだろうか? えっと、分析と言うと、どんな分析方法があるだろうか? 冒頭の特許を参考に、

無音時間
ある閾値を決め、それ以下なら無音だったとして、その時間を求める
強弱の差
一定時間毎にデータを分割し、その期間内での最大と最小値を求める
エネルギー分布
一定時間間隔内でのエネルギー分布(パワースペクトラム?)

こんなのが、求められたら、面白い、かな?