【Max/MSP】ワイヤレスでシグナルストリーミング【netsend~】
こんばんは.1000chです. 世間は台風やなんだで大変ですね. 今週末人生初の四国旅の予定なのですが,はたしてどうなることやら.
今回はpythonではなく,ビジュアルプログラミング言語Maxの話題です.
シグナルをワイヤレス送信したい!
普段研究だったり趣味だったりで,Max/MSP使ってサウンドデータいじって遊んでいます. FFTだのFIR設計だの,簡単な信号処理はデフォルトで用意されているオブジェクト組み合わせるだけでできてしまいます. オーディオインタフェースつないでマルチチャンネルの音源をリアルタイムでごにょごにょするのもお手の物です.
で今回,オーディオインタフェースつないだマシンから別のマシンにシグナルを飛ばす必要が出まして,その方法を調べました. 日本語情報少ないんですよねー.
しらべる
ぐぐってみたところ有力そうな情報がちらほら.
Networking: Max talking to Max « Cycling 74 Topic: snding audio via UDP « Cycling 74 Topic: Send audio over wireless network « Cycling 74
ほぼCycling74のフォーラム情報ですねw
1つ目がオフィシャルの情報っぽく,したの方まで読んでいくとjitterのmatrixを使って音をstreamingする例も載っています. ですが今回は,2つ目の中で触れられているnetsend~オブジェクトを利用する例を備忘録がてら紹介します.
netsend~
詳細は[こちら]から(http://www.remu.fr/sound-delta/netsend~/?page_id=7). fork元?は手元(OSX 10.9.3)では動きませんでした.
DLしてmaxのexternalオブジェクト用ディレクトリに突っ込みましょう.
使い方
オフィシャルの説明パッチのスクショをば.
ヘルプが充実していて非常にうれしいですね.
maxのudpsend/recieveと同様,netsendもnetsend~/netrecieve~のペアで利用します.
netsend~オブジェクト
引数は
inletはチャンネル数分のsignal入力,outletは左が接続時にbangが,右が第一inletにbangが入ったときに詳細が出力されるモノっぽいです.
netrecieve~オブジェクト
引数は
inletは1つで各種messageを受け取り,様々な設定をするもの. outletはチャンネル数+1で,inletへbang時に右端から各種データが,それ以外からは受信したシグナルが流れていきます.
右端出力データのroutingはサンプル右下のrouteが参考になりそう.曰くパラメータは
- format
- channels
- framesize
- bitrate
- overflow
- underflow
だそうな.後半なんのこっちゃ
netrecieve~で適切にport指定した上で,netsend~に対応するIP/portへのconnectメッセージを送れば接続が確立されます.
この状態でnetsend~/netrecieve~両方共でaudioがonになれば,シグナルがストリーミングされるはず!
トラブルシュート
ネットワーク越しになるとデバッグやりづらいんですよね.. パッチが悪いのか環境が悪いのかわかんないし.
以下想定トラブルと対応.
接続先ipわかんね
ターミナル開いてifconfig. もしくはココの一番下参考
object作れないんだけど
netrecieve~はオブジェクトの作成時に指定portに対しlistenをはじめるっぽい. どこぞで使用中のport指定するとobject自体を作成できない.
アドレスもポートもあってるけどシグナルこない...
netsend~,netrecieve~ともにaudioがonになってるか確認. ezadc~なりezdac~なりつないでテスト.
netsend~の接続先が変わらない
netsend~オブジェクトが既にどこかに接続済みかも. 一度disconnectメッセージを与えて接続を解消する必要がある.
音がブツぎれ...
blocksizeの指定を変えてみる...くらいかなぁ chが多すぎる説もある.要調査
まとめ
非常に誰得な記事になったが,maxを使ってワイヤレスストリーミングする際にnetsend~は便利なので,入れておくとよさげなエクスターナルといえそう.
マルチチャンネルのサウンドストリーミングを実装したい人の参考になればコレ幸い.