From ba1a1906607a485d2a40e6b399d6d96c31d50bff Mon Sep 17 00:00:00 2001 From: marchingband Date: Tue, 15 Mar 2022 09:46:47 -0700 Subject: [PATCH] web midi and websockets --- src/midi.cpp | 22 ++++++++++++++++++++++ src/midi.h | 7 ++++--- src/midi_in.c | 20 ++++++++++++++++++++ src/server.cpp | 10 ++++++++-- 4 files changed, 54 insertions(+), 5 deletions(-) diff --git a/src/midi.cpp b/src/midi.cpp index 09728c6..942d317 100644 --- a/src/midi.cpp +++ b/src/midi.cpp @@ -7,14 +7,17 @@ midiXparser midiParser; midiXparser usbMidiParser; +midiXparser webMidiParser; uint8_t *msg; uint8_t *usb_msg; +uint8_t *web_msg; void midi_parser_init(void) { midiParser.setMidiMsgFilter( midiXparser::channelVoiceMsgTypeMsk ); usbMidiParser.setMidiMsgFilter( midiXparser::channelVoiceMsgTypeMsk ); + webMidiParser.setMidiMsgFilter( midiXparser::channelVoiceMsgTypeMsk ); } extern "C" uint8_t* midi_parse(uint8_t in) @@ -51,4 +54,23 @@ extern "C" uint8_t* usb_midi_parse(uint8_t in) } } return NULL; +} + +extern "C" uint8_t* web_midi_parse(uint8_t in) +{ + // log_i("got a byte %d", in); + if ( webMidiParser.parse( in ) ) // Do we received a channel voice msg ? + { + if ( + webMidiParser.isMidiStatus(midiXparser::noteOnStatus) || + webMidiParser.isMidiStatus(midiXparser::noteOffStatus) || + webMidiParser.isMidiStatus(midiXparser::programChangeStatus) || + webMidiParser.isMidiStatus(midiXparser::controlChangeStatus) + ) + { + web_msg = webMidiParser.getMidiMsg(); + return web_msg; + } + } + return NULL; } \ No newline at end of file diff --git a/src/midi.h b/src/midi.h index 4629ab1..3af96c6 100644 --- a/src/midi.h +++ b/src/midi.h @@ -8,9 +8,10 @@ void midi_parser_init(void); extern "C" { #endif - uint8_t* midi_parse(uint8_t in); - uint8_t* usb_midi_parse(uint8_t in); - void midi_hook_default(uint8_t *in); +uint8_t* midi_parse(uint8_t in); +uint8_t* usb_midi_parse(uint8_t in); +uint8_t* web_midi_parse(uint8_t in); +void midi_hook_default(uint8_t *in); #ifdef __cplusplus } diff --git a/src/midi_in.c b/src/midi_in.c index 8c084aa..ec71388 100644 --- a/src/midi_in.c +++ b/src/midi_in.c @@ -29,10 +29,12 @@ esp_err_t ret; QueueHandle_t wav_player_queue; QueueHandle_t uart_queue; // uart Events queue QueueHandle_t uart_queue_usb; // usb uart Events queue +QueueHandle_t web_midi_queue; // usb uart Events queue struct wav_player_event_t wav_player_event; uint8_t *msg; uint8_t *usb_msg; +uint8_t *web_msg; struct metadata_t metadata; void(*midi_hook)(uint8_t *in); @@ -173,6 +175,22 @@ static void read_uart_task() } } +static void web_midi_task() +{ + uint8_t web_midi_byte; + for(;;) + { + if(xQueueReceive(web_midi_queue, (void *)&web_midi_byte, (portTickType)portMAX_DELAY)) + { + web_msg = web_midi_parse(web_midi_byte); + if(web_msg) + { + handle_midi(web_msg); + } + } + } +} + static void read_usb_uart_task() { uart_event_t event; @@ -432,6 +450,8 @@ void midi_init(bool useUsbMidi) init_uart(); midi_hook = midi_hook_default; xTaskCreatePinnedToCore(read_uart_task, "read_uart_task", 4096, NULL, 3, NULL, 0); + web_midi_queue = xQueueCreate(64, sizeof(uint8_t)); + xTaskCreatePinnedToCore(web_midi_task, "web_midi_task", 4096, NULL, 3, NULL, 0); if(useUsbMidi) { init_gpio_usb(); diff --git a/src/server.cpp b/src/server.cpp index 7a324a0..f0ce91f 100644 --- a/src/server.cpp +++ b/src/server.cpp @@ -65,6 +65,8 @@ extern "C" void sendWSMsg(char* msg){ cJSON *ws_root; +QueueHandle_t web_midi_queue; + void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventType type, void * arg, uint8_t *data, size_t len){ if(type == WS_EVT_CONNECT){ Serial.printf("ws[%s][%u] connect\n", server->url(), client->id()); @@ -83,8 +85,12 @@ void onWsEvent(AsyncWebSocket * server, AsyncWebSocketClient * client, AwsEventT String msg = ""; if(info->final && info->index == 0 && info->len == len){ //the whole message is in a single frame and we got all of it's data - ws_root = cJSON_Parse((char *)data); - on_rpc_in(ws_root); + // ws_root = cJSON_Parse((char *)data); + // on_rpc_in(ws_root); + for(int i=0; i