FizzBuzzが書けるようになったら、音楽プログラムを書きましょう
FizzBuzzというプログラムがあります。1 - 2 ときて Fizz、つぎに 4 ときて Buzz、そして 12 - 13 - 14ときて FizzBuzz ですね。タイマーを使ってJavaScriptで書いたらこんな感じ。
var count = 0; function fizzbuzz() { count += 1; if (count % 15 === 0) { console.log("FizzBuzz"); } else if (count % 5 === 0) { console.log("Buzz"); } else if (count % 3 === 0) { console.log("Fizz"); } else { console.log(count); } } setInterval(fizzbuzz, 600);
プログラミングの最初の方の課題で取り組む人も多いと思いますが、昨日革命が起こって、これができれば音を出すプログラミングができるようになります。
WebModular開発者の g200kgさんが、MIDIメッセージを介してウェブ楽器を操作するという面白いことを考えてくれたので、それを利用して音楽にします。
MIDIというのは電子楽器を機器間で連携するための世界共通規格で、ようはこの音を出してくださいとか、止めてくださいとかメッセージを送ると受け取った楽器がそういうように動作するみたいなやつです。
それをこういう感じで、別ウィンドウで開いたウェブ楽器のページに送ります。
var synth = window.open(url); function noteOn(midinote, velocity) { var msg = "midi,90," + midinote.toString(16) + "," + velocity.toString(16); synth.postMessage(msg, "*"); } function noteOff(midinote) { var msg = "midi,80," + midinote.toString(16) + ",0"; synth.postMessage(msg, "*"); }
noteOn 関数で音を出す、 noteOff 関数で音を止めています。noteOn関数で使われているvelocityというのは音の強さで 0 から 127 までの 128 段階で指定できます。midinoteというのは音の高さで 60 がド、1つ増減するたびに半音ずつずれます。一般的に 21(すごい低いラ) から 108(すごい高いド) まであります。ざっくりとした説明ですがこれだけでOKです。詳しくはウィキペディアなりで調べてください。
以上のようなMIDIメッセージをFizzBuzzを表示するかわりに送信してやれば、ばっちりウェブ音楽のできあがりです。例示します。
テキストボックスにウェブ楽器のURLをいれて、[Open Web Instrument]ボタンで開く、そして[FizzBuzz Music]ボタンで再生できます。
var count = 0, midinote = 47; function fizzbuzz() { noteOff(midinote); count += 1; if (count % 15 === 0) { midinote = 48; } else if (count % 5 === 0) { midinote -= 7; } else if (count % 3 === 0) { midinote += 12; } else { midinote += 1; } noteOn(midinote, 64); }
ウェブ楽器のリスト
Modular Synthesizer (g200kg)
http://www.g200kg.com/en/docs/webmodular/webmodular.html
Mini Moog like Synthesizer (aike)
http://aikelab.net/websynth/
timbre.js - Script Synthesizer (mohayonao)
https://dl.dropbox.com/u/645229/webmodular-and-timbre/midilink.html
FizzBuzzの他には、たとえば何か有名な曲のフレーズを配列データにして(先頭から数えて何番目かと midinote とできれば長さ)、シャッフルする。それを適当なソートアルゴリズムでちょっとずつ並び替えながら聞く。アルゴリズムを変えれば途中経過は変わるけど最終的には同じ曲になるみたいなのとか、これができればもう立派なウェブ作曲家、たぶん面白いと思うので誰かお願いします。