フィボナッチ・ミュージック

artonさんのところで見かけたのを、そのままお借りしています。すみません。JRubyにして動かしています。

# cf. http://arton.no-ip.info/diary/20070807.html#p01
require 'java'

def fib(n, r = [0,1])
  r[n] ||= fib(n - 2, r) + fib(n - 1, r)
end

class Array
  alias put []=
  def []=(i, n)
    put(i, n)
  end
end

MidiSystem = javax.sound.midi.MidiSystem
synthesizer = MidiSystem.getSynthesizer()   #システム既定のシンセサイザー
synthesizer.open
channels = synthesizer.getChannels()        #16チャネルとか32チャネルとかある。多声を使うなら使える。
cha = channels[0]                           #とりあえずモノフォニーでいいや

p = 56
if ARGV.size > 0
  p = ARGV[0].to_i
end
cha.programChange(p)                         #1-128でプリセットされた音色を選択

s = 1
1.upto(100) do |n|
  x = fib(n)
  cha.noteOff(s)                             #指定音高の停止
  puts x
  x %= 19                                    #レンジを絞る
  x += 40                                    #下駄を履かせる(西尾さんの真似。というか全部真似だけど)
  cha.noteOn(x, 50)                          #音高、音量。音高は0−127。60がMid C
  s = x
  sleep(0.2)
end

synthesizer.close