@ -416,6 +416,7 @@ uint8_t drum_counter;
uint8_t drum_type [ NUM_DRUMS ] ;
extern void sequencer ( void ) ;
uint8_t drum_midi_channel = DRUM_MIDI_CHANNEL ;
custom_midi_map_t custom_midi_map [ NUM_CUSTOM_MIDI_MAPPINGS ] ;
# endif
# ifdef ENABLE_LCD_UI
@ -933,158 +934,267 @@ void loop()
# endif
}
void learn_key ( byte inChannel , byte inNumber )
{
uint8_t found = 199 ;
if ( inChannel = = DRUM_MIDI_CHANNEL )
{
for ( uint8_t c = 0 ; c < NUM_CUSTOM_MIDI_MAPPINGS ; c + + )
{
if ( inNumber = = custom_midi_map [ c ] . in & & custom_midi_map [ c ] . type = = 1 )
{
found = c ;
break ;
}
}
if ( found ! = 199 ) //remap to new destination if it was already mapped before
{
custom_midi_map [ found ] . in = inNumber ;
custom_midi_map [ found ] . out = drum_config [ activesample ] . midinote ;
custom_midi_map [ found ] . type = 1 ;
custom_midi_map [ found ] . channel = DRUM_MIDI_CHANNEL ;
}
else
{
found = 199 ;
for ( uint8_t c = 0 ; c < NUM_CUSTOM_MIDI_MAPPINGS ; c + + )
{
if ( custom_midi_map [ c ] . in = = 0 )
{
found = c ;
break ;
}
}
if ( found ! = 199 ) // else map to next empty slot if it was not mapped before
{
custom_midi_map [ found ] . in = inNumber ;
custom_midi_map [ found ] . out = drum_config [ activesample ] . midinote ;
custom_midi_map [ found ] . type = 1 ;
custom_midi_map [ found ] . channel = DRUM_MIDI_CHANNEL ;
}
else
; // can not be mapped, no empty slot left
}
}
seq . midi_learn_active = false ;
//update_midi_learn_button();
print_custom_mappings ( ) ;
}
void learn_cc ( byte inChannel , byte inNumber )
{
uint8_t found = 199 ;
for ( uint8_t c = 0 ; c < NUM_CUSTOM_MIDI_MAPPINGS ; c + + )
{
if ( inNumber = = custom_midi_map [ c ] . in & & custom_midi_map [ c ] . type = = 2 )
{
found = c ;
break ;
}
}
if ( found ! = 199 ) //remap to new destination if it was already mapped before
{
custom_midi_map [ found ] . in = inNumber ;
custom_midi_map [ found ] . out = cc_dest_values [ seq . temp_select_menu ] ;
custom_midi_map [ found ] . type = 2 ;
custom_midi_map [ found ] . channel = configuration . dexed [ selected_instance_id ] . midi_channel ;
}
else
{
found = 199 ;
for ( uint8_t c = 0 ; c < NUM_CUSTOM_MIDI_MAPPINGS ; c + + )
{
if ( custom_midi_map [ c ] . in = = 0 )
{
found = c ;
break ;
}
}
if ( found ! = 199 ) // else map to next empty slot if it was not mapped before
{
custom_midi_map [ found ] . in = inNumber ;
custom_midi_map [ found ] . out = cc_dest_values [ seq . temp_select_menu ] ;
custom_midi_map [ found ] . type = 2 ;
custom_midi_map [ found ] . channel = configuration . dexed [ selected_instance_id ] . midi_channel ;
}
else
; // can not be mapped, no empty slot left
}
seq . midi_learn_active = false ;
//update_midi_learn_button();
print_custom_mappings ( ) ;
}
/******************************************************************************
MIDI MESSAGE HANDLER
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
void handleNoteOn ( byte inChannel , byte inNumber , byte inVelocity )
{
//
// Drum Sampler
//
# if NUM_DRUMS > 0
if ( activesample < 6 & & seq . running = = false & & LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_seq_pattern_editor ) ) // live play pitched sample
if ( seq . midi_learn_active & & LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_custom_mappings ) )
learn_key ( inChannel , inNumber ) ;
else
{
if ( drum_counter > = NUM_DRUMS )
drum_counter = 0 ;
uint8_t slot = drum_get_slot ( drum_config [ activesample ] . drum_class ) ;
float pan = mapfloat ( drum_config [ activesample ] . pan , - 1.0 , 1.0 , 0.0 , 1.0 ) ;
drum_mixer_r . gain ( slot , ( 1.0 - pan ) * drum_config [ activesample ] . vol_max ) ;
drum_mixer_l . gain ( slot , pan * drum_config [ activesample ] . vol_max ) ;
//
// Drum Sampler
//
# if NUM_DRUMS > 0
if ( activesample < 6 & & seq . running = = false & & LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_seq_pattern_editor ) ) // live play pitched sample
{
if ( drum_counter > = NUM_DRUMS )
drum_counter = 0 ;
uint8_t slot = drum_get_slot ( drum_config [ activesample ] . drum_class ) ;
float pan = mapfloat ( drum_config [ activesample ] . pan , - 1.0 , 1.0 , 0.0 , 1.0 ) ;
drum_mixer_r . gain ( slot , ( 1.0 - pan ) * drum_config [ activesample ] . vol_max ) ;
drum_mixer_l . gain ( slot , pan * drum_config [ activesample ] . vol_max ) ;
# ifdef USE_FX
drum_reverb_send_mixer_r . gain ( slot , ( 1.0 - pan ) * volume_transform ( drum_config [ activesample ] . reverb_send ) ) ;
drum_reverb_send_mixer_l . gain ( slot , pan * volume_transform ( drum_config [ activesample ] . reverb_send ) ) ;
drum_reverb_send_mixer_r . gain ( slot , ( 1.0 - pan ) * volume_transform ( drum_config [ activesample ] . reverb_send ) ) ;
drum_reverb_send_mixer_l . gain ( slot , pan * volume_transform ( drum_config [ activesample ] . reverb_send ) ) ;
# endif
if ( drum_config [ activesample ] . drum_data ! = NULL & & drum_config [ activesample ] . len > 0 )
{
Drum [ slot ] - > enableInterpolation ( true ) ;
Drum [ slot ] - > setPlaybackRate ( ( float ) pow ( 2 , ( inNumber - 72 ) / 12.00 ) * drum_config [ activesample ] . p_offset ) ;
Drum [ slot ] - > playRaw ( ( int16_t * ) drum_config [ activesample ] . drum_data , drum_config [ activesample ] . len , 1 ) ;
if ( drum_config [ activesample ] . drum_data ! = NULL & & drum_config [ activesample ] . len > 0 )
{
Drum [ slot ] - > enableInterpolation ( true ) ;
Drum [ slot ] - > setPlaybackRate ( ( float ) pow ( 2 , ( inNumber - 72 ) / 12.00 ) * drum_config [ activesample ] . p_offset ) ;
Drum [ slot ] - > playRaw ( ( int16_t * ) drum_config [ activesample ] . drum_data , drum_config [ activesample ] . len , 1 ) ;
}
}
}
else
else
# endif
//Ignore the note when playing & recording the same note into the sequencer
if ( seq . recording = = false | | ( seq . recording & & inNumber ! = seq . note_in ) )
{
// Check for MicroDexed
for ( uint8_t instance_id = 0 ; instance_id < NUM_DEXED ; instance_id + + )
//Ignore the note when playing & recording the same note into the sequencer
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 )
MicroDexed [ instance_id ] - > keydown ( inNumber , uint8_t ( float ( configuration . dexed [ instance_id ] . velocity_level / 127.0 ) * inVelocity + 0.5 ) ) ;
if ( inNumber > = configuration . dexed [ instance_id ] . lowest_note & & inNumber < = configuration . dexed [ instance_id ] . highest_note )
{
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
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_voice_select ) )
{
midi_decay_timer = 0 ;
midi_decay [ instance_id ] = min ( inVelocity / 5 , 7 ) ;
}
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_voice_select ) )
{
midi_decay_timer = 0 ;
midi_decay [ instance_id ] = min ( inVelocity / 5 , 7 ) ;
}
# endif
# ifdef DEBUG
char note_name [ 4 ] ;
getNoteName ( note_name , inNumber ) ;
Serial . print ( F ( " KeyDown " ) ) ;
Serial . print ( note_name ) ;
Serial . print ( F ( " instance " ) ) ;
Serial . print ( instance_id , DEC ) ;
Serial . print ( F ( " MIDI-channel " ) ) ;
Serial . print ( inChannel , DEC ) ;
Serial . println ( ) ;
char note_name [ 4 ] ;
getNoteName ( note_name , inNumber ) ;
Serial . print ( F ( " KeyDown " ) ) ;
Serial . print ( note_name ) ;
Serial . print ( F ( " instance " ) ) ;
Serial . print ( instance_id , DEC ) ;
Serial . print ( F ( " MIDI-channel " ) ) ;
Serial . print ( inChannel , DEC ) ;
Serial . println ( ) ;
# endif
return ;
return ;
}
}
}
}
# if NUM_DRUMS > 0
// Check for Drum
if ( inChannel = = drum_midi_channel | | drum_midi_channel = = MIDI_CHANNEL_OMNI )
{
if ( drum_counter > = NUM_DRUMS )
drum_counter = 0 ;
// Check for Drum
if ( inChannel = = drum_midi_channel | | drum_midi_channel = = MIDI_CHANNEL_OMNI )
{
if ( drum_counter > = NUM_DRUMS )
drum_counter = 0 ;
//check custom midi mapping
for ( uint8_t c = 0 ; c < NUM_CUSTOM_MIDI_MAPPINGS ; c + + )
{
if ( inNumber = = custom_midi_map [ c ] . in & & custom_midi_map [ c ] . type = = 1 )
{
inNumber = custom_midi_map [ c ] . out ;
break ;
}
}
# ifdef DEBUG
char note_name [ 4 ] ;
getNoteName ( note_name , inNumber ) ;
Serial . print ( F ( " => Drum[ " ) ) ;
Serial . print ( drum_counter , DEC ) ;
Serial . print ( F ( " ]: " ) ) ;
Serial . println ( note_name ) ;
char note_name [ 4 ] ;
getNoteName ( note_name , inNumber ) ;
Serial . print ( F ( " => Drum[ " ) ) ;
Serial . print ( drum_counter , DEC ) ;
Serial . print ( F ( " ]: " ) ) ;
Serial . println ( note_name ) ;
# endif
for ( uint8_t d = 0 ; d < NUM_DRUMSET_CONFIG ; d + + )
{
if ( inNumber = = drum_config [ d ] . midinote )
for ( uint8_t d = 0 ; d < NUM_DRUMSET_CONFIG ; d + + )
{
uint8_t slot = drum_get_slot ( drum_config [ d ] . drum_class ) ;
float pan = mapfloat ( drum_config [ d ] . pan , - 1.0 , 1.0 , 0.0 , 1.0 ) ;
if ( inNumber = = drum_config [ d ] . midinote )
{
uint8_t slot = drum_get_slot ( drum_config [ d ] . drum_class ) ;
float pan = mapfloat ( drum_config [ d ] . pan , - 1.0 , 1.0 , 0.0 , 1.0 ) ;
drum_mixer_r . gain ( slot , ( 1.0 - pan ) * volume_transform ( mapfloat ( inVelocity , 0 , 127 , drum_config [ d ] . vol_min , drum_config [ d ] . vol_max ) ) ) ;
drum_mixer_l . gain ( slot , pan * volume_transform ( mapfloat ( inVelocity , 0 , 127 , drum_config [ d ] . vol_min , drum_config [ d ] . vol_max ) ) ) ;
drum_mixer_r . gain ( slot , ( 1.0 - pan ) * volume_transform ( mapfloat ( inVelocity , 0 , 127 , drum_config [ d ] . vol_min , drum_config [ d ] . vol_max ) ) ) ;
drum_mixer_l . gain ( slot , pan * volume_transform ( mapfloat ( inVelocity , 0 , 127 , drum_config [ d ] . vol_min , drum_config [ d ] . vol_max ) ) ) ;
# ifdef USE_FX
drum_reverb_send_mixer_r . gain ( slot , ( 1.0 - pan ) * volume_transform ( drum_config [ d ] . reverb_send ) ) ;
drum_reverb_send_mixer_l . gain ( slot , pan * volume_transform ( drum_config [ d ] . reverb_send ) ) ;
drum_reverb_send_mixer_r . gain ( slot , ( 1.0 - pan ) * volume_transform ( drum_config [ d ] . reverb_send ) ) ;
drum_reverb_send_mixer_l . gain ( slot , pan * volume_transform ( drum_config [ d ] . reverb_send ) ) ;
# endif
if ( drum_config [ d ] . drum_data ! = NULL & & drum_config [ d ] . len > 0 )
{
//Drum[slot]->play(drum_config[d].drum_data);
if ( drum_config [ d ] . pitch ! = 0.0 )
if ( drum_config [ d ] . drum_data ! = NULL & & drum_config [ d ] . len > 0 )
{
Drum [ slot ] - > enableInterpolation ( true ) ;
Drum [ slot ] - > setPlaybackRate ( drum_config [ d ] . pitch ) ;
//Drum[slot]->play(drum_config[d].drum_data);
if ( drum_config [ d ] . pitch ! = 0.0 )
{
Drum [ slot ] - > enableInterpolation ( true ) ;
Drum [ slot ] - > setPlaybackRate ( drum_config [ d ] . pitch ) ;
}
Drum [ slot ] - > playRaw ( ( int16_t * ) drum_config [ d ] . drum_data , drum_config [ d ] . len , 1 ) ;
}
Drum [ slot ] - > playRaw ( ( int16_t * ) drum_config [ d ] . drum_data , drum_config [ d ] . len , 1 ) ;
}
# ifdef DEBUG
Serial . print ( F ( " Drum " ) ) ;
Serial . print ( drum_config [ d ] . shortname ) ;
Serial . print ( F ( " [ " ) ) ;
Serial . print ( drum_config [ d ] . name ) ;
Serial . print ( F ( " ], Slot " ) ) ;
Serial . print ( slot ) ;
Serial . print ( F ( " : V " ) ) ;
Serial . print ( mapfloat ( inVelocity , 0 , 127 , drum_config [ d ] . vol_min , drum_config [ d ] . vol_max ) , 2 ) ;
Serial . print ( F ( " P " ) ) ;
Serial . print ( drum_config [ d ] . pan , 2 ) ;
Serial . print ( F ( " PAN " ) ) ;
Serial . print ( pan , 2 ) ;
Serial . print ( F ( " RS " ) ) ;
Serial . println ( drum_config [ d ] . reverb_send , 2 ) ;
# endif
break ;
Serial . print ( F ( " Drum " ) ) ;
Serial . print ( drum_config [ d ] . shortname ) ;
Serial . print ( F ( " [ " ) ) ;
Serial . print ( drum_config [ d ] . name ) ;
Serial . print ( F ( " ], Slot " ) ) ;
Serial . print ( slot ) ;
Serial . print ( F ( " : V " ) ) ;
Serial . print ( mapfloat ( inVelocity , 0 , 127 , drum_config [ d ] . vol_min , drum_config [ d ] . vol_max ) , 2 ) ;
Serial . print ( F ( " P " ) ) ;
Serial . print ( drum_config [ d ] . pan , 2 ) ;
Serial . print ( F ( " PAN " ) ) ;
Serial . print ( pan , 2 ) ;
Serial . print ( F ( " RS " ) ) ;
Serial . println ( drum_config [ d ] . reverb_send , 2 ) ;
# endif
break ;
}
}
}
}
# endif
}
}
//
// E-Piano
//
//
// E-Piano
//
# if defined(USE_EPIANO)
if ( configuration . epiano . midi_channel = = MIDI_CHANNEL_OMNI | | configuration . epiano . midi_channel = = inChannel )
{
if ( inNumber > = configuration . epiano . lowest_note & & inNumber < = configuration . epiano . highest_note )
if ( configuration . epiano . midi_channel = = MIDI_CHANNEL_OMNI | | configuration . epiano . midi_channel = = inChannel )
{
ep . noteOn ( inNumber + configuration . epiano . transpose - 24 , inVelocity ) ;
if ( inNumber > = configuration . epiano . lowest_note & & inNumber < = configuration . epiano . highest_note )
{
ep . noteOn ( inNumber + configuration . epiano . transpose - 24 , inVelocity ) ;
# ifdef DEBUG
char note_name [ 4 ] ;
getNoteName ( note_name , inNumber ) ;
Serial . print ( F ( " KeyDown " ) ) ;
Serial . print ( note_name ) ;
Serial . print ( F ( " EPIANO " ) ) ;
Serial . print ( F ( " MIDI-channel " ) ) ;
Serial . print ( inChannel , DEC ) ;
Serial . println ( ) ;
char note_name [ 4 ] ;
getNoteName ( note_name , inNumber ) ;
Serial . print ( F ( " KeyDown " ) ) ;
Serial . print ( note_name ) ;
Serial . print ( F ( " EPIANO " ) ) ;
Serial . print ( F ( " MIDI-channel " ) ) ;
Serial . print ( inChannel , DEC ) ;
Serial . println ( ) ;
# endif
}
}
}
# endif
}
}
# if NUM_DRUMS > 0
@ -1177,216 +1287,252 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue)
inCtrl = constrain ( inCtrl , 0 , 127 ) ;
inValue = constrain ( inValue , 0 , 127 ) ;
for ( uint8_t instance_id = 0 ; instance_id < NUM_DEXED ; instance_id + + )
if ( seq . midi_learn_active & & LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_cc_mappings ) )
learn_cc ( inChannel , inCtrl ) ;
else
{
if ( checkMidiChannel ( inChannel , instance_id ) )
//check custom midi mapping
for ( uint8_t c = 0 ; c < NUM_CUSTOM_MIDI_MAPPINGS ; c + + )
{
if ( inCtrl = = custom_midi_map [ c ] . in & & custom_midi_map [ c ] . type = = 2 )
{
inCtrl = custom_midi_map [ c ] . out ;
inChannel = custom_midi_map [ c ] . channel ;
break ;
}
}
for ( uint8_t instance_id = 0 ; instance_id < NUM_DEXED ; instance_id + + )
{
if ( checkMidiChannel ( inChannel , instance_id ) )
{
# ifdef DEBUG
Serial . print ( F ( " INSTANCE " ) ) ;
Serial . print ( instance_id , DEC ) ;
Serial . print ( F ( " : CC# " ) ) ;
Serial . print ( inCtrl , DEC ) ;
Serial . print ( F ( " : " ) ) ;
Serial . println ( inValue , DEC ) ;
Serial . print ( F ( " INSTANCE " ) ) ;
Serial . print ( instance_id , DEC ) ;
Serial . print ( F ( " : CC# " ) ) ;
Serial . print ( inCtrl , DEC ) ;
Serial . print ( F ( " : " ) ) ;
Serial . println ( inValue , DEC ) ;
# endif
switch ( inCtrl ) {
case 0 : // BankSelect MSB
switch ( inCtrl ) {
case 0 : // BankSelect MSB
# ifdef DEBUG
Serial . println ( F ( " BANK-SELECT MSB CC " ) ) ;
Serial . println ( F ( " BANK-SELECT MSB CC " ) ) ;
# endif
configuration . dexed [ instance_id ] . bank = constrain ( ( inValue < < 7 ) & configuration . dexed [ instance_id ] . bank , 0 , MAX_BANKS - 1 ) ;
/* load_sd_voice(configuration.dexed[instance_id].bank, configuration.dexed[instance_id].voice, instance_id);
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_voice_select ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
} */
break ;
case 1 :
configuration . dexed [ instance_id ] . bank = constrain ( ( inValue < < 7 ) & configuration . dexed [ instance_id ] . bank , 0 , MAX_BANKS - 1 ) ;
/* load_sd_voice(configuration.dexed[instance_id].bank, configuration.dexed[instance_id].voice, instance_id);
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_voice_select ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
} */
break ;
case 1 :
# ifdef DEBUG
Serial . println ( F ( " MODWHEEL CC " ) ) ;
Serial . println ( F ( " MODWHEEL CC " ) ) ;
# endif
MicroDexed [ instance_id ] - > setModWheel ( inValue ) ;
MicroDexed [ instance_id ] - > ControllersRefresh ( ) ;
break ;
case 2 :
MicroDexed [ instance_id ] - > setModWheel ( inValue ) ;
MicroDexed [ instance_id ] - > ControllersRefresh ( ) ;
break ;
case 2 :
# ifdef DEBUG
Serial . println ( F ( " BREATH CC " ) ) ;
Serial . println ( F ( " BREATH CC " ) ) ;
# endif
MicroDexed [ instance_id ] - > setBreathController ( inValue ) ;
MicroDexed [ instance_id ] - > ControllersRefresh ( ) ;
break ;
case 4 :
MicroDexed [ instance_id ] - > setBreathController ( inValue ) ;
MicroDexed [ instance_id ] - > ControllersRefresh ( ) ;
break ;
case 4 :
# ifdef DEBUG
Serial . println ( F ( " FOOT CC " ) ) ;
Serial . println ( F ( " FOOT CC " ) ) ;
# endif
MicroDexed [ instance_id ] - > setFootController ( inValue ) ;
MicroDexed [ instance_id ] - > ControllersRefresh ( ) ;
break ;
case 5 : // Portamento time
configuration . dexed [ instance_id ] . portamento_time = inValue ;
MicroDexed [ instance_id ] - > setPortamentoMode ( configuration . dexed [ instance_id ] . portamento_mode , configuration . dexed [ instance_id ] . portamento_glissando , configuration . dexed [ instance_id ] . portamento_time ) ;
break ;
case 7 : // Instance Volume
MicroDexed [ instance_id ] - > setFootController ( inValue ) ;
MicroDexed [ instance_id ] - > ControllersRefresh ( ) ;
break ;
case 5 : // Portamento time
configuration . dexed [ instance_id ] . portamento_time = inValue ;
MicroDexed [ instance_id ] - > setPortamentoMode ( configuration . dexed [ instance_id ] . portamento_mode , configuration . dexed [ instance_id ] . portamento_glissando , configuration . dexed [ instance_id ] . portamento_time ) ;
break ;
case 7 : // Instance Volume
# ifdef DEBUG
Serial . println ( F ( " VOLUME CC " ) ) ;
Serial . println ( F ( " VOLUME CC " ) ) ;
# endif
configuration . dexed [ instance_id ] . sound_intensity = map ( inValue , 0 , 127 , SOUND_INTENSITY_MIN , SOUND_INTENSITY_MAX ) ;
MicroDexed [ instance_id ] - > setGain ( midi_volume_transform ( map ( configuration . dexed [ instance_id ] . sound_intensity , SOUND_INTENSITY_MIN , SOUND_INTENSITY_MAX , 0 , 127 ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_sound_intensity ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 10 : // Pan
configuration . dexed [ instance_id ] . sound_intensity = map ( inValue , 0 , 127 , SOUND_INTENSITY_MIN , SOUND_INTENSITY_MAX ) ;
MicroDexed [ instance_id ] - > setGain ( midi_volume_transform ( map ( configuration . dexed [ instance_id ] . sound_intensity , SOUND_INTENSITY_MIN , SOUND_INTENSITY_MAX , 0 , 127 ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_sound_intensity ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 10 : // Pan
# ifdef DEBUG
Serial . println ( F ( " PANORAMA CC " ) ) ;
Serial . println ( F ( " PANORAMA CC " ) ) ;
# endif
configuration . dexed [ instance_id ] . pan = map ( inValue , 0 , 0x7f , PANORAMA_MIN , PANORAMA_MAX ) ;
mono2stereo [ instance_id ] - > panorama ( mapfloat ( configuration . dexed [ instance_id ] . pan , PANORAMA_MIN , PANORAMA_MAX , - 1.0 , 1.0 ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_panorama ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 32 : // BankSelect LSB
configuration . dexed [ instance_id ] . pan = map ( inValue , 0 , 0x7f , PANORAMA_MIN , PANORAMA_MAX ) ;
mono2stereo [ instance_id ] - > panorama ( mapfloat ( configuration . dexed [ instance_id ] . pan , PANORAMA_MIN , PANORAMA_MAX , - 1.0 , 1.0 ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_panorama ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 32 : // BankSelect LSB
# ifdef DEBUG
Serial . println ( F ( " BANK-SELECT LSB CC " ) ) ;
Serial . println ( F ( " BANK-SELECT LSB CC " ) ) ;
# endif
configuration . dexed [ instance_id ] . bank = constrain ( inValue , 0 , MAX_BANKS - 1 ) ;
/*load_sd_voice(configuration.dexed[instance_id].bank, configuration.dexed[instance_id].voice, instance_id);
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_voice_select ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
} */
break ;
case 64 :
MicroDexed [ instance_id ] - > setSustain ( inValue > 63 ) ;
if ( ! MicroDexed [ instance_id ] - > getSustain ( ) )
{
for ( uint8_t note = 0 ; note < MicroDexed [ instance_id ] - > getMaxNotes ( ) ; note + + )
configuration . dexed [ instance_id ] . bank = constrain ( inValue , 0 , MAX_BANKS - 1 ) ;
/*load_sd_voice(configuration.dexed[instance_id].bank, configuration.dexed[instance_id].voice, instance_id);
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_voice_select ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
} */
break ;
case 64 :
MicroDexed [ instance_id ] - > setSustain ( inValue > 63 ) ;
if ( ! MicroDexed [ instance_id ] - > getSustain ( ) )
{
if ( MicroDexed [ instance_id ] - > voices [ note ] . sustained & & ! MicroDexed [ instance_id ] - > voices [ note ] . keydown )
for ( uint8_t note = 0 ; note < MicroDexed [ instance_id ] - > getMaxNotes ( ) ; note + + )
{
MicroDexed [ instance_id ] - > voices [ note ] . dx7_note - > keyup ( ) ;
MicroDexed [ instance_id ] - > voices [ note ] . sustained = false ;
if ( MicroDexed [ instance_id ] - > voices [ note ] . sustained & & ! MicroDexed [ instance_id ] - > voices [ note ] . keydown )
{
MicroDexed [ instance_id ] - > voices [ note ] . dx7_note - > keyup ( ) ;
MicroDexed [ instance_id ] - > voices [ note ] . sustained = false ;
}
}
}
}
break ;
case 65 :
MicroDexed [ instance_id ] - > setPortamentoMode ( configuration . dexed [ instance_id ] . portamento_mode , configuration . dexed [ instance_id ] . portamento_glissando , configuration . dexed [ instance_id ] . portamento_time ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_portamento_mode ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 94 : // CC 94: (de)tune
configuration . dexed [ selected_instance_id ] . tune = map ( inValue , 0 , 0x7f , TUNE_MIN , TUNE_MAX ) ;
MicroDexed [ selected_instance_id ] - > setMasterTune ( ( int ( ( configuration . dexed [ selected_instance_id ] . tune - 100 ) / 100.0 * 0x4000 ) < < 11 ) * ( 1.0 / 12 ) ) ;
MicroDexed [ selected_instance_id ] - > doRefreshVoice ( ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_tune ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
break ;
case 65 :
MicroDexed [ instance_id ] - > setPortamentoMode ( configuration . dexed [ instance_id ] . portamento_mode , configuration . dexed [ instance_id ] . portamento_glissando , configuration . dexed [ instance_id ] . portamento_time ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_portamento_mode ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 94 : // CC 94: (de)tune
configuration . dexed [ selected_instance_id ] . tune = map ( inValue , 0 , 0x7f , TUNE_MIN , TUNE_MAX ) ;
MicroDexed [ selected_instance_id ] - > setMasterTune ( ( int ( ( configuration . dexed [ selected_instance_id ] . tune - 100 ) / 100.0 * 0x4000 ) < < 11 ) * ( 1.0 / 12 ) ) ;
MicroDexed [ selected_instance_id ] - > doRefreshVoice ( ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_tune ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
# if defined(USE_FX)
case 91 : // CC 91: reverb send
configuration . fx . reverb_send [ selected_instance_id ] = map ( inValue , 0 , 0x7f , REVERB_SEND_MIN , REVERB_SEND_MAX ) ;
reverb_mixer_r . gain ( selected_instance_id , volume_transform ( mapfloat ( configuration . fx . reverb_send [ selected_instance_id ] , REVERB_SEND_MIN , REVERB_SEND_MAX , 0.0 , VOL_MAX_FLOAT ) ) ) ;
reverb_mixer_l . gain ( selected_instance_id , volume_transform ( mapfloat ( configuration . fx . reverb_send [ selected_instance_id ] , REVERB_SEND_MIN , REVERB_SEND_MAX , 0.0 , VOL_MAX_FLOAT ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_reverb_send ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 93 : // CC 93: chorus level
configuration . fx . chorus_level [ selected_instance_id ] = map ( inValue , 0 , 0x7f , CHORUS_LEVEL_MIN , CHORUS_LEVEL_MAX ) ;
chorus_mixer [ selected_instance_id ] - > gain ( 1 , volume_transform ( mapfloat ( configuration . fx . chorus_level [ selected_instance_id ] , CHORUS_LEVEL_MIN , CHORUS_LEVEL_MAX , 0.0 , 0.5 ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_chorus_level ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 103 : // CC 103: filter resonance
configuration . fx . filter_resonance [ instance_id ] = map ( inValue , 0 , 0x7f , FILTER_RESONANCE_MIN , FILTER_RESONANCE_MAX ) ;
MicroDexed [ instance_id ] - > setFilterResonance ( mapfloat ( configuration . fx . filter_resonance [ instance_id ] , FILTER_RESONANCE_MIN , FILTER_RESONANCE_MAX , 1.0 , 0.0 ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_filter_resonance ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 104 : // CC 104: filter cutoff
configuration . fx . filter_cutoff [ instance_id ] = map ( inValue , 0 , 0x7f , FILTER_CUTOFF_MIN , FILTER_CUTOFF_MAX ) ;
MicroDexed [ instance_id ] - > setFilterCutoff ( mapfloat ( configuration . fx . filter_cutoff [ instance_id ] , FILTER_CUTOFF_MIN , FILTER_CUTOFF_MAX , 1.0 , 0.0 ) ) ; ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_filter_cutoff ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 105 : // CC 105: delay time
configuration . fx . delay_time [ instance_id ] = map ( inValue , 0 , 0x7f , DELAY_TIME_MIN , DELAY_TIME_MAX ) ;
delay_fx [ instance_id ] - > delay ( 0 , constrain ( configuration . fx . delay_time [ instance_id ] * 10 , DELAY_TIME_MIN * 10 , DELAY_TIME_MAX * 10 ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_delay_time ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 106 : // CC 106: delay feedback
configuration . fx . delay_feedback [ instance_id ] = map ( inValue , 0 , 0x7f , DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX ) ;
delay_fb_mixer [ instance_id ] - > gain ( 1 , midi_volume_transform ( map ( configuration . fx . delay_feedback [ instance_id ] , DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX , 0 , 127 ) ) ) ; // amount of feedback
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_delay_feedback ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 107 : // CC 107: delay volume
configuration . fx . delay_level [ instance_id ] = map ( inValue , 0 , 0x7f , DELAY_LEVEL_MIN , DELAY_LEVEL_MAX ) ;
delay_mixer [ instance_id ] - > gain ( 1 , midi_volume_transform ( map ( configuration . fx . delay_level [ instance_id ] , DELAY_LEVEL_MIN , DELAY_LEVEL_MAX , 0 , 127 ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_delay_level ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 91 : // CC 91: reverb send
configuration . fx . reverb_send [ selected_instance_id ] = map ( inValue , 0 , 0x7f , REVERB_SEND_MIN , REVERB_SEND_MAX ) ;
reverb_mixer_r . gain ( selected_instance_id , volume_transform ( mapfloat ( configuration . fx . reverb_send [ selected_instance_id ] , REVERB_SEND_MIN , REVERB_SEND_MAX , 0.0 , VOL_MAX_FLOAT ) ) ) ;
reverb_mixer_l . gain ( selected_instance_id , volume_transform ( mapfloat ( configuration . fx . reverb_send [ selected_instance_id ] , REVERB_SEND_MIN , REVERB_SEND_MAX , 0.0 , VOL_MAX_FLOAT ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_reverb_send ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 93 : // CC 93: chorus level
configuration . fx . chorus_level [ selected_instance_id ] = map ( inValue , 0 , 0x7f , CHORUS_LEVEL_MIN , CHORUS_LEVEL_MAX ) ;
chorus_mixer [ selected_instance_id ] - > gain ( 1 , volume_transform ( mapfloat ( configuration . fx . chorus_level [ selected_instance_id ] , CHORUS_LEVEL_MIN , CHORUS_LEVEL_MAX , 0.0 , 0.5 ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_chorus_level ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 103 : // CC 103: filter resonance
configuration . fx . filter_resonance [ instance_id ] = map ( inValue , 0 , 0x7f , FILTER_RESONANCE_MIN , FILTER_RESONANCE_MAX ) ;
MicroDexed [ instance_id ] - > setFilterResonance ( mapfloat ( configuration . fx . filter_resonance [ instance_id ] , FILTER_RESONANCE_MIN , FILTER_RESONANCE_MAX , 1.0 , 0.0 ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_filter_resonance ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 104 : // CC 104: filter cutoff
configuration . fx . filter_cutoff [ instance_id ] = map ( inValue , 0 , 0x7f , FILTER_CUTOFF_MIN , FILTER_CUTOFF_MAX ) ;
MicroDexed [ instance_id ] - > setFilterCutoff ( mapfloat ( configuration . fx . filter_cutoff [ instance_id ] , FILTER_CUTOFF_MIN , FILTER_CUTOFF_MAX , 1.0 , 0.0 ) ) ; ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_filter_cutoff ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 105 : // CC 105: delay time
configuration . fx . delay_time [ instance_id ] = map ( inValue , 0 , 0x7f , DELAY_TIME_MIN , DELAY_TIME_MAX ) ;
delay_fx [ instance_id ] - > delay ( 0 , constrain ( configuration . fx . delay_time [ instance_id ] * 10 , DELAY_TIME_MIN * 10 , DELAY_TIME_MAX * 10 ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_delay_time ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 106 : // CC 106: delay feedback
configuration . fx . delay_feedback [ instance_id ] = map ( inValue , 0 , 0x7f , DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX ) ;
delay_fb_mixer [ instance_id ] - > gain ( 1 , midi_volume_transform ( map ( configuration . fx . delay_feedback [ instance_id ] , DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX , 0 , 127 ) ) ) ; // amount of feedback
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_delay_feedback ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
case 107 : // CC 107: delay volume
configuration . fx . delay_level [ instance_id ] = map ( inValue , 0 , 0x7f , DELAY_LEVEL_MIN , DELAY_LEVEL_MAX ) ;
delay_mixer [ instance_id ] - > gain ( 1 , midi_volume_transform ( map ( configuration . fx . delay_level [ instance_id ] , DELAY_LEVEL_MIN , DELAY_LEVEL_MAX , 0 , 127 ) ) ) ;
if ( LCDML . FUNC_getID ( ) = = LCDML . OTHER_getIDFromFunction ( UI_func_delay_level ) )
{
LCDML . OTHER_updateFunc ( ) ;
LCDML . loop_menu ( ) ;
}
break ;
# endif
case 120 :
MicroDexed [ instance_id ] - > panic ( ) ;
break ;
case 121 :
MicroDexed [ instance_id ] - > resetControllers ( ) ;
break ;
case 123 :
MicroDexed [ instance_id ] - > notesOff ( ) ;
break ;
case 126 :
if ( inValue > 0 )
MicroDexed [ instance_id ] - > setMonoMode ( true ) ;
else
MicroDexed [ instance_id ] - > setMonoMode ( false ) ;
break ;
case 127 :
if ( inValue > 0 )
MicroDexed [ instance_id ] - > setMonoMode ( true ) ;
else
MicroDexed [ instance_id ] - > setMonoMode ( false ) ;
break ;
case 120 :
MicroDexed [ instance_id ] - > panic ( ) ;
break ;
case 121 :
MicroDexed [ instance_id ] - > resetControllers ( ) ;
break ;
case 123 :
MicroDexed [ instance_id ] - > notesOff ( ) ;
break ;
case 126 :
if ( inValue > 0 )
MicroDexed [ instance_id ] - > setMonoMode ( true ) ;
else
MicroDexed [ instance_id ] - > setMonoMode ( false ) ;
break ;
case 127 :
if ( inValue > 0 )
MicroDexed [ instance_id ] - > setMonoMode ( true ) ;
else
MicroDexed [ instance_id ] - > setMonoMode ( false ) ;
break ;
case 200 : // CC 200: seq start/stop
if ( ! seq . running )
handleStart ( ) ;
else
handleStop ( ) ;
break ;
case 201 : // CC 201: seq stop
if ( seq . running )
handleStop ( ) ;
break ;
case 202 : // CC 202: seq record
if ( seq . running )
seq . running = true ;
seq . recording = true ;
seq . note_in = 0 ;
break ;
case 203 : // CC 203: dexed panic
MicroDexed [ 0 ] - > panic ( ) ;
# if NUM_DEXED > 1
MicroDexed [ 1 ] - > panic ( ) ;
# endif
}
}
}
}
# if defined(USE_EPIANO)
if ( configuration . epiano . midi_channel = = MIDI_CHANNEL_OMNI | | configuration . epiano . midi_channel = = inChannel )
ep . processMidiController ( inCtrl , inValue ) ;