Critter&Guittari「Organelle」のファームウェアの内部を見てみた

以前の記事でちょっと取り上げましたが、Critter&Guittariの「Organelle」はユーザがPure Dataでプログラミングできる電子楽器です。Pure Dataを動かしているハードウェアはRaspberry Pi Compute Moduleです。(初代のOrganelleはSolidRunのi.MX6を使ったモジュールが使われていたようです。ちなみにi.MX6はKORG Drumlogueでも使われています。)

drumlogueでのlibpdを使った実装の参考にするために、Organelleのファームウェアはどのような設計になっているのか、調べてみました。調べてみましたと言っても、Devinにリポジトリの中身を調査してもらって、QAで答えてもらっています。Devin、とても便利です。

今回、関心はノブやキーなどのハードウェアからの入力がどのようにPure Dataパッチに渡されるか、という部分ですので、そこに絞って調べてみます。

まず、私はてっきりOrganelleはlibpdを使っていると思っていたのですが、そうではなく、pdを使用していました。システムは起動時にシステムとして用いるPure Dataパッチを/tmp/patch/にコピーして、それを/usr/bin/pdで起動します。

デフォルトでは起動されるパッチはmother.pdで、これがある意味、シェルのような(他のPure Dataパッチを呼び出す)役割をします。

なお、Organelleのpdにはabstractionがいくつか追加されており、それらはplatforms/organelle/rootfs/root/Pd/externalsに入っています。

一方、入力デバイスを管理しているモジュールのメインはOrganelle_OS/main.cppです。

ノブやキーの情報はmain.cppからOSCで送信されます。OSC(Open Sound Control)はUDPベースのプロトコルで、Pure DataはOSCに対応しており、メッセージの送受信が行えます。

OSCで送られてくる情報を待ち受けているのが、上述のmother.pdです。このmother.pdは結構長いパッチで、内部に複数のサブパッチを抱えています。サブパッチの依存関係を示すと以下のようになります。

[pd main]
  [pd audioIO]
    [pd vumeter]
      [pd peaks]
  [pd messageIO]
    [pd LED]
    [pd OLED]
    [pd quit]
    [pd keys]
    [pd footSwitch]
    [pd analog]
  [pd MIDI]
    [pd program-change-in]
      [pd chsel]
    [pd chsel]
    [pd chsel]
    [pd chsel]
    [pd chsel]
    [pd chsel]
    [pd chsel]
    [pd chsel]
    [pd chsel]
  [pd menuControl]
    [pd speedlim50]
  [pd META]
  [pd init]
    [pd checkAndRecallKnobState]

この中にある[messageIO]というサブパッチの下に、各入出力デバイスに対応したOSCメッセージを処理するサブパッチがあります。

例えば、物理的なノブを動かすと、main.cppから”/knobs a b c d e f”(a, b, c, dは各ノブの値、eはボリュームの値、fはエクスプレッションの値)というOSCメッセージが送信されます。

そのメッセージは[analog]サブパッチが受信します。このサブパッチは下図のようになっています。

これは一部分ですが、受信したOSCメッセージから各ノブごとの数値を取り出し、

生の値:knobNRaw(N=1,2,3,4)
0..1に正規化した値:knobN(N=1,2,3,4)

という変数にsendしていることが分かります。ユーザのパッチでは[r knob1]のように変数名を指定して書けば、ノブの値を受け取れるというわけです。

ユーザのパッチで利用できる変数名の一覧はマニュアルに書かれています。また、Organelleでのパッチ作成のチュートリアルが以下にあります。

Critter & Guitari

というわけで、ざっとOrganelle OSの動作を調べてみましたが、システム的なところが一部Pure Dataで書かれているのが興味深いです。上で見たのは主にハードウェアからPure Dataパッチへのデータ送信でしたが、逆にPure DataパッチからOSCでメッセージをsendすることによって、スクリーンやLEDを制御することもできるようになっています。

あと最後におまけですが、この記事で使った、Pure Dataパッチの中のサブパッチの依存関係をツリー構造で出力するPythonスクリプトを貼っておきます。ChatGPTで作ったものです。

コメント