How do I pass two parameters to a js object, including an array?

1.4k Views Asked by At

I am completely new to Max and am struggling to understand how to use arrays and Javascript parameters.

I have one working js object that outputs an array:

var inlets = 1;
var outlets = 1;

function getRandomChordProgression()
{       
    outlet(0, [1,4,5]);
    return [1,4,5];
}

And then later I want to use that array in another js object, that takes an array and an integer:

var inlets = 2;
var outlets = 1;

function getCurrentChord(chords, barNumber)
{
    var chord = chords[barNumber % 3];
    outlet(0, chord);
    return chord;
}

I tried the below, but the js gets undefined inputs.

enter image description here

1

There are 1 best solutions below

0
On BEST ANSWER

The first thing to notice is that in Max Msp, in order to assign a list to a single symbol, you need to use the "tosymbol" object. Even if lists are effectively considered mono dimensional arrays in Max Msp, in order to be understood by javascript they first need to be converted. Once the list is converted into a symbol, we can join it with the integer coming from the number box, pack it with the getCurrentChord message and feed it into the getCurrentChord.js object.

Screenshot of Max-Msp patch using "tosymbol" object

You will see that by converting a list into a symbol every character in the array, including the spaces, is seen as part of the array. So using your example, an array composed by 3 integers will have 5 positions occupied, from 0 to 4. In order to make this work, inside the second .js script the modulo operator needs to be set to 5 in order to have a maximum remainder of 4. This means that by setting the number box to 1 or 3 you will have an empty output. So you need to decide how and if to parse the input or the output in order to obtain only the values desired.

var inlets = 2;
var outlets = 1;

function getCurrentChord(chords, barNumber)
{ 
 var chord = chords[barNumber % 5];
 outlet(0, chord);
}

Hope that helps!