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で作業しているので帰ったら調べよう。