音階をmidiノートナンバーに変換するスクリプト

音楽系メディアアートを作るとき、よく音階をmidiノートナンバーに置き換えて扱うのですが、音階をmidiノートナンバーに変えるのがいちいち考えて打つのは面倒なので、変換するプログラムを練習がてらにRubyで書きました。

コード

p 'e.g.) c d e- e g g+ a'
line = gets
notes = line.split(" ");

midi = []
note_mapper = {
  c: 0, d: 2, e: 4, f: 5, g: 7, a: 9, b: 11
}
acc_mapper = {
  '+': 1, '-': -1
}

for note in notes
  if note !~ /^[abcdefg][-+]?$/
    p "error! illegal string!"
    exit()
  end
  # 幹音
  tmp = note_mapper[note[0].to_sym]

  # #と♭
  tmp += acc_mapper[note[1]] || 0
  midi << tmp
end

i = 0
while midi[i]+12 < 128
  midi << midi[i] + 12
  i += 1
end

p midi

使い方

rubyでスクリプトを走らせると、入力待機状態になるので、小文字の英語音名をスペースで区切って入力するとmidiノートナンバーが出てきます。ただし、#と♭はそれぞれ+とーで表しています。

$ ruby app.rb
input scale...
e.g.) c d e- e g g+ a
c d e g a (入力する)
[0, 2, 4, 7, 9, 12, 14, 16, 19, 21, 24, 26, 28, 31, 33, 36, 38, 40, 43, 45, 48, 50, 52, 55, 57, 60, 62, 64, 67, 69, 72, 74, 76, 79, 81, 84, 86, 88, 91, 93, 96, 98, 100, 103, 105, 108, 110, 112, 115, 117, 120, 122, 124, 127]

あとは必要なmidiノートナンバーを必要な数だけ抜粋してあげればOKです!