|
|
@ -768,92 +768,95 @@ void loop() |
|
|
|
******************************************************************************/ |
|
|
|
******************************************************************************/ |
|
|
|
void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
{ |
|
|
|
{ |
|
|
|
// Check for MicroDexed
|
|
|
|
//Ignore the note when playing & recording the same note into the sequencer
|
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
if (seq_recording == false || (seq_recording && inNumber != seq_note_in )) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (checkMidiChannel(inChannel, instance_id)) |
|
|
|
// Check for MicroDexed
|
|
|
|
|
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (inNumber >= configuration.dexed[instance_id].lowest_note && inNumber <= configuration.dexed[instance_id].highest_note) |
|
|
|
if (checkMidiChannel(inChannel, instance_id)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (configuration.dexed[instance_id].polyphony > 0) |
|
|
|
if (inNumber >= configuration.dexed[instance_id].lowest_note && inNumber <= configuration.dexed[instance_id].highest_note) |
|
|
|
MicroDexed[instance_id]->keydown(inNumber, uint8_t(float(configuration.dexed[instance_id].velocity_level / 127.0)*inVelocity + 0.5)); |
|
|
|
{ |
|
|
|
|
|
|
|
if (configuration.dexed[instance_id].polyphony > 0) |
|
|
|
|
|
|
|
MicroDexed[instance_id]->keydown(inNumber, uint8_t(float(configuration.dexed[instance_id].velocity_level / 127.0)*inVelocity + 0.5)); |
|
|
|
|
|
|
|
|
|
|
|
midi_voices[instance_id]++; |
|
|
|
midi_voices[instance_id]++; |
|
|
|
#ifdef TEENSY4 |
|
|
|
#ifdef TEENSY4 |
|
|
|
if (LCDML.FUNC_getID() == LCDML.OTHER_getIDFromFunction(UI_func_voice_select)) |
|
|
|
if (LCDML.FUNC_getID() == LCDML.OTHER_getIDFromFunction(UI_func_voice_select)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
midi_decay_timer = 0; |
|
|
|
midi_decay_timer = 0; |
|
|
|
midi_decay[instance_id] = min(inVelocity / 5, 7); |
|
|
|
midi_decay[instance_id] = min(inVelocity / 5, 7); |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
char note_name[4]; |
|
|
|
char note_name[4]; |
|
|
|
getNoteName(note_name, inNumber); |
|
|
|
getNoteName(note_name, inNumber); |
|
|
|
Serial.print(F("Keydown ")); |
|
|
|
Serial.print(F("Keydown ")); |
|
|
|
Serial.print(note_name); |
|
|
|
Serial.print(note_name); |
|
|
|
Serial.print(F(" instance ")); |
|
|
|
Serial.print(F(" instance ")); |
|
|
|
Serial.print(instance_id, DEC); |
|
|
|
Serial.print(instance_id, DEC); |
|
|
|
Serial.print(F(" MIDI-channel ")); |
|
|
|
Serial.print(F(" MIDI-channel ")); |
|
|
|
Serial.print(inChannel, DEC); |
|
|
|
Serial.print(inChannel, DEC); |
|
|
|
Serial.println(); |
|
|
|
Serial.println(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
return; |
|
|
|
return; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if NUM_DRUMS > 0 |
|
|
|
#if NUM_DRUMS > 0 |
|
|
|
// Check for Drum
|
|
|
|
// Check for Drum
|
|
|
|
if (inChannel == DRUM_MIDI_CHANNEL) |
|
|
|
if (inChannel == DRUM_MIDI_CHANNEL) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if (drum_counter >= NUM_DRUMS) |
|
|
|
if (drum_counter >= NUM_DRUMS) |
|
|
|
drum_counter = 0; |
|
|
|
drum_counter = 0; |
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
char note_name[4]; |
|
|
|
char note_name[4]; |
|
|
|
getNoteName(note_name, inNumber); |
|
|
|
getNoteName(note_name, inNumber); |
|
|
|
Serial.print(F("=> Drum[")); |
|
|
|
Serial.print(F("=> Drum[")); |
|
|
|
Serial.print(drum_counter, DEC); |
|
|
|
Serial.print(drum_counter, DEC); |
|
|
|
Serial.print(F("]: ")); |
|
|
|
Serial.print(F("]: ")); |
|
|
|
Serial.println(note_name); |
|
|
|
Serial.println(note_name); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
for (uint8_t d = 0; d < NUM_DRUMSET_CONFIG; d++) |
|
|
|
for (uint8_t d = 0; d < NUM_DRUMSET_CONFIG; d++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (inNumber == drum_config[d].midinote) |
|
|
|
|
|
|
|
{ |
|
|
|
{ |
|
|
|
uint8_t slot = drum_get_slot(drum_config[d].drum_class); |
|
|
|
if (inNumber == drum_config[d].midinote) |
|
|
|
float pan = mapfloat(drum_config[d].pan, -1.0, 1.0, 0.0, 1.0); |
|
|
|
{ |
|
|
|
|
|
|
|
uint8_t slot = drum_get_slot(drum_config[d].drum_class); |
|
|
|
drum_mixer_r.gain(slot, (1.0 - pan) * pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max))); |
|
|
|
float pan = mapfloat(drum_config[d].pan, -1.0, 1.0, 0.0, 1.0); |
|
|
|
drum_mixer_l.gain(slot, (pan) * pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max))); |
|
|
|
|
|
|
|
drum_reverb_send_mixer_r.gain(slot, (1.0 - pan) * pseudo_log_curve(drum_config[d].reverb_send)); |
|
|
|
drum_mixer_r.gain(slot, (1.0 - pan) * pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max))); |
|
|
|
drum_reverb_send_mixer_l.gain(slot, pan * pseudo_log_curve(drum_config[d].reverb_send)); |
|
|
|
drum_mixer_l.gain(slot, (pan) * pseudo_log_curve(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max))); |
|
|
|
|
|
|
|
drum_reverb_send_mixer_r.gain(slot, (1.0 - pan) * pseudo_log_curve(drum_config[d].reverb_send)); |
|
|
|
if (drum_config[d].drum_data != NULL) |
|
|
|
drum_reverb_send_mixer_l.gain(slot, pan * pseudo_log_curve(drum_config[d].reverb_send)); |
|
|
|
Drum[slot]->play(drum_config[d].drum_data); |
|
|
|
|
|
|
|
|
|
|
|
if (drum_config[d].drum_data != NULL) |
|
|
|
#ifdef DEBUG |
|
|
|
Drum[slot]->play(drum_config[d].drum_data); |
|
|
|
Serial.print(F("Drum ")); |
|
|
|
|
|
|
|
Serial.print(drum_config[d].shortname); |
|
|
|
#ifdef DEBUG |
|
|
|
Serial.print(F(" [")); |
|
|
|
Serial.print(F("Drum ")); |
|
|
|
Serial.print(drum_config[d].name); |
|
|
|
Serial.print(drum_config[d].shortname); |
|
|
|
Serial.print(F("], Slot ")); |
|
|
|
Serial.print(F(" [")); |
|
|
|
Serial.print(slot); |
|
|
|
Serial.print(drum_config[d].name); |
|
|
|
Serial.print(F(": V")); |
|
|
|
Serial.print(F("], Slot ")); |
|
|
|
Serial.print(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max), 2); |
|
|
|
Serial.print(slot); |
|
|
|
Serial.print(F(" P")); |
|
|
|
Serial.print(F(": V")); |
|
|
|
Serial.print(drum_config[d].pan, 2); |
|
|
|
Serial.print(mapfloat(inVelocity, 0, 127, drum_config[d].vol_min, drum_config[d].vol_max), 2); |
|
|
|
Serial.print(F(" PAN")); |
|
|
|
Serial.print(F(" P")); |
|
|
|
Serial.print(pan, 2); |
|
|
|
Serial.print(drum_config[d].pan, 2); |
|
|
|
Serial.print(F(" RS")); |
|
|
|
Serial.print(F(" PAN")); |
|
|
|
Serial.println(drum_config[d].reverb_send, 2); |
|
|
|
Serial.print(pan, 2); |
|
|
|
|
|
|
|
Serial.print(F(" RS")); |
|
|
|
|
|
|
|
Serial.println(drum_config[d].reverb_send, 2); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if NUM_DRUMS > 0 |
|
|
|
#if NUM_DRUMS > 0 |
|
|
|