Float to Int for sending over serial

Jess Mardon's icon

Hey, I've run into an issue in a project where I'm trying to send a list of floats from max to arduino. The data is a list of FFT bin amplitudes generated from the fft.list and fft.normalize objects in the fft tutorials https://cycling74.com/articles/fft-part-5.

I've been able to send data from max to arduino over serial, but only when the data are integers, but the FFT bins are floats - and while I get some data into arduino, it doesn't correspond to the digits I see in max and I don't know how to make sense of it. I've been reading a few threads, which suggested instead to convert the data to ints in max before it's sent which seems like a sensible strategy. I can edit the fft.normalize object to convert the range to 0-100 for a sensible range for whole-number amplitude values, but I don't know how to convert the float list to an int list in max.

Would anyone have any suggestions on how to solve this? or alternatively how to interpret float data sent from max over serial?

thanks
Jess

FFT 7.maxpat
Max Patch

FFTinoutsub7.maxpat
Max Patch

Source Audio's icon

Here one example using start / end markers to form data string

I used < and > as Markers

const byte numItems = 255;
char receivedItems[numItems];
boolean newMessage = false;

void setup() {Serial.begin(115200);}
void loop() {stringWithMarks(); showNewMessage();}

void stringWithMarks() {static boolean Receiving = false; static byte index = 0;
char startMark = '<'; char endMark = '>'; char bag;
while (Serial.available() > 0 && newMessage == false) {bag =
Serial.read();
if (Receiving == true) {if (bag != endMark) {receivedItems[index] = bag; index++;
if (index >= numItems) {index = numItems - 1;}}
else {receivedItems[index] = '\0'; Receiving = false; index = 0; newMessage = true;}}
else if (bag == startMark) {Receiving = true;}}}

void showNewMessage() {if (newMessage == true) {Serial.println(receivedItems);newMessage = false;}}

Max Patch
Copy patch and select New From Clipboard in Max.

Int or float, no matter, you also don't have to reduce float precision
Just change port to your board

Jess Mardon's icon

ah terrific thanks, that's worked. in case it's useful to anyone else, I added the t <> and atoi objects to the list coming out of fft.list before sending over serial and the numbers received into arduino make sense now.

thanks again for your help, much appreciated

Source Audio's icon

just use the max patch I uploaded, there is t > l < and itoa inside