Skip to content

Commit

Permalink
Add support for TOGGLE rules: CC & NoteOn events. See zynthian/zynthi…
Browse files Browse the repository at this point in the history
  • Loading branch information
jofemodo committed May 1, 2020
1 parent 593d9dd commit 0165831
Show file tree
Hide file tree
Showing 2 changed files with 66 additions and 4 deletions.
56 changes: 54 additions & 2 deletions zynmidirouter.c
Expand Up @@ -92,6 +92,8 @@ int init_midi_router() {
}
}
}
memset(midi_filter.cc_toggle, 0, 16*128);
memset(midi_filter.note_toggle, 0, 16*128);
memset(midi_filter.ctrl_mode, 0, 16*128);
memset(midi_filter.ctrl_relmode_count, 0, 16*128);
memset(midi_filter.last_ctrl_val, 0, 16*128);
Expand Down Expand Up @@ -178,6 +180,48 @@ int get_midi_filter_transpose(uint8_t chan) {
return midi_filter.transpose[chan];
}

//MIDI filter toggle

void set_midi_filter_cc_toggle(uint8_t chan, uint8_t num, int val) {
if (chan>15) {
fprintf (stderr, "ZynMidiRouter: MIDI CC-toggle channel (%d) is out of range!\n",chan);
return;
}
midi_filter.cc_toggle[chan][num]=val;
}

int get_midi_filter_cc_toggle(uint8_t chan, uint8_t num) {
if (chan>15) {
fprintf (stderr, "ZynMidiRouter: MIDI CC-toggle channel (%d) is out of range!\n",chan);
return 0;
}
return midi_filter.cc_toggle[chan][num];
}

void reset_midi_filter_cc_toggle() {
memset(midi_filter.cc_toggle, 0, 16*128);
}

void set_midi_filter_note_toggle(uint8_t chan, uint8_t num, int val) {
if (chan>15) {
fprintf (stderr, "ZynMidiRouter: MIDI note-toggle channel (%d) is out of range!\n",chan);
return;
}
midi_filter.note_toggle[chan][num]=val;
}

int get_midi_filter_note_toggle(uint8_t chan, uint8_t num) {
if (chan>15) {
fprintf (stderr, "ZynMidiRouter: MIDI note-toggle channel (%d) is out of range!\n",chan);
return 0;
}
return midi_filter.note_toggle[chan][num];
}

void reset_midi_filter_note_toggle() {
memset(midi_filter.note_toggle, 0, 16*128);
}

//MIDI filter clone
void set_midi_filter_clone(uint8_t chan_from, uint8_t chan_to, int v) {
if (chan_from>15) {
Expand Down Expand Up @@ -292,8 +336,7 @@ void set_midi_filter_event_map_st(struct midi_event_st *ev_from, struct midi_eve
}
}

void set_midi_filter_event_map(enum midi_event_type_enum type_from, uint8_t chan_from, uint8_t num_from,
enum midi_event_type_enum type_to, uint8_t chan_to, uint8_t num_to) {
void set_midi_filter_event_map(enum midi_event_type_enum type_from, uint8_t chan_from, uint8_t num_from, enum midi_event_type_enum type_to, uint8_t chan_to, uint8_t num_to) {
struct midi_event_st ev_from={ .type=type_from, .chan=chan_from, .num=num_from };
struct midi_event_st ev_to={ .type=type_to, .chan=chan_to, .num=num_to };
set_midi_filter_event_map_st(&ev_from, &ev_to);
Expand Down Expand Up @@ -836,6 +879,15 @@ int jack_process_zmip(int iz, jack_nframes_t nframes) {
event_num=event_val=0;
}

if ((zmip->flags & FLAG_ZMIP_TOGGLE) && event_val>0) {
if (event_type==CTRL_CHANGE && midi_filter.cc_toggle[event_chan][event_num]>0) {
zynmidi_send_ccontrol_change(event_chan, event_num, 0);
}
else if (event_type==NOTE_ON && midi_filter.note_toggle[event_chan][event_num]>0) {
zynmidi_send_note_off(event_chan, event_num, 0);
}
}

if (ev.buffer[0]<SYSTEM_EXCLUSIVE && event_chan!=midi_filter.master_chan) {
//Active Channel => When set, move all channel events to active_chan
if (current_midi_filter_active_chan>=0) {
Expand Down
14 changes: 12 additions & 2 deletions zynmidirouter.h
Expand Up @@ -101,6 +101,8 @@ struct midi_filter_st {
int auto_relmode;

int transpose[16];
int cc_toggle[16][128];
int note_toggle[16][128];
struct mf_clone_st clone[16][16];
struct midi_event_st event_map[8][16][128];

Expand Down Expand Up @@ -136,6 +138,14 @@ int get_midi_filter_tuning_pitchbend();
void set_midi_filter_transpose(uint8_t chan, int offset);
int get_midi_filter_transpose(uint8_t chan);

//MIDI filter toggle
void set_midi_filter_cc_toggle(uint8_t chan, uint8_t num, int val);
int get_midi_filter_cc_toggle(uint8_t chan, uint8_t num);
void reset_midi_filter_cc_toggle();
void set_midi_filter_note_toggle(uint8_t chan, uint8_t num, int val);
int get_midi_filter_note_toggle(uint8_t chan, uint8_t num);
void reset_midi_filter_note_toggle();

//MIDI filter clone
void set_midi_filter_clone(uint8_t chan_from, uint8_t chan_to, int v);
int get_midi_filter_clone(uint8_t chan_from, uint8_t chan_to);
Expand All @@ -162,7 +172,6 @@ uint8_t get_midi_filter_cc_map(uint8_t chan, uint8_t cc_from);
void del_midi_filter_cc_map(uint8_t chan, uint8_t cc_from);
void reset_midi_filter_cc_map();


//MIDI Learning Mode
int midi_learning_mode;
void set_midi_learning_mode(int mlm);
Expand All @@ -189,6 +198,7 @@ uint8_t get_midi_filter_cc_swap(uint8_t chan, uint8_t num);
#define FLAG_ZMIP_SWAP 16
#define FLAG_ZMIP_TRANSPOSE 32
#define FLAG_ZMIP_TUNING 64
#define FLAG_ZMIP_TOGGLE 128

#define ZMOP_MAIN 0
#define ZMOP_MIDI 1
Expand Down Expand Up @@ -222,7 +232,7 @@ uint8_t get_midi_filter_cc_swap(uint8_t chan, uint8_t num);

#define ZMOP_MAIN_FLAGS (FLAG_ZMOP_TUNING)

#define ZMIP_MAIN_FLAGS (FLAG_ZMIP_UI|FLAG_ZMIP_ZYNCODER|FLAG_ZMIP_CLONE|FLAG_ZMIP_FILTER|FLAG_ZMIP_SWAP|FLAG_ZMIP_TRANSPOSE|FLAG_ZMIP_TUNING)
#define ZMIP_MAIN_FLAGS (FLAG_ZMIP_UI|FLAG_ZMIP_ZYNCODER|FLAG_ZMIP_CLONE|FLAG_ZMIP_FILTER|FLAG_ZMIP_SWAP|FLAG_ZMIP_TRANSPOSE|FLAG_ZMIP_TUNING|FLAG_ZMIP_TOGGLE)
#define ZMIP_SEQ_FLAGS (FLAG_ZMIP_UI|FLAG_ZMIP_ZYNCODER)
#define ZMIP_CTRL_FLAGS (FLAG_ZMIP_UI)

Expand Down

0 comments on commit 0165831

Please sign in to comment.