CreoFUGA AWARD 2012 レセプションにてDJしますよ?

スクリーンショット 2012-12-21 4.59.03

12月27日に開催されるCreoFUGA AWARD 2012 レセプションというイベントにてDJさせて頂きます!Maltine Recordsと対局にあるようなポップ成分高めなクレオフーガのイベントに出るなんて結構レアだ!

M3プラプラしてたら、MIDIコン制作でお馴染みTANZVOLKさん経由でクレオフーガの社長さんと投資家の木下さんと知り合いになりました。音楽の話を色々してたら「パーティあるんだけど良いDJいない?」と言われまして「あわわ、わたくしでよければ!」とか言ってたら、晴れてやらせてくれる事になりました。せっかくなので「投稿作品をリアルタイムマッシュアップとかしますよぉぉぉ」とか言うと即採用してくれて、フットワーク軽さにビビる。っていうかこのメンツに並んでるの違和感ある。頑張る!!

投稿作品の中から厳選された曲を聴かせて貰ってるのですが、皆さんプロ並み作曲まじで凄いっす。作曲が苦手で、Maltine RecordsのTomad社長も痺れを切らして「8月にアルバム出さないとコバルト解散」とか言う始末でダメなんですが、改めて自分でやる必要ないなぁ。Max/MSPに任せたい!と思ってしまいました。

お得な情報のステマなんですけど(いやマーケティング?)、このBlogを読んでる方、限定で上記リンクから飛べるイベント申し込み欄インビテーションコード に “無料 かがみ” と入力すると入場料がタダになるらしいですよ!社長太っ腹ですね!!!

Max6の環境設定をいじってパフォーマンスをあげる:Max/MSP

パフォーマンス問題

現在開発中のコバルト爆弾αΩ用のDVJパッチは、複数の動画と音を同時に扱うため今までになく重く、フレームレート5fpsくらいしかでてなくて泣きそうでした。一応、Max上で見られるMSPのCPU仕様率は10%もいってないし、jit.qt.movie には loadram メッセージを送る事で動画はメモリに直接おいて、ボトルネックになりそうな部分は回避してるつもりなんですが、上手くいっていませんでした。

Max6をMacのアクティビティモニタでみると1つのコアしか使ってないみたいです。CPU使用率は130%前後。ハイパースレッディングが効いてるはずなので、1コア最大200%だとしても70%くらいCPU使えてないように思えます。メモリも8GB空いてる!なにが原因だろうと、まずはマルチコア使うように変更できないかな?とCycling74のフォーラムを漁ってはみたものの、マルチスレッドに関する話題はあるけど、マルチコアは無理みたいな話がありました。お前の実力は、こんなものなのか!?と疑問を持ちつつ探っていると、見つけました!!

解決策

スクリーンショット 2012-12-20 5.24.08

Maxの環境設定(Command + , )の中にあるThrottle関連の設定を変更します。なんとfpsが5~10もUPしました。特にQueue Throttle の値を 10 → 32000 へ上げたのが効いてるみたいです。jit.qt.movie や jit.matrix 重いようだったのですが、qmetro等のロープライオリティな処理をやり切れないまま、スケジュールが回ってたのかと推測できます。とりあえず、これでライブ出来そうです。以下、各パラメーターの適当な意訳。

  • Poll Throttle :CPUのスケジューラーがハイプライオリティイベントにおいて処理するイベントの数
  • Queue Throttle : ロープライオリティで処理するイベントの数
  • Redraw Queue Throttle :UI関連で処理するイベントの数?
  • Refresh Rate:UIの描画レート
  • Scheduler Rate:スケジューラーが呼ばれるインターバル
  • Scheduler Slop:ロープライオリティのスケジューラーが休止してる時間

スケジュールやらスレッドやらVMに関しては、あまり理解してないのですが動いてるので取り敢えず良いかな・・・たぶんPCの種類によってセッティングも変わってくるので、色々試して貰えればと思います!

参考サイト

JSオブジェクSignal入力に対する信号処理は不可:Max/MSP,JavaScript

スクリーンショット 2012-12-19 0.32.34

SignalをJavaScriptで信号処理したいぞー!というわけで調べてみたのですが、jsオブジェクトでSignalをスルーするコードしかわからなかったです。

追記

Cycling 74のフォーラムで質問してみたところ、信号処理はGen~かSDKを使ったC,Javaの開発でないと無理だったようです(T_T)

JavaScript

[javascript]

//signalをただスルーするパッチです。

inlets = 1;</pre>
outlets = 1;
autowatch = 1;

function signal() {

post(messagename + "\n");
post(arguments + "\n");
post(arrayfromargs(messagename, arguments) + "\n");

outlet(0, arrayfromargs(messagename, arguments));
}

[/javascript]

Max6のJavaScriptのバージョンは1.8.5:Max/MSP , JavaScript

スクリーンショット 2012-12-15 11.24.31

Max6のJavaScriptのバージョンはJavascript 1.8.5との事です → Announcing Max6JavaScriptのwikiを見てみると比較的新しいバージョンのようですね。

forEach文を使ってみたかったんですが、javascript1.6以降なら利用可能という事で、使ってみたところ動きました。

[javascript]

var nums = [0,122,122,113];

function bang(){
nums.forEach(function(i){post(i)}); //MaxWindowに0 122 122 113が表示される。
}

[/javascript]

動的に生成したパッチを繋ぐサンプル:Max/MSP , JavaScript

スクリーンショット 2012-12-15 4.03.31スクリーンショット 2012-12-15 4.04.42

スクリーンショット 2012-12-15 3.54.47

動的に(プログラム実行時に)生成したtoggleを繋いじゃいましょう!左上の数値を変更すると、makeToggleが呼ばれて、数値の数だけ繋がったtoggleが生成されます。clearToggleでtoggleを全部消すことが可能です。特に意味は無い、そこにMax6とJavaScriptがあったのと、夜眠れなくなったからやりました。

メタプログラミングという世界に突入だとコバルト爆弾αΩのΔが言ってました。夢が広がりそうな予感が!!!

余談ですが、ECMAscript5でArrayクラスに追加されたと噂のメソッドforEach使おうと思ったんですが、呼べなかったです。使えました!まさかMax6のJavaScriptは ECMAscript5 じゃない?3なのかな?調べたけれどわからなかったです。さらなる余談ですが4はActionScript3.0の原型らしいですね。どうりで似てるわけだ。

[javascript]
inlets = 1;
outlets = 0;

var p = this.patcher;
var toggles = new Array();

post(p);

function makeToggle(numPatch){

for(var i = 0 ; i < numPatch ; i++)
{
toggles.push( p.newdefault(Math.random() * p.wind.size[0],Math.random() * p.wind.size[1],"toggle") );

if(toggles[toggles.length-2] != null)
{
p.connect(toggles[toggles.length-1],0,toggles[toggles.length-2],0); //今生成したtoggleのoutletと一つ前に生成したtoggleのinletを繋ぐ
}
}
}

function clearToggle(){

for(var i = 0,length = toggles.length ; i < length;i++)
{
p.remove(toggles[i]);
}
}
[/javascript]