Web MIDI API Wrapper 公開したよ ^^v (2)

前回に引き続き Web MIDI API Wrapper についての説明です。今回は具体的な MIDI メッセージの送信の方法になります。

本題の前に、またまた MIDI ってどこで使われているかコーナーです。 MIDI には Show Control(MSC) という仕様があります。 前回の Universal Studio の Water World も MSC の一例でした。今回もその続きです。 そして Showといえば、Las Vegas かな?っていう勝手な想いがありまして、 今回はそこで利用されている例です。映画 Ocean’s Eleven って御存知ですか?? Las Vegas のカジノに泥棒に入るっていうストーリーですが、 最後のシーンで噴水ショーがが出てくるんです。あれが Las Vegas の ベラージオ (Bellagio) のショーというのは有名だと思います。なんと、あのコントロールのオリジナルのシステムは MIDI なんですよ〜!!

さて、本題です。前回もお伝えしましたが、Web MIDI API Wrapperは基本的な以下のメッセージに対応にしています。

  • NoteOn:音を鳴らす
  • NoteOff:音を止める
  • PitchBend:ピッチを上下させる
  • Sustain:ダンパーペダルの操作
  • Modulation:揺らぎ
  • AllSoundOff:残響、Sustainを含め即時に全ての音を止める
  • ResetAllController:PitchBend、After-Touchなどのコントローラを初期値に戻す
  • AllNoteOff:発音している音を全て止める

ということで、まずは NoteOn/NoteOff についてです。 NoteOnは「音を発音させてね」、NoteOffは「発音している音を停止させてね」 を知らせる Message です。えっ「コンピュータで音を鳴らすんだから、 例えばNoteOnの時にどれだけ長さ(時間)音を出すか指定しちゃえばいいじゃない。」 という印象をお持ちの方もいらっしゃると思いますが、もともと MIDI というのは電子楽器と電子楽器を つなげ相互にコントロールを可能とする Protocol なので、コンピュータなら最初から音を出す時間を指定できちゃいますが、 リアルタイムの演奏ではそれはできないですよね〜、というところから NoteOn、NoteOff に分かれているのです。

sendNoteOn(portNo, ch, note, velocity, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • note:鳴らすnote番号を指定
  • velocity:鳴らすnoteのvelocityを指定
  • time:音を鳴らすタイミング(いつ音を鳴らすかをミリ秒で指定)

NoteOnのvelocityに関して:velocityを直訳すると「速さ、速力」ですが、MIDI機器側では音の強弱に割り当てられている場合がほとんどです。数値の目安は1:ppp、64:mpとmfの中間、127:fff というのが目安です。 note番号に関して:中央のC(C4:ド)を60として白鍵、黒鍵関係なく鍵盤1つに対して数字が割り当てられています。 よって、88鍵ですと21〜108まで割り当てられていることになります。 例えばC4の右隣の白鍵D4は62、その間にある黒鍵は61です。note番号の図 右にスクロールすると見えてきます。

sendNoteOff(portNo, ch, note, velocity, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • note:停止するnote番号を指定
  • velocity:停止するnoteのvelocityを指定
  • time:音を停止するタイミング(いつ音を鳴らすかをミリ秒で指定)
  • NoteOffのvelocityに関して:鍵盤から手を離す速度と認識する機器もあり、その場合は音の余韻の長さを指定できます。NoteOnのvelocityをゼロにしてNoteOffの代わりにすることも可能です。

sendProgramChange(portNo, ch, programNo, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • programNo:変更する音色番号
  • time:適応するタイミング(いつ音色を変更するかミリ秒で指定)
setPitchBendValue(portNo, min, max, center);
  • portNo:設定するMIDI機器(Port)を指定
  • min:PitchBendの最小値
  • max:PitchBendの最大値
  • center:PitchBendの中央値(PitchBendがかかっていない状態)
  • PitchBendに関して:範囲は16383と決まっていますが、MIDI機器によって中央を0、または中央が8192と違う場合があります。Web MIDI API Wrapperの初期設定値は中央:8192、最小:0、最大:16383 としています。
  • sendPitchBend(portNo, ch, value, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • value:適応するPitchBendの値を指定
  • time:適応するタイミング(いつPitchBendを適応すかをミリ秒で指定)

数値に関してはここが参考になると思います。

sendSustainStatus(portNo, ch, status, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • status:Sustainの指定を”on”、”off”で指定
  • time:適応するタイミング(いつSustainを適応すかをミリ秒で指定)

Sustainとは:ピアノで言うと一番右のペダルを踏んだ時の効果です。

sendModulationValue(portNo, ch, value, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • value:Modulationのかけ具合を数値で指定
  • time:適応するタイミング(いつModulationを適応すかをミリ秒で指定)

Modulationとは:音の揺らぎです。

endAllSoundOff(portNo, ch, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • time:適応するタイミング(いつallSoundOffを適応すかをミリ秒で指定)
  • Sustainが動作していて、残響があったとしても即座に全ての音を停止する。AllNoteOffよりも強力。

sendAllNoteOff(portNo, ch, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • time:適応するタイミング(いつallNoteOffを適応すかをミリ秒で指定)

その名の通りで、全てのNoteOnをNoteOffにする。よって、Sustainが動作していて残響ある場合はこの範囲ではない。

sendResetAllController(portNo, ch, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • ch:送信先のMIDI機器(portNoで指定)のチャンネルを指定
  • time:適応するタイミング(いつResetAllControllerを適応すかをミリ秒で指定)

PitchBend, After-Touch等のコントローラを初期値に戻す。

sendRaw(portNo, msg, time);
  • portNo:送信先のMIDI機器(Port)を指定
  • msg:送信するMIDIメッセージをArray型で指定
  • time:適応するタイミング(いつSustainを適応すかをミリ秒で指定) 生のMIDIメッセージを送ることができます。例えばSysExを送信します。
initializePerformanceNow();

時間を初期化して、現在をスタート時間とします。再生する前に必ず実行してください。

さて、以上が Web MIDI API Wrapper が現状サポートしている MIDI メッセージになります。それでは引き続き実際に、 NoteOn/NoteOff と ProgramChange で馴染みのあるだろうこんなのを作ってみました。

/** 
 * 前回からの引き続きですので、Constructor は引き継いていでいます。
 * 詳しくは前回のPOSTを御覧ください。 
 */
wmaw.initializePerformanceNow();
wmaw.sendProgramChange(0, 0, 12, 0);

wmaw.sendNoteOn(0, 0, 62, 127, 0);
wmaw.sendNoteOff(0, 0, 62, 0, 120);

wmaw.sendNoteOn(0, 0, 69, 127, 120);
wmaw.sendNoteOff(0, 0, 69, 0, 240);

wmaw.sendNoteOn(0, 0, 74, 127, 240);
wmaw.sendNoteOff(0, 0, 74, 0, 360);

詳しく見てみます。

  • 5行目:時間を初期化
  • 6行目:音色を12(マリンバ)に変更
  • 8, 9行目:D4(レ)を120ms鳴らす
  • 11, 12行目:A4(ラ)を120ms鳴らす
  • 14, 15行目:D5(レ)を120ms鳴らす

ということが行われています。 実際にどうなるかというのは デモページ のここ▼に実装してありますので試してみてください。多分聞いたことがあると思いますよ。

では今回はこの辺にして、次回は初心に戻り、素で Web MIDI API を使う場合について説明していこうと思います!!

お楽しみに^^v

[更新履歴] 2013/08/26 sendRaw() の説明を追加しました。