[COLOR=#4E5B61][FONT=Menlo][COLOR=#728e00]#include[/COLOR] [COLOR=#005c5f]<Bounce.h>[/COLOR]
[COLOR=#728e00]#include[/COLOR] [COLOR=#005c5f]<Audio.h>[/COLOR]
[COLOR=#728e00]#include[/COLOR] [COLOR=#005c5f]<Wire.h>[/COLOR]
[COLOR=#728e00]#include[/COLOR] [COLOR=#005c5f]<SPI.h>[/COLOR]
[COLOR=#728e00]#include[/COLOR] [COLOR=#005c5f]<SD.h>[/COLOR]
[COLOR=#728e00]#include[/COLOR] [COLOR=#005c5f]<SerialFlash.h>[/COLOR]
[COLOR=#00979d]const[/COLOR] [COLOR=#00979d]int[/COLOR] NUM_CHANNELS = [COLOR=#005c5f]8[/COLOR];
AudioInputI2SOct i2s_oct1;
AudioInputI2S2 i2s2_1;
AudioFilterStateVariable [COLOR=#d35400]filters[/COLOR][NUM_CHANNELS];
AudioAmplifier [COLOR=#d35400]amps[/COLOR][NUM_CHANNELS];
AudioRecordQueue [COLOR=#d35400]queues[/COLOR][NUM_CHANNELS];
AudioConnection [COLOR=#d35400]patchCord1[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]0[/COLOR], filters[[COLOR=#005c5f]0[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord2[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]1[/COLOR], filters[[COLOR=#005c5f]1[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord3[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]2[/COLOR], filters[[COLOR=#005c5f]2[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord4[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]3[/COLOR], filters[[COLOR=#005c5f]3[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord5[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]4[/COLOR], filters[[COLOR=#005c5f]4[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord6[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]5[/COLOR], filters[[COLOR=#005c5f]5[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord7[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]6[/COLOR], filters[[COLOR=#005c5f]6[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord8[/COLOR][COLOR=#434f54]([/COLOR]i2s_oct1, [COLOR=#005c5f]7[/COLOR], filters[[COLOR=#005c5f]7[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#95a5a6]// AudioConnection patchCord9(i2s2_1, 0, filters[8], 0);[/COLOR]
[COLOR=#95a5a6]// AudioConnection patchCord10(i2s2_1, 1, filters[9], 0);[/COLOR]
AudioConnection [COLOR=#d35400]patchCord11[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]0[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]0[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord12[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]1[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]1[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord13[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]2[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]2[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord14[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]3[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]3[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord15[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]4[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]4[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord16[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]5[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]5[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord17[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]6[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]6[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord18[/COLOR][COLOR=#434f54]([/COLOR]filters[[COLOR=#005c5f]7[/COLOR]], [COLOR=#005c5f]2[/COLOR], amps[[COLOR=#005c5f]7[/COLOR]], [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#95a5a6]// AudioConnection patchCord19(filters[8], 2, amps[8], 0);[/COLOR]
[COLOR=#95a5a6]// AudioConnection patchCord20(filters[9], 2, amps[9], 0);[/COLOR]
AudioConnection [COLOR=#d35400]patchCord21[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]0[/COLOR]], queues[[COLOR=#005c5f]0[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord22[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]1[/COLOR]], queues[[COLOR=#005c5f]1[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord23[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]2[/COLOR]], queues[[COLOR=#005c5f]2[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord24[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]3[/COLOR]], queues[[COLOR=#005c5f]3[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord25[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]4[/COLOR]], queues[[COLOR=#005c5f]4[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord26[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]5[/COLOR]], queues[[COLOR=#005c5f]5[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord27[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]6[/COLOR]], queues[[COLOR=#005c5f]6[/COLOR]][COLOR=#434f54])[/COLOR];
AudioConnection [COLOR=#d35400]patchCord28[/COLOR][COLOR=#434f54]([/COLOR]amps[[COLOR=#005c5f]7[/COLOR]], queues[[COLOR=#005c5f]7[/COLOR]][COLOR=#434f54])[/COLOR];
[COLOR=#95a5a6]// AudioConnection patchCord29(amps[8], queues[8]);[/COLOR]
[COLOR=#95a5a6]// AudioConnection patchCord30(amps[9], queues[9]);[/COLOR]
[COLOR=#728e00]#define[/COLOR] [COLOR=#d35400]SDCARD_CS_PIN[/COLOR] BUILTIN_SDCARD
[COLOR=#00979d]int[/COLOR] mode = [COLOR=#005c5f]0[/COLOR];[COLOR=#95a5a6] // 0=stopped, 1=recording, 2=playing[/COLOR]
[COLOR=#95a5a6]// Bounce objects to easily and reliably read the buttons[/COLOR]
Bounce buttonRecord = [COLOR=#d35400]Bounce[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]0[/COLOR], [COLOR=#005c5f]8[/COLOR][COLOR=#434f54])[/COLOR];
Bounce buttonStop = [COLOR=#d35400]Bounce[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]1[/COLOR], [COLOR=#005c5f]8[/COLOR][COLOR=#434f54])[/COLOR];[COLOR=#95a5a6] // 8 = 8 ms debounce time[/COLOR]
File [COLOR=#d35400]files[/COLOR][NUM_CHANNELS];
[COLOR=#00979d]void[/COLOR] [COLOR=#d35400]setup[/COLOR][COLOR=#434f54]()[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]AudioMemory[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]90[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]filters[/COLOR][i].[COLOR=#d35400]frequency[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]60[/COLOR][COLOR=#434f54])[/COLOR];[COLOR=#95a5a6] // filter out DC & extremely low frequencies[/COLOR]
[COLOR=#d35400]amps[/COLOR][i].[COLOR=#d35400]gain[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]0.5[/COLOR][COLOR=#434f54])[/COLOR];[COLOR=#95a5a6] // make it less loud[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#d35400]pinMode[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]0[/COLOR], INPUT_PULLUP[COLOR=#434f54])[/COLOR];
[COLOR=#d35400]pinMode[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]1[/COLOR], INPUT_PULLUP[COLOR=#434f54])[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR]))[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#728e00]while[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#005c5f]1[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"❌ Unable to access the SD card"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#d35400]delay[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]500[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#434f54]}[/COLOR] [COLOR=#728e00]else[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"SD Card found."[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"Setup complete."[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#00979d]void[/COLOR] [COLOR=#d35400]loop[/COLOR][COLOR=#434f54]()[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]buttonRecord[/COLOR].[COLOR=#d35400]update[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#d35400]buttonStop[/COLOR].[COLOR=#d35400]update[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#d35400]buttonRecord[/COLOR].[COLOR=#d35400]fallingEdge[/COLOR][COLOR=#434f54]())[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"record button pressed"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR]mode == [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#d35400]startRecording[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#d35400]buttonStop[/COLOR].[COLOR=#d35400]fallingEdge[/COLOR][COLOR=#434f54]())[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"stop button pressed"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR]mode == [COLOR=#005c5f]1[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#d35400]stopRecording[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR]mode == [COLOR=#005c5f]1[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]continueRecording[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#00979d]void[/COLOR] [COLOR=#d35400]startRecording[/COLOR][COLOR=#434f54]()[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"📣 startRecording"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
String fileString = [COLOR=#005c5f]"RECORD"[/COLOR] + [COLOR=#d35400]String[/COLOR][COLOR=#434f54]([/COLOR]i[COLOR=#434f54])[/COLOR] + [COLOR=#005c5f]".RAW"[/COLOR];
[COLOR=#00979d]char[/COLOR]* filePath = [COLOR=#d35400]fileString[/COLOR].[COLOR=#d35400]c_str[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#d35400]SD[/COLOR].[COLOR=#d35400]exists[/COLOR][COLOR=#434f54]([/COLOR]filePath[COLOR=#434f54]))[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]SD[/COLOR].[COLOR=#d35400]remove[/COLOR][COLOR=#434f54]([/COLOR]filePath[COLOR=#434f54])[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#d35400]files[/COLOR][i] = [COLOR=#d35400]SD[/COLOR].[COLOR=#d35400]open[/COLOR][COLOR=#434f54]([/COLOR]filePath, FILE_WRITE[COLOR=#434f54])[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR]![COLOR=#d35400]files[/COLOR][i][COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"❌ File creation failed: "[/COLOR] + [COLOR=#d35400]String[/COLOR][COLOR=#434f54]([/COLOR]i[COLOR=#434f54]))[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]begin[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#95a5a6] // Serial.println("🎙️ NOW RECORDING: " + String(i));[/COLOR]
[COLOR=#434f54]}[/COLOR]
mode = [COLOR=#005c5f]1[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#00979d]void[/COLOR] [COLOR=#d35400]continueRecording[/COLOR][COLOR=#434f54]()[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]available[/COLOR][COLOR=#434f54]()[/COLOR] >= [COLOR=#005c5f]2[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
byte [COLOR=#d35400]buffer[/COLOR][[COLOR=#005c5f]512[/COLOR]];
[COLOR=#95a5a6] // Fetch 2 blocks from the audio library and copy[/COLOR]
[COLOR=#95a5a6] // into a 512 byte buffer. The Arduino SD library[/COLOR]
[COLOR=#95a5a6] // is most efficient when full 512 byte sector size[/COLOR]
[COLOR=#95a5a6] // writes are used.[/COLOR]
[COLOR=#d35400]memcpy[/COLOR][COLOR=#434f54]([/COLOR]buffer, [COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]readBuffer[/COLOR][COLOR=#434f54]()[/COLOR], [COLOR=#005c5f]256[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]freeBuffer[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#d35400]memcpy[/COLOR][COLOR=#434f54]([/COLOR]buffer + [COLOR=#005c5f]256[/COLOR], [COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]readBuffer[/COLOR][COLOR=#434f54]()[/COLOR], [COLOR=#005c5f]256[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]freeBuffer[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#95a5a6] // write all 512 bytes to the SD card[/COLOR]
[COLOR=#95a5a6] // elapsedMicros usec = 0;[/COLOR]
[COLOR=#d35400]files[/COLOR][i].[COLOR=#d35400]write[/COLOR][COLOR=#434f54]([/COLOR]buffer, [COLOR=#005c5f]512[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#95a5a6] // Uncomment these lines to see how long SD writes[/COLOR]
[COLOR=#95a5a6] // are taking. A pair of audio blocks arrives every[/COLOR]
[COLOR=#95a5a6] // 5802 microseconds, so hopefully most of the writes[/COLOR]
[COLOR=#95a5a6] // take well under 5802 us. Some will take more, as[/COLOR]
[COLOR=#95a5a6] // the SD library also must write to the FAT tables[/COLOR]
[COLOR=#95a5a6] // and the SD card controller manages media erase and[/COLOR]
[COLOR=#95a5a6] // wear leveling. The queue1 object can buffer[/COLOR]
[COLOR=#95a5a6] // approximately 301700 us of audio, to allow time[/COLOR]
[COLOR=#95a5a6] // for occasional high SD card latency, as long as[/COLOR]
[COLOR=#95a5a6] // the average write time is under 5802 us.[/COLOR]
[COLOR=#95a5a6] // Serial.print("SD write, us=");[/COLOR]
[COLOR=#95a5a6] // Serial.println(usec);[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#00979d]void[/COLOR] [COLOR=#d35400]stopRecording[/COLOR][COLOR=#434f54]()[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"📣 stopRecording"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]end[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"✅ ALL QUEUES STOPPED"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#728e00]if[/COLOR] [COLOR=#434f54]([/COLOR]mode == [COLOR=#005c5f]1[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#95a5a6] // Serial.print("writing queue: " + String(i));[/COLOR]
[COLOR=#728e00]while[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]available[/COLOR][COLOR=#434f54]()[/COLOR] > [COLOR=#005c5f]0[/COLOR][COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#95a5a6] // Serial.print(".");[/COLOR]
[COLOR=#d35400]files[/COLOR][i].[COLOR=#d35400]write[/COLOR][COLOR=#434f54](([/COLOR]byte*[COLOR=#434f54])[/COLOR][COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]readBuffer[/COLOR][COLOR=#434f54]()[/COLOR], [COLOR=#005c5f]256[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#d35400]queues[/COLOR][i].[COLOR=#d35400]freeBuffer[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#95a5a6] // Serial.println();[/COLOR]
[COLOR=#434f54]}[/COLOR]
[COLOR=#728e00]for[/COLOR] [COLOR=#434f54]([/COLOR][COLOR=#00979d]int[/COLOR] i = [COLOR=#005c5f]0[/COLOR]; i < NUM_CHANNELS; i++[COLOR=#434f54])[/COLOR] [COLOR=#434f54]{[/COLOR]
[COLOR=#d35400]files[/COLOR][i].[COLOR=#d35400]close[/COLOR][COLOR=#434f54]()[/COLOR];
[COLOR=#434f54]}[/COLOR]
[COLOR=#d35400]Serial[/COLOR].[COLOR=#d35400]println[/COLOR][COLOR=#434f54]([/COLOR][COLOR=#005c5f]"✅ ALL FILES WRITTEN"[/COLOR][COLOR=#434f54])[/COLOR];
[COLOR=#434f54]}[/COLOR]
mode = [COLOR=#005c5f]0[/COLOR];
[COLOR=#434f54]}[/COLOR]
[/FONT][/COLOR]