はじめに

こんにちは。ワントゥーテンの稲田です。

突然ですが、皆さんはMax/MSP(以下、Max)というソフトウェアをご存知でしょうか?Maxは、ノードと呼ばれる箱を仮想の線で繋いでいくことで、専門的なプログラミング知識がなくてもインタラクティブなアート作品や音楽、マルチメディアコンテンツなどを開発できるビジュアルプログラミング環境です。
特に、リアルタイムでの柔軟な音声信号処理、いわゆるサウンドプログラミングの分野では非常に強力なツールとして世界中で知られています。

私たちワントゥーテンでも、インタラクティブなサウンドシステムを導入する際にデジタルインスタレーションやライブ演出といった案件で時折活用しています。

そんなMaxですが、2018年にリリースされたMax 8から約6年の時を経て、2024年11月、待望のメジャーアップデート版であるMax 9が登場しました。

UIの刷新やパフォーマンスの向上など、Max 9には数多くの新機能が搭載されています。その内、今回の記事で取り上げるのは、アプリケーション間連携の定番規格OSC通信の大幅な機能アップデートについてです。

OSC自体は以前のバージョンにも搭載されていましたが、従来の実装方法とは異なる方式が組み込まれ、より直感的に、そして格段に扱いやすくなりました。

本記事では、この「生まれ変わった」OSC通信の仕組みと使い方を徹底解説していきます。


Max9ではOSCがどう変わった?

Max 9におけるOSCの新機能はオブジェクトの「パラメータ(Parameter)」をOSCと直接結びつける仕組みが導入されたことです。

従来のOSCが抱えていた課題

これまでのMaxでOSC通信を実装するには、udpsendudpreceiveといったオブジェクトを使い、手作業で仕組みを構築する方法が一般的だったと思います。

例えば、スライダーの値をOSCで送信するには、/slider/1のようなOSCアドレスを文字列として作成し、スライダーの値と結合して送信する、というパッチを組む必要がありました。受信側では、送られてきたアドレスを解析し、目的のスライダーに値を送るためのルーティング処理を組む、といった具合です。この方法は自由度が高い反面、以下のようなデメリットがありました。

  • 手間がかかる: アドレスの文字列作成やルーティングを全て手動でパッチングする必要がある。
  • パッチが複雑化する: オブジェクトが増えるほど、パッチの見た目が複雑になり、管理が難しくなる。

Max 9におけるOSCの新機能

Max 9で新たに導入されたOSCの機能は、主に以下の3つです:

  1. グローバル設定による設定の一元化
    • Maxアプリケーション全体で利用するOSCの送受信アドレスやポート番号を、環境設定から一元的に管理できるようになった
  2. パラメータの自動的なOSC対応
    • パッチ内のUIオブジェクトなどが持つ「パラメータモード」を有効にするだけで、そのオブジェクトが自動的にOSCの操作対象となります。従来必須だった、OSCメッセージを解析して目的のオブジェクトに値を振り分ける、といった複雑な手動パッチングが不要になった
  3. 状態を確認するための専用オブジェクト
    • この新しい仕組みを円滑に利用するため、param.oscosc.codeboxといった専用のオブジェクトが追加されました。これらを使うことで、現在の設定状況や実際の通信内容を簡単に確認・デバッグできる

以降の章では、これらの新機能がどのように連携し、私たちの開発を効率化してくれるのかを詳しく見ていきましょう。


グローバル設定による設定の一元化

Max 9では、Options > Preferencesの中に、上の画像のようにOSC専用の設定画面が新たに追加されました。

従来はパッチごと、あるいはudpsendのようなオブジェクトごとに設定する必要があったOSCの基本的な挙動を、この画面でまとめて管理できるようになったのが大きなポイントです。

では、各項目がどのような意味を持つのか、カテゴリに分けて見ていきましょう。

送信・受信の基本設定

まずは、OSCの送受信をコントロールする基本的な項目です。

  • Send OSC Default / Receive OSC Default
    • Max全体でOSCの送信・受信を有効にするかのマスター設定です。ここをUDPに設定することで、OSCの送受信それぞれの機能が有効化されます
  • Default Remote UDP Address / Port
    • OSCを送信する先の、デフォルトのIPアドレスとポート番号です(127.0.0.1ローカルホスト=自分自身のPCを指します)
  • Default Local UDP Port
    • 外部からOSCメッセージを受信するための、デフォルトのポート番号です

アドレスとデータ形式の自動化設定

次に、OSCアドレスの形式や送信する値のデータ形式を自動化するための項目です。

  • OSC Address Prefix Type / OSC Address Prefix
    • パラメータから自動生成されるOSCアドレスの先頭に、どのような文字列(プリフィックス)を割り当てるかの設定。
Prefix Type説明
None先頭文字無し
Patcher Nameパッチャー名
CustomOSC Address Prefixに指定した文字列
  • OSC Value To Send
    • 送信する値のデフォルト形式を設定します。主には「生のデータ or 0-1で正規化されたデータ」の2種類と、それぞれの情報をアドレスの末尾に添付するか否かの違いです。
項目名送信データの形式アドレスの末尾
Raw Only生のデータ無し
Raw With Suffix生のデータ“/raw”
Normalized Only0-1で正規化された値無し
Normalized With Suffix0-1で正規化された値“/normalized”
Raw & NormalizedRawとNormalizedが両方送信される“/raw”
“/normalized”
  • Use /param Prefix For Parameters
    • これを有効にすると、パラメータのOSCアドレスに自動的に/paramという階層が追加されます
  • OSC Enabled Default
    • 新しく作成したオブジェクトのパラメータモードを、デフォルトでOSCアドレスの生成を有効にするかの設定です。
      チェックを入れておくと、パッチ上に追加されたパラメーターモードのオブジェクトは全てデフォルトでOSCアドレスが割り当てられます。

以上が新たに追加されたOSCの設定についてでした。
次の章では実際にパッチ上でOSC通信を用いらデータのやりとりの方法について説明します。


新機能を活用したOSC通信の実践

それでは実際にパッチ上でOSC通信を行う手順を見ていきます。

1.事前準備

新規パッチを作成し、引数に「@auto 1 @outputmode 2」を指定したparam.oscオブジェクト とosc.codeboxオブジェクトをパッチに追加し、下図のように接続する。

この工程はあくまでデバッグ機能の下準備です。
param.oscとosc.codeboxを使うことで、現在のOSCに関する設定状況や実際の通信内容を簡単に確認・デバッグできるため、アドレスやデータが正しく通信できているかが見てわかるため便利です。

2.OSC機能を持つオブジェクトを追加する

今回はsliderオブジェクトを例としてとりあげます。
先述したとおり、新機能におけるOSCのアドレスとデータのやりとりはParameter Modeのオブジェクトに紐づく設計になっているようです。

一部のオブジェクト(主にlive.系のもの)はデフォルトでParameter Modeが有効化されているのですが、そうじゃないオブジェクトについては手動で有効化する必要があります。

まず、sliderオブジェクトを先程のパッチに追加します。

この状態ではParameter Modeが無効なため、Inspector画面より「Parameter Mode Enable」という項目を見つけて有効化します。

チェックが入っていればOK

OSCのグローバル設定よりOSC Enabled Defaultが有効化されていれば、この時点でsliderをOSCの送受信可能なオブジェクトとして扱うことができます。

もしOSC Enabled Defaultが無効の場合は、sliderのInspectorより「OSC Enabled」という項目を見つけて、Enabledに設定することでsliderオブジェクトのOSC機能が使用可能となります(下図参照)

では、試しに先ほど追加したsliderオブジェクトの値を変更してみましょう。

パッチがロックされていない状態の場合は「Ctrl+ドラッグ」、パッチがロックされている場合は通常のドラッグで、sliderの値を変更してみます。

osc.codebox上へ、sliderオブジェクトに割り当てられたOSCアドレスと、送信中の値が表示されましたね。
下図のようにsliderの動きに合わせてcodebox内の情報が正しく対応していれば成功です。

このように、Parameter Modeが適用可能なオブジェクトであれば、パッチに追加してParameter Modeを有効化するだけでOSCの送受信の準備が完了となります。
live.系のオブジェクトに関してはデフォルトでParamert Modeが有効となっているため、オブジェクトを追加するだけでOSCの機能が使えるためものすごくお手軽ですね。

3.実際にアプリケーション間でのOSC通信を試してみる

それでは実際に別のアプリケーションとOSC通信を行ってみましょう。
ここでは、Maxと同じくビジュアル型プログラミングのvvvv gammaを通信相手として使用しています。

MaxからOSCを送信する

まずはMaxが送信したOSCをvvvvで受信するテストです。
Max側のグローバル設定で指定したDefault Remote UDP Address / Portをvvvv側に反映し、codeboxに表示されているアドレス(今回でいうと"/param/slider")をvvvv側の受けるアドレスに指定することで、Maxが送信したsliderのデータをvvvvで受信することができます。

下図の画面右側がvvvvの画面なのですが、Max上のスライダーの値の動きに合わせて、画面下のナンバーボックスが変化していることがわかります。

外部アプリ(vvvv)からOSCを受信する

次に、Max側でOSCを受信してみます。
先程の送信時と同様にsliderに割り当てられたアドレスと、グローバル設定で指定したDefault Local UDP Port のポート番号に対してvvvvからOSCを送信してみます。

下図右側はvvvvの画面ですが、下部のナンバーボックスの数値を変更するとvvvvからOSCが送信される仕組みです。

vvvv側の数値の変更に合わせてMax側のsliderの値が変化していることがわかります。
このように受信したデータが直接オブジェクトに反映されるため、その後の処理へも扱いやすいですね。

先程までの例は数値データの送受信を行っていましたが、texteditオブジェクトを使うと文字列の送受信も可能なようです。


まとめ

今回は、Max 9で新しくなったOSCの機能について、設定方法から実践的な使い方までを解説しました。

従来のudpsend/udpreceiveを使った手動での実装とは異なり、オブジェクトの「パラメータモード」を有効にするだけで、驚くほど簡単に外部アプリケーションとの連携が実現できることわかりました。

ぜひ皆さんも、この生まれ変わったMax 9のOSC機能を活用して、様々なアプリケーションやデバイスとの連携を楽しんでみてください!



■ワントゥーテンでは中途採用募集中です!

1→10(ワントゥーテン)のカルチャーや、作品のクリエイティブに共感し、自身のより高い成長を求めている方からのご応募をお待ちしています!