From c3d08b9862ce7b6401f847b692bfefe76cbd2bb1 Mon Sep 17 00:00:00 2001 From: Andrew Capon Date: Tue, 30 Aug 2022 10:44:09 +0100 Subject: [PATCH 1/6] Initial proof of concept --- src/effects.c | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) mode change 100644 => 100755 src/effects.c diff --git a/src/effects.c b/src/effects.c old mode 100644 new mode 100755 index 05892d6..15101f6 --- a/src/effects.c +++ b/src/effects.c @@ -511,6 +511,7 @@ typedef struct MIDI_CC_T { int effect_id; const char* symbol; port_t* port; + int8_t midiOutValue; } midi_cc_t; typedef struct ASSIGNMENT_T { @@ -677,6 +678,7 @@ static jack_port_t *g_audio_out2_port; #endif #endif static jack_port_t *g_midi_in_port; +static jack_port_t *g_midi_out_port; static jack_position_t g_jack_pos; static bool g_jack_rolling; static volatile double g_transport_bpb; @@ -2452,6 +2454,28 @@ static int ProcessGlobalClient(jack_nframes_t nframes, void *arg) } #endif + void *buf = jack_port_get_buffer(g_midi_out_port, nframes); + if (buf != NULL) + { + jack_midi_clear_buffer(buf); + for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) + { + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) + break; + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) + continue; + if (g_midi_cc_list[j].midiOutValue >= 0) + { + jack_midi_data_t buffer[3]; + buffer [0] = 0xb0 + g_midi_cc_list[j].channel; + buffer [1] = g_midi_cc_list[j].controller; + buffer [2] = g_midi_cc_list[j].midiOutValue; + g_midi_cc_list[j].midiOutValue = -1; + if(jack_midi_event_write(buf, 0, buffer,3)) + break; + } + } + } // Handle input MIDI events void *const port_buf = jack_port_get_buffer(g_midi_in_port, nframes); const jack_nframes_t event_count = jack_midi_get_event_count(port_buf); @@ -3741,6 +3765,16 @@ int effects_init(void* client) jack_client_close(g_jack_global_client); return ERR_JACK_PORT_REGISTER; } + + g_midi_out_port = jack_port_register(g_jack_global_client, "midi_out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); + + if (! g_midi_out_port) + { + fprintf(stderr, "can't register global jack midi-out port\n"); + if (client == NULL) + jack_client_close(g_jack_global_client); + return ERR_JACK_PORT_REGISTER; + } #ifdef __MOD_DEVICES__ #ifdef _MOD_DEVICE_DWARF @@ -4184,6 +4218,7 @@ int effects_init(void* client) g_midi_cc_list[i].effect_id = ASSIGNMENT_NULL; g_midi_cc_list[i].symbol = NULL; g_midi_cc_list[i].port = NULL; + g_midi_cc_list[i].midiOutValue = -1; } g_midi_learning = NULL; @@ -5829,6 +5864,20 @@ int effects_set_parameter(int effect_id, const char *control_symbol, float value if (InstanceExist(effect_id)) { + for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) + { + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) + break; + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) + continue; + if (g_midi_cc_list[j].effect_id == effect_id && + strcmp(g_midi_cc_list[j].symbol, control_symbol) == 0) + { + float fRange = g_midi_cc_list[j].maximum - g_midi_cc_list[j].minimum; + float fNormal = (value - g_midi_cc_list[j].minimum) / fRange; + g_midi_cc_list[j].midiOutValue = fNormal * 127; + } + } // check whether is setting the same parameter if (last_effect_id == effect_id) { From ce6ffcb1df507040e9f856272cb5653f3d3c16ed Mon Sep 17 00:00:00 2001 From: Andrew Capon Date: Tue, 30 Aug 2022 11:43:59 +0100 Subject: [PATCH 2/6] Refactor cc code into SetMidiOutValue(). When control is mapped set correct cc value. --- src/effects.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) diff --git a/src/effects.c b/src/effects.c index 15101f6..c9810ef 100755 --- a/src/effects.c +++ b/src/effects.c @@ -774,7 +774,7 @@ static const char* const g_rolling_port_symbol = ROLLING_PORT_SYMBOL; * LOCAL FUNCTION PROTOTYPES ************************************************************************************************************************ */ - +static void SetMidiOutValue(midi_cc_t *midiCC); static void InstanceDelete(int effect_id); static int InstanceExist(int effect_id); static void AllocatePortBuffers(effect_t* effect, int in_size, int out_size); @@ -872,6 +872,16 @@ static char* strchrnul(const char *s, int c) } #endif +static void SetMidiOutValue(midi_cc_t *midiCC) +{ + float value = *(midiCC->port->buffer); + + float fRange = midiCC->maximum - midiCC->minimum; + float fNormal = (value - midiCC->minimum) / fRange; + + midiCC->midiOutValue = fNormal * 127; +} + static void InstanceDelete(int effect_id) { if (INSTANCE_IS_VALID(effect_id)) @@ -5864,20 +5874,6 @@ int effects_set_parameter(int effect_id, const char *control_symbol, float value if (InstanceExist(effect_id)) { - for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) - { - if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) - break; - if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) - continue; - if (g_midi_cc_list[j].effect_id == effect_id && - strcmp(g_midi_cc_list[j].symbol, control_symbol) == 0) - { - float fRange = g_midi_cc_list[j].maximum - g_midi_cc_list[j].minimum; - float fNormal = (value - g_midi_cc_list[j].minimum) / fRange; - g_midi_cc_list[j].midiOutValue = fNormal * 127; - } - } // check whether is setting the same parameter if (last_effect_id == effect_id) { @@ -5909,6 +5905,19 @@ int effects_set_parameter(int effect_id, const char *control_symbol, float value value = last_max; *last_prev = *last_buffer = value; + + for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) + { + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) + break; + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) + continue; + if (g_midi_cc_list[j].effect_id == effect_id && + strcmp(g_midi_cc_list[j].symbol, control_symbol) == 0) + { + SetMidiOutValue(&(g_midi_cc_list[j])); + } + } return SUCCESS; } @@ -6616,6 +6625,8 @@ int effects_midi_map(int effect_id, const char *control_symbol, int channel, int { g_midi_cc_list[i].minimum = minimum; g_midi_cc_list[i].maximum = maximum; + + SetMidiOutValue(&(g_midi_cc_list[i])); } return SUCCESS; @@ -6639,10 +6650,13 @@ int effects_midi_map(int effect_id, const char *control_symbol, int channel, int if (port == NULL) return ERR_LV2_INVALID_PARAM_SYMBOL; + g_midi_cc_list[i].minimum = minimum; g_midi_cc_list[i].maximum = maximum; g_midi_cc_list[i].symbol = port->symbol; g_midi_cc_list[i].port = port; + + SetMidiOutValue(&(g_midi_cc_list[i])); } g_midi_cc_list[i].channel = channel; From 02e76af6b86bfce0f7e15ddaa1da24b6850f3879 Mon Sep 17 00:00:00 2001 From: Andrew Capon Date: Wed, 31 Aug 2022 09:17:02 +0100 Subject: [PATCH 3/6] Add ENABLE_MIDI_FEEDBACK to set midi feedback mode 0: Off 1: On 2: On with sync between devices on input --- src/effects.c | 96 +++++++++++++++++++++++++++++++++------------------ 1 file changed, 63 insertions(+), 33 deletions(-) diff --git a/src/effects.c b/src/effects.c index c9810ef..4a7f5cf 100755 --- a/src/effects.c +++ b/src/effects.c @@ -689,6 +689,8 @@ static double g_transport_tick; static bool g_aggregated_midi_enabled; static bool g_processing_enabled; static bool g_verbose_debug; +static bool g_enable_midi_feedback; +static bool g_enable_midi_feedback_sync; // Wall clock time since program startup static uint64_t g_monotonic_frame_count = 0; @@ -2463,26 +2465,29 @@ static int ProcessGlobalClient(jack_nframes_t nframes, void *arg) } } #endif - - void *buf = jack_port_get_buffer(g_midi_out_port, nframes); - if (buf != NULL) + // If midi feedback is enabled send any cc messages out to midi + if(g_enable_midi_feedback) { - jack_midi_clear_buffer(buf); - for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) + void *buf = jack_port_get_buffer(g_midi_out_port, nframes); + if (buf != NULL) { - if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) - break; - if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) - continue; - if (g_midi_cc_list[j].midiOutValue >= 0) + jack_midi_clear_buffer(buf); + for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) { - jack_midi_data_t buffer[3]; - buffer [0] = 0xb0 + g_midi_cc_list[j].channel; - buffer [1] = g_midi_cc_list[j].controller; - buffer [2] = g_midi_cc_list[j].midiOutValue; - g_midi_cc_list[j].midiOutValue = -1; - if(jack_midi_event_write(buf, 0, buffer,3)) + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) break; + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) + continue; + if (g_midi_cc_list[j].midiOutValue >= 0) + { + jack_midi_data_t buffer[3]; + buffer [0] = 0xb0 + g_midi_cc_list[j].channel; + buffer [1] = g_midi_cc_list[j].controller; + buffer [2] = g_midi_cc_list[j].midiOutValue; + g_midi_cc_list[j].midiOutValue = -1; + if(jack_midi_event_write(buf, 0, buffer,3)) + break; + } } } } @@ -2627,6 +2632,11 @@ static int ProcessGlobalClient(jack_nframes_t nframes, void *arg) handled = true; value = UpdateValueFromMidi(&g_midi_cc_list[j], mvalue, highres); + // if midi feedback sync is enabled set the output CC to send back out over midi + // this will keep any other devices synced. + if(g_enable_midi_feedback_sync) + SetMidiOutValue(&(g_midi_cc_list[j])); + postponed_event_list_data* const posteventptr = rtsafe_memory_pool_allocate_atomic(g_rtsafe_mem_pool); if (posteventptr) @@ -3776,16 +3786,27 @@ int effects_init(void* client) return ERR_JACK_PORT_REGISTER; } - g_midi_out_port = jack_port_register(g_jack_global_client, "midi_out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); + /* check midi feedback mode + ENABLE_MIDI_FEEDBACK = 1 : Enable midi CC feedback + ENABLE_MIDI_FEEDBACK = 2 : Enable midi CC feedback and also sync devices on input */ + + const char* const enable_midi_feedback = getenv("ENABLE_MIDI_FEEDBACK"); + g_enable_midi_feedback = enable_midi_feedback != NULL && atoi(enable_midi_feedback) != 0; + g_enable_midi_feedback_sync = enable_midi_feedback != NULL && atoi(enable_midi_feedback) == 2; - if (! g_midi_out_port) + // if midi feedback is enable create output midi port + if(g_enable_midi_feedback) { - fprintf(stderr, "can't register global jack midi-out port\n"); - if (client == NULL) - jack_client_close(g_jack_global_client); - return ERR_JACK_PORT_REGISTER; - } + g_midi_out_port = jack_port_register(g_jack_global_client, "midi_out", JACK_DEFAULT_MIDI_TYPE, JackPortIsOutput, 0); + if (! g_midi_out_port) + { + fprintf(stderr, "can't register global jack midi-out port\n"); + if (client == NULL) + jack_client_close(g_jack_global_client); + return ERR_JACK_PORT_REGISTER; + } + } #ifdef __MOD_DEVICES__ #ifdef _MOD_DEVICE_DWARF g_audio_in1_port = jack_port_register(g_jack_global_client, "in1", JACK_DEFAULT_AUDIO_TYPE, JackPortIsInput, 0); @@ -3882,6 +3903,7 @@ int effects_init(void* client) const char* const mod_log = getenv("MOD_LOG"); g_verbose_debug = mod_log != NULL && atoi(mod_log) != 0; + /* this fails to build if GLOBAL_EFFECT_ID >= MAX_INSTANCES */ char global_effect_id_static_check1[GLOBAL_EFFECT_ID >= MAX_PLUGIN_INSTANCES?1:-1]; char global_effect_id_static_check2[GLOBAL_EFFECT_ID < MAX_INSTANCES?1:-1]; @@ -5906,16 +5928,20 @@ int effects_set_parameter(int effect_id, const char *control_symbol, float value *last_prev = *last_buffer = value; - for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) + // if midi feedback is enabled find the correct CC and set it to be output + if(g_enable_midi_feedback) { - if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) - break; - if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) - continue; - if (g_midi_cc_list[j].effect_id == effect_id && - strcmp(g_midi_cc_list[j].symbol, control_symbol) == 0) + for (int j = 0; j < MAX_MIDI_CC_ASSIGN; j++) { - SetMidiOutValue(&(g_midi_cc_list[j])); + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_NULL) + break; + if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) + continue; + if (g_midi_cc_list[j].effect_id == effect_id && + strcmp(g_midi_cc_list[j].symbol, control_symbol) == 0) + { + SetMidiOutValue(&(g_midi_cc_list[j])); + } } } return SUCCESS; @@ -6626,7 +6652,9 @@ int effects_midi_map(int effect_id, const char *control_symbol, int channel, int g_midi_cc_list[i].minimum = minimum; g_midi_cc_list[i].maximum = maximum; - SetMidiOutValue(&(g_midi_cc_list[i])); + // if midi feedback is enabled set this cc to be sent + if(g_enable_midi_feedback) + SetMidiOutValue(&(g_midi_cc_list[i])); } return SUCCESS; @@ -6656,7 +6684,9 @@ int effects_midi_map(int effect_id, const char *control_symbol, int channel, int g_midi_cc_list[i].symbol = port->symbol; g_midi_cc_list[i].port = port; - SetMidiOutValue(&(g_midi_cc_list[i])); + // if midi feedback is enabled set this cc to be sent + if(g_enable_midi_feedback) + SetMidiOutValue(&(g_midi_cc_list[i])); } g_midi_cc_list[i].channel = channel; From eb9972b4382292ef5654c0088778085d58aecc8e Mon Sep 17 00:00:00 2001 From: Andrew Capon Date: Wed, 31 Aug 2022 10:02:16 +0100 Subject: [PATCH 4/6] Remove call to strcmp when checking for symbols. --- src/effects.c | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/effects.c b/src/effects.c index 4a7f5cf..bc520de 100755 --- a/src/effects.c +++ b/src/effects.c @@ -5937,11 +5937,17 @@ int effects_set_parameter(int effect_id, const char *control_symbol, float value break; if (g_midi_cc_list[j].effect_id == ASSIGNMENT_UNUSED) continue; - if (g_midi_cc_list[j].effect_id == effect_id && - strcmp(g_midi_cc_list[j].symbol, control_symbol) == 0) - { - SetMidiOutValue(&(g_midi_cc_list[j])); + if (g_midi_cc_list[j].effect_id == effect_id) + { + // avoid call to strcmp and compare strings ourselves + bool bEqual = false; + for(const char *s1 = control_symbol, *s2 = g_midi_cc_list[j].symbol; (bEqual = *s1 == *s2) && *s1; s1++, s2++) + /* empty loop*/; + + if(bEqual) + SetMidiOutValue(&(g_midi_cc_list[j])); } + } } return SUCCESS; From 36e5806989a006aaef4a21264a9a9cb7d6cebf83 Mon Sep 17 00:00:00 2001 From: Andrew Capon Date: Wed, 31 Aug 2022 12:48:18 +0100 Subject: [PATCH 5/6] Add automatic connection of midi ports --- src/effects.c | 87 +++++++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 78 insertions(+), 9 deletions(-) diff --git a/src/effects.c b/src/effects.c index bc520de..f33fa06 100755 --- a/src/effects.c +++ b/src/effects.c @@ -242,7 +242,8 @@ enum PostPonedEventType { POSTPONED_MIDI_PROGRAM_CHANGE, POSTPONED_MIDI_MAP, POSTPONED_TRANSPORT, - POSTPONED_JACK_MIDI_CONNECT, + POSTPONED_JACK_MIDI_CONNECT_IN, + POSTPONED_JACK_MIDI_CONNECT_OUT, POSTPONED_LOG_TRACE, // stack allocated, rt-safe POSTPONED_LOG_MESSAGE, // heap allocated POSTPONED_PROCESS_OUTPUT_BUFFER @@ -1003,21 +1004,28 @@ static void PortRegistration(jack_port_id_t port_id, int reg, void* data) return; /* port flags to connect to */ - static const int target_port_flags = JackPortIsTerminal|JackPortIsPhysical|JackPortIsOutput; + static const int target_port_flags_out = JackPortIsTerminal|JackPortIsPhysical|JackPortIsOutput; + static const int target_port_flags_in = JackPortIsTerminal|JackPortIsPhysical|JackPortIsInput; const jack_port_t* const port = jack_port_by_id(g_jack_global_client, port_id); - if ((jack_port_flags(port) & target_port_flags) != target_port_flags) - return; if (strcmp(jack_port_type(port), JACK_DEFAULT_MIDI_TYPE) != 0) return; + enum PostPonedEventType eventType; + if ((jack_port_flags(port) & target_port_flags_out) == target_port_flags_out) + eventType = POSTPONED_JACK_MIDI_CONNECT_OUT; + else if ((jack_port_flags(port) & target_port_flags_in) == target_port_flags_in) + eventType = POSTPONED_JACK_MIDI_CONNECT_IN; + else + return; + postponed_event_list_data* const posteventptr = rtsafe_memory_pool_allocate_atomic(g_rtsafe_mem_pool); if (posteventptr == NULL) return; - posteventptr->event.type = POSTPONED_JACK_MIDI_CONNECT; + posteventptr->event.type = eventType; posteventptr->event.jack_midi_connect.port = port_id; pthread_mutex_lock(&g_rtsafe_mutex); @@ -1189,7 +1197,7 @@ static void RunPostPonedEvents(int ignored_effect_id) } #endif - if (got_only_jack_midi_requests && eventptr->event.type != POSTPONED_JACK_MIDI_CONNECT) + if (got_only_jack_midi_requests && !(eventptr->event.type == POSTPONED_JACK_MIDI_CONNECT_OUT || eventptr->event.type == POSTPONED_JACK_MIDI_CONNECT_IN)) got_only_jack_midi_requests = false; switch (eventptr->event.type) @@ -1271,7 +1279,7 @@ static void RunPostPonedEvents(int ignored_effect_id) got_transport = true; break; - case POSTPONED_JACK_MIDI_CONNECT: + case POSTPONED_JACK_MIDI_CONNECT_OUT: if (g_jack_global_client != NULL) { const jack_port_id_t port_id = eventptr->event.jack_midi_connect.port; const jack_port_t *const port = jack_port_by_id(g_jack_global_client, port_id); @@ -1295,6 +1303,21 @@ static void RunPostPonedEvents(int ignored_effect_id) } break; + case POSTPONED_JACK_MIDI_CONNECT_IN: + if(g_enable_midi_feedback && g_jack_global_client != NULL) { + const jack_port_id_t port_id = eventptr->event.jack_midi_connect.port; + const jack_port_t *const port = jack_port_by_id(g_jack_global_client, port_id); + + if (port != NULL) { + if(g_midi_out_port != NULL) + { + jack_connect(g_jack_global_client, jack_port_name(g_midi_out_port), jack_port_name(port)); + } + } + } + break; + + case POSTPONED_PROCESS_OUTPUT_BUFFER: if (eventptr->event.process_out_buf.effect_id == ignored_effect_id) continue; @@ -3168,6 +3191,39 @@ static void ConnectToAllHardwareMIDIPorts(void) jack_free(midihwports); } + + if(g_enable_midi_feedback) + { + const char** const midihwports = jack_get_ports(g_jack_global_client, "", + JACK_DEFAULT_MIDI_TYPE, + JackPortIsTerminal|JackPortIsPhysical|JackPortIsInput); + if (midihwports != NULL) + { + const char *ourportname = jack_port_name(g_midi_out_port); + + char aliases[2][320]; + char* aliasesptr[2] = { + aliases[0], + aliases[1] + }; + + for (int i=0; midihwports[i] != NULL; ++i) + { + jack_port_t* const port = jack_port_by_name(g_jack_global_client, midihwports[i]); + + if (port == NULL) + continue; + if (jack_port_get_aliases(port, aliasesptr) <= 0) + continue; + if (strncmp(aliases[0], "alsa_pcm:Midi-Through/", 22) == 0) + continue; + + jack_connect(g_jack_global_client, ourportname, midihwports[i]); + } + + jack_free(midihwports); + } + } } static void ConnectToMIDIThroughPorts(void) @@ -4292,8 +4348,15 @@ int effects_init(void* client) if (g_aggregated_midi_enabled) { - const char *ourportname = jack_port_name(g_midi_in_port); - jack_connect(g_jack_global_client, "mod-midi-merger:out", ourportname); + const char *ourportnamein = jack_port_name(g_midi_in_port); + jack_connect(g_jack_global_client, "mod-midi-merger:out", ourportnamein); + + if(g_enable_midi_feedback) + { + const char *ourportnameout = jack_port_name(g_midi_out_port); + jack_connect(g_jack_global_client, ourportnameout, "mod-midi-broadcaster:in"); + } + ConnectToMIDIThroughPorts(); } /* Else connect to all good hw ports (system, ttymidi and nooice) */ @@ -7910,6 +7973,12 @@ int effects_aggregated_midi_enable(int enable) pthread_mutex_unlock(&g_raw_midi_port_mutex); } + // step7. If midi feedback enabled then connect to mod-midi-broadcaster + if(g_enable_midi_feedback) + { + const char *ourportnameout = jack_port_name(g_midi_out_port); + jack_connect(g_jack_global_client, ourportnameout, "mod-midi-broadcaster:in"); + } } else { // step 1. remove aggregated midi clients jack_intclient_t merger = jack_internal_client_handle(g_jack_global_client, "mod-midi-merger", NULL); From d5cf8e5b47aab3f28728684c23ab7fd582da5bfc Mon Sep 17 00:00:00 2001 From: Andrew Capon Date: Wed, 31 Aug 2022 15:13:36 +0100 Subject: [PATCH 6/6] Fix issue with ports with no alias not being connected. --- src/effects.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/effects.c b/src/effects.c index f33fa06..58a5175 100755 --- a/src/effects.c +++ b/src/effects.c @@ -875,6 +875,28 @@ static char* strchrnul(const char *s, int c) } #endif +#ifdef ENABLE_TMP_LOG +static void Log(const char *psFormatString, ...) +{ + static FILE *pFile = NULL; + static char logStr[2048]; + + if(pFile == NULL) + { + pFile = fopen("/tmp/mod.log", "a"); + } + + va_list args; + va_start(args, psFormatString); + + vsnprintf(logStr, 2048, psFormatString, args); + + fputs(logStr, pFile); + + fflush(pFile); +} +#endif + static void SetMidiOutValue(midi_cc_t *midiCC) { float value = *(midiCC->port->buffer); @@ -3213,10 +3235,12 @@ static void ConnectToAllHardwareMIDIPorts(void) if (port == NULL) continue; - if (jack_port_get_aliases(port, aliasesptr) <= 0) - continue; - if (strncmp(aliases[0], "alsa_pcm:Midi-Through/", 22) == 0) - continue; + + if (jack_port_get_aliases(port, aliasesptr) > 0) + { + if (strncmp(aliases[0], "alsa_pcm:Midi-Through/", 22) == 0) + continue; + } jack_connect(g_jack_global_client, ourportname, midihwports[i]); }