Scratch MIDI

こちらの記事は以前Quitaに書いた 「Scratch 3 MIDI Extension(機能拡張)」を加筆修正したものです。

MIT Scratch(スクラッチ)は、マサチューセッツ工科大学(MIT)メディアラボが開発した、子ども向けの無料プログラミング学習環境です。 ブロックをパズルのようにマウスでつなぎ合わせるだけで、直感的にアニメーションやゲームを作成できます。

Scratch 3.0の正式版は2019年1月2日リリースされ、HTML、CSS、JavaScriptのセットであるHTML5で記述されています。 また、ソースコードがGithubに公開されています。 この公開されているソースコードに自前の機能拡張(Extension)を追加する仕組みを持っています。 HTML5で記載されていますので、機能拡張の制作は敷居が低くなりました。

一方、ブラウザがMIDIを扱うWeb MIDI APIもHTML5で記述されていますので、ScratchでMIDIを扱う機能拡張を作成することができます。

Scratch からMIDIを扱うとは、例えばスクラッチキャットが壁にぶつかったらNote Onを出すことができます。 あるいは、鍵盤を押すと風船が出るといったプログラムを書くことができます。

Web MIDI APIを使った、MIDI機能拡張が使えるScratchは、こちらのサイトからアクセスしてください。

MIDI機能拡張の使い方

Scratch MIDIを立ち上げる前に、MIDIデバイスを接続して下さい。 立ち上げた後ではデバイスを認識してくれないことがあります。 Web MIDI APIに対応しているブラウザ Chrome や Edge でこちらのサイトにアクセスしてください。


Scratchを開きます。左のブロックパレットの下段の機能拡張追加をクリックします。 機能拡張を選択する画面が表示されます。

MIDI(WebMIDI)をクリックします。「mikatahara.github.ioの内容」と書かれたダイアログが表示されます。


このダイアログには、「Success MIDI!」Web MIDI APIが使えること、「Input Device」入力デバイスとして ここでは2つのデバイス 1:NSX-39と 2:NanoKEY2 KEYBOARDが接続されていること、 「Output Device」出力デバイスとして ここでは2つのデバイス 1:NSX-39と 2:NanoKEY2 CTRLが接続されていること、が表示されています。 ここで表示されている、"1", "2"は後で使いますので覚えておいて下さい。「OK]を押します。


左に示すようにWeb MIDIに関わるブロックが表示されます。

ここでは簡単に、NanoKEY2の鍵盤を押すと、スクラッチキャットが左に動くようにプログラミングします。


ここでは簡単に、anoKEY2の鍵盤を押すと、スクラッチキャットが左右に、 さらにピッチベンドを動かすとスクラッチキャットが上下に移動するようにプログラミングします。



ハットブロック

ハットブロックは、該当のチャンネルメッセージを受信した時に起動します。ただし、連続したメッセージを取り込むには不向きです。

ハットブロック いずれのメッセージを受信した時にイベントが発生するか?
すべてのチャンネルメッセージ
ノートンオンメッセージ
ノートンオフメッセージ
ピッチベンドメッセージ
プログラムチェンジメッセージ
コントロールチェンジメッセージ
決められたノート番号のノートンオンメッセージを受け取った時。
ここではノート番号48のノートオンを受け取った時イベントが発生する。
決められたノート番号のノートオフメッセージを受け取った時。
ここではノート番号48のノートオフを受け取った時イベントが発生する。

ただし、 は同時に使えません。

同様に、 は同時に使えません。


レポーターブロック

レポーターブロックは直近で受信したメッセージのデータ部分を保持しています。

レポーターブロック メッセージ
NoteOnメッセージに付随するノートの番号を保持しています。
NoteOnメッセージに付随するベロシティを保持しています。
ピッチベンドメッセージのMSBを保持しています。
プログラムチェンジメッセージのプログラムの番号を保持しています。
内臓しているカウンターの値です。4部音符の長さが480Tick、 4/4拍子の一小節、1920Tickで折り返します。 すなわち、レポーターブロックTicksは、1 - 1920 の値を出力します。
コントロールチェンジメッセージのデータを、コントロール番号ごとに保持しています。変数はコントロール番号で、1 - 128の値です。

時間の単位Tickを使って、4分音符でドラムを鳴らしたい時は以下のようにプログラムします。 4部音符単位で鳴らしたい時はTickの値が0, 480, 960, 1440になる時です。 しかし、Scratchはリアルタイムでぴったりの値を読み込むことはできません。 ですので、一回前の値を変数bticksに覚えておいて、一つ前の値と現在の値を比較して時間を判断しています。 特にゼロのところは、一つ前の値から現在値を引くとマイナスになっていることを見て判断しています。

Tick(ティック)については、こちらのページをご覧ください。


書き方としてはこちらの方が自然かもしれません。



メッセージブロック

メッセージを送信するためのブロックです。

メッセージブロック 送信メッセージ
NoteOnメッセージを送信します。
引数1:Channel Number  引数2:Note Number  引数3:Velocity
NoteOnメッセージを送信します。4つめの引数、ここでは480ティック後にNote Offを送ります。
NoteOffメッセージを送信します。
引数1:Channel Number  引数2:Note Number  引数3:Velocity
Program Changeメッセージを送信します。
引数1:Channel Number  引数2:Program Number
引数のティック数を待ちます。ここでは240ティック待ちます。
複数のデバイスが接続されている時、引数の番号のデバイスに対して送信する設定です。

ブーリアンブロック

ブーリアンブロックは1だけです。いずれかのチェンネルメッセージを受け取るとTrueになります。 挙動としてハットブロックのEVENTと同じと考えられます。



例えば次のようなプログラムでは、鍵盤を押すたびにスクラッチカットは動き回ります。




ピッチベンドの受信

ピッチベンドをUPの方へ動かすと、スクラッチキャットが上へ、ピッチベンドをDOWNの方へ動かすと、スクラッチキャットが下へ、動くプログラムです。

ハットブロックP.Bendは、ピッチベンドをメッセージのイベントを受け取った時に起動するブロックです。 レターブロックPBはピッチベンドの値を受け取ります。PBは0から127の値です。

スクラッチキャットをY軸上の上から下まで動かしたいので、(PB - 64) x 2 という式で、-128 から +126 までの数字を作っています。

しかし、このブロックではピッチベンドを素早く動かしたとににスクラッチキャットは付いてきません。ハットブロックP.Bend が連続したメッセージでは反応しない為です。


そこで、「ずっと」ブロックでY方向への移動を囲みます。この書き方だと、レターブロックPBを読みに行った時の値を取り込むことができます。 このブロックの方がピッチベンドの動きに付いてきます。

実験をYoutubeにアップしましたので、見てみてください。→ https://youtu.be/IcYNmreTAss