jit.gl.pix で Gold Noise #max8 #jitter

リアルタイムグラフィックスの数学を1日1サンプルずつ進めているのですが、ノイズ生成の章でGenには無いビット演算を使っていて困りました。

別のアルゴリズムを探してみようと思い、出会ったのがGold Noiseです。少数の精度が低くても使えると書いてありました。名前がカッコイイ・・・

Gif

Blog容量の問題でフレームレート解像度は下がってますが、辺なパターンもなく良い感じでした

code


----------begin_max5_patcher----------
705.3ocwW10aZCCEF95vuBKeYGE4ORBI6evtaec2TUUJ3QCJwA43vXpp+2m+
HzMlnkyvQdHAV1wgW+jWe74jmlkfen6fnGidO5anjjmlkj3FxNPxX+Dba0gU
MU8togkhez8vV7b+kzhCZ2verRU0h5Eh0Hdd1wKKGZ6FzMBs6doiiVu1cKl+
la4uLU+7z+bmvuZvXzciWZWkd0i0xM2qDqz9qxWxVPliXjbaS4RWGyPubOFk
qkGElXG64Yyr+LOLNuAQIlOvAL85.jxRsLkwntFxaCHc5.b2GfyF+JYqvwFa
oiJZYDMOxBJb7XggWYgsgyil0cCXzXEWGZ4NjxR8VV4hr2hL1zQ1W9zm+JCN
cKCJlKsf6ah19xuqpLqAv3kGj4U5LONKZaK0UR3rkEBaoK8dVVzXqQH2neDN
doAgmGrTZzv6V3jwCgLdAIxmnrWrBQPvyiynW4YJYtJT3o9iVtPgJr+KICHA
YczkQ15dGXxnkWooQ7LkmFYz7UQuoqYsPppz0c1BVxoEDNblyCZi5XE0zbRz
x94gVI56ZFLHKQYTl8KXjSCCYpu5ZZZdzP1rNQuRgnjyvG9RAg4YtLC73k3y
aZC2qqaEvqnNnW1azmJ3QyljcpVvvETI0irw+G1B5lAtoV92u+tSD63mBbe2
fZ0wkzw28F8agVK500R6gNx+XR1iPQTzcm8gJXkRAnj8cRBVIao+WToiKmfT
xdN6kYhdxj5TqEpWeOJXHoPjlOEFGCJjAqDGhwwhkw411eFiiFlwU.4wY9D.
IKCZDWvJA4w4TDvw.cHR1TnDj8hrIgIBzH4f20WBQIxDDIW.UnSQxmNqZ2t8
BU+3rcZXxTusyE7UL20sV56xccUh80GmuKqLtRYxwpMIXGTt0E9PtuBJbamI
LVNTOFIanyHoqJ.YUqneWkGD71Z8hMBId1yy9EPHVci9
-----------end_max5_patcher-----------

jit.gl.pixのコードなので注意

余談

記事を書き終わって、そういえば・・・大昔に自分でjit.gl.pixで使うnoise調べてましたわ。今回とアルゴリズム違うのでこちらもご参照

Gen で配列をつくる検討 #Max8

リアルタイムグラフィックスの数学勉強中

リアルタイムグラフィックスの数学

シェーダーの勉強がてら、こちらの書籍をMax8上のGenに移植しています。

このような画像作成の学習を通して、数学やシェーダーの理解が向上できそうです。しかし、Max8で実装していく上では直接的に配列が使えないようで少し困っていました。

解決案(とりあえず)

かなり無理矢理ですが、整数の入力に対して変数を返せば良いと考えてSubpatchを作ってみました。と言ってもselector objectなんですが、0はじまりにしてあります。

Length3の配列

配列の長さを3以上に増やしたければ、根性でinletの数を増やさなければなりません。genにおける配列実装に良い解決案をご存知の方いたらコメント/Twitter等で教えて頂けますとありがたいです。

使用例

色の配列を扱う例(arr3に繋いだ三つ目のベクトルが出力されます)

Package Managerで配布されているease objectを使いやすくしてイージング #max8

Demo

今回作成したpatch

Package Manager で配布されているease

Max8のパッケージマネージャーからダウンロードできるCycling 74お手製のEase Packageですが、自分の目的に合わせて使うのが若干めんどくさい&毎回この作業やってる気がするので改良版置いておきます。

Ease Object 改良点

スクリーンショット 2022-08-31 22.22.16
自分用 改良版
改良ポイントは1つ前の最終的な値を記憶しておいて、次の開始値として利用するようにしています。A,B,Cとポイントを次々に指定して移動させるみたいなときに使いやすいです。

Code

———-begin_max5_patcher———-
1042.3ocyYsriaaCEcs8WAgVkB3ZvWhTJqRBR61tnEcSQw.ZYNS0DYJCIpzo
MHe.ce+YJP9d519KT9PxiyXaIFa5AwKrsjI4gmy8bIuT9Cymkrp9AYaB3kfe
ALa1GlOal6V1aLq+5YIaDOTTIZcMKondyFoRmrv+aZ4CZ28+NQqD7CqtWVnA
u3e+6+4+9zeMzlsBcwuUpt6lFyO5whjuDt.Pf12SYT6G12A+ZeWTcaJUURsC
ST+MusVoUhMRGdudk4mqUfeTnZAuotZcxicstSOzWX+cKW65U8p6+VDMYuAr
s7OcCHMaIzd2ONet8sEwPN99NUwKJU5uYmRzHaMsVnKqU2TUpjE0cJWGvmVq
vnzkLyKJCxHDLmmku.fPYVQKmuLcA.CmR5lVTvIwk8FN.9oRSv5RnNBmZYYO
YyPwhrnXR12Ja0feVT0IGwvSo6QDt6hXPD34PDGPIeoFNJ7wTVxIm5viN0QG
N0yFl.9lo+isRO5II6F4AE21mglWpVKcjibFLWI+cC1GDA2JJdG.tzPK3xwh
gLWXCQ1KFhOkPfCUHniIDWgn6PNUjim3KMdhiW7rpVrdirsE.GQGxcQSBK2t
nBGNdzDEpLjF4n4IXXmZvyNpiEwHGlISP7PLvGmx3ijIyOImu0DILdwguDSE
HL9icaYP8kavPQJkMiE4nr0rJtSd.IMtRHMeZBRLlYyGovXQP5yiMVCp.q.U
iQPjOnwbE5POqzTxQH3HKWYrqqDp6reddj0X1MSfIKFH0mAlBiTdHYuU6ZLk
IqkM2HUBScx6uP9o46N3ustYivMUYwKTKsED+paMUDaq.Df24vJpqpa7yE3R
NEg3rEluQRYYLh8aPJGlZq.YOE5zhJws6LBlGoEzI3HmJDn6neion4N37ulc
G1CDL9R48pxvB5iqJjPUETVR.L+L3oPqa5JGFb6U9feu++Ks5aheuKTFIR1Z
d94YGhoXTp11ouownwx.1COyKK7Ln+EkazizXU2V1WA5gYzCQPvYzCMHWY4I
G9LJO9gYx0BXHVHmfI3CSSRB4XJnqvQx5e3.Q9DYnK8DY6SUWObKS+jmVniN
16+47ustqoX.u9y6CdjQqks5Rk6gAsWarKJYazQk3PABE.PzHfCNPbPWHNz.
vICGABYywmDIRLPJK+YCIdHpGKBgI2fLEROQhqaVKcK8Cu9P+DMeGznKCZZn
56EGIs1A7THwiERnoPhFKjlR8PYQ.I9yVFGOnLN5mIwQJOHHnI3qQdPZH6tE
CyIIDKCAFCjBZ6fXrgc14Id9RRDa29dYSaeqcfXJ95d+iTHag6xRk+R2wBSZ
juubn8txlRDMlJxzlxw5Z7+4hOv7OdhjM0F6gxTqt2gXnmARWgc1+Hx1sBOS
b0+M+iy+eTl6qZB
———–end_max5_patcher———–

これをコピーしてMax8にペーストするとそのまま使えると思います。ease packageに依存しているので、Menu -> File -> Show Package Manager からeaseをインストールしてご利用ください。

Node for Max を用いて、定形外のUDPデータを受信 #Max8 #n4m

Maxの生命線UDPで問題が・・・

他のアプリを繋いでくれる updreceive

センシングや3D(Unity / UE / Arduino) 等とのコミュニケーション時に重宝するudprecieve ですが、udpを受信する場合に、メッセージが4bytesに揃っていなかったり長すぎた場合にアトリビュートなどの設定やOSC-routeを利用しても上手く受信できない事があります。

OSC Bad message name string: DataAfterAlignedString: Unreasonably long string Dropping entire message. / OSC packet size not a multiple of 4 byte dropping.

Max内にどうにかする方法としてNode for Maxが利用できます。

Node for Max で UDP receive

node object は、とりあえずHelpからコピペでOK

node.script objectjs をHelpからコピペし、ダブルクリックするとテキストエディターが開くので書き換えます。Maxのテキストエディタはクソなので、VS Code使ってます。

udpreceive.js

const dgram = require('dgram');
const IP = '192.168.1.1';
const PORT = 8888;
const socket = dgram.createSocket('udp4');
socket.on('listening', () => {
    const address = socket.address();
    console.log('UDP socket listening on ' + address.address + ":" + address.port);
});
socket.on('message', (message, remote) => {
    console.log(remote.address + ':' + remote.port +' - ' + message);
	/*
		処理
	*/
});
socket.bind(PORT, IP);

とくに外部ライブラリを入れる事なくできました!JS的に正しい書き方なのかは謎。外部ライブラリのOSC-routeなどを使わなくても、テキスト処理はスクリプト言語の十八番でしょうから楽ちんです。

感想

昔、VJソフトのあのタグをつくるためにMaxのjs objectを触っていた頃は、jsの文法を読んで型なしでプロトタイプ継承とか難しいなと思い、深入りしませんでした。時は経ち最近のjsは今どきな文法が色々あって使いやすくなってそうです。

Node.jsやnpmエコシステムなどでは当たり前の事が、Maxおじさんからすると凄いみたいな事は非常に沢山ありそうです。(Blogを適当に放置してる事から分かるように)今までネットワーク / スクリプト言語は触れないように生きてきましたが、そろそろNode.jsから色々触ってみようかなと思いました。

Reference

Gen Subpatcher & Subparam 使い方

jit.pix内部のfaderという変数をイジれるようになってる。

jit.pixの中身

gen subpatcherはgen @gen *** で指定。またパラメーターをイジる場合は、setparamを使用する。ちなみにparamは外部公開する変数。

gen subpatcherの中身

外部からイジるパラメーターはparamで指定。