14 March 2011

Max/MSP Javascript: Dollar Function - Returns a reference to a Max Object in a patch/subpatch

I started using Max this month and was simultaneously impressed with its power and simplicity and frustrated by it's cumbersome interface. I quickly checked out it's javascript capabilities and became much more comfortable. JS allows you do simple operations quite quickly that would take a tonne of parsing objects which use up space and lead to a messy patch.

That said, JS in Max is really a slightly ugly cousin of browser based javascript. Calls to objects are long winded and basically everything is a bit head wrecking!

So here we go: the first in my "Making Max JS less crap" series... The infamous dollar function! All you need to do to access a max object is give the object a scripting name in the inspector* and then use: $('scriptingname')

Please see right hand pane before copying my code>>

function $(stringref){
    stringref=stringref.replace(/parent/gi, "parentpatcher")
    var path=stringref.split('.')
    var obj=this.patcher
    for(i in path){
        if(path[i]=='parentpatcher'){ //up 1 level:
            obj=obj.parentpatcher
        }else{
            obj=obj.getnamed(path[i])
            if(i!=path.length-1){ //down 1 level:
                obj=obj.subpatcher()
            }
        }
    }
    return(obj)
}


//USAGE:
$("myButton").message('set','new text!') //access 'myButton' object in current patcher
$("parent.myButton").message('set','new text!') //access 'myButton' object in parent patcher
$("myPatcher.myButton").message('set','new text!') //access 'myButton' object in child patcher
$("parent.myPatcher.myButton").message('set','new text!') //access 'myButton' object in sibling patcher

* If you're not bothered giving every patcher a unique scripting name in the inspector, try my lazy dollar function instead.

UPDATE:
A good way to use this function is to use Luke Hall's include script. Save his script into your jsexternals folder, save my functions into your project folder as basefunctions.js (or something similar) and then you can simply use include(this,"basefunctions.js") at the top of every JS file you use. Thanks Luke - this is awesome!


6 comments:

hallluke said...

Just a quick mention of the "jsextensions" folder in the Max search path. It's the best home for these types of utility functions as you can then use them in any other javascripts you write.

cron said...

BUG: After some testing it turns out there are some problems calling this function in a for/while loop. Max seems to be mildly retarded when it comes to JS and the speed of the for loop is too fast for the function (wtf?!) and the program crashes like a big bastard.

Anonymous said...

This was helpful. I have prototypes on my array objects so I needed to change the loop invariant to explicitly run for the length of the split path.

Meiqing Xu said...

cheap jordans
louis vuitton handbags
cheap nfl jerseys
supra for sale
christian louboutin shoes
fitflops sale clearance
uggs
michael kors outlet
toms shoes
lebron james shoes
20161228caiyan

spencermeyer said...

In the long run, a bag tackk.com/ can have a zillion bells as well as Check This Out whistles however if it doesn't swallow you up like Leading 8 Finest Blender For Smoothies Or Food Processor Mixer Combos your preferred down comforter if it does not keep.

JulieAzevedo said...

Cordless as well as electric sites.google.com/ blowers will commonly clear up Title to six to ten inches of snow, yet you may have to work to get Snow Blower Buying Guide 2017 them through much heavier snowfalls.

Post a Comment

Cron Design Studio: Dublin based web design & software development