Beepサウンド対応

http://community.osdev.info/index.php?(PIT)8254に K-tan がまとめてくれている情報を利用します。


結構簡単そうなので、早速サンプルプログラムを書いてみよう。

// hz = 1193180 / value;
void beep(dword hz)
{
    word value = (word)(1193180 / hz);
    outp8(0x43, 0xb6);
    outp8(0x42, value & 0xff);
    outp8(0x42, value >> 8);
    outp8(0x61, (inp8(0x61) | 0x03) & 0x0f);
}

int MonaMain(List<char*>* pekoe)
{
    syscall_get_io();

    for (word i = 440; i < 1200; i++)
    {
        beep(i);
        sleep(10);
    }

    // off
    outp8(0x61, inp8(0x61) & 0x0d);
    printf("end ");

これをやると音が A(440Hz, チューニングのときに使うよね?)から徐々に高くなっていきます。
OS Wikiに書いてあるBEEPのON/OFFは、「ONの間音が鳴っている」「OFFになると止まる」という意味。

つまり休符を表現するのであればタイマを適切に利用して ON -> OFF -> ONを切替える必要があるということか。

音を鳴らす方法は分かった。
beepライブラリを提供するだけでは、いまいち利用してもらえなさそうなので何らかの楽譜データを喰わせると音が鳴るアプリでも作るかな?
それともピアノアプリでも作る?
単音の楽譜データは、PC上で利用するような汎用フォーマットあるんだろうか。意味なく YAML や S式ってのはどうかね(ぉ
今Cafeで作業しているので帰ったら調べよう。