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

Nov 18, 2013 at 8:08am

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

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??

Nov 18, 2013 at 8:51am

The midiparse reference page says:

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.

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.

Nov 18, 2013 at 9:06am

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

Nov 18, 2013 at 9:23am

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..

Nov 18, 2013 at 9:38am
function msg_int(v){

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

Nov 18, 2013 at 10:31am

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)

Nov 18, 2013 at 10:58am

:) 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 !

Nov 18, 2013 at 12:09pm

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

– Pasted Max Patch, click to expand. –


And the code:

function msg_int(v){

var myAwesomeArray = arrayfromargs(arguments);


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?


– Pasted Max Patch, click to expand. –


Nov 18, 2013 at 12:19pm

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 ;)

Nov 18, 2013 at 1:46pm

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])

Nov 18, 2013 at 2:08pm

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

Nov 18, 2013 at 2:27pm

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!

Nov 18, 2013 at 2:33pm

great KMLL ! have a lot of fun !!!


You must be logged in to reply to this topic.