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??
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.
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
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..
function msg_int(v){
post("the list contains",arguments.length,"elements\n");
}
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)
:) 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 !
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");
}
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?
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 ;)
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])
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
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!
great KMLL ! have a lot of fun !!!