jit.gl.multiples or instancing, jit.mo and some audio reactive goodies
Might be a long post...it's a bunch of notes about this video by Federico. He's using Max 8.something, I'm hoping this knowledge is not obsolete with the new 3d jitter geom stuff that we got in Max 9!
ANYWAY. To instance jit.gl shapes we use something called jit.gl.multiple (I think this used to be called jit.gl.multipleS) and plug it into the jit.gl.mesh we want to instance all over the place. It takes a few specific attributes, which will create extra inputs on the top of the node when we specify we are using them. Notice we specify the "context" or the name of the gl.world (myWorld) and the number of inputs we want (3). We also have to use the @glparam to specify the parameters...for whatever reason.
First lets tackle what we want to plug into the position. All of these inputs will need to be matrices. We could use a noise with 3 values as a position vector. We'd use the "jit.noise" node.
This creates values between 0 and 1. We'll need to remap them.
So here I've specified 3 dimensions to the noise for the X Y and Z value. It's of type float32 and I want 100 values, because I want 100 instanced objects.
I follow it up with a jit.map where I'm taking the values 0. and 1. (remember your .'s ) and mapping that between -1 and 1. After that, I use a jit.mult (this deals with matrices - a normal * doesn't work with them) to control the size of the values. We could technically do that in the jit.map eg 0. 1. -10. 10., but I guess it's easier to tweak this one object (?)
This now can go into the first input of the jit.gl.multiple. You should see 100 instances of your gridshape in random positions.
We can use the same noise function for rotation, since that expects three values too. However we'll need to jit.mult them by 360, as it will require a rotation value in degrees.
Scale can also take the noise function as is, if you wish to have non-uniform scale. If we have a cube to begin with, we'll end up with a bunch of randomly scaled cuboids. IF however you wish to uniformly scale them, you can alter the noise node ever so slightly to pass the same value for XYZ-
Here we make a single random value (well, actuallly a hundred of them) between 0 and 1. Then by passing it to a jit.matrix with 3 dimensions specified, the X, Y and Z values each take the same value to provide uniform scaling. This matrix can be scaled with jit.mult too.
Animation!
Ok, so we've got a bunch of random gridshapes doing nothing now... What if we want to move them a bit? Well there is a library of nodes under the "jit.mo" family, which can help us.
We can add some random rotation to objects by using "jit.mo.perlin" instead of the jit.noise. Though to be properly random, we'll use three of them because it only makes a single dimension stream of randomness.
So here, we scale the values by 360 to get them in degree scale. And we use a jit.mo.join to make a matrix. Also we pass a speed message that controls the "flow" of the values. Higher values = faster.
The output of the jit.mo.join can be plugged into the rotation instead of the jit.noise/jit.matrix now.
For the position we could do the same, or we could try another thing.
We could get our objects moving in a circle using "jit.mo.sin"
If we plug a sin and a cos into the x and y values of the positions, we can plot a circle. And since cos is just sin with an offset of 0.5 (in terms of the wave cycle)...
Here we create the cos with the @phase attrib. We use jit.mo.join to make a matrix out of these values - leaving the z value empty (we just want a flat circle, but you could add in whatever) and we also bang a speed message to the jit.mo.sin's. Finally we multiply the value to make the circle bigger. This can now be plugged into the position input of the jit.gl.multiple
Audio reactive goodies
Lastly a bit of audio reactivity..
A little trick that Federico uses quite often in his tutorials is the "s" and "r" objects, which send or receive messages/values(?) without the connecting wires. Here we send the bang from the jit.world, which will be every 1/60th of a second, or whatever your display's refresh rate is. It takes a "snapshot" value from the audio file at this interval. So it is constantly grabbing the amplitude of the signal every 1/60th of a second ( which I then look at in a float). Next I take only the absolute values using the "abs" node and then use a "slide" node, which sort of smooths out a signal over a given number of frames. The first value is how smoothed the values are when they are increasing and the second is when they are decreasing, so you can sort of tune an attack/release with the values you are playing with.
Then we plug this into a scale message as a variable and plug that into an anim.node which then gets put into a gridshape. This could be used with the system above, but my network was getting a bit messy, so I decided to have it on a separate shape.
Below is the patch with all the stuff, not organised particularly well.
test code
{
"boxes" : [ {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mult @val 10",
"patching_rect" : [ 320.833321094512939, 716.66663932800293, 91.0, 22.0 ],
"id" : "obj-119",
"numinlets" : 2,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "speed 0.4",
"patching_rect" : [ 366.666652679443359, 566.666645050048828, 61.0, 22.0 ],
"id" : "obj-118",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "button",
"patching_rect" : [ 312.499988079071045, 545.833312511444092, 24.0, 24.0 ],
"id" : "obj-116",
"numinlets" : 1,
"numoutlets" : 1,
"parameter_enable" : 0,
"outlettype" : [ "bang" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.join 3 100",
"patching_rect" : [ 316.666654586791992, 670.83330774307251, 93.0, 22.0 ],
"id" : "obj-114",
"numinlets" : 3,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.sin @phase 0.5",
"patching_rect" : [ 354.166653156280518, 624.99997615814209, 124.0, 22.0 ],
"id" : "obj-113",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.sin",
"patching_rect" : [ 285.416655778884888, 624.99997615814209, 56.0, 22.0 ],
"id" : "obj-112",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "slide 30 7",
"patching_rect" : [ 979.0, 192.0, 60.0, 22.0 ],
"id" : "obj-99",
"numinlets" : 3,
"numoutlets" : 1,
"outlettype" : [ "float" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "* 20.",
"patching_rect" : [ 979.0, 230.0, 33.0, 22.0 ],
"id" : "obj-98",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "float" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "abs 0.",
"patching_rect" : [ 979.0, 158.0, 41.0, 22.0 ],
"id" : "obj-97",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "float" ]
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "scale $1",
"patching_rect" : [ 986.0, 267.0, 53.0, 22.0 ],
"id" : "obj-90",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.anim.node @scale 1",
"patching_rect" : [ 954.0, 306.0, 130.0, 22.0 ],
"id" : "obj-82",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.gridshape @shape cube",
"patching_rect" : [ 961.0, 348.0, 163.0, 22.0 ],
"id" : "obj-81",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "r worldBang",
"patching_rect" : [ 754.0, 58.0, 73.0, 22.0 ],
"id" : "obj-80",
"numinlets" : 0,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "s worldBang",
"patching_rect" : [ 512.5, 117.0, 75.0, 22.0 ],
"id" : "obj-79",
"numinlets" : 1,
"numoutlets" : 0
}
}
, {
"box" : {
"maxclass" : "flonum",
"patching_rect" : [ 865.0, 131.0, 50.0, 22.0 ],
"format" : 6,
"id" : "obj-78",
"numinlets" : 1,
"numoutlets" : 2,
"parameter_enable" : 0,
"outlettype" : [ "", "bang" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "snapshot~",
"patching_rect" : [ 865.0, 95.0, 64.0, 22.0 ],
"id" : "obj-76",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "float" ]
}
}
, {
"box" : {
"maxclass" : "ezdac~",
"patching_rect" : [ 740.0, 135.0, 45.0, 45.0 ],
"id" : "obj-75",
"numinlets" : 2,
"numoutlets" : 0
}
}
, {
"box" : {
"maxclass" : "playlist~",
"patching_rect" : [ 865.0, 47.0, 150.0, 30.0 ],
"pitchcorrection" : 0,
"followglobaltempo" : 0,
"id" : "obj-74",
"numinlets" : 1,
"formantcorrection" : 0,
"basictuning" : 440,
"mode" : "basic",
"numoutlets" : 5,
"originallength" : [ 0.0, "ticks" ],
"quality" : "basic",
"parameter_enable" : 0,
"outlettype" : [ "signal", "signal", "signal", "", "dictionary" ],
"originaltempo" : 120.0,
"timestretch" : [ 0 ],
"saved_attribute_attributes" : {
"candicane2" : {
"expression" : ""
}
,
"candicane3" : {
"expression" : ""
}
,
"candicane4" : {
"expression" : ""
}
,
"candicane5" : {
"expression" : ""
}
,
"candicane6" : {
"expression" : ""
}
,
"candicane7" : {
"expression" : ""
}
,
"candicane8" : {
"expression" : ""
}
}
,
"data" : {
"clips" : [ {
"absolutepath" : "C:\\temp\\02. Birdy Nam Nam - Defiant order.flac",
"filename" : "02. Birdy Nam Nam - Defiant order.flac",
"filekind" : "audiofile",
"id" : "u910004071",
"selection" : [ 0.0, 1.0 ],
"loop" : 0,
"content_state" : {
}
}
]
}
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "speed 0.",
"patching_rect" : [ 902.083298921585083, 418.7499840259552, 55.0, 22.0 ],
"id" : "obj-72",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.perlin @scale 360",
"patching_rect" : [ 1037.499960422515869, 487.49998140335083, 137.0, 22.0 ],
"id" : "obj-69",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.perlin @scale 360",
"patching_rect" : [ 887.499966144561768, 487.49998140335083, 137.0, 22.0 ],
"id" : "obj-68",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.join 3 100",
"patching_rect" : [ 864.583300352096558, 539.583312749862671, 93.0, 22.0 ],
"id" : "obj-67",
"numinlets" : 3,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mo.perlin @scale 360",
"patching_rect" : [ 741.666638374328613, 487.49998140335083, 137.0, 22.0 ],
"id" : "obj-66",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mult @val 360",
"patching_rect" : [ 839.583301305770874, 697.916640043258667, 97.0, 22.0 ],
"id" : "obj-65",
"numinlets" : 2,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.noise 3 float32 100",
"patching_rect" : [ 852.083300828933716, 633.333309173583984, 122.0, 22.0 ],
"id" : "obj-64",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.matrix 3 float32 100",
"patching_rect" : [ 579.16664457321167, 679.166640758514404, 126.0, 22.0 ],
"id" : "obj-57",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.mult @val 10",
"patching_rect" : [ 122.916661977767944, 718.749972581863403, 91.0, 22.0 ],
"id" : "obj-55",
"numinlets" : 2,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.map @map 0. 1. -1. 1.",
"patching_rect" : [ 118.749995470046997, 664.583307981491089, 140.0, 22.0 ],
"id" : "obj-54",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.noise 1 float32 100",
"patching_rect" : [ 579.16664457321167, 635.416642427444458, 122.0, 22.0 ],
"id" : "obj-53",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "message",
"text" : "anim_reset",
"patching_rect" : [ 272.0, 106.0, 68.0, 22.0 ],
"id" : "obj-52",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "toggle",
"patching_rect" : [ 365.0, 24.0, 24.0, 24.0 ],
"id" : "obj-50",
"numinlets" : 1,
"numoutlets" : 1,
"parameter_enable" : 0,
"outlettype" : [ "int" ]
}
}
, {
"box" : {
"maxclass" : "button",
"patching_rect" : [ 579.16664457321167, 391.666651725769043, 24.0, 24.0 ],
"id" : "obj-41",
"numinlets" : 1,
"numoutlets" : 1,
"parameter_enable" : 0,
"outlettype" : [ "bang" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.noise 3 float32 100",
"patching_rect" : [ 118.749995470046997, 599.999977111816406, 122.0, 22.0 ],
"id" : "obj-38",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.light myWorld @type point @position -1 0 -2 @diffuse 0.4 0.4 0.4 @ambient 0.2 0 0",
"patching_rect" : [ 48.0, 327.0, 477.0, 22.0 ],
"id" : "obj-36",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.light myWorld @type spotlight @position 0 2 3 @lookat 0 0 0 @diffuse 0.8 0.8 0.8 @spot_angle 180",
"patching_rect" : [ 48.0, 279.0, 565.0, 22.0 ],
"id" : "obj-35",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "attrui",
"patching_rect" : [ 15.0, 81.0, 150.0, 22.0 ],
"id" : "obj-23",
"numinlets" : 1,
"attr" : "ease",
"numoutlets" : 1,
"parameter_enable" : 0,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "attrui",
"patching_rect" : [ 15.0, 123.0, 150.0, 22.0 ],
"id" : "obj-21",
"numinlets" : 1,
"attr" : "speed",
"numoutlets" : 1,
"parameter_enable" : 0,
"outlettype" : [ "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.anim.drive @ui_listen 1",
"patching_rect" : [ 65.0, 186.0, 145.0, 22.0 ],
"id" : "obj-10",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.camera myWorld @position 0 0 10 @lookat 0. 0. 0. @locklook 1 @tripod 1",
"patching_rect" : [ 59.0, 257.0, 429.0, 22.0 ],
"id" : "obj-9",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_gl_texture", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.material",
"patching_rect" : [ 206.24999213218689, 810.416635751724243, 92.5, 22.0 ],
"id" : "obj-8",
"numinlets" : 8,
"numoutlets" : 2,
"outlettype" : [ "", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.gridshape @shape torus @lighting_enable 1 @position 0 0 0",
"patching_rect" : [ 335.416653871536255, 843.749967813491821, 357.0, 22.0 ],
"id" : "obj-7",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "jit_matrix", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.world myWorld @enable 1 @floating 1 @erase_color 0.8 0.58 0.3",
"patching_rect" : [ 365.0, 64.0, 370.0, 22.0 ],
"id" : "obj-6",
"numinlets" : 1,
"numoutlets" : 3,
"outlettype" : [ "jit_matrix", "bang", "" ]
}
}
, {
"box" : {
"maxclass" : "newobj",
"text" : "jit.gl.multiple myWorld 3 @glparam position scale rotatexyz",
"patching_rect" : [ 335.416653871536255, 774.999970436096191, 322.0, 22.0 ],
"id" : "obj-3",
"numinlets" : 3,
"numoutlets" : 2,
"outlettype" : [ "", "" ]
}
}
],
"lines" : [ {
"patchline" : {
"source" : [ "obj-74", 1 ],
"destination" : [ "obj-75", 1 ]
}
}
, {
"patchline" : {
"source" : [ "obj-74", 0 ],
"destination" : [ "obj-75", 0 ],
"order" : 1
}
}
, {
"patchline" : {
"source" : [ "obj-118", 0 ],
"destination" : [ "obj-113", 0 ],
"order" : 0
}
}
, {
"patchline" : {
"source" : [ "obj-116", 0 ],
"destination" : [ "obj-113", 0 ],
"order" : 0
}
}
, {
"patchline" : {
"source" : [ "obj-113", 0 ],
"destination" : [ "obj-114", 1 ]
}
}
, {
"patchline" : {
"source" : [ "obj-119", 0 ],
"destination" : [ "obj-3", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-114", 0 ],
"destination" : [ "obj-119", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-118", 0 ],
"destination" : [ "obj-112", 0 ],
"order" : 1
}
}
, {
"patchline" : {
"source" : [ "obj-116", 0 ],
"destination" : [ "obj-112", 0 ],
"order" : 1
}
}
, {
"patchline" : {
"source" : [ "obj-112", 0 ],
"destination" : [ "obj-114", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-99", 0 ],
"destination" : [ "obj-98", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-98", 0 ],
"destination" : [ "obj-90", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-50", 0 ],
"destination" : [ "obj-6", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-6", 1 ],
"destination" : [ "obj-79", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-97", 0 ],
"destination" : [ "obj-99", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-78", 0 ],
"destination" : [ "obj-97", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-90", 0 ],
"destination" : [ "obj-82", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-82", 0 ],
"destination" : [ "obj-81", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-76", 0 ],
"destination" : [ "obj-78", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-80", 0 ],
"destination" : [ "obj-76", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-74", 0 ],
"destination" : [ "obj-76", 0 ],
"order" : 0
}
}
, {
"patchline" : {
"source" : [ "obj-8", 0 ],
"destination" : [ "obj-7", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-3", 0 ],
"destination" : [ "obj-7", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-67", 0 ],
"destination" : [ "obj-3", 2 ]
}
}
, {
"patchline" : {
"source" : [ "obj-69", 0 ],
"destination" : [ "obj-67", 2 ]
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-69", 0 ],
"order" : 0
}
}
, {
"patchline" : {
"source" : [ "obj-72", 0 ],
"destination" : [ "obj-69", 0 ],
"order" : 0
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-68", 0 ],
"order" : 1
}
}
, {
"patchline" : {
"source" : [ "obj-68", 0 ],
"destination" : [ "obj-67", 1 ]
}
}
, {
"patchline" : {
"source" : [ "obj-72", 0 ],
"destination" : [ "obj-68", 0 ],
"order" : 1
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-66", 0 ],
"order" : 3
}
}
, {
"patchline" : {
"source" : [ "obj-66", 0 ],
"destination" : [ "obj-67", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-72", 0 ],
"destination" : [ "obj-66", 0 ],
"order" : 2
}
}
, {
"patchline" : {
"source" : [ "obj-64", 0 ],
"destination" : [ "obj-65", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-64", 0 ],
"order" : 2
}
}
, {
"patchline" : {
"source" : [ "obj-57", 0 ],
"destination" : [ "obj-3", 1 ]
}
}
, {
"patchline" : {
"source" : [ "obj-53", 0 ],
"destination" : [ "obj-57", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-53", 0 ],
"order" : 4
}
}
, {
"patchline" : {
"source" : [ "obj-54", 0 ],
"destination" : [ "obj-55", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-38", 0 ],
"destination" : [ "obj-54", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-52", 0 ],
"destination" : [ "obj-10", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-21", 0 ],
"destination" : [ "obj-10", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-23", 0 ],
"destination" : [ "obj-10", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-10", 0 ],
"destination" : [ "obj-9", 0 ]
}
}
, {
"patchline" : {
"source" : [ "obj-41", 0 ],
"destination" : [ "obj-38", 0 ],
"order" : 5
}
}
],
"appversion" : {
"major" : 9,
"minor" : 0,
"revision" : 7,
"architecture" : "x64",
"modernui" : 1
}
,
"classnamespace" : "box"
}
Comments
Post a Comment