4821 lines
503 KiB
Text
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.
|
|
}
|
|
^
|