Forums > Javascript

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

November 18, 2013 | 8:08 am

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


November 18, 2013 | 8:51 am

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


November 18, 2013 | 9:06 am

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


November 18, 2013 | 9:23 am

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


November 18, 2013 | 9:38 am
function msg_int(v){

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

}

November 18, 2013 | 10:31 am

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)


November 18, 2013 | 10:58 am

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


November 18, 2013 | 12:09 pm

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

– Pasted Max Patch, click to expand. –

</code>

And the code:

function msg_int(v){

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

}

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?

<code>

– Pasted Max Patch, click to expand. –

</code>


November 18, 2013 | 12:19 pm

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


November 18, 2013 | 1:46 pm

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


November 18, 2013 | 2:08 pm

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


November 18, 2013 | 2:27 pm

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!


November 18, 2013 | 2:33 pm

great KMLL ! have a lot of fun !!!


Viewing 13 posts - 1 through 13 (of 13 total)