Get note and velocity values from [midiparse] as js function arguments

kmll's icon

The first outlet of [midiparse] send note and velocity. I want to transfer these to variables in javascript. How can I do this? Does the midiparse send out two ints?? The code below works but it only prints the note value.. (v[0] and v[1] is undefined..)

function msg_int(v){
    post("enter msg_int\n");
    post(v + "\n");
post("exit msg_int\n");
}

Or maybe I should use the midiin object directly??

Christopher Dobrian's icon

list    Out leftmost outlet: A note-on message. The first number is a pitch value and the second number is a velocity value.

The js function to handle a list is list().

The JavaScript documentation on Basic Techniques says:

To handle Max lists, i.e., a message that begins with a number, call your function list. In implementing a list function, you’ll probably want to use the Javascript arguments property, since otherwise you couldn’t handle input of varying length.
Example:

function list(a)
{
post("the list contains",arguments.length, "elements");
}

You could also unjoin or unpack the list and send only pitch or velocity to your js object as an int message. Or you could use notein.

do.while's icon

note that , note off ( key released ) will report the same note number but with velocity 0 . if you dont want note off's then use [stripnote] connected to [midiparse] to avoid note off as function call

kmll's icon

Thanks for the advise! However I must be missing something.. I tried the code below but get the message:"the list contains elements"

function msg_int(v){
    post("enter msg_int ok\n");
    post("the list contains",v.length,"elements\n");
}

I was thinking about using unpack but this would give me two integers and I am not sure how to pass these two values simulaniously to the one and same js function - I assume I then would have to re-pack again or similar..

do.while's icon
function msg_int(v){

   post("the list contains",arguments.length,"elements\n");

}

kmll's icon

Ah ok - so "arguments" is a predefined variable! Ok I am getting closer:)
(Btw is arguments the same as jsarguments??)

When I now print the argument.length I get:
"the list contains 1 elements"
So I assume this 1 element is the list however I do not find an example in the documentation for how I can extract the value itself..
(If I try to print arguments[0] I get the name of the .js file itself)

do.while's icon

:) function arguments are similar to Array but they are not real array , you cant operate on it like on arrays where you would want to shift ,splice etc .
In order to make it possible you can make arrays from arguments with function "arrayfromargs" that is implemented into MaxJs only . Anyway its just for the information ! .

In order to send midi note and velocity together to your msg_int function you need to pack it . [pack i i] or [pack 0 0] . then you will receive both "guys" :)

jsarguments and arguments that are passed ONTO the MAX object , in this case your JS object . It have nothing to do with your msg_int function .

jsarguments[0] is js file sure . but jsarguments[1] would stand for the first argument that you specify after your "name.js" argument !

kmll's icon
Max Patch
Copy patch and select New From Clipboard in Max.

Brilliant - I almost got it now:) Many thanks for the advise!
This is what works:

And the code:
function msg_int(v){

var myAwesomeArray = arrayfromargs(arguments);
    post("---------------------------------\n");
    post(myAwesomeArray[0],"\n");
    post(myAwesomeArray[1],"\n");
    post("---------------------------------\n");

}

Max Patch
Copy patch and select New From Clipboard in Max.

The only challenge left is that I need the midi note as a frequency. I use the [mtof] object and try to re-pack and send to the script but the pack converts the float to an int. Any suggestions on how to work around this?

do.while's icon

you should check [pack] help first , make it as a routine to check what objects do and expect . the [pack] guy need to know what type of data it is assembling , in your particular case its a float from mtof and int from midiparse / unpack , so your [pack] should stand for [pack f i] or [pack 0. 0] . take a look at help file , you will have wider range ;)

kmll's icon

Hi - I do always check the help file first and I tried [pack 0. 0] before posting however then the javascript is failing with the error "js:no function list" (same error with [pack f i])

do.while's icon

all good KMLL .
first of all msg_int will expect only integers , you have got float as a first argument . so here you will be forced to use list() function . OR you can create your own function which name you will [prepend] while sending your packed data !

another thing , check your [pack] formating . be sure youve typed small "I" instead of small "L" if you use this symbolic type formating . this forum typeface isnt suited for small "I" letters ,where sometimes it can cause wonderings :)

so again , msg_int will not understand floats at all .

edit : otherwise post a patch , so it can be seen

kmll's icon

Ah - of course :o) my bad. Changing it to msg_float or list made it work fine:)
Thanks for all help with this - I now have the values I need and I am ready to progress my code!

do.while's icon

great KMLL ! have a lot of fun !!!