Claude Heiland-Allen wrote:
Hi Frank, all,
Frank Barknecht wrote:
Hallo, Claude Heiland-Allen hat gesagt: // Claude Heiland-Allen wrote:
I'm trying to send the symbol output of [makefilename %d] using sendOSC, but it gets sent as a number instead of as a string. If I use [makefilename x%d] it is sent as a string, but I don't want that x there.
How are you sending? You cannot conserve "symbol 2" in a list- or meta-message as in [4( | [makefilename %d] | [send /test $1( | [sendOSC]
as that would be sending the equivalent of [send /test 4( and your "symbol" is gone before it reaches the [sendOSC]. You could of course send: [send /test symbol 4( though you wouldn't need [makefilename] for that (and it still wouldn't be a string for most apps...)
I can quite imagine that $args in "messsagebox $1" get 'reinterpreted', by which I mean converted to a string and then back into whatever type Pd thinks that string should be (this is necessary for constructs like "messagebox $1-blah".
But, I'm using [pack s s s], and as the attached patch shows the real type of each atom in the list is preserved as it should be, it's only when it reaches sendOSC that the 'reinterpretation' occurs.
That's right. It's inside sendOSC that the arguments after "send" are converted to string and then parsed to determine the type for OSC. Any numeric characters become int unless they are adjacent to a '.' in which case they become float. Otherwise they are string. So there is no way to distinguish between '4' and '52'(the ASCII character '4') this way because 4 gets converted to 52 by atom_string and then reinterpreted as 4 in ParseToken. You would have to [send four( instead.
In the function sendOSC_sendtyped in sendOSC.c we find: for (c=0;c<argc;c++) { atom_string(argv+c,tmp, MAXPDSTRING);
This part should really check the atom type and use atom_getfloat if it's a number, and then decide if it's an int or a float. It also won't accept any other OSC types than string, float and int. If I have time I'll try and fix it, if nobody else wants to...
Martin