midi-breadboard-instrument/main/mmcontroller.log

4821 lines
503 KiB
Text

Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(14): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(15): Expected device instantiation or directive here.
// 1. HARDWARE DEFINITIONS
^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(16): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(39): Expected nodes here.
pcnt_unit_handle_t pcnt_unit = NULL;
^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(40): Expected node name here.
spi_device_handle_t spi = NULL;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(40): Expected device instantiation or directive here.
spi_device_handle_t spi = NULL;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(42): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(43): Expected device instantiation or directive here.
// 2. INTER-PROCESS COMMUNICATION (IPC)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(44): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(45): Unknown parameter
volatile uint32_t current_freq = 0;
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(46): Unknown parameter
volatile bool current_kick = false;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(47): Unknown parameter
volatile bool current_hat = false;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(48): Unknown parameter
volatile float current_speed = 1.0;
^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(50): Unknown parameter
volatile bool is_paused = false;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(51): Unknown parameter
volatile int current_song_idx = 0;
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(52): Unknown parameter
volatile bool trigger_song_change = false;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(54): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(55): Expected device instantiation or directive here.
// 3. GRAPHICS ENGINE & 1.3" OLED DRIVER
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(56): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(57): Expected nodes here.
uint8_t oled_buffer[1024];
^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(59): Expected device instantiation or directive here.
const uint8_t font5x7[59][5] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(60): Expected device instantiation or directive here.
{0x00,0x00,0x00,0x00,0x00}, {0x00,0x00,0x5f,0x00,0x00}, {0x00,0x07,0x00,0x07,0x00}, {0x14,0x7f,0x14,0x7f,0x14},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(61): Expected device instantiation or directive here.
{0x24,0x2a,0x7f,0x2a,0x12}, {0x23,0x13,0x08,0x64,0x62}, {0x36,0x49,0x55,0x22,0x50}, {0x00,0x05,0x03,0x00,0x00},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(62): Expected device instantiation or directive here.
{0x00,0x1c,0x22,0x41,0x00}, {0x00,0x41,0x22,0x1c,0x00}, {0x14,0x08,0x3e,0x08,0x14}, {0x08,0x08,0x3e,0x08,0x08},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(63): Expected device instantiation or directive here.
{0x00,0x50,0x30,0x00,0x00}, {0x08,0x08,0x08,0x08,0x08}, {0x00,0x60,0x60,0x00,0x00}, {0x20,0x10,0x08,0x04,0x02},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(64): Expected device instantiation or directive here.
{0x3e,0x51,0x49,0x45,0x3e}, {0x00,0x42,0x7f,0x40,0x00}, {0x42,0x61,0x51,0x49,0x46}, {0x21,0x41,0x45,0x4b,0x31},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(65): Expected device instantiation or directive here.
{0x18,0x14,0x12,0x7f,0x10}, {0x27,0x45,0x45,0x45,0x39}, {0x3c,0x4a,0x49,0x49,0x30}, {0x01,0x71,0x09,0x05,0x03},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(66): Expected device instantiation or directive here.
{0x36,0x49,0x49,0x49,0x36}, {0x06,0x49,0x49,0x29,0x1e}, {0x00,0x36,0x36,0x00,0x00}, {0x00,0x56,0x36,0x00,0x00},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(67): Expected device instantiation or directive here.
{0x08,0x14,0x22,0x41,0x00}, {0x14,0x14,0x14,0x14,0x14}, {0x00,0x41,0x22,0x14,0x08}, {0x02,0x01,0x51,0x09,0x06},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(68): Expected device instantiation or directive here.
{0x32,0x49,0x79,0x41,0x3e}, {0x7e,0x11,0x11,0x11,0x7e}, {0x7f,0x49,0x49,0x49,0x36}, {0x3e,0x41,0x41,0x41,0x22},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(69): Expected device instantiation or directive here.
{0x7f,0x41,0x41,0x22,0x1c}, {0x7f,0x49,0x49,0x49,0x41}, {0x7f,0x09,0x09,0x09,0x01}, {0x3e,0x41,0x49,0x49,0x7a},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(70): Expected device instantiation or directive here.
{0x7f,0x08,0x08,0x08,0x7f}, {0x00,0x41,0x7f,0x41,0x00}, {0x20,0x40,0x41,0x3f,0x01}, {0x7f,0x08,0x14,0x22,0x41},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(71): Expected device instantiation or directive here.
{0x7f,0x40,0x40,0x40,0x40}, {0x7f,0x02,0x0c,0x02,0x7f}, {0x7f,0x04,0x08,0x10,0x7f}, {0x3e,0x41,0x41,0x41,0x3e},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(72): Expected device instantiation or directive here.
{0x7f,0x09,0x09,0x09,0x06}, {0x3e,0x41,0x51,0x21,0x5e}, {0x7f,0x09,0x19,0x29,0x46}, {0x46,0x49,0x49,0x49,0x31},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(73): Expected device instantiation or directive here.
{0x01,0x01,0x7f,0x01,0x01}, {0x3f,0x40,0x40,0x40,0x3f}, {0x1f,0x20,0x40,0x20,0x1f}, {0x3f,0x40,0x38,0x40,0x3f},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(74): Expected device instantiation or directive here.
{0x63,0x14,0x08,0x14,0x63}, {0x07,0x08,0x70,0x08,0x07}, {0x61,0x51,0x49,0x45,0x43}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(75): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(77): Expected node name here.
void oled_send_cmd(uint8_t cmd) {
^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(77): Expected device instantiation or directive here.
void oled_send_cmd(uint8_t cmd) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(78): Expected 2 node names here.
gpio_set_level(OLED_DC_PIN, 0); spi_transaction_t t; memset(&t, 0, sizeof(t));
uint8_t cmd_ram = cmd; t.length = 8; t.tx_buffer = &cmd_ram; spi_device_polling_transmit(spi, &t);
}
void oled_send_data(const uint8_t *data, int len) {
gpio_set_level(OLED_DC_PIN, 1); spi_transaction_t t; memset(&t, 0, sizeof(t));
t.length = len * 8; t.tx_buffer = data; spi_device_polling_transmit(spi, &t);
}
void draw_pixel(int x, int y, int color) {
if (x < 0 || x >= 128 || y < 0 || y >= 64) return;
if (color) oled_buffer[x + (y / 8) * 128] |= (1 << (y % 8));
else oled_buffer[x + (y / 8) * 128] &= ~(1 << (y % 8));
}
void draw_filled_rect(int x, int y, int w, int h, int color) {
for (int i = x; i < x + w; i++) for (int j = y; j < y + h; j++) draw_pixel(i, j, color);
}
void draw_rect(int x, int y, int w, int h, int color) {
for (int i = x; i < x + w; i++) { draw_pixel(i, y, color); draw_pixel(i, y + h - 1, color); }
for (int j = y; j < y + h; j++) { draw_pixel(x, j, color); draw_pixel(x + w - 1, j, color); }
}
void draw_string(int x, int y, const char* str) {
while(*str) {
char c = *str;
if (c >= 32 && c <= 90) {
for(int i=0; i<5; i++) for(int j=0; j<8; j++) if((font5x7[c-32][i] >> j) & 1) draw_pixel(x+i, y+j, 1);
} else if (c >= 97 && c <= 122) {
for(int i=0; i<5; i++) for(int j=0; j<8; j++) if((font5x7[c-64][i] >> j) & 1) draw_pixel(x+i, y+j, 1);
}
x += 6; str++;
}
}
void oled_push_framebuffer(void) {
for(int page = 0; page < 8; page++) {
oled_send_cmd(0xB0 + page); oled_send_cmd(0x02); oled_send_cmd(0x10);
oled_send_data(&oled_buffer[page * 128], 128);
}
}
// ==========================================
// 4. THE ULTIMATE 8-TRACK PLAYLIST (FLASH MEMORY STORAGE)
// ==========================================
typedef struct { uint32_t frequency; uint32_t duration; bool kick_drum; bool hi_hat; } SequenceStep;
#define REST 0
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
// Converted from: alla_turca_8.mid
const SequenceStep midi_alla_turca[] = {
{493, 136, false, false}, {440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false},
{220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false}, {523, 136, false, false},
{329, 136, false, false}, {523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false},
{261, 136, false, false}, {659, 136, false, false}, {329, 136, false, false}, {659, 136, false, false},
{220, 136, false, false}, {880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false},
{220, 136, false, false}, {880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false},
{220, 272, false, false}, {329, 272, false, false}, {261, 272, false, false}, {329, 272, false, false},
{164, 272, false, false}, {329, 272, false, false}, {329, 272, false, false}, {329, 272, false, false},
{164, 272, false, false}, {246, 272, false, false}, {329, 272, false, false}, {329, 272, false, false},
{164, 272, false, false}, {329, 272, false, false}, {123, 272, false, false}, {246, 272, false, false},
{164, 545, false, false}, {523, 272, false, false}, {698, 272, false, false}, {130, 272, false, false},
{261, 272, false, false}, {164, 136, false, false}, {783, 136, false, false}, {329, 136, false, false},
{659, 136, false, false}, {195, 272, false, false}, {391, 272, false, false}, {523, 272, false, false},
{698, 272, false, false}, {130, 272, false, false}, {261, 272, false, false}, {164, 136, false, false},
{783, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {195, 545, false, false},
{440, 272, false, false}, {587, 272, false, false}, {110, 272, false, false}, {220, 272, false, false},
{130, 136, false, false}, {659, 136, false, false}, {261, 136, false, false}, {523, 136, false, false},
{164, 272, false, false}, {329, 272, false, false}, {440, 272, false, false}, {587, 272, false, false},
{110, 272, false, false}, {220, 272, false, false}, {130, 136, false, false}, {659, 136, false, false},
{261, 136, false, false}, {523, 136, false, false}, {164, 545, false, false}, {493, 136, false, false},
{440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false},
{329, 272, false, false}, {261, 136, false, false}, {523, 136, false, false}, {329, 136, false, false},
{523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false},
{659, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {261, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {174, 272, false, false},
{311, 272, false, false}, {311, 272, false, false}, {311, 272, false, false}, {164, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {246, 272, false, false}, {130, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {246, 272, false, false}, {220, 272, false, false},
{164, 272, false, false}, {207, 272, false, false}, {207, 136, false, false}, {440, 68, false, false},
{493, 68, false, false}, {220, 68, false, false}, {220, 477, false, false}, {440, 272, false, false},
{493, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false}, {155, 272, false, false},
{155, 272, false, false}, {164, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {110, 545, false, false}, {1108, 136, false, false}, {1174, 136, false, false},
{1108, 136, false, false}, {987, 136, false, false}, {184, 136, false, false}, {987, 136, false, false},
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {880, 136, false, false},
{277, 136, false, false}, {739, 136, false, false}, {207, 136, false, false}, {739, 136, false, false},
{246, 136, false, false}, {698, 136, false, false}, {277, 136, false, false}, {622, 136, false, false},
{277, 136, false, false}, {554, 136, false, false}, {184, 136, false, false}, {698, 136, false, false},
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {830, 136, false, false},
{277, 136, false, false}, {987, 136, false, false}, {174, 136, false, false}, {1046, 136, false, false},
{277, 136, false, false}, {1046, 136, false, false}, {277, 136, false, false}, {1174, 136, false, false},
{277, 136, false, false}, {987, 136, false, false}, {184, 136, false, false}, {987, 136, false, false},
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {880, 136, false, false},
{220, 136, false, false}, {739, 136, false, false}, {207, 136, false, false}, {739, 136, false, false},
{329, 136, false, false}, {659, 136, false, false}, {329, 136, false, false}, {622, 136, false, false},
{329, 136, false, false}, {554, 136, false, false}, {207, 136, false, false}, {659, 136, false, false},
{369, 136, false, false}, {622, 136, false, false}, {311, 136, false, false}, {554, 136, false, false},
{369, 136, false, false}, {523, 136, false, false}, {329, 545, false, false}, {659, 136, false, false},
{587, 136, false, false}, {554, 136, false, false}, {493, 136, false, false}, {220, 136, false, false},
{493, 136, false, false}, {329, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
{739, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {246, 136, false, false},
{830, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {207, 136, false, false},
{587, 136, false, false}, {329, 136, false, false}, {493, 136, false, false}, {220, 136, false, false},
{493, 136, false, false}, {329, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
{739, 136, false, false}, {277, 136, false, false}, {880, 136, false, false}, {164, 272, false, false},
{293, 272, false, false}, {293, 136, false, false}, {587, 136, false, false}, {293, 136, false, false},
{493, 136, false, false}, {220, 136, false, false}, {493, 136, false, false}, {329, 136, false, false},
{587, 136, false, false}, {277, 136, false, false}, {739, 136, false, false}, {329, 136, false, false},
{880, 136, false, false}, {246, 136, false, false}, {830, 136, false, false}, {329, 136, false, false},
{659, 136, false, false}, {207, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
{493, 136, false, false}, {220, 136, false, false}, {659, 136, false, false}, {184, 136, false, false},
{554, 136, false, false}, {146, 136, false, false}, {587, 136, false, false}, {164, 136, false, false},
{493, 136, false, false}, {110, 272, false, false}, {220, 272, false, false}, {1108, 136, false, false},
{1174, 136, false, false}, {1108, 136, false, false}, {987, 136, false, false}, {184, 136, false, false},
{987, 136, false, false}, {277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false},
{880, 136, false, false}, {277, 136, false, false}, {739, 136, false, false}, {207, 136, false, false},
{739, 136, false, false}, {277, 136, false, false}, {698, 136, false, false}, {246, 136, false, false},
{622, 136, false, false}, {277, 136, false, false}, {554, 136, false, false}, {184, 136, false, false},
{698, 136, false, false}, {277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false},
{830, 136, false, false}, {277, 136, false, false}, {987, 136, false, false}, {138, 136, false, false},
{1046, 136, false, false}, {207, 136, false, false}, {1046, 136, false, false}, {277, 136, false, false},
{1046, 136, false, false}, {277, 136, false, false}, {932, 136, false, false}, {123, 136, false, false},
{1108, 136, false, false}, {246, 136, false, false}, {1108, 136, false, false}, {246, 136, false, false},
{1108, 136, false, false}, {246, 136, false, false}, {1108, 136, false, false}, {123, 136, false, false},
{1108, 136, false, false}, {246, 136, false, false}, {880, 136, false, false}, {246, 136, false, false},
{880, 136, false, false}, {246, 136, false, false}, {830, 136, false, false}, {138, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {739, 136, false, false}, {138, 136, false, false},
{739, 136, false, false}, {207, 136, false, false}, {698, 136, false, false}, {220, 545, false, false},
{440, 272, false, false}, {493, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false},
{155, 272, false, false}, {155, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {110, 545, false, false}, {493, 136, false, false},
{440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false},
{329, 272, false, false}, {329, 136, false, false}, {523, 136, false, false}, {329, 136, false, false},
{523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false},
{659, 136, false, false}, {261, 136, false, false}, {659, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {220, 272, false, false},
{329, 272, false, false}, {329, 272, false, false}, {261, 272, false, false}, {164, 272, false, false},
{329, 272, false, false}, {329, 272, false, false}, {329, 272, false, false}, {164, 272, false, false},
{329, 272, false, false}, {246, 272, false, false}, {329, 272, false, false}, {164, 272, false, false},
{329, 272, false, false}, {123, 272, false, false}, {246, 272, false, false}, {164, 545, false, false},
{659, 272, false, false}, {698, 272, false, false}, {130, 272, false, false}, {261, 272, false, false},
{164, 136, false, false}, {783, 136, false, false}, {329, 136, false, false}, {659, 136, false, false},
{195, 272, false, false}, {391, 272, false, false}, {659, 272, false, false}, {698, 272, false, false},
{130, 272, false, false}, {261, 272, false, false}, {164, 136, false, false}, {783, 136, false, false},
{329, 136, false, false}, {659, 136, false, false}, {195, 545, false, false}, {523, 272, false, false},
{587, 272, false, false}, {110, 272, false, false}, {220, 272, false, false}, {130, 136, false, false},
{659, 136, false, false}, {261, 136, false, false}, {523, 136, false, false}, {164, 272, false, false},
{329, 272, false, false}, {523, 272, false, false}, {587, 272, false, false}, {110, 272, false, false},
{220, 272, false, false}, {130, 136, false, false}, {659, 136, false, false}, {261, 136, false, false},
{523, 136, false, false}, {164, 545, false, false}, {493, 136, false, false}, {440, 136, false, false},
{415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false}, {329, 272, false, false},
{329, 136, false, false}, {523, 136, false, false}, {329, 136, false, false}, {523, 136, false, false},
{220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false}, {659, 136, false, false},
{329, 136, false, false}, {659, 136, false, false}, {220, 136, false, false}, {880, 136, false, false},
{329, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {880, 136, false, false},
{261, 136, false, false}, {880, 136, false, false}, {174, 272, false, false}, {311, 272, false, false},
{311, 272, false, false}, {311, 272, false, false}, {164, 272, false, false}, {329, 272, false, false},
{146, 272, false, false}, {174, 272, false, false}, {130, 272, false, false}, {220, 272, false, false},
{146, 272, false, false}, {246, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{164, 272, false, false}, {207, 136, false, false}, {440, 68, false, false}, {493, 68, false, false},
{220, 68, false, false}, {220, 477, false, false}, {440, 136, false, false}, {880, 136, false, false},
{493, 136, false, false}, {987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 272, false, false}, {220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{830, 136, false, false}, {146, 136, false, false}, {739, 136, false, false}, {146, 136, false, false},
{830, 136, false, false}, {155, 136, false, false}, {880, 136, false, false}, {155, 136, false, false},
{987, 136, false, false}, {164, 136, false, false}, {830, 136, false, false}, {164, 136, false, false},
{659, 136, false, false}, {164, 136, false, false}, {880, 136, false, false}, {164, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false}, {220, 272, false, false},
{220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {987, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {987, 136, false, false},
{220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {830, 136, false, false},
{146, 136, false, false}, {739, 136, false, false}, {146, 136, false, false}, {987, 136, false, false},
{164, 136, false, false}, {830, 136, false, false}, {164, 136, false, false}, {659, 136, false, false},
{110, 545, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {369, 136, false, false},
{293, 136, false, false}, {369, 136, false, false}, {220, 136, false, false}, {369, 136, false, false},
{293, 136, false, false}, {369, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {164, 136, false, false}, {329, 136, false, false},
{207, 136, false, false}, {329, 136, false, false}, {164, 136, false, false}, {329, 136, false, false},
{207, 136, false, false}, {329, 136, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {110, 545, false, false}, {164, 545, false, false},
{164, 545, false, false},
{0, 2000, false, false}
};
// TRACK 1: Careless Whisper (Long Sax Solo & Groove)
const SequenceStep careless_song[] = {
{NOTE_D5, 600, true, false}, {NOTE_C5, 300, false, true}, {NOTE_AS4, 300, false, false}, {NOTE_A4, 1200, true, true}, {REST, 200, false, false},
{NOTE_F4, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_D5, 600, true, false}, {NOTE_C5, 300, false, true}, {NOTE_AS4, 300, false, false}, {NOTE_A4, 1200, true, true}, {REST, 200, false, false},
{NOTE_F4, 300, false, true}, {NOTE_A4, 300, true, false}, {NOTE_D5, 600, false, true}, {NOTE_C5, 300, true, false}, {NOTE_AS4, 300, false, true}, {NOTE_A4, 1200, true, false}, {REST, 200, false, false},
{NOTE_E4, 300, false, true}, {NOTE_G4, 300, true, false}, {NOTE_C5, 600, false, true}, {NOTE_AS4, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_G4, 1200, true, true}, {REST, 600, false, false},
{NOTE_D4, 200, true, true}, {NOTE_F4, 200, false, false}, {NOTE_A4, 200, false, true}, {NOTE_D5, 400, true, false}, {NOTE_C5, 200, false, true}, {NOTE_A4, 200, true, false}, {NOTE_F4, 200, false, true}, {NOTE_D4, 400, true, true},
{REST, 1000, false, false}
};
// TRACK 2: Take On Me (The Iconic Synth Riff + Heavy Drums)
const SequenceStep takeonme_song[] = {
{NOTE_FS5, 200, true, true}, {NOTE_FS5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_D5, 200, false, false},
{NOTE_CS5, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_D5, 200, false, true},
{NOTE_E5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_GS5, 200, true, false},
{NOTE_GS5, 200, false, true}, {NOTE_A5, 200, false, false}, {NOTE_B5, 200, true, true}, {REST, 400, false, false},
{NOTE_FS5, 200, true, true}, {NOTE_FS5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_D5, 200, false, false},
{NOTE_CS5, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_D5, 200, false, true},
{NOTE_E5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_GS5, 200, true, false},
{NOTE_GS5, 200, false, true}, {NOTE_A5, 200, false, false}, {NOTE_B5, 200, true, true}, {REST, 1000, false, false}
};
// TRACK 3: Rickroll (Intro & Chorus)
const SequenceStep rickroll_song[] = {
{NOTE_CS5, 300, true, false}, {NOTE_D5, 300, false, true}, {NOTE_CS5, 300, true, false}, {NOTE_B4, 300, false, true}, {NOTE_FS4, 600, true, true}, {REST, 600, false, false},
{NOTE_A4, 150, true, false}, {NOTE_B4, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_B4, 150, false, true}, {NOTE_FS5, 300, true, false}, {NOTE_FS5, 300, false, true}, {NOTE_E5, 600, true, false},
{NOTE_A4, 150, false, true}, {NOTE_B4, 150, true, false}, {NOTE_D5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_E5, 300, true, true}, {NOTE_E5, 300, false, false}, {NOTE_D5, 300, true, false}, {NOTE_CS5, 150, false, true}, {NOTE_B4, 150, false, false},
{NOTE_A4, 150, true, true}, {NOTE_B4, 150, false, false}, {NOTE_D5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_D5, 300, true, false}, {NOTE_E5, 300, false, true}, {NOTE_CS5, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_A4, 300, true, false}, {NOTE_E5, 300, false, true}, {NOTE_D5, 900, true, true},
{REST, 1000, false, false}
};
// TRACK 4: Can't Help Falling In Love (Slow, Emotional Rhythm)
const SequenceStep elvis_song[] = {
{NOTE_C4, 400, true, false}, {NOTE_G4, 400, false, true}, {NOTE_C5, 800, true, false}, {NOTE_G4, 400, false, true}, {NOTE_E4, 400, true, false},
{NOTE_A4, 400, true, true}, {NOTE_B4, 400, false, false}, {NOTE_C5, 400, true, false}, {NOTE_D5, 400, false, true}, {NOTE_E5, 400, true, false}, {NOTE_F5, 400, false, true}, {NOTE_E5, 800, true, true}, {NOTE_D5, 800, false, true},
{NOTE_G4, 400, true, false}, {NOTE_A4, 400, false, true}, {NOTE_B4, 400, true, false}, {NOTE_C5, 800, true, true}, {NOTE_D5, 400, false, true},
{NOTE_E5, 400, true, false}, {NOTE_F5, 400, false, true}, {NOTE_G5, 400, true, false}, {NOTE_F5, 400, true, true}, {NOTE_E5, 400, false, true}, {NOTE_D5, 400, true, false}, {NOTE_C5, 1200, true, true},
{REST, 1500, false, false}
};
// TRACK 5: Gimme! Gimme! Gimme! (Midnight Rave Bassline)
const SequenceStep abba_song[] = {
{NOTE_D5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_F5, 400, true, false}, {NOTE_A5, 200, false, true}, {NOTE_G5, 400, true, true}, {NOTE_F5, 200, false, false}, {NOTE_E5, 200, true, false}, {NOTE_F5, 200, false, true}, {NOTE_D5, 600, true, true}, {REST, 200, false, false},
{NOTE_D5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_F5, 400, true, false}, {NOTE_A5, 200, false, true}, {NOTE_G5, 400, true, true}, {NOTE_F5, 200, false, false}, {NOTE_E5, 200, true, false}, {NOTE_D5, 200, false, true}, {NOTE_CS5, 600, true, true}, {REST, 400, false, false},
{NOTE_D4, 200, true, true}, {REST, 100, false, false}, {NOTE_D4, 200, false, true}, {NOTE_F4, 200, true, false}, {NOTE_A4, 200, false, true}, {NOTE_G4, 200, true, true}, {REST, 100, false, false}, {NOTE_E4, 200, false, true}, {NOTE_C4, 200, true, false}, {NOTE_D4, 400, true, true},
{REST, 1000, false, false}
};
// TRACK 6: Turkish March / Rondo Alla Turca (Mozart)
const SequenceStep turkish_song[] = {
// The famous ultra-fast piano run!
{NOTE_B4, 150, true, false}, {NOTE_A4, 150, false, true}, {NOTE_GS4, 150, false, false}, {NOTE_A4, 150, false, true}, {NOTE_C5, 600, true, true}, {REST, 150, false, false},
{NOTE_D5, 150, true, false}, {NOTE_C5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_C5, 150, false, true}, {NOTE_E5, 600, true, true}, {REST, 150, false, false},
{NOTE_F5, 150, true, false}, {NOTE_E5, 150, false, true}, {NOTE_DS5, 150, false, false}, {NOTE_E5, 150, false, true},
{NOTE_B5, 150, true, false}, {NOTE_A5, 150, false, true}, {NOTE_GS5, 150, false, false}, {NOTE_A5, 150, false, true},
{NOTE_B5, 150, true, false}, {NOTE_A5, 150, false, true}, {NOTE_GS5, 150, false, false}, {NOTE_A5, 150, false, true},
{NOTE_C6, 450, true, true}, {NOTE_A5, 450, false, true}, {NOTE_C6, 450, true, false},
// The strong driving ending
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_A5, 300, true, false},
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_A5, 300, true, false},
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_FS5, 300, true, false},
{NOTE_E5, 600, true, true},
{REST, 1000, false, false}
};
// TRACK 7: Für Elise (Beethoven)
const SequenceStep elise_song[] = {
// The iconic looping riff with a modern Trap/Rave beat
{NOTE_E5, 200, true, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, false, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, true, false},
{NOTE_B4, 200, false, true}, {NOTE_D5, 200, false, false}, {NOTE_C5, 200, false, true},
{NOTE_A4, 600, true, true}, {REST, 200, false, false},
{NOTE_C4, 200, false, true}, {NOTE_E4, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 600, true, true}, {REST, 200, false, false},
{NOTE_E4, 200, false, true}, {NOTE_GS4, 200, false, false}, {NOTE_B4, 200, false, true},
{NOTE_C5, 600, true, true}, {REST, 200, false, false},
// Repeat to lock the trance
{NOTE_E5, 200, true, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, false, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, true, false},
{NOTE_B4, 200, false, true}, {NOTE_D5, 200, false, false}, {NOTE_C5, 200, false, true},
{NOTE_A4, 600, true, true}, {REST, 200, false, false},
{NOTE_C4, 200, false, true}, {NOTE_E4, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 600, true, true}, {REST, 200, false, false},
{NOTE_E4, 200, false, true}, {NOTE_C5, 200, false, false}, {NOTE_B4, 200, false, true},
{NOTE_A4, 800, true, true},
{REST, 1000, false, false}
};
// TRACK 8: Symphony No. 40 (Mozart)
const SequenceStep mozart_song[] = {
// The intense, frantic strings
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
{NOTE_AS5, 600, true, true}, {REST, 300, false, false},
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
{NOTE_A5, 600, true, true}, {REST, 300, false, false},
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
{NOTE_GS5, 600, true, true},
{REST, 1000, false, false}
};
// ==========================================
// 5. HARDWARE INITIALIZATION
// ==========================================
void init_hardware(void) {
gpio_set_direction(ACTIVE_BUZZER_1_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_1_PIN, 0);
gpio_set_direction(ACTIVE_BUZZER_2_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_direction(LED_KICK_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_KICK_PIN, 0);
gpio_set_direction(LED_HAT_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_HAT_PIN, 0);
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; spi_transaction_t t; memset(&t, 0, sizeof(t));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(79): Expected nodes here.
uint8_t cmd_ram = cmd; t.length = 8; t.tx_buffer = &cmd_ram; spi_device_polling_transmit(spi, &t);
^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(80): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(82): Expected node name here.
void oled_send_data(const uint8_t *data, int len) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(82): Expected device instantiation or directive here.
void oled_send_data(const uint8_t *data, int len) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(83): Expected 2 node names here.
gpio_set_level(OLED_DC_PIN, 1); spi_transaction_t t; memset(&t, 0, sizeof(t));
t.length = len * 8; t.tx_buffer = data; spi_device_polling_transmit(spi, &t);
}
void draw_pixel(int x, int y, int color) {
if (x < 0 || x >= 128 || y < 0 || y >= 64) return;
if (color) oled_buffer[x + (y / 8) * 128] |= (1 << (y % 8));
else oled_buffer[x + (y / 8) * 128] &= ~(1 << (y % 8));
}
void draw_filled_rect(int x, int y, int w, int h, int color) {
for (int i = x; i < x + w; i++) for (int j = y; j < y + h; j++) draw_pixel(i, j, color);
}
void draw_rect(int x, int y, int w, int h, int color) {
for (int i = x; i < x + w; i++) { draw_pixel(i, y, color); draw_pixel(i, y + h - 1, color); }
for (int j = y; j < y + h; j++) { draw_pixel(x, j, color); draw_pixel(x + w - 1, j, color); }
}
void draw_string(int x, int y, const char* str) {
while(*str) {
char c = *str;
if (c >= 32 && c <= 90) {
for(int i=0; i<5; i++) for(int j=0; j<8; j++) if((font5x7[c-32][i] >> j) & 1) draw_pixel(x+i, y+j, 1);
} else if (c >= 97 && c <= 122) {
for(int i=0; i<5; i++) for(int j=0; j<8; j++) if((font5x7[c-64][i] >> j) & 1) draw_pixel(x+i, y+j, 1);
}
x += 6; str++;
}
}
void oled_push_framebuffer(void) {
for(int page = 0; page < 8; page++) {
oled_send_cmd(0xB0 + page); oled_send_cmd(0x02); oled_send_cmd(0x10);
oled_send_data(&oled_buffer[page * 128], 128);
}
}
// ==========================================
// 4. THE ULTIMATE 8-TRACK PLAYLIST (FLASH MEMORY STORAGE)
// ==========================================
typedef struct { uint32_t frequency; uint32_t duration; bool kick_drum; bool hi_hat; } SequenceStep;
#define REST 0
#define NOTE_G3 196
#define NOTE_GS3 208
#define NOTE_A3 220
#define NOTE_AS3 233
#define NOTE_B3 247
#define NOTE_C4 262
#define NOTE_CS4 277
#define NOTE_D4 294
#define NOTE_DS4 311
#define NOTE_E4 330
#define NOTE_F4 349
#define NOTE_FS4 370
#define NOTE_G4 392
#define NOTE_GS4 415
#define NOTE_A4 440
#define NOTE_AS4 466
#define NOTE_B4 494
#define NOTE_C5 523
#define NOTE_CS5 554
#define NOTE_D5 587
#define NOTE_DS5 622
#define NOTE_E5 659
#define NOTE_F5 698
#define NOTE_FS5 740
#define NOTE_G5 784
#define NOTE_GS5 831
#define NOTE_A5 880
#define NOTE_AS5 932
#define NOTE_B5 988
#define NOTE_C6 1047
#define NOTE_CS6 1109
#define NOTE_D6 1175
#define NOTE_DS6 1245
#define NOTE_E6 1319
// Converted from: alla_turca_8.mid
const SequenceStep midi_alla_turca[] = {
{493, 136, false, false}, {440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false},
{220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false}, {523, 136, false, false},
{329, 136, false, false}, {523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false},
{261, 136, false, false}, {659, 136, false, false}, {329, 136, false, false}, {659, 136, false, false},
{220, 136, false, false}, {880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false},
{220, 136, false, false}, {880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false},
{220, 272, false, false}, {329, 272, false, false}, {261, 272, false, false}, {329, 272, false, false},
{164, 272, false, false}, {329, 272, false, false}, {329, 272, false, false}, {329, 272, false, false},
{164, 272, false, false}, {246, 272, false, false}, {329, 272, false, false}, {329, 272, false, false},
{164, 272, false, false}, {329, 272, false, false}, {123, 272, false, false}, {246, 272, false, false},
{164, 545, false, false}, {523, 272, false, false}, {698, 272, false, false}, {130, 272, false, false},
{261, 272, false, false}, {164, 136, false, false}, {783, 136, false, false}, {329, 136, false, false},
{659, 136, false, false}, {195, 272, false, false}, {391, 272, false, false}, {523, 272, false, false},
{698, 272, false, false}, {130, 272, false, false}, {261, 272, false, false}, {164, 136, false, false},
{783, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {195, 545, false, false},
{440, 272, false, false}, {587, 272, false, false}, {110, 272, false, false}, {220, 272, false, false},
{130, 136, false, false}, {659, 136, false, false}, {261, 136, false, false}, {523, 136, false, false},
{164, 272, false, false}, {329, 272, false, false}, {440, 272, false, false}, {587, 272, false, false},
{110, 272, false, false}, {220, 272, false, false}, {130, 136, false, false}, {659, 136, false, false},
{261, 136, false, false}, {523, 136, false, false}, {164, 545, false, false}, {493, 136, false, false},
{440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false},
{329, 272, false, false}, {261, 136, false, false}, {523, 136, false, false}, {329, 136, false, false},
{523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false},
{659, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {261, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {174, 272, false, false},
{311, 272, false, false}, {311, 272, false, false}, {311, 272, false, false}, {164, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {246, 272, false, false}, {130, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {246, 272, false, false}, {220, 272, false, false},
{164, 272, false, false}, {207, 272, false, false}, {207, 136, false, false}, {440, 68, false, false},
{493, 68, false, false}, {220, 68, false, false}, {220, 477, false, false}, {440, 272, false, false},
{493, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false}, {155, 272, false, false},
{155, 272, false, false}, {164, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {110, 545, false, false}, {1108, 136, false, false}, {1174, 136, false, false},
{1108, 136, false, false}, {987, 136, false, false}, {184, 136, false, false}, {987, 136, false, false},
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {880, 136, false, false},
{277, 136, false, false}, {739, 136, false, false}, {207, 136, false, false}, {739, 136, false, false},
{246, 136, false, false}, {698, 136, false, false}, {277, 136, false, false}, {622, 136, false, false},
{277, 136, false, false}, {554, 136, false, false}, {184, 136, false, false}, {698, 136, false, false},
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {830, 136, false, false},
{277, 136, false, false}, {987, 136, false, false}, {174, 136, false, false}, {1046, 136, false, false},
{277, 136, false, false}, {1046, 136, false, false}, {277, 136, false, false}, {1174, 136, false, false},
{277, 136, false, false}, {987, 136, false, false}, {184, 136, false, false}, {987, 136, false, false},
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {880, 136, false, false},
{220, 136, false, false}, {739, 136, false, false}, {207, 136, false, false}, {739, 136, false, false},
{329, 136, false, false}, {659, 136, false, false}, {329, 136, false, false}, {622, 136, false, false},
{329, 136, false, false}, {554, 136, false, false}, {207, 136, false, false}, {659, 136, false, false},
{369, 136, false, false}, {622, 136, false, false}, {311, 136, false, false}, {554, 136, false, false},
{369, 136, false, false}, {523, 136, false, false}, {329, 545, false, false}, {659, 136, false, false},
{587, 136, false, false}, {554, 136, false, false}, {493, 136, false, false}, {220, 136, false, false},
{493, 136, false, false}, {329, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
{739, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {246, 136, false, false},
{830, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {207, 136, false, false},
{587, 136, false, false}, {329, 136, false, false}, {493, 136, false, false}, {220, 136, false, false},
{493, 136, false, false}, {329, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
{739, 136, false, false}, {277, 136, false, false}, {880, 136, false, false}, {164, 272, false, false},
{293, 272, false, false}, {293, 136, false, false}, {587, 136, false, false}, {293, 136, false, false},
{493, 136, false, false}, {220, 136, false, false}, {493, 136, false, false}, {329, 136, false, false},
{587, 136, false, false}, {277, 136, false, false}, {739, 136, false, false}, {329, 136, false, false},
{880, 136, false, false}, {246, 136, false, false}, {830, 136, false, false}, {329, 136, false, false},
{659, 136, false, false}, {207, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
{493, 136, false, false}, {220, 136, false, false}, {659, 136, false, false}, {184, 136, false, false},
{554, 136, false, false}, {146, 136, false, false}, {587, 136, false, false}, {164, 136, false, false},
{493, 136, false, false}, {110, 272, false, false}, {220, 272, false, false}, {1108, 136, false, false},
{1174, 136, false, false}, {1108, 136, false, false}, {987, 136, false, false}, {184, 136, false, false},
{987, 136, false, false}, {277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false},
{880, 136, false, false}, {277, 136, false, false}, {739, 136, false, false}, {207, 136, false, false},
{739, 136, false, false}, {277, 136, false, false}, {698, 136, false, false}, {246, 136, false, false},
{622, 136, false, false}, {277, 136, false, false}, {554, 136, false, false}, {184, 136, false, false},
{698, 136, false, false}, {277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false},
{830, 136, false, false}, {277, 136, false, false}, {987, 136, false, false}, {138, 136, false, false},
{1046, 136, false, false}, {207, 136, false, false}, {1046, 136, false, false}, {277, 136, false, false},
{1046, 136, false, false}, {277, 136, false, false}, {932, 136, false, false}, {123, 136, false, false},
{1108, 136, false, false}, {246, 136, false, false}, {1108, 136, false, false}, {246, 136, false, false},
{1108, 136, false, false}, {246, 136, false, false}, {1108, 136, false, false}, {123, 136, false, false},
{1108, 136, false, false}, {246, 136, false, false}, {880, 136, false, false}, {246, 136, false, false},
{880, 136, false, false}, {246, 136, false, false}, {830, 136, false, false}, {138, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {739, 136, false, false}, {138, 136, false, false},
{739, 136, false, false}, {207, 136, false, false}, {698, 136, false, false}, {220, 545, false, false},
{440, 272, false, false}, {493, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false},
{155, 272, false, false}, {155, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {110, 545, false, false}, {493, 136, false, false},
{440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false},
{329, 272, false, false}, {329, 136, false, false}, {523, 136, false, false}, {329, 136, false, false},
{523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false},
{659, 136, false, false}, {261, 136, false, false}, {659, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {220, 272, false, false},
{329, 272, false, false}, {329, 272, false, false}, {261, 272, false, false}, {164, 272, false, false},
{329, 272, false, false}, {329, 272, false, false}, {329, 272, false, false}, {164, 272, false, false},
{329, 272, false, false}, {246, 272, false, false}, {329, 272, false, false}, {164, 272, false, false},
{329, 272, false, false}, {123, 272, false, false}, {246, 272, false, false}, {164, 545, false, false},
{659, 272, false, false}, {698, 272, false, false}, {130, 272, false, false}, {261, 272, false, false},
{164, 136, false, false}, {783, 136, false, false}, {329, 136, false, false}, {659, 136, false, false},
{195, 272, false, false}, {391, 272, false, false}, {659, 272, false, false}, {698, 272, false, false},
{130, 272, false, false}, {261, 272, false, false}, {164, 136, false, false}, {783, 136, false, false},
{329, 136, false, false}, {659, 136, false, false}, {195, 545, false, false}, {523, 272, false, false},
{587, 272, false, false}, {110, 272, false, false}, {220, 272, false, false}, {130, 136, false, false},
{659, 136, false, false}, {261, 136, false, false}, {523, 136, false, false}, {164, 272, false, false},
{329, 272, false, false}, {523, 272, false, false}, {587, 272, false, false}, {110, 272, false, false},
{220, 272, false, false}, {130, 136, false, false}, {659, 136, false, false}, {261, 136, false, false},
{523, 136, false, false}, {164, 545, false, false}, {493, 136, false, false}, {440, 136, false, false},
{415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false}, {329, 272, false, false},
{329, 136, false, false}, {523, 136, false, false}, {329, 136, false, false}, {523, 136, false, false},
{220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false}, {659, 136, false, false},
{329, 136, false, false}, {659, 136, false, false}, {220, 136, false, false}, {880, 136, false, false},
{329, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {880, 136, false, false},
{261, 136, false, false}, {880, 136, false, false}, {174, 272, false, false}, {311, 272, false, false},
{311, 272, false, false}, {311, 272, false, false}, {164, 272, false, false}, {329, 272, false, false},
{146, 272, false, false}, {174, 272, false, false}, {130, 272, false, false}, {220, 272, false, false},
{146, 272, false, false}, {246, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{164, 272, false, false}, {207, 136, false, false}, {440, 68, false, false}, {493, 68, false, false},
{220, 68, false, false}, {220, 477, false, false}, {440, 136, false, false}, {880, 136, false, false},
{493, 136, false, false}, {987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 272, false, false}, {220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
{830, 136, false, false}, {146, 136, false, false}, {739, 136, false, false}, {146, 136, false, false},
{830, 136, false, false}, {155, 136, false, false}, {880, 136, false, false}, {155, 136, false, false},
{987, 136, false, false}, {164, 136, false, false}, {830, 136, false, false}, {164, 136, false, false},
{659, 136, false, false}, {164, 136, false, false}, {880, 136, false, false}, {164, 136, false, false},
{987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false}, {220, 272, false, false},
{220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {987, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {987, 136, false, false},
{220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {830, 136, false, false},
{146, 136, false, false}, {739, 136, false, false}, {146, 136, false, false}, {987, 136, false, false},
{164, 136, false, false}, {830, 136, false, false}, {164, 136, false, false}, {659, 136, false, false},
{110, 545, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {369, 136, false, false},
{293, 136, false, false}, {369, 136, false, false}, {220, 136, false, false}, {369, 136, false, false},
{293, 136, false, false}, {369, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
{277, 136, false, false}, {329, 136, false, false}, {164, 136, false, false}, {329, 136, false, false},
{207, 136, false, false}, {329, 136, false, false}, {164, 136, false, false}, {329, 136, false, false},
{207, 136, false, false}, {329, 136, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
{220, 272, false, false}, {220, 272, false, false}, {110, 545, false, false}, {164, 545, false, false},
{164, 545, false, false},
{0, 2000, false, false}
};
// TRACK 1: Careless Whisper (Long Sax Solo & Groove)
const SequenceStep careless_song[] = {
{NOTE_D5, 600, true, false}, {NOTE_C5, 300, false, true}, {NOTE_AS4, 300, false, false}, {NOTE_A4, 1200, true, true}, {REST, 200, false, false},
{NOTE_F4, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_D5, 600, true, false}, {NOTE_C5, 300, false, true}, {NOTE_AS4, 300, false, false}, {NOTE_A4, 1200, true, true}, {REST, 200, false, false},
{NOTE_F4, 300, false, true}, {NOTE_A4, 300, true, false}, {NOTE_D5, 600, false, true}, {NOTE_C5, 300, true, false}, {NOTE_AS4, 300, false, true}, {NOTE_A4, 1200, true, false}, {REST, 200, false, false},
{NOTE_E4, 300, false, true}, {NOTE_G4, 300, true, false}, {NOTE_C5, 600, false, true}, {NOTE_AS4, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_G4, 1200, true, true}, {REST, 600, false, false},
{NOTE_D4, 200, true, true}, {NOTE_F4, 200, false, false}, {NOTE_A4, 200, false, true}, {NOTE_D5, 400, true, false}, {NOTE_C5, 200, false, true}, {NOTE_A4, 200, true, false}, {NOTE_F4, 200, false, true}, {NOTE_D4, 400, true, true},
{REST, 1000, false, false}
};
// TRACK 2: Take On Me (The Iconic Synth Riff + Heavy Drums)
const SequenceStep takeonme_song[] = {
{NOTE_FS5, 200, true, true}, {NOTE_FS5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_D5, 200, false, false},
{NOTE_CS5, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_D5, 200, false, true},
{NOTE_E5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_GS5, 200, true, false},
{NOTE_GS5, 200, false, true}, {NOTE_A5, 200, false, false}, {NOTE_B5, 200, true, true}, {REST, 400, false, false},
{NOTE_FS5, 200, true, true}, {NOTE_FS5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_D5, 200, false, false},
{NOTE_CS5, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_D5, 200, false, true},
{NOTE_E5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_GS5, 200, true, false},
{NOTE_GS5, 200, false, true}, {NOTE_A5, 200, false, false}, {NOTE_B5, 200, true, true}, {REST, 1000, false, false}
};
// TRACK 3: Rickroll (Intro & Chorus)
const SequenceStep rickroll_song[] = {
{NOTE_CS5, 300, true, false}, {NOTE_D5, 300, false, true}, {NOTE_CS5, 300, true, false}, {NOTE_B4, 300, false, true}, {NOTE_FS4, 600, true, true}, {REST, 600, false, false},
{NOTE_A4, 150, true, false}, {NOTE_B4, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_B4, 150, false, true}, {NOTE_FS5, 300, true, false}, {NOTE_FS5, 300, false, true}, {NOTE_E5, 600, true, false},
{NOTE_A4, 150, false, true}, {NOTE_B4, 150, true, false}, {NOTE_D5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_E5, 300, true, true}, {NOTE_E5, 300, false, false}, {NOTE_D5, 300, true, false}, {NOTE_CS5, 150, false, true}, {NOTE_B4, 150, false, false},
{NOTE_A4, 150, true, true}, {NOTE_B4, 150, false, false}, {NOTE_D5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_D5, 300, true, false}, {NOTE_E5, 300, false, true}, {NOTE_CS5, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_A4, 300, true, false}, {NOTE_E5, 300, false, true}, {NOTE_D5, 900, true, true},
{REST, 1000, false, false}
};
// TRACK 4: Can't Help Falling In Love (Slow, Emotional Rhythm)
const SequenceStep elvis_song[] = {
{NOTE_C4, 400, true, false}, {NOTE_G4, 400, false, true}, {NOTE_C5, 800, true, false}, {NOTE_G4, 400, false, true}, {NOTE_E4, 400, true, false},
{NOTE_A4, 400, true, true}, {NOTE_B4, 400, false, false}, {NOTE_C5, 400, true, false}, {NOTE_D5, 400, false, true}, {NOTE_E5, 400, true, false}, {NOTE_F5, 400, false, true}, {NOTE_E5, 800, true, true}, {NOTE_D5, 800, false, true},
{NOTE_G4, 400, true, false}, {NOTE_A4, 400, false, true}, {NOTE_B4, 400, true, false}, {NOTE_C5, 800, true, true}, {NOTE_D5, 400, false, true},
{NOTE_E5, 400, true, false}, {NOTE_F5, 400, false, true}, {NOTE_G5, 400, true, false}, {NOTE_F5, 400, true, true}, {NOTE_E5, 400, false, true}, {NOTE_D5, 400, true, false}, {NOTE_C5, 1200, true, true},
{REST, 1500, false, false}
};
// TRACK 5: Gimme! Gimme! Gimme! (Midnight Rave Bassline)
const SequenceStep abba_song[] = {
{NOTE_D5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_F5, 400, true, false}, {NOTE_A5, 200, false, true}, {NOTE_G5, 400, true, true}, {NOTE_F5, 200, false, false}, {NOTE_E5, 200, true, false}, {NOTE_F5, 200, false, true}, {NOTE_D5, 600, true, true}, {REST, 200, false, false},
{NOTE_D5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_F5, 400, true, false}, {NOTE_A5, 200, false, true}, {NOTE_G5, 400, true, true}, {NOTE_F5, 200, false, false}, {NOTE_E5, 200, true, false}, {NOTE_D5, 200, false, true}, {NOTE_CS5, 600, true, true}, {REST, 400, false, false},
{NOTE_D4, 200, true, true}, {REST, 100, false, false}, {NOTE_D4, 200, false, true}, {NOTE_F4, 200, true, false}, {NOTE_A4, 200, false, true}, {NOTE_G4, 200, true, true}, {REST, 100, false, false}, {NOTE_E4, 200, false, true}, {NOTE_C4, 200, true, false}, {NOTE_D4, 400, true, true},
{REST, 1000, false, false}
};
// TRACK 6: Turkish March / Rondo Alla Turca (Mozart)
const SequenceStep turkish_song[] = {
// The famous ultra-fast piano run!
{NOTE_B4, 150, true, false}, {NOTE_A4, 150, false, true}, {NOTE_GS4, 150, false, false}, {NOTE_A4, 150, false, true}, {NOTE_C5, 600, true, true}, {REST, 150, false, false},
{NOTE_D5, 150, true, false}, {NOTE_C5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_C5, 150, false, true}, {NOTE_E5, 600, true, true}, {REST, 150, false, false},
{NOTE_F5, 150, true, false}, {NOTE_E5, 150, false, true}, {NOTE_DS5, 150, false, false}, {NOTE_E5, 150, false, true},
{NOTE_B5, 150, true, false}, {NOTE_A5, 150, false, true}, {NOTE_GS5, 150, false, false}, {NOTE_A5, 150, false, true},
{NOTE_B5, 150, true, false}, {NOTE_A5, 150, false, true}, {NOTE_GS5, 150, false, false}, {NOTE_A5, 150, false, true},
{NOTE_C6, 450, true, true}, {NOTE_A5, 450, false, true}, {NOTE_C6, 450, true, false},
// The strong driving ending
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_A5, 300, true, false},
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_A5, 300, true, false},
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_FS5, 300, true, false},
{NOTE_E5, 600, true, true},
{REST, 1000, false, false}
};
// TRACK 7: Für Elise (Beethoven)
const SequenceStep elise_song[] = {
// The iconic looping riff with a modern Trap/Rave beat
{NOTE_E5, 200, true, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, false, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, true, false},
{NOTE_B4, 200, false, true}, {NOTE_D5, 200, false, false}, {NOTE_C5, 200, false, true},
{NOTE_A4, 600, true, true}, {REST, 200, false, false},
{NOTE_C4, 200, false, true}, {NOTE_E4, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 600, true, true}, {REST, 200, false, false},
{NOTE_E4, 200, false, true}, {NOTE_GS4, 200, false, false}, {NOTE_B4, 200, false, true},
{NOTE_C5, 600, true, true}, {REST, 200, false, false},
// Repeat to lock the trance
{NOTE_E5, 200, true, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, false, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, true, false},
{NOTE_B4, 200, false, true}, {NOTE_D5, 200, false, false}, {NOTE_C5, 200, false, true},
{NOTE_A4, 600, true, true}, {REST, 200, false, false},
{NOTE_C4, 200, false, true}, {NOTE_E4, 200, false, false}, {NOTE_A4, 200, false, true},
{NOTE_B4, 600, true, true}, {REST, 200, false, false},
{NOTE_E4, 200, false, true}, {NOTE_C5, 200, false, false}, {NOTE_B4, 200, false, true},
{NOTE_A4, 800, true, true},
{REST, 1000, false, false}
};
// TRACK 8: Symphony No. 40 (Mozart)
const SequenceStep mozart_song[] = {
// The intense, frantic strings
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
{NOTE_AS5, 600, true, true}, {REST, 300, false, false},
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
{NOTE_A5, 600, true, true}, {REST, 300, false, false},
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
{NOTE_GS5, 600, true, true},
{REST, 1000, false, false}
};
// ==========================================
// 5. HARDWARE INITIALIZATION
// ==========================================
void init_hardware(void) {
gpio_set_direction(ACTIVE_BUZZER_1_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_1_PIN, 0);
gpio_set_direction(ACTIVE_BUZZER_2_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_direction(LED_KICK_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_KICK_PIN, 0);
gpio_set_direction(LED_HAT_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_HAT_PIN, 0);
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; spi_transaction_t t; memset(&t, 0, sizeof(t));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(84): Expected nodes here.
t.length = len * 8; t.tx_buffer = data; spi_device_polling_transmit(spi, &t);
^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(85): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(87): Expected node name here.
void draw_pixel(int x, int y, int color) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(87): Expected device instantiation or directive here.
void draw_pixel(int x, int y, int color) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(88): Unknown parameter
if (x < 0 || x >= 128 || y < 0 || y >= 64) return;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(88): Unknown parameter
if (x < 0 || x >= 128 || y < 0 || y >= 64) return;
^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(89): Expected node name here.
if (color) oled_buffer[x + (y / 8) * 128] |= (1 << (y % 8));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(89): Expected device instantiation or directive here.
if (color) oled_buffer[x + (y / 8) * 128] |= (1 << (y % 8));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(90): Expected 2 node names here.
else oled_buffer[x + (y / 8) * 128] &= ~(1 << (y % 8));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(91): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(93): Expected node name here.
void draw_filled_rect(int x, int y, int w, int h, int color) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(93): Expected device instantiation or directive here.
void draw_filled_rect(int x, int y, int w, int h, int color) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(94): syntax error
for (int i = x; i < x + w; i++) for (int j = y; j < y + h; j++) draw_pixel(i, j, color);
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(95): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(97): Expected node name here.
void draw_rect(int x, int y, int w, int h, int color) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(97): Expected device instantiation or directive here.
void draw_rect(int x, int y, int w, int h, int color) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(98): syntax error
for (int i = x; i < x + w; i++) { draw_pixel(i, y, color); draw_pixel(i, y + h - 1, color); }
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(99): syntax error
for (int j = y; j < y + h; j++) { draw_pixel(x, j, color); draw_pixel(x + w - 1, j, color); }
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(100): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(102): Expected node name here.
void draw_string(int x, int y, const char* str) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(102): Expected device instantiation or directive here.
void draw_string(int x, int y, const char* str) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(103): Expected node name here.
while(*str) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(103): Expected device instantiation or directive here.
while(*str) {
^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(104): Expected device instantiation or directive here.
char c = *str;
^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(105): Unknown parameter
if (c >= 32 && c <= 90) {
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(105): Expected expression or literal here.
if (c >= 32 && c <= 90) {
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(106): syntax error
for(int i=0; i<5; i++) for(int j=0; j<8; j++) if((font5x7[c-32][i] >> j) & 1) draw_pixel(x+i, y+j, 1);
^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(107): Expected device instantiation or directive here.
} else if (c >= 97 && c <= 122) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(108): syntax error
for(int i=0; i<5; i++) for(int j=0; j<8; j++) if((font5x7[c-64][i] >> j) & 1) draw_pixel(x+i, y+j, 1);
^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(109): Expected device instantiation or directive here.
}
^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(110): syntax error
x += 6; str++;
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(111): Expected device instantiation or directive here.
}
^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(112): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(114): Expected node name here.
void oled_push_framebuffer(void) {
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(114): Expected device instantiation or directive here.
void oled_push_framebuffer(void) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(115): syntax error
for(int page = 0; page < 8; page++) {
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(116): Expected nodes here.
oled_send_cmd(0xB0 + page); oled_send_cmd(0x02); oled_send_cmd(0x10);
^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(117): Expected nodes here.
oled_send_data(&oled_buffer[page * 128], 128);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(118): Expected device instantiation or directive here.
}
^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(119): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(121): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(122): Expected device instantiation or directive here.
// 4. THE ULTIMATE 8-TRACK PLAYLIST (FLASH MEMORY STORAGE)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(123): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(124): Expected "}" here.
typedef struct { uint32_t frequency; uint32_t duration; bool kick_drum; bool hi_hat; } SequenceStep;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(124): Expected nodes here.
typedef struct { uint32_t frequency; uint32_t duration; bool kick_drum; bool hi_hat; } SequenceStep;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(163): Expected device instantiation or directive here.
// Converted from: alla_turca_8.mid
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(164): Expected device instantiation or directive here.
const SequenceStep midi_alla_turca[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(165): Expected device instantiation or directive here.
{493, 136, false, false}, {440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(166): Expected device instantiation or directive here.
{220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false}, {523, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(167): Expected device instantiation or directive here.
{329, 136, false, false}, {523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(168): Expected device instantiation or directive here.
{261, 136, false, false}, {659, 136, false, false}, {329, 136, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(169): Expected device instantiation or directive here.
{220, 136, false, false}, {880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(170): Expected device instantiation or directive here.
{220, 136, false, false}, {880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(171): Expected device instantiation or directive here.
{220, 272, false, false}, {329, 272, false, false}, {261, 272, false, false}, {329, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(172): Expected device instantiation or directive here.
{164, 272, false, false}, {329, 272, false, false}, {329, 272, false, false}, {329, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(173): Expected device instantiation or directive here.
{164, 272, false, false}, {246, 272, false, false}, {329, 272, false, false}, {329, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(174): Expected device instantiation or directive here.
{164, 272, false, false}, {329, 272, false, false}, {123, 272, false, false}, {246, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(175): Expected device instantiation or directive here.
{164, 545, false, false}, {523, 272, false, false}, {698, 272, false, false}, {130, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(176): Expected device instantiation or directive here.
{261, 272, false, false}, {164, 136, false, false}, {783, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(177): Expected device instantiation or directive here.
{659, 136, false, false}, {195, 272, false, false}, {391, 272, false, false}, {523, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(178): Expected device instantiation or directive here.
{698, 272, false, false}, {130, 272, false, false}, {261, 272, false, false}, {164, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(179): Expected device instantiation or directive here.
{783, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {195, 545, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(180): Expected device instantiation or directive here.
{440, 272, false, false}, {587, 272, false, false}, {110, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(181): Expected device instantiation or directive here.
{130, 136, false, false}, {659, 136, false, false}, {261, 136, false, false}, {523, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(182): Expected device instantiation or directive here.
{164, 272, false, false}, {329, 272, false, false}, {440, 272, false, false}, {587, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(183): Expected device instantiation or directive here.
{110, 272, false, false}, {220, 272, false, false}, {130, 136, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(184): Expected device instantiation or directive here.
{261, 136, false, false}, {523, 136, false, false}, {164, 545, false, false}, {493, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(185): Expected device instantiation or directive here.
{440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(186): Expected device instantiation or directive here.
{329, 272, false, false}, {261, 136, false, false}, {523, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(187): Expected device instantiation or directive here.
{523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(188): Expected device instantiation or directive here.
{659, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(189): Expected device instantiation or directive here.
{880, 136, false, false}, {261, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(190): Expected device instantiation or directive here.
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {174, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(191): Expected device instantiation or directive here.
{311, 272, false, false}, {311, 272, false, false}, {311, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(192): Expected device instantiation or directive here.
{220, 272, false, false}, {146, 272, false, false}, {246, 272, false, false}, {130, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(193): Expected device instantiation or directive here.
{220, 272, false, false}, {146, 272, false, false}, {246, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(194): Expected device instantiation or directive here.
{164, 272, false, false}, {207, 272, false, false}, {207, 136, false, false}, {440, 68, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(195): Expected device instantiation or directive here.
{493, 68, false, false}, {220, 68, false, false}, {220, 477, false, false}, {440, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(196): Expected device instantiation or directive here.
{493, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(197): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(198): Expected device instantiation or directive here.
{220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false}, {155, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(199): Expected device instantiation or directive here.
{155, 272, false, false}, {164, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(200): Expected device instantiation or directive here.
{164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(201): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(202): Expected device instantiation or directive here.
{220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(203): Expected device instantiation or directive here.
{164, 272, false, false}, {110, 545, false, false}, {1108, 136, false, false}, {1174, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(204): Expected device instantiation or directive here.
{1108, 136, false, false}, {987, 136, false, false}, {184, 136, false, false}, {987, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(205): Expected device instantiation or directive here.
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(206): Expected device instantiation or directive here.
{277, 136, false, false}, {739, 136, false, false}, {207, 136, false, false}, {739, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(207): Expected device instantiation or directive here.
{246, 136, false, false}, {698, 136, false, false}, {277, 136, false, false}, {622, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(208): Expected device instantiation or directive here.
{277, 136, false, false}, {554, 136, false, false}, {184, 136, false, false}, {698, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(209): Expected device instantiation or directive here.
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {830, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(210): Expected device instantiation or directive here.
{277, 136, false, false}, {987, 136, false, false}, {174, 136, false, false}, {1046, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(211): Expected device instantiation or directive here.
{277, 136, false, false}, {1046, 136, false, false}, {277, 136, false, false}, {1174, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(212): Expected device instantiation or directive here.
{277, 136, false, false}, {987, 136, false, false}, {184, 136, false, false}, {987, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(213): Expected device instantiation or directive here.
{277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(214): Expected device instantiation or directive here.
{220, 136, false, false}, {739, 136, false, false}, {207, 136, false, false}, {739, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(215): Expected device instantiation or directive here.
{329, 136, false, false}, {659, 136, false, false}, {329, 136, false, false}, {622, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(216): Expected device instantiation or directive here.
{329, 136, false, false}, {554, 136, false, false}, {207, 136, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(217): Expected device instantiation or directive here.
{369, 136, false, false}, {622, 136, false, false}, {311, 136, false, false}, {554, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(218): Expected device instantiation or directive here.
{369, 136, false, false}, {523, 136, false, false}, {329, 545, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(219): Expected device instantiation or directive here.
{587, 136, false, false}, {554, 136, false, false}, {493, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(220): Expected device instantiation or directive here.
{493, 136, false, false}, {329, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(221): Expected device instantiation or directive here.
{739, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {246, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(222): Expected device instantiation or directive here.
{830, 136, false, false}, {329, 136, false, false}, {659, 136, false, false}, {207, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(223): Expected device instantiation or directive here.
{587, 136, false, false}, {329, 136, false, false}, {493, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(224): Expected device instantiation or directive here.
{493, 136, false, false}, {329, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(225): Expected device instantiation or directive here.
{739, 136, false, false}, {277, 136, false, false}, {880, 136, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(226): Expected device instantiation or directive here.
{293, 272, false, false}, {293, 136, false, false}, {587, 136, false, false}, {293, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(227): Expected device instantiation or directive here.
{493, 136, false, false}, {220, 136, false, false}, {493, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(228): Expected device instantiation or directive here.
{587, 136, false, false}, {277, 136, false, false}, {739, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(229): Expected device instantiation or directive here.
{880, 136, false, false}, {246, 136, false, false}, {830, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(230): Expected device instantiation or directive here.
{659, 136, false, false}, {207, 136, false, false}, {587, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(231): Expected device instantiation or directive here.
{493, 136, false, false}, {220, 136, false, false}, {659, 136, false, false}, {184, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(232): Expected device instantiation or directive here.
{554, 136, false, false}, {146, 136, false, false}, {587, 136, false, false}, {164, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(233): Expected device instantiation or directive here.
{493, 136, false, false}, {110, 272, false, false}, {220, 272, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(234): Expected device instantiation or directive here.
{1174, 136, false, false}, {1108, 136, false, false}, {987, 136, false, false}, {184, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(235): Expected device instantiation or directive here.
{987, 136, false, false}, {277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(236): Expected device instantiation or directive here.
{880, 136, false, false}, {277, 136, false, false}, {739, 136, false, false}, {207, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(237): Expected device instantiation or directive here.
{739, 136, false, false}, {277, 136, false, false}, {698, 136, false, false}, {246, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(238): Expected device instantiation or directive here.
{622, 136, false, false}, {277, 136, false, false}, {554, 136, false, false}, {184, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(239): Expected device instantiation or directive here.
{698, 136, false, false}, {277, 136, false, false}, {830, 136, false, false}, {277, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(240): Expected device instantiation or directive here.
{830, 136, false, false}, {277, 136, false, false}, {987, 136, false, false}, {138, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(241): Expected device instantiation or directive here.
{1046, 136, false, false}, {207, 136, false, false}, {1046, 136, false, false}, {277, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(242): Expected device instantiation or directive here.
{1046, 136, false, false}, {277, 136, false, false}, {932, 136, false, false}, {123, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(243): Expected device instantiation or directive here.
{1108, 136, false, false}, {246, 136, false, false}, {1108, 136, false, false}, {246, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(244): Expected device instantiation or directive here.
{1108, 136, false, false}, {246, 136, false, false}, {1108, 136, false, false}, {123, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(245): Expected device instantiation or directive here.
{1108, 136, false, false}, {246, 136, false, false}, {880, 136, false, false}, {246, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(246): Expected device instantiation or directive here.
{880, 136, false, false}, {246, 136, false, false}, {830, 136, false, false}, {138, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(247): Expected device instantiation or directive here.
{987, 136, false, false}, {220, 136, false, false}, {739, 136, false, false}, {138, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(248): Expected device instantiation or directive here.
{739, 136, false, false}, {207, 136, false, false}, {698, 136, false, false}, {220, 545, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(249): Expected device instantiation or directive here.
{440, 272, false, false}, {493, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(250): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(251): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(252): Expected device instantiation or directive here.
{155, 272, false, false}, {155, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(253): Expected device instantiation or directive here.
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(254): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(255): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {146, 272, false, false}, {146, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(256): Expected device instantiation or directive here.
{164, 272, false, false}, {164, 272, false, false}, {110, 545, false, false}, {493, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(257): Expected device instantiation or directive here.
{440, 136, false, false}, {415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(258): Expected device instantiation or directive here.
{329, 272, false, false}, {329, 136, false, false}, {523, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(259): Expected device instantiation or directive here.
{523, 136, false, false}, {220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(260): Expected device instantiation or directive here.
{659, 136, false, false}, {261, 136, false, false}, {659, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(261): Expected device instantiation or directive here.
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(262): Expected device instantiation or directive here.
{880, 136, false, false}, {329, 136, false, false}, {880, 136, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(263): Expected device instantiation or directive here.
{329, 272, false, false}, {329, 272, false, false}, {261, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(264): Expected device instantiation or directive here.
{329, 272, false, false}, {329, 272, false, false}, {329, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(265): Expected device instantiation or directive here.
{329, 272, false, false}, {246, 272, false, false}, {329, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(266): Expected device instantiation or directive here.
{329, 272, false, false}, {123, 272, false, false}, {246, 272, false, false}, {164, 545, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(267): Expected device instantiation or directive here.
{659, 272, false, false}, {698, 272, false, false}, {130, 272, false, false}, {261, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(268): Expected device instantiation or directive here.
{164, 136, false, false}, {783, 136, false, false}, {329, 136, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(269): Expected device instantiation or directive here.
{195, 272, false, false}, {391, 272, false, false}, {659, 272, false, false}, {698, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(270): Expected device instantiation or directive here.
{130, 272, false, false}, {261, 272, false, false}, {164, 136, false, false}, {783, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(271): Expected device instantiation or directive here.
{329, 136, false, false}, {659, 136, false, false}, {195, 545, false, false}, {523, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(272): Expected device instantiation or directive here.
{587, 272, false, false}, {110, 272, false, false}, {220, 272, false, false}, {130, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(273): Expected device instantiation or directive here.
{659, 136, false, false}, {261, 136, false, false}, {523, 136, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(274): Expected device instantiation or directive here.
{329, 272, false, false}, {523, 272, false, false}, {587, 272, false, false}, {110, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(275): Expected device instantiation or directive here.
{220, 272, false, false}, {130, 136, false, false}, {659, 136, false, false}, {261, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(276): Expected device instantiation or directive here.
{523, 136, false, false}, {164, 545, false, false}, {493, 136, false, false}, {440, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(277): Expected device instantiation or directive here.
{415, 136, false, false}, {440, 136, false, false}, {220, 272, false, false}, {329, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(278): Expected device instantiation or directive here.
{329, 136, false, false}, {523, 136, false, false}, {329, 136, false, false}, {523, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(279): Expected device instantiation or directive here.
{220, 272, false, false}, {329, 272, false, false}, {329, 136, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(280): Expected device instantiation or directive here.
{329, 136, false, false}, {659, 136, false, false}, {220, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(281): Expected device instantiation or directive here.
{329, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(282): Expected device instantiation or directive here.
{261, 136, false, false}, {880, 136, false, false}, {174, 272, false, false}, {311, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(283): Expected device instantiation or directive here.
{311, 272, false, false}, {311, 272, false, false}, {164, 272, false, false}, {329, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(284): Expected device instantiation or directive here.
{146, 272, false, false}, {174, 272, false, false}, {130, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(285): Expected device instantiation or directive here.
{146, 272, false, false}, {246, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(286): Expected device instantiation or directive here.
{164, 272, false, false}, {207, 136, false, false}, {440, 68, false, false}, {493, 68, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(287): Expected device instantiation or directive here.
{220, 68, false, false}, {220, 477, false, false}, {440, 136, false, false}, {880, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(288): Expected device instantiation or directive here.
{493, 136, false, false}, {987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(289): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(290): Expected device instantiation or directive here.
{987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(291): Expected device instantiation or directive here.
{987, 136, false, false}, {220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(292): Expected device instantiation or directive here.
{830, 136, false, false}, {146, 136, false, false}, {739, 136, false, false}, {146, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(293): Expected device instantiation or directive here.
{830, 136, false, false}, {155, 136, false, false}, {880, 136, false, false}, {155, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(294): Expected device instantiation or directive here.
{987, 136, false, false}, {164, 136, false, false}, {830, 136, false, false}, {164, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(295): Expected device instantiation or directive here.
{659, 136, false, false}, {164, 136, false, false}, {880, 136, false, false}, {164, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(296): Expected device instantiation or directive here.
{987, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(297): Expected device instantiation or directive here.
{220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {987, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(298): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {987, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(299): Expected device instantiation or directive here.
{220, 136, false, false}, {880, 136, false, false}, {220, 136, false, false}, {830, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(300): Expected device instantiation or directive here.
{146, 136, false, false}, {739, 136, false, false}, {146, 136, false, false}, {987, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(301): Expected device instantiation or directive here.
{164, 136, false, false}, {830, 136, false, false}, {164, 136, false, false}, {659, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(302): Expected device instantiation or directive here.
{110, 545, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(303): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(304): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(305): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(306): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(307): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(308): Expected device instantiation or directive here.
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(309): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(310): Expected device instantiation or directive here.
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(311): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(312): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(313): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(314): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(315): Expected device instantiation or directive here.
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(316): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(317): Expected device instantiation or directive here.
{164, 272, false, false}, {164, 272, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(318): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(319): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(320): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(321): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(322): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(323): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(324): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(325): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {369, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(326): Expected device instantiation or directive here.
{293, 136, false, false}, {369, 136, false, false}, {220, 136, false, false}, {369, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(327): Expected device instantiation or directive here.
{293, 136, false, false}, {369, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(328): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {220, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(329): Expected device instantiation or directive here.
{277, 136, false, false}, {329, 136, false, false}, {164, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(330): Expected device instantiation or directive here.
{207, 136, false, false}, {329, 136, false, false}, {164, 136, false, false}, {329, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(331): Expected device instantiation or directive here.
{207, 136, false, false}, {329, 136, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(332): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(333): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(334): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {220, 136, false, false}, {1108, 136, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(335): Expected device instantiation or directive here.
{220, 136, false, false}, {1108, 136, false, false}, {146, 272, false, false}, {146, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(336): Expected device instantiation or directive here.
{146, 272, false, false}, {146, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(337): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {164, 272, false, false}, {164, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(338): Expected device instantiation or directive here.
{164, 272, false, false}, {164, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(339): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(340): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(341): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false}, {220, 272, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(342): Expected device instantiation or directive here.
{220, 272, false, false}, {220, 272, false, false}, {110, 545, false, false}, {164, 545, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(343): Expected device instantiation or directive here.
{164, 545, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(344): Expected device instantiation or directive here.
{0, 2000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(345): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(347): Expected device instantiation or directive here.
// TRACK 1: Careless Whisper (Long Sax Solo & Groove)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(348): Expected device instantiation or directive here.
const SequenceStep careless_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(349): Expected device instantiation or directive here.
{NOTE_D5, 600, true, false}, {NOTE_C5, 300, false, true}, {NOTE_AS4, 300, false, false}, {NOTE_A4, 1200, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(350): Expected device instantiation or directive here.
{NOTE_F4, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_D5, 600, true, false}, {NOTE_C5, 300, false, true}, {NOTE_AS4, 300, false, false}, {NOTE_A4, 1200, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(351): Expected device instantiation or directive here.
{NOTE_F4, 300, false, true}, {NOTE_A4, 300, true, false}, {NOTE_D5, 600, false, true}, {NOTE_C5, 300, true, false}, {NOTE_AS4, 300, false, true}, {NOTE_A4, 1200, true, false}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(352): Expected device instantiation or directive here.
{NOTE_E4, 300, false, true}, {NOTE_G4, 300, true, false}, {NOTE_C5, 600, false, true}, {NOTE_AS4, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_G4, 1200, true, true}, {REST, 600, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(353): Expected device instantiation or directive here.
{NOTE_D4, 200, true, true}, {NOTE_F4, 200, false, false}, {NOTE_A4, 200, false, true}, {NOTE_D5, 400, true, false}, {NOTE_C5, 200, false, true}, {NOTE_A4, 200, true, false}, {NOTE_F4, 200, false, true}, {NOTE_D4, 400, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(354): Expected device instantiation or directive here.
{REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(355): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(357): Expected device instantiation or directive here.
// TRACK 2: Take On Me (The Iconic Synth Riff + Heavy Drums)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(358): Expected device instantiation or directive here.
const SequenceStep takeonme_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(359): Expected device instantiation or directive here.
{NOTE_FS5, 200, true, true}, {NOTE_FS5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_D5, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(360): Expected device instantiation or directive here.
{NOTE_CS5, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_A4, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(361): Expected device instantiation or directive here.
{NOTE_B4, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_D5, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(362): Expected device instantiation or directive here.
{NOTE_E5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_GS5, 200, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(363): Expected device instantiation or directive here.
{NOTE_GS5, 200, false, true}, {NOTE_A5, 200, false, false}, {NOTE_B5, 200, true, true}, {REST, 400, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(364): Expected device instantiation or directive here.
{NOTE_FS5, 200, true, true}, {NOTE_FS5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_D5, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(365): Expected device instantiation or directive here.
{NOTE_CS5, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_A4, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(366): Expected device instantiation or directive here.
{NOTE_B4, 200, true, false}, {NOTE_CS5, 200, false, true}, {NOTE_CS5, 200, false, false}, {NOTE_D5, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(367): Expected device instantiation or directive here.
{NOTE_E5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_E5, 200, false, true}, {NOTE_GS5, 200, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(368): Expected device instantiation or directive here.
{NOTE_GS5, 200, false, true}, {NOTE_A5, 200, false, false}, {NOTE_B5, 200, true, true}, {REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(369): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(371): Expected device instantiation or directive here.
// TRACK 3: Rickroll (Intro & Chorus)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(372): Expected device instantiation or directive here.
const SequenceStep rickroll_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(373): Expected device instantiation or directive here.
{NOTE_CS5, 300, true, false}, {NOTE_D5, 300, false, true}, {NOTE_CS5, 300, true, false}, {NOTE_B4, 300, false, true}, {NOTE_FS4, 600, true, true}, {REST, 600, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(374): Expected device instantiation or directive here.
{NOTE_A4, 150, true, false}, {NOTE_B4, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_B4, 150, false, true}, {NOTE_FS5, 300, true, false}, {NOTE_FS5, 300, false, true}, {NOTE_E5, 600, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(375): Expected device instantiation or directive here.
{NOTE_A4, 150, false, true}, {NOTE_B4, 150, true, false}, {NOTE_D5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_E5, 300, true, true}, {NOTE_E5, 300, false, false}, {NOTE_D5, 300, true, false}, {NOTE_CS5, 150, false, true}, {NOTE_B4, 150, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(376): Expected device instantiation or directive here.
{NOTE_A4, 150, true, true}, {NOTE_B4, 150, false, false}, {NOTE_D5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_D5, 300, true, false}, {NOTE_E5, 300, false, true}, {NOTE_CS5, 300, true, false}, {NOTE_A4, 300, false, true}, {NOTE_A4, 300, true, false}, {NOTE_E5, 300, false, true}, {NOTE_D5, 900, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(377): Expected device instantiation or directive here.
{REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(378): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(380): Expected device instantiation or directive here.
// TRACK 4: Can't Help Falling In Love (Slow, Emotional Rhythm)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(381): Expected device instantiation or directive here.
const SequenceStep elvis_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(382): Expected device instantiation or directive here.
{NOTE_C4, 400, true, false}, {NOTE_G4, 400, false, true}, {NOTE_C5, 800, true, false}, {NOTE_G4, 400, false, true}, {NOTE_E4, 400, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(383): Expected device instantiation or directive here.
{NOTE_A4, 400, true, true}, {NOTE_B4, 400, false, false}, {NOTE_C5, 400, true, false}, {NOTE_D5, 400, false, true}, {NOTE_E5, 400, true, false}, {NOTE_F5, 400, false, true}, {NOTE_E5, 800, true, true}, {NOTE_D5, 800, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(384): Expected device instantiation or directive here.
{NOTE_G4, 400, true, false}, {NOTE_A4, 400, false, true}, {NOTE_B4, 400, true, false}, {NOTE_C5, 800, true, true}, {NOTE_D5, 400, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(385): Expected device instantiation or directive here.
{NOTE_E5, 400, true, false}, {NOTE_F5, 400, false, true}, {NOTE_G5, 400, true, false}, {NOTE_F5, 400, true, true}, {NOTE_E5, 400, false, true}, {NOTE_D5, 400, true, false}, {NOTE_C5, 1200, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(386): Expected device instantiation or directive here.
{REST, 1500, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(387): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(389): Expected device instantiation or directive here.
// TRACK 5: Gimme! Gimme! Gimme! (Midnight Rave Bassline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(390): Expected device instantiation or directive here.
const SequenceStep abba_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(391): Expected device instantiation or directive here.
{NOTE_D5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_F5, 400, true, false}, {NOTE_A5, 200, false, true}, {NOTE_G5, 400, true, true}, {NOTE_F5, 200, false, false}, {NOTE_E5, 200, true, false}, {NOTE_F5, 200, false, true}, {NOTE_D5, 600, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(392): Expected device instantiation or directive here.
{NOTE_D5, 200, true, true}, {NOTE_E5, 200, false, false}, {NOTE_F5, 400, true, false}, {NOTE_A5, 200, false, true}, {NOTE_G5, 400, true, true}, {NOTE_F5, 200, false, false}, {NOTE_E5, 200, true, false}, {NOTE_D5, 200, false, true}, {NOTE_CS5, 600, true, true}, {REST, 400, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(393): Expected device instantiation or directive here.
{NOTE_D4, 200, true, true}, {REST, 100, false, false}, {NOTE_D4, 200, false, true}, {NOTE_F4, 200, true, false}, {NOTE_A4, 200, false, true}, {NOTE_G4, 200, true, true}, {REST, 100, false, false}, {NOTE_E4, 200, false, true}, {NOTE_C4, 200, true, false}, {NOTE_D4, 400, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(394): Expected device instantiation or directive here.
{REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(395): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(397): Expected device instantiation or directive here.
// TRACK 6: Turkish March / Rondo Alla Turca (Mozart)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(398): Expected device instantiation or directive here.
const SequenceStep turkish_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(399): Expected device instantiation or directive here.
// The famous ultra-fast piano run!
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(400): Expected device instantiation or directive here.
{NOTE_B4, 150, true, false}, {NOTE_A4, 150, false, true}, {NOTE_GS4, 150, false, false}, {NOTE_A4, 150, false, true}, {NOTE_C5, 600, true, true}, {REST, 150, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(401): Expected device instantiation or directive here.
{NOTE_D5, 150, true, false}, {NOTE_C5, 150, false, true}, {NOTE_B4, 150, false, false}, {NOTE_C5, 150, false, true}, {NOTE_E5, 600, true, true}, {REST, 150, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(402): Expected device instantiation or directive here.
{NOTE_F5, 150, true, false}, {NOTE_E5, 150, false, true}, {NOTE_DS5, 150, false, false}, {NOTE_E5, 150, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(403): Expected device instantiation or directive here.
{NOTE_B5, 150, true, false}, {NOTE_A5, 150, false, true}, {NOTE_GS5, 150, false, false}, {NOTE_A5, 150, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(404): Expected device instantiation or directive here.
{NOTE_B5, 150, true, false}, {NOTE_A5, 150, false, true}, {NOTE_GS5, 150, false, false}, {NOTE_A5, 150, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(405): Expected device instantiation or directive here.
{NOTE_C6, 450, true, true}, {NOTE_A5, 450, false, true}, {NOTE_C6, 450, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(406): Expected device instantiation or directive here.
// The strong driving ending
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(407): Expected device instantiation or directive here.
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_A5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(408): Expected device instantiation or directive here.
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_A5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(409): Expected device instantiation or directive here.
{NOTE_B5, 300, true, true}, {NOTE_A5, 300, false, false}, {NOTE_G5, 300, false, true}, {NOTE_FS5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(410): Expected device instantiation or directive here.
{NOTE_E5, 600, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(411): Expected device instantiation or directive here.
{REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(412): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(414): Expected device instantiation or directive here.
// TRACK 7: Für Elise (Beethoven)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(415): Expected device instantiation or directive here.
const SequenceStep elise_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(416): Expected device instantiation or directive here.
// The iconic looping riff with a modern Trap/Rave beat
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(417): Expected device instantiation or directive here.
{NOTE_E5, 200, true, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, false, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(418): Expected device instantiation or directive here.
{NOTE_B4, 200, false, true}, {NOTE_D5, 200, false, false}, {NOTE_C5, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(419): Expected device instantiation or directive here.
{NOTE_A4, 600, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(420): Expected device instantiation or directive here.
{NOTE_C4, 200, false, true}, {NOTE_E4, 200, false, false}, {NOTE_A4, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(421): Expected device instantiation or directive here.
{NOTE_B4, 600, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(422): Expected device instantiation or directive here.
{NOTE_E4, 200, false, true}, {NOTE_GS4, 200, false, false}, {NOTE_B4, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(423): Expected device instantiation or directive here.
{NOTE_C5, 600, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(425): Expected device instantiation or directive here.
// Repeat to lock the trance
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(426): Expected device instantiation or directive here.
{NOTE_E5, 200, true, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, false, false}, {NOTE_DS5, 200, false, true}, {NOTE_E5, 200, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(427): Expected device instantiation or directive here.
{NOTE_B4, 200, false, true}, {NOTE_D5, 200, false, false}, {NOTE_C5, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(428): Expected device instantiation or directive here.
{NOTE_A4, 600, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(429): Expected device instantiation or directive here.
{NOTE_C4, 200, false, true}, {NOTE_E4, 200, false, false}, {NOTE_A4, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(430): Expected device instantiation or directive here.
{NOTE_B4, 600, true, true}, {REST, 200, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(431): Expected device instantiation or directive here.
{NOTE_E4, 200, false, true}, {NOTE_C5, 200, false, false}, {NOTE_B4, 200, false, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(432): Expected device instantiation or directive here.
{NOTE_A4, 800, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(433): Expected device instantiation or directive here.
{REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(434): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(436): Expected device instantiation or directive here.
// TRACK 8: Symphony No. 40 (Mozart)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(437): Expected device instantiation or directive here.
const SequenceStep mozart_song[] = {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(438): Expected device instantiation or directive here.
// The intense, frantic strings
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(439): Expected device instantiation or directive here.
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(440): Expected device instantiation or directive here.
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(441): Expected device instantiation or directive here.
{NOTE_DS5, 150, false, true}, {NOTE_D5, 150, false, false}, {NOTE_D5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(442): Expected device instantiation or directive here.
{NOTE_AS5, 600, true, true}, {REST, 300, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(444): Expected device instantiation or directive here.
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(445): Expected device instantiation or directive here.
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(446): Expected device instantiation or directive here.
{NOTE_D5, 150, false, true}, {NOTE_CS5, 150, false, false}, {NOTE_CS5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(447): Expected device instantiation or directive here.
{NOTE_A5, 600, true, true}, {REST, 300, false, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(449): Expected device instantiation or directive here.
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(450): Expected device instantiation or directive here.
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(451): Expected device instantiation or directive here.
{NOTE_CS5, 150, false, true}, {NOTE_C5, 150, false, false}, {NOTE_C5, 300, true, false},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(452): Expected device instantiation or directive here.
{NOTE_GS5, 600, true, true},
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(453): Expected device instantiation or directive here.
{REST, 1000, false, false}
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(454): Expected device instantiation or directive here.
};
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(456): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(457): Expected device instantiation or directive here.
// 5. HARDWARE INITIALIZATION
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(458): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(459): Expected node name here.
void init_hardware(void) {
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(459): Expected device instantiation or directive here.
void init_hardware(void) {
^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(460): Expected 2 node names here.
gpio_set_direction(ACTIVE_BUZZER_1_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_1_PIN, 0);
gpio_set_direction(ACTIVE_BUZZER_2_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_direction(LED_KICK_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_KICK_PIN, 0);
gpio_set_direction(LED_HAT_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_HAT_PIN, 0);
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(ACTIVE_BUZZER_1_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(461): Expected 2 node names here.
gpio_set_direction(ACTIVE_BUZZER_2_PIN, GPIO_MODE_OUTPUT); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_direction(LED_KICK_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_KICK_PIN, 0);
gpio_set_direction(LED_HAT_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_HAT_PIN, 0);
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(462): Expected 2 node names here.
gpio_set_direction(LED_KICK_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_KICK_PIN, 0);
gpio_set_direction(LED_HAT_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_HAT_PIN, 0);
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(LED_KICK_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(463): Expected 2 node names here.
gpio_set_direction(LED_HAT_PIN, GPIO_MODE_OUTPUT); gpio_set_level(LED_HAT_PIN, 0);
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(LED_HAT_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(465): Expected 2 node names here.
gpio_reset_pin(BTN_PAUSE_PIN); gpio_reset_pin(BTN_NEXT_PIN);
^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(466): Expected 2 node names here.
gpio_set_direction(BTN_PAUSE_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_pull_mode(BTN_PAUSE_PIN, GPIO_PULLUP_ONLY);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(467): Expected 2 node names here.
gpio_set_direction(BTN_NEXT_PIN, GPIO_MODE_INPUT); gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
ledc_timer_config(&timer_cfg);
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
ledc_channel_config(&ch_cfg);
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
pcnt_new_unit(&unit_config, &pcnt_unit);
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_pull_mode(BTN_NEXT_PIN, GPIO_PULLUP_ONLY);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(469): Expected nodes here.
ledc_timer_config_t timer_cfg = { .speed_mode = BUZZER_LEDC_MODE, .timer_num = BUZZER_LEDC_TIMER, .duty_resolution = LEDC_TIMER_13_BIT, .freq_hz = 440, .clk_cfg = LEDC_AUTO_CLK };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(470): Expected nodes here.
ledc_timer_config(&timer_cfg);
^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(471): Expected nodes here.
ledc_channel_config_t ch_cfg = { .speed_mode = BUZZER_LEDC_MODE, .channel = BUZZER_LEDC_CHANNEL, .timer_sel = BUZZER_LEDC_TIMER, .intr_type = LEDC_INTR_DISABLE, .gpio_num = PASSIVE_BUZZER_PIN, .duty = 0, .hpoint = 0 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(472): Expected nodes here.
ledc_channel_config(&ch_cfg);
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(474): Expected nodes here.
pcnt_unit_config_t unit_config = { .high_limit = 100, .low_limit = -100 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(475): Expected nodes here.
pcnt_new_unit(&unit_config, &pcnt_unit);
^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(476): Expected nodes here.
pcnt_glitch_filter_config_t filter_config = { .max_glitch_ns = 1000 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(477): Expected nodes here.
pcnt_unit_set_glitch_filter(pcnt_unit, &filter_config);
^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(478): Expected nodes here.
pcnt_chan_config_t chan_a_config = { .edge_gpio_num = ROTARY_CLK_PIN, .level_gpio_num = ROTARY_DT_PIN };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(479): Expected nodes here.
pcnt_channel_handle_t pcnt_chan_a = NULL; pcnt_new_channel(pcnt_unit, &chan_a_config, &pcnt_chan_a);
^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(480): Expected nodes here.
pcnt_chan_config_t chan_b_config = { .edge_gpio_num = ROTARY_DT_PIN, .level_gpio_num = ROTARY_CLK_PIN };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(481): Expected nodes here.
pcnt_channel_handle_t pcnt_chan_b = NULL; pcnt_new_channel(pcnt_unit, &chan_b_config, &pcnt_chan_b);
^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(482): Expected nodes here.
pcnt_channel_set_edge_action(pcnt_chan_a, PCNT_CHANNEL_EDGE_ACTION_DECREASE, PCNT_CHANNEL_EDGE_ACTION_INCREASE);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(483): Expected nodes here.
pcnt_channel_set_level_action(pcnt_chan_a, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(484): Expected nodes here.
pcnt_channel_set_edge_action(pcnt_chan_b, PCNT_CHANNEL_EDGE_ACTION_INCREASE, PCNT_CHANNEL_EDGE_ACTION_DECREASE);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(485): Expected nodes here.
pcnt_channel_set_level_action(pcnt_chan_b, PCNT_CHANNEL_LEVEL_ACTION_KEEP, PCNT_CHANNEL_LEVEL_ACTION_INVERSE);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(486): Expected nodes here.
pcnt_unit_enable(pcnt_unit); pcnt_unit_clear_count(pcnt_unit); pcnt_unit_start(pcnt_unit);
^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(488): Expected 2 node names here.
gpio_set_direction(OLED_DC_PIN, GPIO_MODE_OUTPUT); gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_direction(OLED_RES_PIN, GPIO_MODE_OUTPUT);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(489): Expected node name here.
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(489): Expected device instantiation or directive here.
spi_bus_config_t buscfg = { .miso_io_num = -1, .mosi_io_num = OLED_MOSI_PIN, .sclk_io_num = OLED_CLK_PIN, .quadwp_io_num = -1, .quadhd_io_num = -1, .max_transfer_sz = 1024 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(490): Expected node name here.
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(490): Expected device instantiation or directive here.
spi_device_interface_config_t devcfg = { .clock_speed_hz = 10 * 1000 * 1000, .mode = 0, .spics_io_num = OLED_CS_PIN, .queue_size = 7 };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(491): Expected node name here.
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(491): Expected device instantiation or directive here.
spi_bus_initialize(SPI2_HOST, &buscfg, SPI_DMA_CH_AUTO); spi_bus_add_device(SPI2_HOST, &devcfg, &spi);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(492): Expected 2 node names here.
gpio_set_level(OLED_RES_PIN, 0); vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
}
// ==========================================
// 6. CORE 0: BUTTON TASK
// ==========================================
void button_task(void *pvParameters) {
bool pause_last = true;
bool next_last = true;
while(1) {
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
if(pause_btn == 0 && pause_last == 1) {
is_paused = !is_paused;
}
if(next_btn == 0 && next_last == 1) {
current_song_idx++;
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
trigger_song_change = true;
is_paused = false;
}
pause_last = pause_btn;
next_last = next_btn;
vTaskDelay(pdMS_TO_TICKS(50));
}
}
// ==========================================
// 7. CORE 0: OLED GRAPHICS ENGINE
// ==========================================
void oled_visualizer_task(void *pvParameters) {
char speed_buf[16];
while(1) {
memset(oled_buffer, 0, 1024);
// 8 Track Interface Updater
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
if (is_paused) draw_string(45, 2, "PAUSE");
sprintf(speed_buf, "%.2fx", current_speed);
draw_string(96, 2, speed_buf);
draw_filled_rect(0, 11, 128, 1, 1);
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
if(current_freq > 0 && !is_paused) {
int h = (current_freq - 200) / 12;
if (h < 5) h = 5;
if (h > 40) h = 40;
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
draw_filled_rect(60, 60 - h, 8, h, 1);
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
} else {
draw_filled_rect(50, 58, 28, 2, 1);
}
oled_push_framebuffer();
vTaskDelay(pdMS_TO_TICKS(33));
}
}
// ==========================================
// 8. CORE 1: THE MUSIC ENGINE
// ==========================================
void buzzer_sequence_task(void *pvParameters) {
const SequenceStep* active_song = careless_song;
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
int encoder_count = 0;
while(1) {
for (int i = 0; i < num_steps; i++) {
while (is_paused) {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; vTaskDelay(pdMS_TO_TICKS(10)); gpio_set_level(OLED_RES_PIN, 1); vTaskDelay(pdMS_TO_TICKS(50));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(493): Expected device instantiation or directive here.
const uint8_t init_cmds[] = { 0xAE, 0xD5, 0x80, 0xA8, 0x3F, 0xD3, 0x00, 0x40, 0x8D, 0x14, 0x20, 0x02, 0xA1, 0xC8, 0xDA, 0x12, 0x81, 0xCF, 0xD9, 0xF1, 0xDB, 0x40, 0xA4, 0xA6, 0xAF };
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(494): syntax error
for(int i=0; i<sizeof(init_cmds); i++) oled_send_cmd(init_cmds[i]);
^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(495): syntax error
for(int page = 0; page < 8; page++) { oled_send_cmd(0xB0 + page); oled_send_cmd(0x00); oled_send_cmd(0x10); uint8_t zero_buf[132]; memset(zero_buf, 0, 132); oled_send_data(zero_buf, 132); }
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(496): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(498): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(499): Expected device instantiation or directive here.
// 6. CORE 0: BUTTON TASK
^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(500): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(501): Expected node name here.
void button_task(void *pvParameters) {
^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(501): Expected device instantiation or directive here.
void button_task(void *pvParameters) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(502): Expected node name here.
bool pause_last = true;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(502): Expected device instantiation or directive here.
bool pause_last = true;
^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(503): Expected node name here.
bool next_last = true;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(503): Expected device instantiation or directive here.
bool next_last = true;
^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(505): Expected node name here.
while(1) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(505): Expected device instantiation or directive here.
while(1) {
^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(506): Expected node name here.
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(506): Expected device instantiation or directive here.
bool pause_btn = gpio_get_level(BTN_PAUSE_PIN);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(507): Expected node name here.
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(507): Expected device instantiation or directive here.
bool next_btn = gpio_get_level(BTN_NEXT_PIN);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(509): Expected node name here.
if(pause_btn == 0 && pause_last == 1) {
^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(509): Expected device instantiation or directive here.
if(pause_btn == 0 && pause_last == 1) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(510): Expected node name here.
is_paused = !is_paused;
^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(510): Expected device instantiation or directive here.
is_paused = !is_paused;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(511): Expected device instantiation or directive here.
}
^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(513): Expected node name here.
if(next_btn == 0 && next_last == 1) {
^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(513): Expected device instantiation or directive here.
if(next_btn == 0 && next_last == 1) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(514): Expected device instantiation or directive here.
current_song_idx++;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(515): Unknown parameter
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(515): Unknown parameter
if (current_song_idx > 8) current_song_idx = 0; // Cycles through 8 songs!
^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(516): Expected nodes here.
trigger_song_change = true;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(517): Expected node name here.
is_paused = false;
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(517): Expected device instantiation or directive here.
is_paused = false;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(518): Expected device instantiation or directive here.
}
^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(520): Expected nodes here.
pause_last = pause_btn;
^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(521): Expected device instantiation or directive here.
next_last = next_btn;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(522): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(50));
^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(522): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(50));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(523): Expected device instantiation or directive here.
}
^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(524): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(526): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(527): Expected device instantiation or directive here.
// 7. CORE 0: OLED GRAPHICS ENGINE
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(528): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(529): Expected node name here.
void oled_visualizer_task(void *pvParameters) {
^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(529): Expected device instantiation or directive here.
void oled_visualizer_task(void *pvParameters) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(530): Expected device instantiation or directive here.
char speed_buf[16];
^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(532): Expected node name here.
while(1) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(532): Expected device instantiation or directive here.
while(1) {
^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(533): Expected node name here.
memset(oled_buffer, 0, 1024);
^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(533): Expected device instantiation or directive here.
memset(oled_buffer, 0, 1024);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(535): Expected device instantiation or directive here.
// 8 Track Interface Updater
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(536): Expected node name here.
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(536): Expected device instantiation or directive here.
if (current_song_idx == 0) draw_string(2, 2, "WHISP");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(537): Expected 2 node names here.
else if (current_song_idx == 1) draw_string(2, 2, "TAKE ");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(538): Expected 2 node names here.
else if (current_song_idx == 2) draw_string(2, 2, "RICK ");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(539): Expected 2 node names here.
else if (current_song_idx == 3) draw_string(2, 2, "ELVIS");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(540): Expected 2 node names here.
else if (current_song_idx == 4) draw_string(2, 2, "GIMME");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(541): Expected 2 node names here.
else if (current_song_idx == 5) draw_string(2, 2, "TURK ");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(542): Expected 2 node names here.
else if (current_song_idx == 6) draw_string(2, 2, "ELISE");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(543): Expected 2 node names here.
else if (current_song_idx == 7) draw_string(2, 2, "MOZRT");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(544): Expected 2 node names here.
else if (current_song_idx == 8) draw_string(2, 2, "ALLA_TURCA");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(545): Expected node name here.
if (is_paused) draw_string(45, 2, "PAUSE");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(545): Expected device instantiation or directive here.
if (is_paused) draw_string(45, 2, "PAUSE");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(547): Expected node name here.
sprintf(speed_buf, "%.2fx", current_speed);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(547): Expected device instantiation or directive here.
sprintf(speed_buf, "%.2fx", current_speed);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(548): Expected node name here.
draw_string(96, 2, speed_buf);
^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(548): Expected device instantiation or directive here.
draw_string(96, 2, speed_buf);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(549): Expected node name here.
draw_filled_rect(0, 11, 128, 1, 1);
^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(549): Expected device instantiation or directive here.
draw_filled_rect(0, 11, 128, 1, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(551): Expected node name here.
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(551): Expected device instantiation or directive here.
if(current_kick) draw_filled_rect(10, 25, 20, 30, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(552): Expected "}" here.
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(552): Expected 2 node names here.
else { draw_filled_rect(10, 45, 20, 10, 1); draw_rect(10, 25, 20, 30, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(554): Expected node name here.
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(554): Expected device instantiation or directive here.
if(current_hat) draw_filled_rect(98, 30, 16, 25, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(555): Expected "}" here.
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(555): Expected 2 node names here.
else { draw_filled_rect(98, 45, 16, 10, 1); draw_rect(98, 30, 16, 25, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(557): Unknown parameter
if(current_freq > 0 && !is_paused) {
^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(558): Expected node name here.
int h = (current_freq - 200) / 12;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(558): Expected device instantiation or directive here.
int h = (current_freq - 200) / 12;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(559): Unknown parameter
if (h < 5) h = 5;
^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(560): Unknown parameter
if (h > 40) h = 40;
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(562): Expected node name here.
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(562): Expected device instantiation or directive here.
draw_filled_rect(50, 60 - (h/2), 6, (h/2), 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(563): Expected node name here.
draw_filled_rect(60, 60 - h, 8, h, 1);
^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(563): Expected device instantiation or directive here.
draw_filled_rect(60, 60 - h, 8, h, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(564): Expected node name here.
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(564): Expected device instantiation or directive here.
draw_filled_rect(72, 60 - (h/1.5), 6, (h/1.5), 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(565): Expected device instantiation or directive here.
} else {
^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(566): Expected node name here.
draw_filled_rect(50, 58, 28, 2, 1);
^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(566): Expected device instantiation or directive here.
draw_filled_rect(50, 58, 28, 2, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(567): Expected device instantiation or directive here.
}
^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(569): Expected nodes here.
oled_push_framebuffer();
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(570): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(33));
^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(570): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(33));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(571): Expected device instantiation or directive here.
}
^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(572): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(574): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(575): Expected device instantiation or directive here.
// 8. CORE 1: THE MUSIC ENGINE
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(576): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(577): Expected node name here.
void buzzer_sequence_task(void *pvParameters) {
^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(577): Expected device instantiation or directive here.
void buzzer_sequence_task(void *pvParameters) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(578): Expected device instantiation or directive here.
const SequenceStep* active_song = careless_song;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(579): Expected node name here.
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(579): Expected device instantiation or directive here.
int num_steps = sizeof(careless_song) / sizeof(SequenceStep);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(580): Expected node name here.
int encoder_count = 0;
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(580): Expected device instantiation or directive here.
int encoder_count = 0;
^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(582): Expected node name here.
while(1) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(582): Expected device instantiation or directive here.
while(1) {
^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(583): syntax error
for (int i = 0; i < num_steps; i++) {
^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(585): Expected node name here.
while (is_paused) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(585): Expected device instantiation or directive here.
while (is_paused) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(586): Expected nodes here.
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0); ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(587): Expected 2 node names here.
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(588): Expected 2 node names here.
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_freq = 0; current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(50));
if (trigger_song_change) break;
}
if (trigger_song_change) {
// 8 Track Router
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
trigger_song_change = false;
break;
}
SequenceStep step = active_song[i];
pcnt_unit_get_count(pcnt_unit, &encoder_count);
current_speed = 1.0 + (encoder_count * 0.05);
if (current_speed < 0.2) current_speed = 0.2;
if (current_speed > 3.0) current_speed = 3.0;
int adj_duration = (int)(step.duration / current_speed);
int adj_drum_hit = (int)(45 / current_speed);
current_freq = step.frequency;
if (step.frequency > 0) {
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
} else {
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
}
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_kick = step.kick_drum;
current_hat = step.hi_hat;
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
if (adj_duration > adj_drum_hit) {
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(LED_HAT_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(589): Expected device instantiation or directive here.
current_freq = 0; current_kick = false; current_hat = false;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(591): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(50));
^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(591): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(50));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(592): Expected node name here.
if (trigger_song_change) break;
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(592): Expected device instantiation or directive here.
if (trigger_song_change) break;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(593): Expected device instantiation or directive here.
}
^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(595): Expected node name here.
if (trigger_song_change) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(595): Expected device instantiation or directive here.
if (trigger_song_change) {
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(596): Expected device instantiation or directive here.
// 8 Track Router
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(597): Expected node name here.
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(597): Expected device instantiation or directive here.
if (current_song_idx == 0) { active_song = careless_song; num_steps = sizeof(careless_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(598): Expected 2 node names here.
else if (current_song_idx == 1) { active_song = takeonme_song; num_steps = sizeof(takeonme_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(599): Expected 2 node names here.
else if (current_song_idx == 2) { active_song = rickroll_song; num_steps = sizeof(rickroll_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(600): Expected 2 node names here.
else if (current_song_idx == 3) { active_song = elvis_song; num_steps = sizeof(elvis_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(601): Expected 2 node names here.
else if (current_song_idx == 4) { active_song = abba_song; num_steps = sizeof(abba_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(602): Expected 2 node names here.
else if (current_song_idx == 5) { active_song = turkish_song; num_steps = sizeof(turkish_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(603): Expected 2 node names here.
else if (current_song_idx == 6) { active_song = elise_song; num_steps = sizeof(elise_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(604): Expected 2 node names here.
else if (current_song_idx == 7) { active_song = mozart_song; num_steps = sizeof(mozart_song) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(605): Expected 2 node names here.
else if (current_song_idx == 8) { active_song = midi_alla_turca; num_steps = sizeof(midi_alla_turca) / sizeof(SequenceStep); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(606): Expected nodes here.
trigger_song_change = false;
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(607): Expected node name here.
break;
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(607): Expected device instantiation or directive here.
break;
^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(608): Expected device instantiation or directive here.
}
^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(610): Expected node name here.
SequenceStep step = active_song[i];
^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(610): Expected device instantiation or directive here.
SequenceStep step = active_song[i];
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(612): Expected nodes here.
pcnt_unit_get_count(pcnt_unit, &encoder_count);
^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(613): Expected device instantiation or directive here.
current_speed = 1.0 + (encoder_count * 0.05);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(614): Unknown parameter
if (current_speed < 0.2) current_speed = 0.2;
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(614): Unknown parameter
if (current_speed < 0.2) current_speed = 0.2;
^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(615): Unknown parameter
if (current_speed > 3.0) current_speed = 3.0;
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(615): Unknown parameter
if (current_speed > 3.0) current_speed = 3.0;
^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(617): Expected node name here.
int adj_duration = (int)(step.duration / current_speed);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(617): Expected device instantiation or directive here.
int adj_duration = (int)(step.duration / current_speed);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(618): Expected node name here.
int adj_drum_hit = (int)(45 / current_speed);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(618): Expected device instantiation or directive here.
int adj_drum_hit = (int)(45 / current_speed);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(620): Expected device instantiation or directive here.
current_freq = step.frequency;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(621): Unknown parameter
if (step.frequency > 0) {
^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(622): Expected nodes here.
ledc_set_freq(BUZZER_LEDC_MODE, BUZZER_LEDC_TIMER, step.frequency);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(623): Expected nodes here.
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, BUZZER_LEDC_DUTY);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(624): Expected device instantiation or directive here.
} else {
^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(625): Expected nodes here.
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(626): Expected device instantiation or directive here.
}
^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(627): Expected nodes here.
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(629): Expected device instantiation or directive here.
current_kick = step.kick_drum;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(630): Expected device instantiation or directive here.
current_hat = step.hi_hat;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(631): Expected node name here.
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(631): Expected device instantiation or directive here.
if (step.kick_drum) { gpio_set_level(ACTIVE_BUZZER_1_PIN, 1); gpio_set_level(LED_KICK_PIN, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(632): Expected node name here.
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(632): Expected device instantiation or directive here.
if (step.hi_hat) { gpio_set_level(ACTIVE_BUZZER_2_PIN, 1); gpio_set_level(LED_HAT_PIN, 1); }
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(634): Unknown parameter
if (adj_duration > adj_drum_hit) {
^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(635): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(635): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(adj_drum_hit));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(636): Expected 2 node names here.
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(637): Expected 2 node names here.
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
} else {
vTaskDelay(pdMS_TO_TICKS(adj_duration));
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(LED_HAT_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(638): Expected device instantiation or directive here.
current_kick = false; current_hat = false;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(639): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(639): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(adj_duration - adj_drum_hit));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(640): Expected device instantiation or directive here.
} else {
^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(641): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(adj_duration));
^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(641): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(adj_duration));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(642): Expected 2 node names here.
gpio_set_level(ACTIVE_BUZZER_1_PIN, 0); gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(ACTIVE_BUZZER_2_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(643): Expected 2 node names here.
gpio_set_level(LED_KICK_PIN, 0); gpio_set_level(LED_HAT_PIN, 0);
current_kick = false; current_hat = false;
}
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
current_freq = 0;
vTaskDelay(pdMS_TO_TICKS(15));
}
}
}
// ==========================================
// 9. MAIN APPLICATION ENTRY
// ==========================================
void app_main(void) {
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
init_hardware();
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
}
; gpio_set_level(LED_HAT_PIN, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(644): Expected device instantiation or directive here.
current_kick = false; current_hat = false;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(645): Expected device instantiation or directive here.
}
^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(647): Expected nodes here.
ledc_set_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(648): Expected nodes here.
ledc_update_duty(BUZZER_LEDC_MODE, BUZZER_LEDC_CHANNEL);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(649): Expected device instantiation or directive here.
current_freq = 0;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(650): Expected node name here.
vTaskDelay(pdMS_TO_TICKS(15));
^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(650): Expected device instantiation or directive here.
vTaskDelay(pdMS_TO_TICKS(15));
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(651): Expected device instantiation or directive here.
}
^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(652): Expected device instantiation or directive here.
}
^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(653): Expected device instantiation or directive here.
}
^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(655): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(656): Expected device instantiation or directive here.
// 9. MAIN APPLICATION ENTRY
^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(657): Expected device instantiation or directive here.
// ==========================================
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(658): Expected node name here.
void app_main(void) {
^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(658): Expected device instantiation or directive here.
void app_main(void) {
^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(659): Expected nodes here.
printf("Desk Rave: 8-Track Symphony Edition Initializing...\n");
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(660): Expected node name here.
init_hardware();
^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(660): Expected device instantiation or directive here.
init_hardware();
^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(662): Expected subckt name here.
xTaskCreatePinnedToCore(oled_visualizer_task, "oled_task", 4096, NULL, 4, NULL, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(663): Expected subckt name here.
xTaskCreatePinnedToCore(button_task, "btn_task", 4096, NULL, 5, NULL, 0);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(664): Expected subckt name here.
xTaskCreatePinnedToCore(buzzer_sequence_task, "music_task", 4096, NULL, 5, NULL, 1);
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Z:\home\gateleven\esp\mmcontroller\main\mmcontroller.c(665): Expected device instantiation or directive here.
}
^