Scratch と OSC の連携


Scratch は、初心者向けのプログラミング言語学習環境です。
OSC (OpenSound Control) は、MIDI の代替となる電子楽器用の通信プロトコルです。

注意
Scratch の最新版は バージョン 2.0 ですが。
この記事は バージョン 1.4 について述べています。
Scratch のサイト からダウンロードできます。

Scratch と外部プログラムの連携
Scratch 1.4 には 遠隔センサー (Remote Sensors) という機能があります。

Scratch と OSC の連携
Scratch の遠隔センサーと、OSC を橋渡しする Scratch OSC Bridge (以降 Bridge と称する) というアプリがあります。
Windows、MAC、Linux で動作します。

遠隔センサーのメッセージには、broadcast と sensor-update の2種類がありますが。
Bridge では、sensor-update を OSC メッセージとしてサポートしています。
broadcast は、Scratch と Bridge との間のコマンドして使用しています。

注意
Bridge は Java SE 6 を必要とします。
MAC の場合は ダウンロード – Java for OS X 2015-001 から

動作確認1 : Scratch から OSC Server へ
Scratch にて画像をクリックすると、
OSC Server にて画像に対応する文字が表示する。
OSC Server は pyOSC を使って Python で記述しました。

設定
(1) Scratch にて to_osc.sb を起動する。
20160827_scratch_to_osc

(2) Bridge を起動する。
「Connected with Scratch」が表示される。
送信先ホスト (HOST IP-ADDRESS) はデフォルトの「127.0.0.1」のままに。
送信先ポート (OUTGOING PORT) はデフォルトの「9000」のままに。
20160827_bridge_to_osc

(3) ターミナルにて、osc_server.py を起動する。

操作
(1) Scratch の画像をクリックする。
変数 /animal に値を代入し、sensor-update メッセージを送信する。
(2) Bridge にて、OSC メッセージに変換し、送信する。
(3) OSC Server にて、OSCメッセージを受信する。
ターミナルに、値に対応する文字を表示する。
画像と数字とメッセージの対応。
ねこ : 1:cat
いぬ : 2:dog
うま : 3:horse

プログラムの工夫
Scratch では、変数の値が変わった時に、sensor-update メッセージが送信されます。
「ねこ」の画像を続けてクリックしても、最初の1回しか送信されないという不具合が生じます。
これを回避するために、変数の値を設定してから、1秒後に画像以外の数字(0)を送っています。

動作確認2 : OSC Client から Scratch へ
OSC Client にて数字を入力すると、Scratch にて猫が移動する。
OSC Client は、pyOSC を使って Python で記述しました。

設定
(1) Scratch にて from_osc.sb を起動する。
20160827_scratch_from_osc

(2) Bridge を起動する。
「Connected with Scratch」が表示される。
「NOW LISTENING TO OSC PORT」に「8000」に表示される
「RECIEVED OSC ADDRESS」と「SEND THESE OSC ADDRESS TO SCRATCH」に「/MOVE」が表示される。
20160827_bridge_to_osc

(3) ターミナルにて、osc_client.py を起動する。

操作
(1) ターミナルにて、コマンド(数字)を入力する。
OSCメッセージ「/move 数字」を送信する。
(2) Bridge にて、sensor-update メッセージに変換し、送信する。
(3) Scratch にて、変数「/move」の値が変更される。
値に応じて、画像が移動する。

コマンドは、数字1文字です。
0 : 中心に移動する
1: 左に移動する
2 : 右に移動する
3 : 上に移動する
4 : 下に移動する

プログラムの工夫
Scratch では、sensor-update メッセージを受け取った時というイベントが無いようです。
sensor-update メッセージを受け取ると、対応する変数に値が設定されます。
変数が同じ値を保持するために、右に移動するというコマンドを送ると、いつまでも右に移動し続けるという不具合が生じます。
これを回避するために、OSC Client では、コマンドの数字を送ってから、1秒後にコマンド以外の数字(−1)を送っています。
Scratch では、変数の更新を1秒間隔にすることで、コマンドが一度実行された後は何もしないという動作を実現しています。
う〜ん。もっといいう手があるかもしれない。

プログラム
作成したプログラムは Github で公開しました。

参考
Scratch OSC Bridge
Scratch OSC Bridge 用の環境のセットアップとテストの手順


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です