なぜこんなことを考えたのか
以前働いていた職場では、終礼およそ15分前にアラームとしてBeep音が鳴るようになっていました。
その時にふと「ただ同じ音が繰り返されるのは面白くない」と思ったのが事の始まりです。
Rubyを選んだのは特に意味はありません。
RubyでBeep音を鳴らすには
こちらのサイトを参考にさせて頂きました。
そんでもって鳴らすには下記のように。
beep.rb
require 'Win32API'
beep = Win32API.new('kernel32', 'Beep', %w(i i), 'i')
beep.call(262, 500)
Callメソッドの第1引数に「周波数」、第2引数に「鳴らす時間」、おそらくmsecです。
意外と簡単ですね。
音階を鳴らす
まず音楽知識ゼロなのでおなじみのドレミはどの周波数なのか調べました。
こちらを参考にしました。
ビープ音サンプル - コンピュータを楽しもう!!
一般的にはラの音を基準にしているようです(440hz)
この440hzを基準に半音×n個移動したときの計算式を作ります。
周波数 = 440 * 2の( n / 12 )
となり、これをRubyに直すと
hz = 440 * ( 2** ( n / 12 ) )
になります。
これを使ってド~シを鳴らしてみます。
melody.rb
require 'Win32API'
beep = Win32API.new('kernel32', 'Beep', %w(i i), 'i')
# ド
hz=440 * ( 2** (-9/12))
beep.call(hz, 500)
# ド#
hz=440 * ( 2** (-8/12))
beep.call(hz, 500)
# レ
hz=440 * ( 2** (-7/12))
beep.call(hz, 500)
# レ#
hz=440 * ( 2** (-8/12))
beep.call(hz, 500)
# ミ
hz=440 * ( 2** (-5/12))
beep.call(hz, 500)
# ファ
hz=440 * ( 2** (-4/12))
beep.call(hz, 500)
# ファ#
hz=440 * ( 2** (-3/12))
beep.call(hz, 500)
# ソ
hz=440 * ( 2** (-2/12))
beep.call(hz, 500)
# ソ#
hz=440 * ( 2** (-1/12))
beep.call(hz, 500)
# ラ
hz=440 * ( 2** (0/12))
beep.call(hz, 500)
# ラ#
hz=440 * ( 2** (1/12))
beep.call(hz, 500)
# シ
hz=440 * ( 2** (2/12))
beep.call(hz, 500)
これでメロディが作れますね!