正確なメトロノーム #max7

揺れの少ない正確なメトロノームをつくりたい〜

スクリーンショット 2016-08-22 1.24.24

Maxの標準のmetroは精度が悪いと言われております。計測したわけでは無いですが16部音符で再生すると結構気になるくらいグルーヴ感があるようです。より正確なメトロノームを生成するにはMSPを使うのが良いとの事で以前某楽器メーカーの方に教わった方法を実装してみました。

サンプル


----------begin_max5_patcher----------
746.3ocyWkjaaCCEcs7oPfqcBDE0XAZuHEEAzRzNL0hxkjx0NAw.EdSW0yPG
1UfbAJxsQ.sWiJRY033JWKKGolMhfeyg26y2ev2Lv.LJcAQ.Leg4qMMLtYfg
g1jxfwl4FfD7hnoXgdY.F48oitBLr7mjjERsYbrPhkYBSI9sjz4Dd0JXYIoY
xoDod61arNCKitjxlbAmDIKudD7bqglNt5AnkqZv19bKy2rYOkGib4LR4F.f
gl.JqX6UqfFqwRA9Nyaq6mx185ExkS0mB.nLb6fApOCOMWvzTbbBQHLg0yc3
g3NJHTM3a2.pWGmgN0RZ3SBokoSlTr81wLGXflSNUe+C7mg43DhjvufvviJw
m09X89drgnNj3GRvqD6wb5bxQq3gtVORxGdZRd+NTxGkljPJt2c8B+7tu8qu
9i7O7870eIe8GyWeW95Oku9970etd2g09cG1taoQJCEPnsbFiSYxw3Hx1OsJ
aB50Za5c9WdE2NTZPtNFGs5nIJzBo4XXP4ye02Zk1+Oyi4wN53cHzWQm.cNr
.2VlIyo+imO4r2kTt0Iu8r6eN+pWtxz57VxWaWzCx2+MgEzIL7zZoMJr+E3m
oXsaaossNosG5zncP+SaR7DxpV1V1l7wNNGl0ivrIpxT5wZ4t+y01Tf1gcYa
JHu9ODe1kXQJeUqxkuwo3qE79gmlf2oCE7ixjxz1xOjMZOO50KsqsJcXG9xh
kRdFs5BTyzlGyIuKivhVdz7N.ssX2psUrZSS25yALkx18Ocpgox9icDhzLdT
EJpZ027AjFSDRJCKoEO+OrHuGslKowwD11QrwTgJHVSEqZeQdRgie+AGmF.m
cvbWhGTSvipVXegml.Gm9CNdOyvieSjOg8GdBZh+oGwSXSvS+Et2nnqdCMp+
AyggSayMWV4.Oa1bBWr4L0PonX4Uo5Rh9C0Sorxo5dK.bxbZ05czVv7hBhxh
pgY7xBTK7JaNAjjFS3rhZsp5XCT27sC9MfZHW6C
-----------end_max5_patcher-----------

HSL to RGB 変換 JS オブジェクト #max7

JSオブジェクト用コード

function rgbToHsl(r, g, b){

	r /= 255, g /= 255, b /= 255;

	var max = Math.max(r, g, b), min = Math.min(r, g, b);

	var h, s, l = (max + min) / 2;

if(max == min){
h = s = 0; // achromatic
}else{
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch(max){
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
outlet(0, h, s, l);
}

function hslToRgb(h, s, l){
var r, g, b;

if(s == 0){
r = g = b = l; // achromatic
}else{
function hue2rgb(p, q, t){
if(t < 0) t += 1; if(t > 1) t -= 1;
if(t < 1/6) return p + (q - p) * 6 * t;
if(t < 1/2) return q;
if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
return p;
}

var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
var p = 2 * l - q;
r = hue2rgb(p, q, h + 1/3);
g = hue2rgb(p, q, h);
b = hue2rgb(p, q, h - 1/3);
}
r = Math.round(r*255);
g = Math.round(g*255);
b = Math.round(b*255);
outlet(0,r, g, b);
}

引用元

RGB to HSL conversion


IntensityShuttleViewer 0.2.2 公開しました #max7

IntensityShuttleViewerとは?

MacでBlackmagic Design社 IntensityShuttle for ThunderboltのPreviewを簡単にできるアプリです。今回、久しぶりにバージョンアップをしました。詳しくは、以前の記事をご覧ください。

変更点

スクリーンショット 2016-03-12 16.13.24

  • 内部処理を見直し軽量化
  • GUIの変更
  • Max6 → Max7で書き換え
  • OS 10.11.3 対応

ダウンロード

こちらからどうぞ


Maya LTでモデリングした3DデータをMax7で使うぞい #max7 #MayaLT #Jitter

Maya LT を使ってモデリングしたい。

3Dプリンター持っていたり、VJで3Dモデル使ってみようと思って、Blenderを勉強してみようと思ったんですが、操作が難しすぎて挫折していました。そんな中、最近UnityやUnreal Engineのようなゲーム開発環境向けにMaya LTというソフトが比較的お手頃な価格で出ておました。ポリゴン書き出し数やレンダリングの制限があるようなのですが、Blenderよりは分かりやすい操作で、Maxで使うオブジェクトを作るにも丁度良さそうだったので使ってみる事に。

モデルを用意

 

スクリーンショット 2015-03-22 21.34.56 モデルを用意して、FBXで書き出し。

FBXをDAEに変換したい

Maya LTでつくったモデルは、FBX / OBJ / Maya LTフォーマットで書き出せます。一方、Maxのjit.gl.modelが対応しているフォーマットは、DAEとOBJです。それならOBJで書き出し読込すれば良さそうですが、頂点カラーの設定がどうにも読み込まれ無かったりで、使えませんでした。続いて、プランBとしてFBXをDAEに変換を試してみました。 スクリーンショット 2015-03-22 21.22.22 FBX→DAE変換は、AutoDesk公式でFBX Converterというアプリケーションがでております。これにMaya LTで書きだしたFBXをドラッグ&ドロップで読み込ませ、”Destination format”で”DAE Collada”を選択しエクスポートで変換完了。

MaxでDAEの読込表示

スクリーンショット 2015-03-22 22.08.13 jit.world(Max7からjit.gl系のセッティングが楽になりましたね)、jit.gl.model、jit.gl.handleを繋いで書きだしたDAEを読込むと。 

スクリーンショット 2015-03-22 23.04.21

表示できました。jit.gl.modelの@modeがdisplaylistかimmediateにしないと、Maya LTで設定した頂点カラーが描画されないので注意です。

おまけ:Maya LTでフェースに色をつける


頂点カラーでモデルに色を塗った場合、色の境界は自動的に補間されてなだらかに繋がってしまいます。それを防ぐために、フェース単位で色を塗る方法がありました。

Continue reading


jit.movie @output_texture 1 で取得したGPU上の動画テクスチャを指定した解像度でアスペクト比を保ったまま描画:#max7 #maxmsp #gen

GPU上の動画テクスチャのアスペクト比と解像度を固定したい

スクリーンショット 2015-02-15 18.44.32
あのタグで待ってるをMax7に対応させようと改良しています。Max7化のポイントは、jit.movieから直接GPUに動画テクスチャを送る機能を使ったパフォーマンスアップです。

ただし、問題がありました。jit.gl.pixの解像度が、第一インレットに入力される解像度に固定されてしまうという点です。これの何が問題かと言うと、VJソフトは16:9や4:3等の異なるアスペクト比や、HDやSD画質など異なる解像度を持つ動画を次々に切り替えて再生するので、そのままでは最終出力の解像度やアスペクト比も次々に変わってしまいます。横長の間延びした動画になってしまったり、SD解像度にHD画質の動画がひっぱられて解像度が落ちてしまったり。

そこで今回は、上記の画像のように16:9の画面に4:3の動画を、指定した解像度で出すのが目的となります。

パッチ

スクリーンショット 2015-02-15 18.40.16

ポイントは、jit.gl.pixの第一インレットに解像度を指定するMatrixを入力する所です。これを使ってjit.gl.pixの出力を常に同じ解像度に固定します。また第二インレットに jit.movie @output_texture 1 で取得した動画テクスチャを入れます。この動画テクスチャのアスペクト比を保持するために、解像度を別途jit.gl.pixに入力してあげる必要があります。なぜならjit.gl.pixでは、in2に入力したテクスチャから直接dimを取得できないためです。param dim2 としてパラメーターを与えています。

ちなみに動画テクスチャの解像度をjit.movieから取り出す際に、dimメッセージで取得すると正しい値が取れないので、getmoviedimを使いました。

jit.gl.pixの内部

スクリーンショット 2015-02-25 23.59.09

in1に入れたマトリクスは、全く利用しません。あくまで解像度を固定するために入力しています。テクスチャのアスペクト比の調整は、右側のコードで行って、最終的にin2の動画テクスチャをsampleオブジェクトで取り出します。

結果

スクリーンショット 2015-02-15 18.40.21

指定した解像度とアスペクト比にする事は出来ましたが、まだ問題があります。上記画像を見ると、左右領域にゴミが残ってしまっています。本来ここの領域は真っ黒にしたいのです。この原因はjit.gl.pixの内部でsampleのオプションを@boundmode clampにしているためです。@boundmodeはいくつか指定があるのですが、他のwrapやmirrorでももちろん駄目でした。指定した領域にテクスチャが無い場合に単純に黒くするオプションが欲しい所・・・。自分で黒く塗るプログラムを追加するのが解決策になりそうですが。

スクリーンショット 2015-02-15 18.45.05

動画の縁まで色が付いていると、こんな感じになってしまいます。

Continue reading


Cycling’74 Max7 勉強会 β #max7 #maxmsp #jitter

image06

先日 Cycling’74 Max7 勉強会(のβテスト開催)をDMM.make AKIBAの一角を間借りして開催しました。ちなみに急遽開催だったため、お呼び出来なかった方すみません。参加者は左から→@CO_CO_ / @ishicca / TY0004 / @raykunimoto / @nanagagatata + @mirrorboy

勉強会の内容

image04

半日かけてMax7の新機能を中心に、各々が気になる機能を好き勝手触るという無謀なやり方でしたが、結果的には皆で新機能に関する知見が共有できました。

image03

参加者の中ではBEAPとVIZZIEの扱いやすさが特に人気でした。サウンド・アートなどをされている神谷氏(@ishicca)。最近はデジタルを使わない作品が多いため、Maxを弄るのは久しぶりだったとのこと。

image00

チュートリアルをやるMaxレッスンの生徒さん。右側で実演される動画に合わせて、左側で実際にパッチを組んでいけるので、分かりやすい!

image01

チームラボでMaxを使ったサウンドデザインを担当されている國本氏(@raykunimoto) BEAP & Gen & Jiter を組み合わせようとしている強者。最近はGPU処理に興味があるようです。

image07

BeapやGroove~のTime Stretchをチェックするコバルト爆弾αΩのΣ氏(@nanagagatata)。写真には写ってないですが、monomeコントローラーがBEAPのモジュールで動くことも確認していました。

image02

自作コントローラー等を発表しているTanzvolk(@tanzvolk)の塩沢氏(@CO_CO_)。本日Max初挑戦との事でしたが、やはりBEAPの簡単さに驚いていた様子。Javaを使えるそうで、mxjにも興味があったようです。

新機能を触ってみて

 

  • BEAP / VIZZIE

    • BEAPはMSPの煩わしさが無しに簡単にシンセ組める
    • VIZZIEはBEAPとGUIが共通化されててお洒落度アップ
    • BEAP/VIZZIEの組み合わせで容易にオーディオビジュアルが可能
    • BEAPにMonome等のコントローラー連携パッチがビルトイン
    • 参加者には、とにかくBEAP大人気
  • Patch 復帰機能 / Clash Recovery

    • Max7がまだ不安定だったので、大活躍(笑)
  • Reference

    • サンプルがコピーできるように
    • 新機能は、Max7からと書いてあり親切
  • Tutorial

    • 動画をその場で見ながら1ステップごとにつくれるので初心者も安心
    • BEAPとVIZZIEに偏っており、3時間くらいやると終わってしまうので、今後拡充されるのを期待
  • Snipet

    • 便利貼り付け機能
  • grove~

    • 待望のTimeStretch / Pitch によりAbleton Live的な事がしやすく
  • jit.world

    • jit.gl は事前準備(jit.gl.render / jit.window / qmetro 等々)が結構面倒臭かったが、スグにGL環境を用意出来るようになった。
  • playlist

    • 動画や音声ファイルをパッチにドラッグドロップするだけで再生・ループ・ジャンプ・繰り返しなどが簡単にできてよい。
  • GUI

    • 音や映像の長さでデータを探せるのが便利。
    • フラットデザイン・プルプルコードになって、今までより気持よく操作できるとのご意見も。

Gen

image05

GenはMax6から入った機能なので、Max7の新機能という訳ではないのですが、参加者のリクエストに答えて少し解説しました。

  • jit.gen / jit.pix / jit.gl.pix の役割の違い

    • jit.gen と jit.pix は CPU処理 / jit.gl.pix はGPU処理
    • jit.gen は N次元 / jit.pix と jit.gl.pix は 2次元画像処理
  • jit.gl.pix は裏でGLSL(OpenGL Shader Language)として動作

    • jit.gl.pix は GLSL でいうpixcel shader / fragment shaderに相当
    • jit.genを使えば、vertex shaderっぽい事も可能
    • jit.gl.shaderを使えば、生GLSLも使える
    • jit.gl.pixで書いたシェーダは、exportcodeするとopenFrameworksやWebGLで使える
  • MSP処理をGPU上で行いたい(参加者の要望)

    • gen~ はCPUのコードとしてコンパイルされるので☓
    • オーディオ信号をjit.matrixへ書き込みjit.gl.pixでGPU処理してから、再びjit.matrixへ戻してMSP化する方法は出来るかも。今後試したい。
    • jit.gl.shaderのサンプルの中に音処理系もあったような・・・

勉強会をやってみて

Max7は、GUIの大幅な変化に目を奪われますが、特に初心者/久しぶりな方々でも取っ付き易く学んだり遊んだりできる機能が増えているという印象でした。とにかくBEAPがヤバイ楽しい。あとは、みんなで好きに弄るスタイルの勉強会であれば、余力で開催できそうなので、今後も機会があれば続けたいです。

text by @mirrorboy

 


jit.leapmotion リープモーションのステレオ赤外線カメラ画像取得できるExternalオブジェクト #maxmsp #jitter

スクリーンショット 2014-11-04 21.43.12
Jitter Externalの勉強がてらLeap Motionのステレオ赤外線カメラ画像を取得できるExternalオブジェクトを書いてみました。Mac OSX Yosemite環境にて開発してるので、それ以外で動くかは謎です。

ダウンロード

Cycling74 Max Tool。パッケージにまとめてあるので、Application/Max6.1/packages 以下に落としたファイルを置けば使えると思います。

注意点

スクリーンショット 2014-10-31 19.49.15

  • Leap Motionをインストールするとメニューバーに出てくるLeap Motionコントロールパネルにて、イメージを許可するにチェックをしないと動かないです。
  • 解像度は640×240で固定。Leap Motion SDKの仕様で、動作が重くなると自動的に640×120に変更されてしまう事があるのですが、その場合は縦に引き伸ばしています。

Max External開発 simplemaxオブジェクトのサンプルコードを読み解く #maxmsp

スクリーンショット 2014-10-25 2.08.50
MaxでもopenFrameworksみたいにCやC++の資産を活用したい!aka.leapmotionを参考にLeapMotion v2.のオブジェクトも開発してるので、そのうち公開したい!ということで、久しぶりにMax External勉強してます。

今回は、MaxSDKをダウンロードすると付いて来るXcodeプロジェクトサンプルから、simplemaxのコードを読んでみます。ちなみに Yosemite / Xcode6でやってます。

インクルード

#include "ext.h"	// standard Max include, always required
#include "ext_obex.h"	// required for new style Max object

この2つは大抵のオブジェクトでインクルードします。C言語の入門書におまじないって書いてあるやつですね。

Maxオブジェクトの構造体定義

////////////////////////// object struct
typedef struct _simplemax 
{
	t_object	ob;	// the object itself (must be first)
} t_simplemax;

プライベート変数やプロキシを利用する場合は、構造体メンバとして定義する必要があるそうです。MaxAPI Document参照。

関数プロトタイプ宣言

///////////////////////// function prototypes
//// standard set
void *simplemax_new(t_symbol *s, long argc, t_atom *argv);
void simplemax_free(t_simplemax *x);
void simplemax_assist(t_simplemax *x, void *b, long m, long a, char *s);

(Max側から呼び出したい)登録したいメソッドは、ここでプロトタイプ宣言しといてmain関数で登録する。maxsimpleがインスタンス化する時に必要なnewと解放する(消す)時に必要なfreeは必須。assist関数は、必ず必要なものでは無いようです。

クラスの登録

//////////////////////// global class pointer variable
void *simplemax_class;


int C74_EXPORT main(void)
{	
	// object initialization, NEW STYLE
	t_class *c;
	
	c = class_new("simplemax", (method)simplemax_new, (method)simplemax_free, (long)sizeof(t_simplemax), 
				  0L /* leave NULL!! */, A_GIMME, 0);
	
	/* you CAN'T call this from the patcher */
        class_addmethod(c, (method)simplemax_assist,"assist",A_CANT, 0);  
	
	class_register(CLASS_BOX, c); /* CLASS_NOBOX */
	simplemax_class = c;

	post("I am the simplemax object");
	return 0;
}

C74_EXPORTは、おまじないでMaxからこのmain関数が呼べるようになるマクロのようです。t_class *cのポインタにclass_newでクラスを生成しています。simplemax_new / simplemax_free は、プロトタイプ宣言してあるのでここで関数ポインタを渡してクラスメソッドとして登録していますね。さらにそのclassインスタンスにsimplemax_assistメソッドを登録しています。このメソッドは、inletやoutletにマウスポインタを合わせるとポップアップで説明がでてくるタイプのメソッド。class_registerでCLASS_BOXへクラスの登録をすることでMaxからsimplemaxクラスが探せるようになります。このmain関数で一度作成し登録したクラスは、グローバル変数のsimplemax_classにポインタを保存しておくみたい。たぶんMax起動時に一度だけこのMain関数が呼ばれてクラスだけ登録しておいて、simplemaxがインスタンス化される場合は使いまわしている。

メソッドの実装

void *simplemax_new(t_symbol *s, long argc, t_atom *argv)
{
	t_simplemax *x = NULL;
        long i;
    
	// object instantiation, NEW STYLE
	if ((x = (t_simplemax *)object_alloc(simplemax_class))) {
        object_post((t_object *)x, "a new %s object was instantiated: %p", s->s_name, x);
        object_post((t_object *)x, "it has %ld arguments", argc);
        
        for (i = 0; i < argc; i++) {
            if ((argv + i)->a_type == A_LONG) {
                object_post((t_object *)x, "arg %ld: long (%ld)", i, atom_getlong(argv+i));
            } else if ((argv + i)->a_type == A_FLOAT) {
                object_post((t_object *)x, "arg %ld: float (%f)", i, atom_getfloat(argv+i));
            } else if ((argv + i)->a_type == A_SYM) {
                object_post((t_object *)x, "arg %ld: symbol (%s)", i, atom_getsym(argv+i)->s_name);
            } else {
                object_error((t_object *)x, "forbidden argument");
            }
        }
	}
	return (x);
}

void simplemax_free(t_simplemax *x)
{
	;
}

void simplemax_assist(t_simplemax *x, void *b, long m, long a, char *s)
{
	if (m == ASSIST_INLET) { // inlet
		sprintf(s, "I am inlet %ld", a);
	} 
	else {	// outlet
		sprintf(s, "I am outlet %ld", a); 			
	}
}

simplemax_newはオブジェクトがインスタンス化される場合に呼ばれる。このサンプルは、渡された引数をひたすらMaxWindowにポストしてくれてる。argvにアーギュメントがargc個入っていて、t_atom型はa_typeメンバをみると型が書いてあるよう。atom型はゲット関数が用意されている。メンバ変数などの初期化は、ここに書けば良さそう。

simplemax_freeの方は特に何もしてないけど、インスタンス化したオブジェクト自体は裏で勝手に開放してくれているのかな?。自分でインスタンス化したオブジェクトがあればここで開放したい。simplemax_assistは、アシスト表示を使うときのテンプレートのようです。

メソッド追加(余談)

void simplemax_bang(t_simplemax*x)
{
    post("bang");
}

class_addmethod(c,(method)simplemax_bang,"bang", A_SYM,0);

このsimplemaxオブジェクトは、どんなメッセージにも反応しないサンプルとしてはかなり駄目な子です。そこでメソッドを定義して、クラスに登録してみたらちゃんと動きました。トップ絵はbangを送って動作させてる様子です。C言語だけどオブジェクト思考の匂いがする。