void mode_0(void) { uint8_t dmx_index = (uint8_t) 0; bool dmx_new_data = false; if (midi_get_active_sense_state() == MIDI_ACTIVE_SENSE_FAILED) { if (!midi_active_sense_failed) { dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false); midi_active_sense_failed = true; } } else if (midi_active_sense_failed) { dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true); midi_active_sense_failed = false; } if (midi_read_channel(midi_channel)) { if (midi_message->channel != 0 ) { // Channel messages switch (midi_message->type) { case MIDI_TYPES_NOTE_OFF: dmx_index = dmx_start_address + midi_message->data1; // MIDI Channel starts with 0, DMX address starts with 1 if (dmx_index <= DMX_UNIVERSE_SIZE) { // we skip SC dmx_data[dmx_index] = (uint8_t) 0; } dmx_new_data = true; break; case MIDI_TYPES_NOTE_ON: dmx_index = dmx_start_address + midi_message->data1; if (dmx_index <= DMX_UNIVERSE_SIZE) { // we skip SC uint8_t data = midi_message->data2 << 1; dmx_data[dmx_index] = data; } dmx_new_data = true; break; case MIDI_TYPES_CONTROL_CHANGE: { switch (midi_message->data1) { case MIDI_CONTROL_CHANGE_ALL_NOTES_OFF: clear_dmx_data(); dmx_new_data = true; break; default: break; } break; } default: break; } if (dmx_new_data) { dmx_set_send_data(dmx_data, 1 + dmx_max_slot); } } } }
void mode_0_init(void) { clear_dmx_data(); midi_message = (const struct _midi_message *) midi_message_get(); midi_channel = bridge_params_get_midi_channel(); midi_active_sense_failed = (midi_get_active_sense_state() == MIDI_ACTIVE_SENSE_FAILED); dmx_start_address = bridge_params_get_dmx_start_address(); dmx_max_slot = (dmx_start_address + (uint16_t) 127) <= DMX_UNIVERSE_SIZE ? (dmx_start_address + (uint16_t) 127) : DMX_UNIVERSE_SIZE + (uint16_t) 1; // SC dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, false); dmx_set_send_data(dmx_data, 1 + dmx_max_slot); // SC + data dmx_set_port_direction(DMX_PORT_DIRECTION_OUTP, true); monitor_line(5, "Listening channel : %d %s", midi_channel, midi_channel == 0 ? "<OMNI>" : ""); monitor_line(6, "DMX start address : %d", dmx_start_address); monitor_line(7, "DMX slots : %d", dmx_max_slot); }
void monitor_update(void) { // Handle Active Sensing messages switch (midi_get_active_sense_state()) { case MIDI_ACTIVE_SENSE_ENABLED: console_save_cursor(); console_set_cursor(70, 3); console_set_fg_bg_color(CONSOLE_BLACK, CONSOLE_CYAN); (void) console_puts("ACTIVE SENSING "); console_restore_cursor(); break; case MIDI_ACTIVE_SENSE_FAILED: console_save_cursor(); console_set_cursor(70, 3); console_set_fg_bg_color(CONSOLE_RED, CONSOLE_WHITE); (void) console_puts("ACTIVE SENSING - Failed!"); console_restore_cursor(); break; default: break; } }