音楽系メディアアートを作るとき、よく音階を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です!