4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

RubyでBeep音を鳴らしてメロディーを流す(その1)

Posted at

なぜこんなことを考えたのか

以前働いていた職場では、終礼およそ15分前にアラームとしてBeep音が鳴るようになっていました。
その時にふと「ただ同じ音が繰り返されるのは面白くない」と思ったのが事の始まりです。
Rubyを選んだのは特に意味はありません。

RubyでBeep音を鳴らすには

こちらのサイトを参考にさせて頂きました。

Ruby で Win32 API

そんでもって鳴らすには下記のように。

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)

これでメロディが作れますね!

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?