static void filter_preproc_keyrange(MidiFilter* self) { if ( floorf(self->lcfg[1]) == floorf(*self->cfg[1]) && floorf(self->lcfg[2]) == floorf(*self->cfg[2]) && floorf(self->lcfg[3]) == floorf(*self->cfg[3]) ) return; int c,k; uint8_t buf[3]; buf[2] = 0; const int mode = RAIL(floorf(*self->cfg[3]),0, 3); const uint8_t low = midi_limit_val(floorf(*self->cfg[1])); const uint8_t upp = midi_limit_val(floorf(*self->cfg[2])); for (c=0; c < 16; ++c) { for (k=0; k < 127; ++k) { const uint8_t vel = self->memCM[c][k]; if (vel == 0) continue; if (mode != 0 && (k >= low && k <= upp) ^ (mode == 2)) continue; buf[0] = MIDI_NOTEOFF | c; buf[1] = midi_limit_val(k + self->memCI[c][k]); forge_midimessage(self, 0, buf, 3); self->memCM[c][k] = 0; } } }
static void filter_preproc_miditranspose(MidiFilter* self) { if (floor(self->lcfg[1]) == floor(*self->cfg[1])) return; const int transp = rint(*(self->cfg[1])); int c,k; uint8_t buf[3]; buf[2] = 0; for (c=0; c < 16; ++c) { #if 0 /* send "all notes off" */ buf[0] = MIDI_CONTROLCHANGE | c; buf[1] = 123; forge_midimessage(self, tme, buf, 3); // send "all sound off" buf[0] = 0xb0 | i; buf[1] = 120; forge_midimessage(self, tme, buf, 3); #else /* re-transpose playing notes */ for (k=0; k < 127; ++k) { if (!self->memCM[c][k]) continue; buf[0] = MIDI_NOTEOFF | c; buf[1] = midi_limit_val(k + self->memCI[c][k]); buf[2] = 0; forge_midimessage(self, 0, buf, 3); buf[0] = MIDI_NOTEON | c; buf[1] = midi_limit_val(k + transp); buf[2] = self->memCM[c][k]; self->memCI[c][k] = transp; forge_midimessage(self, 0, buf, 3); } #endif } }
static void filter_preproc_mapkeyscale(MidiFilter* self) { int i; int identical_cfg = 1; int keymap[12]; for (i=0; i < 12; ++i) { keymap[i] = RAIL(floorf(*self->cfg[i+1]), -13, 12); if (floorf(self->lcfg[i+1]) != floorf(*self->cfg[i+1])) { identical_cfg = 0; } } if (identical_cfg) return; int c,k; uint8_t buf[3]; buf[2] = 0; for (c=0; c < 16; ++c) { for (k=0; k < 127; ++k) { int note; const int n = 1 + k%12; if (!self->memCM[c][k]) continue; if (floorf(self->lcfg[n]) == floorf(*self->cfg[n])) continue; note = k + self->memCI[c][k]; if (midi_valid(note)) { note = midi_limit_val(note); if (self->memCS[c][note] > 0) { self->memCS[c][note]--; if (self->memCS[c][note] == 0) { buf[0] = MIDI_NOTEOFF | c; buf[1] = note; buf[2] = 0; forge_midimessage(self, 0, buf, 3); } } } note = k + keymap[k%12]; if (midi_valid(note)) { note = midi_limit_val(note); buf[0] = MIDI_NOTEON | c; buf[1] = note; buf[2] = self->memCM[c][k]; self->memCI[c][k] = note - k; self->memCS[c][note]++; if (self->memCS[c][note] == 1) { forge_midimessage(self, 0, buf, 3); } } else { self->memCM[c][k] = 0; self->memCI[c][k] = -1000; } } } }
static void filter_preproc_enforcescale(MidiFilter* self) { if (floorf(self->lcfg[1]) == floorf(*self->cfg[1])) return; const int scale = RAIL(floorf(*self->cfg[1]), 0, 11); int c,k; uint8_t buf[3]; buf[2] = 0; for (c=0; c < 16; ++c) { for (k=0; k < 127; ++k) { if (self->memCS[c][k] ==0) continue; if (filter_enforcescale_check(scale, k)) { self->memCI[c][k] = 0; continue; } buf[0] = MIDI_NOTEOFF | c; buf[1] = midi_limit_val(k); buf[2] = 0; forge_midimessage(self, 0, buf, 3); self->memCS[c][k] = 0; self->memCI[c][k] = 0; } } }
static void filter_midi_keyrange(MidiFilter* self, uint32_t tme, const uint8_t* const buffer, uint32_t size) { const int mode = RAIL(floorf(*self->cfg[3]),0, 3); const uint8_t chs = midi_limit_chn(floorf(*self->cfg[0]) -1); const uint8_t chn = buffer[0] & 0x0f; uint8_t mst = buffer[0] & 0xf0; if (size != 3 || !(mst == MIDI_NOTEON || mst == MIDI_NOTEOFF) || !(floorf(*self->cfg[0]) == 0 || chs == chn) || mode == 0 ) { forge_midimessage(self, tme, buffer, size); return; } const uint8_t low = midi_limit_val(floorf(*self->cfg[1])); const uint8_t upp = midi_limit_val(floorf(*self->cfg[2])); const uint8_t key = buffer[1] & 0x7f; const uint8_t vel = buffer[2] & 0x7f; if (mst == MIDI_NOTEON && vel ==0 ) { mst = MIDI_NOTEOFF; } switch(mst) { case MIDI_NOTEON: if ((key >= low && key <= upp) ^ (mode == 2)) { forge_midimessage(self, tme, buffer, size); self->memCM[chn][key] = vel; } break; case MIDI_NOTEOFF: if (self->memCM[chn][key] > 0) { forge_midimessage(self, tme, buffer, size); } self->memCM[chn][key] = 0; break; } }