Forums > Java

Issue with sending message to [line] object using JAVA

December 27, 2013 | 9:26 am

I need to send a message to line e.g 20 200
I.e I want line to increase to 20 and use 200 ms on the operation.
However the send method is per API defined like this:

send(int i) Send this box the "int" message.
send(java.lang.String message, Atom[] args) Send this box an arbitrary message.

The only option I can think of is to send to the second inlet of line but do anyone know if this is possible in java to route to a specific inlet?

MaxPatcher p = this.getParentPatcher();
MaxBox mb = p.getNamedBox("sn_line1");
mb.send(20); //This work but the change is immediate


December 27, 2013 | 12:23 pm

its not possible to send array to the outlet ? or literal with commas like in JS ? mb.send(20,200) ?


December 28, 2013 | 1:01 am

you could reformulate your message as "list 20 200" (which is essentially the same as "20 200") and use the "send(java.lang.String message, Atom[] args)" method.
vb


December 28, 2013 | 4:05 am

Thanks for the suggestions. However I did not get it quite to work. In the example below the value changes but the change is immediate so I assume the second value(the ramp time) is ignored..
MaxPatcher p = this.getParentPatcher();
MaxBox mb = p.getNamedBox("sn_line1");
Atom[] outputAtom = new Atom[] {Atom.newAtom ("300 "),Atom.newAtom ("5000")};
//mb.send(10); //OK
mb.send("list",outputAtom);


December 28, 2013 | 5:09 am

Hi Kmill !
i never coded in java and max api but …
i would try to ommit "list" message as it may be that send() function sends array as list by itself (but im just guessing) … because line object expects 2 values inside list message so it get two aready -> "list 300" and 5000 is ignored . but yeah , im jsut guessing .
or try to format your atom array with 3 cells
Atom[] outputAtom = new Atom[] {Atom.newAtom ("list "),Atom.newAtom ("300 "),Atom.newAtom ("5000")};


December 28, 2013 | 8:51 am

First of all, a Java String is not a Max list. All Volker’s suggestion will do is generate a symbol ‘list 20 200′ which is not, and never will be, a list (although inserting a [fromsymbol] object might give you some joy, but then you’ve got to go through Max patch cords–which, in and of itself, would probably be a Good Idea).

I’ve had Java objects create Max lists, so it can be done. It’s been a while, but as I recall, the Java/Max interface simply converts Atom arrays in Java to lists in Max. So, change your last line to

mb.send(new Atom[] {Atom.newAtom(300), Atom.newAtom(5000)});

And leave out the quotation marks, otherwise you’re going to generate symbol atoms when you want int atoms.


December 28, 2013 | 8:57 am

Actually, you could probably make life even easier for yourself by using an int[] instead of an Atom[].

This is, btw, all covered in the "Writing Max Externals In Java" document, pp.29-31.


December 28, 2013 | 3:13 pm

The challenge is that I am bound by the API as described in my initial post. For that reason
mb.send(new Atom[] {Atom.newAtom(300), Atom.newAtom(5000)}); will not be a valid call. However I think I will use outlets instead of direct messaging to the [line] object as described in the "Writing Max Externals In Java" document.

MAX objects seem to be inconsistent with regards to the message format they receive and as far as I can see this is not reflected in the API. E.g the [play] object takes the style "start 300 500 200" (which is possible using the API) whilst the [line] object takes "200 5000" which is not possible using the API.


December 29, 2013 | 1:47 am

All Volker’s suggestion will do is generate a symbol ‘list 20 200′ which is not, and never will be, a list

maybe the quotes were misleading, but i really meant message when i wrote message, and not symbol. thought it would be clear from the context.

int args[] = {20, 200};

MaxPatcher p = this.getParentPatcher();
MaxBox mb = p.getNamedBox("sn_line1");
mb.send("list", Atom.newAtom(args));


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