August 08, 2007

ビープ音で『カエルの歌』 (Windows版)

最近『どう書く.org』を見るのが面白いです。

そこで目にとまったのがビープ音で、カエルの歌を演奏するというもの。皆さん、様々な言語で挑戦されています。Rubyで音をどう鳴らしているのか興味があったのでコードを見てみたところ、残念ながら*NIXにしかないビープ音を鳴らすコマンドbeepを利用していました。

これではM$のWindowsでは実行でできません。仕方がないので、Windowsでも実行できるようにビープ音を鳴らすWin32APIのBeep関数(引数として周波数と時間)を呼び出してみることにしました。こんな感じでいけます。

require 'Win32API'
$beep = Win32API::new('kernel32', 'Beep', ['i', 'i'], 'i')

FREQ_TABLE={ ?c=>262, ?d=>294, ?e=>330, ?f=>349, ?g=>392, ?a=>440, ?b=>494, ?r=>39999}
def play(mmf)
    mmf.each_byte{|c| $beep.call(FREQ_TABLE[c], 500)}
end
play "cdefedcrefgagfercrcrcrcrcdefedcr"

ちなみにマイコン関係をいじっていると、たまに音声処理をしたくなることがあります。そんなときに一定周波数の音声波形が欲しくなることがあるのですが、そんなときはRuby経由でWin32APIのBeep関数を呼び出すのが手ごろそうですね。

22:25 fenrir が投稿 : 固定リンク | | このエントリーを含むはてなブックマーク | この記事をdel.icio.usでブックマーク | トラックバック
このエントリーのトラックバックURL: http://fenrir.naruoka.org/mt/mt-tb.cgi/585
コメント
コメントする









名前、アドレスを登録しますか?
(次回以降コメント入力が楽になります)
  • 匿名でのコメントは受け付けておりません。
  • 名前(ハンドル名可)とメールアドレスは必ず入力してください。
  • メールアドレスを表示されたくないときはURLも必ず記入してください。
  • コメント欄でHTMLタグは使用できません。
  • コメント本文に日本語(全角文字)がある程度多く含まれている必要があります。
  • コメント欄内のURLと思われる文字列は自動的にリンクに変換されます。