BPMに同期した映像の再生 #maxmsp #jitter

BPMに同期した映像の再生

スクリーンショット 2014-08-12 00.56.26
transportで指定したBPMとjit.qt.movieを同期させて、映像を再生する方法です。phasor~が指定したBar/Beatsでtransportに同期して0~1の信号を出すことができるので、その値をframecountに掛ける事で現在のフレームへジャンプさせて同期再生をする事ができます。例えば、2小節でjit.qt.movieの再生を繰り返したい場合は、phasor~のfrequencyアトリビュートに”2 0 0″と指定します。

Continue reading


Maxのパーティクルシステム その1: jit.p.shiva jit.p.vishnu jit.gen jit.gl.multiple #max6 #maxmsp #jitter #cycling74

スクリーンショット 2014-07-02 17.59.38

アニメのオープニング、特に芳文社系を見ているとタイトルが出現する辺りの画面遷移エフェクトとして、桜のパーティクルが多用されている事に気が付きました。さっそく桜パーティクルVJを行うべくjitterのパーティクルシステムを調査しました。

Jitter パーティクルシステム × jit.gl.multiple TIPS

  • jitter のデフォルトで付いてるパーティクルシステム jit.p.shiva / jit.p.vishnuでは、オブジェクトの回転処理が入っていないため、全部同じ向きに表示される。(トップの桜パーティクルは、全部同じ向きで残念な感じ。)
  • jit.gl.multiple に Rotate Array を指定できるので、jit.genなどで回転を考慮した処理を書けば、パーティクルを回転させら模様。
  • デフォルトのパーティクルシステムは、レファレンスを見る限り機能が少ない。ただしjit.p.shiva / jit.p.vishnu 自体は、32個までプレーンまで対応しているので、6プレーン以降に回転 / スケール / カラー などを保存してイジる処理を入れれば多機能なパーティクルシステムを実装できそう。
  • jit.gl.multiple を使って描画する場合には、寿命が無くなったパーティクルの描画をしないよう注意。
  • jit.gl.multiple & アルファチャンネル描画する場合は、オブジェクトの @depth_enable 0 @blend_enable 1 を設定。しないと、四角形の枠がでて酷い描画になる。

上記パッチを作るに辺り、ニコニ・コモンズのの素材を利用させて頂きました。今後、回転も考慮した桜パーティクルシステムを実装してみたいと思います。

パーティクルシステム テストパッチ

スクリーンショット 2014-07-02 18.30.10

jit.gen のコード (jit.p.vishnuに接続)

スクリーンショット 2014-07-02 18.26.11

jit.gl.multiple + アルファチャンネル無しのテクスチャ パーティクル

スクリーンショット 2014-07-02 16.59.29

透過を使わない場合は、depth_enable 1 で立体的なパーティクルが利用できる。画像は、NC帝國によるハンバーガーアイコン。1000個くらいが限界っぽい。

jit.gl.render によるプリミティブなパーティクル

スクリーンショット 2014-07-02 16.04.08

jit.gl.render のプリミティブな描画(Lines / strip) であれば、1万パーティクルで60fps近くで動作。


jit.gl.multiple と jit.gen を使って、 jit.gl オブジェクトを複数個描画 #maxmsp #jitter #gen

スクリーンショット 2014-06-21 5.32.03

jitterを使う上で避けては通れない、matrixとjit.gl.multiple(と、たぶん jit.meshも)を、そろそろ本腰入れて使って見ようと思いテストしてみました。jit.gl.videoplaneの動画をjit.genによるjit.matrixとjit.gl.multipleで大量に描画しています。

パッチ

スクリーンショット 2014-06-21 5.32.30

multiple の @targetname で複数個描画したいオブジェクト(今回は、jit.gl.videoplane)を名前で指定する必要があります。また、描画するオブジェクトのアトリビュートで @automatic 0 にしておかないと、コイツが別途描画されてしまいます。

jit.gen code

スクリーンショット 2014-06-21 5.32.33

メモ – jitterのパーティクルについて

jitterでパーティクル処理をするためには、個々のオブジェクトの状態をmatrixで保存するようですね。jit.genを使えばパーティクルを軽量かつ大量に描けるようです。ただjit.gen自体は、jit.gl.pixと違ってGPU処理では無く、CPU処理のコードにコンパイルされるので、jit.shivaなどのデフォルトのパーティクルオブジェクトと比較して、パフォーマンスがどうなのかは今度検証してみたいです。


jit.gl.lua 疑問点メモ : #jitter #maxmsp #max6

  • jit.qt.movie を jit.listener を使って、コールバック監視の方法がわからない。asyncreadを行ないたいが、listenerが使えないため困っている。

追記

jit.gl.luaの中でlistenerをつかった jit.qt.mov asyncread 後のevent受ける処理は、実装されてないそうです。Cycling74のサポートからのメールより


jit.gl.lua 内でjit.qt.mov + jit.gl.videoplane を使ってテクスチャを描画 : #maxmsp #jitter #max6

スクリーンショット 2014-05-12 17.55.48

 

Lua内でJitterのオブジェクトを使ってテクスチャ描画しよう!Lua以外は、jit.gl.* 系 で使ういつものパターンです。

結果

スクリーンショット 2014-05-12 17.54.52

解説


local mov = jit.new("jit.qt.movie");
local plane = jit.new("jit.gl.videoplane",this.drawto)

jitterのオブジェクトをインスタンス化します。jit.qt.movieは、pngを読み込みテクスチャに変換できます。jit.gl.videoplaneは、テクスチャを使って描画をしてくれます。


mov.adapt = 1
mov:read("cobalt_logo_sun.png")

ここではファイル名を指定して画像を読み込んでいます。luaにおけるオブジェクトのメソッド呼び出しは、 :(コロン)でプロパティは.(ドット)のようです。

 


local frame = jit.matrix(4,"char");
mov:matrixcalc(frame.name, frame.name)

plane:jit_matrix(frame.name);

jit.gl.videoplane へ jit.qt.movieのテクスチャの流し込み方になります。直接テクスチャを渡せれば良かったのですが出来なくて、一旦、jit.matrixへテクスチャを描画 (mov:matrixcalc(frame.name,frame.name)し、それをplaneへマッピングしています。jitter系のオブジェクトの受け渡しは、名前でやってるのが理解できます。(内部的にはポインタ渡してるのかな?)

コード

autogarbage = 1
autowatch = 1
gc = 1

local mov = jit.new("jit.qt.movie");
local plane = jit.new("jit.gl.videoplane",this.drawto)

function scriptload()

 mov.adapt = 1
 mov:read("cobalt_logo_sun.png"); 

 local frame = jit.matrix(4,"char");
 mov:matrixcalc(frame.name, frame.name)

 plane:jit_matrix(frame.name);
 plane.blend_enable = 1;
 plane.blend = "alphablend";

end

local rotate = 0;

function draw()

 plane.rotate = {rotate,0,0,1};
 rotate = rotate + 2;

end

jit.gl.lua の勉強は参考文献が少なくて中々はかどりませんが、jitterオブジェクトをガンガン使えるようになると、また世界が広がりそうです。(テキストのコーディングが増えたら、oFとかUnity使ったら良いんじゃないかという話にもなりそうw)


jit.qt.movie & jit.gl.videoplane で透過PNG/MOVを扱う時のメモ : #maxmsp #max6 #jitter

スクリーンショット 2014-05-09 23.01.50

jit.qt.movie

  • jit.gl.videoplane へ マトリクスを送るときに @adapt 1 としておくと元の解像度で出る

jit.gl.videoplane

  • @blend_enable 1 @blend alphablend  @depth_enable 0 :鉄板の設定
  • @automatic 0 : jit.gl.*は描画順が謎なので、bangで直接指定する。

透過MOV

  • Hapというコーデックがアツいらしい

jit.qt.movie で動画を1度最後まで再生し、その後 指定区間をループ

スクリーンショット 2014-03-16 21.20.49

@loopreport 1 にしておくと、再生終了時に jit.qt.movie の第2インレットから loopnotify bang が出力されるので、そのbangを使ってlooppointsを指定すれば、実現できました。looppointsは、動画をread する都度[ 0 最大値 ]が再設定されます。設定する値は QuickTime time valuesとヘルプパッチには書いてあるのですが、単位がわからず・・・