|
|
@ -86,12 +86,6 @@ AudioEffectModulatedDelay ep_modchorus_l; |
|
|
|
AudioAmplifier ep_chorus_inverter; |
|
|
|
AudioAmplifier ep_chorus_inverter; |
|
|
|
AudioMixer<2> ep_chorus_mixer_r; |
|
|
|
AudioMixer<2> ep_chorus_mixer_r; |
|
|
|
AudioMixer<2> ep_chorus_mixer_l; |
|
|
|
AudioMixer<2> ep_chorus_mixer_l; |
|
|
|
AudioMixer<2> ep_delay_fb_mixer_r; |
|
|
|
|
|
|
|
AudioMixer<2> ep_delay_fb_mixer_l; |
|
|
|
|
|
|
|
AudioEffectDelay ep_delay_fx_r; |
|
|
|
|
|
|
|
AudioEffectDelay ep_delay_fx_l; |
|
|
|
|
|
|
|
AudioMixer<2> ep_delay_mixer_r; |
|
|
|
|
|
|
|
AudioMixer<2> ep_delay_mixer_l; |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
AudioMixer<2> microdexed_peak_mixer; |
|
|
|
AudioMixer<2> microdexed_peak_mixer; |
|
|
@ -114,11 +108,11 @@ AudioEffectFreeverbStereoFloat freeverb; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(USE_EPIANO) |
|
|
|
#if defined(USE_EPIANO) |
|
|
|
AudioMixer<5> master_mixer_r; |
|
|
|
|
|
|
|
AudioMixer<5> master_mixer_l; |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
AudioMixer<4> master_mixer_r; |
|
|
|
AudioMixer<4> master_mixer_r; |
|
|
|
AudioMixer<4> master_mixer_l; |
|
|
|
AudioMixer<4> master_mixer_l; |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
AudioMixer<5> master_mixer_r; |
|
|
|
|
|
|
|
AudioMixer<5> master_mixer_l; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
AudioAmplifier volume_r; |
|
|
|
AudioAmplifier volume_r; |
|
|
|
AudioAmplifier volume_l; |
|
|
|
AudioAmplifier volume_l; |
|
|
@ -260,30 +254,18 @@ AudioConnection patchCord[] = { |
|
|
|
{ep_chorus_modulator, 0, ep_modchorus_filter, 0}, |
|
|
|
{ep_chorus_modulator, 0, ep_modchorus_filter, 0}, |
|
|
|
{ep_modchorus_filter, 0, ep_modchorus_r, 1}, |
|
|
|
{ep_modchorus_filter, 0, ep_modchorus_r, 1}, |
|
|
|
{ep_modchorus_filter, 0, ep_chorus_inverter, 0}, |
|
|
|
{ep_modchorus_filter, 0, ep_chorus_inverter, 0}, |
|
|
|
{ep_chorus_inverter, 0, ep_modchorus_l, 1}, |
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
{ep_chorus_modulator, 0, ep_modchorus_r, 1}, |
|
|
|
{ep_chorus_modulator, 0, ep_modchorus_r, 1}, |
|
|
|
{ep_chorus_modulator, 0, ep_chorus_inverter, 0}, |
|
|
|
{ep_chorus_modulator, 0, ep_chorus_inverter, 0}, |
|
|
|
{ep_chorus_inverter, 0, ep_modchorus_l, 1}, |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
{ep_chorus_inverter, 0, ep_modchorus_l, 1}, |
|
|
|
{ep_modchorus_r, 0, ep_chorus_mixer_r, 1}, |
|
|
|
{ep_modchorus_r, 0, ep_chorus_mixer_r, 1}, |
|
|
|
{ep_modchorus_l, 0, ep_chorus_mixer_l, 1}, |
|
|
|
{ep_modchorus_l, 0, ep_chorus_mixer_l, 1}, |
|
|
|
|
|
|
|
{ep_chorus_mixer_r, 0, reverb_mixer_r, 3}, |
|
|
|
{ep_chorus_mixer_r, 0, ep_delay_fb_mixer_r, 0}, |
|
|
|
{ep_chorus_mixer_l, 0, reverb_mixer_l, 3}, |
|
|
|
{ep_chorus_mixer_l, 0, ep_delay_fb_mixer_l, 0}, |
|
|
|
|
|
|
|
{ep_chorus_mixer_r, 0, ep_delay_mixer_r, 0}, |
|
|
|
|
|
|
|
{ep_chorus_mixer_l, 0, ep_delay_mixer_l, 0}, |
|
|
|
|
|
|
|
{ep_delay_fb_mixer_r, 0, ep_delay_fx_r, 0}, |
|
|
|
|
|
|
|
{ep_delay_fb_mixer_l, 0, ep_delay_fx_l, 0}, |
|
|
|
|
|
|
|
{ep_delay_fx_r, 0, ep_delay_fb_mixer_r, 1}, |
|
|
|
|
|
|
|
{ep_delay_fx_l, 0, ep_delay_fb_mixer_l, 1}, |
|
|
|
|
|
|
|
{ep_delay_fx_r, 0, ep_delay_mixer_r, 1}, |
|
|
|
|
|
|
|
{ep_delay_fx_l, 0, ep_delay_mixer_l, 1}, |
|
|
|
|
|
|
|
{ep_delay_mixer_r, 0, reverb_mixer_r, 3}, |
|
|
|
|
|
|
|
{ep_delay_mixer_l, 0, reverb_mixer_l, 5}, |
|
|
|
|
|
|
|
#else |
|
|
|
#else |
|
|
|
{ep, 0, master_mixer_r, 4}, |
|
|
|
{ep, 0, master_mixer_r, 4}, |
|
|
|
{ep, 1, master_mixer_l, 4}, , |
|
|
|
{ep, 1, master_mixer_l, 4}, |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
}; |
|
|
|
}; |
|
|
@ -418,6 +400,10 @@ int perform_release_mod[NUM_DEXED] = { 0 }; |
|
|
|
#if defined(USE_FX) |
|
|
|
#if defined(USE_FX) |
|
|
|
// Allocate the delay lines for chorus
|
|
|
|
// Allocate the delay lines for chorus
|
|
|
|
int16_t delayline[NUM_DEXED][MOD_DELAY_SAMPLE_BUFFER]; |
|
|
|
int16_t delayline[NUM_DEXED][MOD_DELAY_SAMPLE_BUFFER]; |
|
|
|
|
|
|
|
#ifdef USE_EPIANO |
|
|
|
|
|
|
|
int16_t ep_delayline_r[MOD_DELAY_SAMPLE_BUFFER]; |
|
|
|
|
|
|
|
int16_t ep_delayline_l[MOD_DELAY_SAMPLE_BUFFER]; |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if NUM_DRUMS > 0 |
|
|
|
#if NUM_DRUMS > 0 |
|
|
@ -594,22 +580,24 @@ void setup() |
|
|
|
// Setup EPiano
|
|
|
|
// Setup EPiano
|
|
|
|
#if defined(USE_FX) |
|
|
|
#if defined(USE_FX) |
|
|
|
#if defined(USE_EPIANO) |
|
|
|
#if defined(USE_EPIANO) |
|
|
|
|
|
|
|
|
|
|
|
// EP_CHORUS
|
|
|
|
// EP_CHORUS
|
|
|
|
switch (configuration.fx.ep_chorus_waveform) |
|
|
|
memset(ep_delayline_r, 0, sizeof(ep_delayline_r)); |
|
|
|
|
|
|
|
if (!ep_modchorus_r.begin(ep_delayline_r, MOD_DELAY_SAMPLE_BUFFER)) |
|
|
|
{ |
|
|
|
{ |
|
|
|
case 0: |
|
|
|
#ifdef DEBUG |
|
|
|
ep_chorus_modulator.begin(WAVEFORM_TRIANGLE); |
|
|
|
Serial.println(F("AudioEffectModulatedDelay R - begin failed EP")); |
|
|
|
break; |
|
|
|
#endif |
|
|
|
case 1: |
|
|
|
while (1); |
|
|
|
ep_chorus_modulator.begin(WAVEFORM_SINE); |
|
|
|
} |
|
|
|
break; |
|
|
|
memset(ep_delayline_l, 0, sizeof(ep_delayline_l)); |
|
|
|
default: |
|
|
|
if (!ep_modchorus_l.begin(ep_delayline_l, MOD_DELAY_SAMPLE_BUFFER)) |
|
|
|
ep_chorus_modulator.begin(WAVEFORM_TRIANGLE); |
|
|
|
{ |
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
|
|
|
|
Serial.println(F("AudioEffectModulatedDelay L - begin failed EP")); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
while (1); |
|
|
|
} |
|
|
|
} |
|
|
|
ep_chorus_modulator.phase(0); |
|
|
|
|
|
|
|
ep_chorus_modulator.frequency(configuration.fx.ep_chorus_frequency / 10.0); |
|
|
|
|
|
|
|
ep_chorus_modulator.amplitude(mapfloat(configuration.fx.ep_chorus_depth, EP_CHORUS_DEPTH_MIN, EP_CHORUS_DEPTH_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
ep_chorus_modulator.offset(0.0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if MOD_FILTER_OUTPUT == MOD_BUTTERWORTH_FILTER_OUTPUT |
|
|
|
#if MOD_FILTER_OUTPUT == MOD_BUTTERWORTH_FILTER_OUTPUT |
|
|
|
// Butterworth filter, 12 db/octave
|
|
|
|
// Butterworth filter, 12 db/octave
|
|
|
@ -626,18 +614,7 @@ void setup() |
|
|
|
ep_chorus_mixer_r.gain(1, mapfloat(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_LEVEL_MAX, 0.0, 0.5)); |
|
|
|
ep_chorus_mixer_r.gain(1, mapfloat(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_LEVEL_MAX, 0.0, 0.5)); |
|
|
|
ep_chorus_mixer_l.gain(1, mapfloat(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_LEVEL_MAX, 0.0, 0.5)); |
|
|
|
ep_chorus_mixer_l.gain(1, mapfloat(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_LEVEL_MAX, 0.0, 0.5)); |
|
|
|
ep_chorus_inverter.gain(-1.0); |
|
|
|
ep_chorus_inverter.gain(-1.0); |
|
|
|
ep_delay_mixer_r.gain(0, 1.0); |
|
|
|
|
|
|
|
ep_delay_mixer_l.gain(0, 1.0);; |
|
|
|
|
|
|
|
ep_delay_mixer_r.gain(1, midi_volume_transform(map(configuration.fx.ep_delay_level, EP_DELAY_LEVEL_MIN, EP_DELAY_LEVEL_MAX, 0, 127))); |
|
|
|
|
|
|
|
ep_delay_mixer_l.gain(1, midi_volume_transform(map(configuration.fx.ep_delay_level, EP_DELAY_LEVEL_MIN, EP_DELAY_LEVEL_MAX, 0, 127))); |
|
|
|
|
|
|
|
ep_delay_fb_mixer_r.gain(0, 1.0); |
|
|
|
|
|
|
|
ep_delay_fb_mixer_r.gain(0, 1.0); |
|
|
|
|
|
|
|
ep_delay_fb_mixer_l.gain(1, midi_volume_transform(map(configuration.fx.ep_delay_feedback, EP_DELAY_FEEDBACK_MIN, EP_DELAY_FEEDBACK_MAX, 0, 127))); |
|
|
|
|
|
|
|
ep_delay_fb_mixer_l.gain(1, midi_volume_transform(map(configuration.fx.ep_delay_feedback, EP_DELAY_FEEDBACK_MIN, EP_DELAY_FEEDBACK_MAX, 0, 127))); |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#else |
|
|
|
|
|
|
|
master_mixer_r.gain(3, 1.0); |
|
|
|
|
|
|
|
master_mixer_l.gain(3, 1.0); |
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// Setup effects
|
|
|
|
// Setup effects
|
|
|
@ -752,6 +729,11 @@ void setup() |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
master_mixer_r.gain(3, VOL_MAX_FLOAT); |
|
|
|
master_mixer_r.gain(3, VOL_MAX_FLOAT); |
|
|
|
master_mixer_l.gain(3, VOL_MAX_FLOAT); |
|
|
|
master_mixer_l.gain(3, VOL_MAX_FLOAT); |
|
|
|
|
|
|
|
#if defined(USE_EPIANO) |
|
|
|
|
|
|
|
master_mixer_r.gain(4, VOL_MAX_FLOAT); |
|
|
|
|
|
|
|
master_mixer_l.gain(4, VOL_MAX_FLOAT); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#if defined(TEENSY_AUDIO_BOARD) && defined(SGTL5000_AUDIO_THRU) |
|
|
|
#if defined(TEENSY_AUDIO_BOARD) && defined(SGTL5000_AUDIO_THRU) |
|
|
|
audio_thru_mixer_r.gain(0, VOL_MAX_FLOAT); // MD signal sum
|
|
|
|
audio_thru_mixer_r.gain(0, VOL_MAX_FLOAT); // MD signal sum
|
|
|
|
audio_thru_mixer_l.gain(0, VOL_MAX_FLOAT); // MD signal sum
|
|
|
|
audio_thru_mixer_l.gain(0, VOL_MAX_FLOAT); // MD signal sum
|
|
|
@ -988,7 +970,7 @@ void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
#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); |
|
|
@ -1063,6 +1045,26 @@ void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
} |
|
|
|
} |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ep.noteOn(inNumber - 12 + configuration.epiano.transpose, 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(); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
#if NUM_DRUMS > 0 |
|
|
|
#if NUM_DRUMS > 0 |
|
|
@ -1128,6 +1130,26 @@ void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#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) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
ep.noteOff(inNumber - 12 + configuration.epiano.transpose); |
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
|
|
|
|
char note_name[4]; |
|
|
|
|
|
|
|
getNoteName(note_name, inNumber); |
|
|
|
|
|
|
|
Serial.print(F("KeyUp ")); |
|
|
|
|
|
|
|
Serial.print(note_name); |
|
|
|
|
|
|
|
Serial.print(F(" EPIANO ")); |
|
|
|
|
|
|
|
Serial.print(F(" MIDI-channel ")); |
|
|
|
|
|
|
|
Serial.print(inChannel, DEC); |
|
|
|
|
|
|
|
Serial.println(); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleControlChange(byte inChannel, byte inCtrl, byte inValue) |
|
|
|
void handleControlChange(byte inChannel, byte inCtrl, byte inValue) |
|
|
@ -1344,6 +1366,11 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(USE_EPIANO) |
|
|
|
|
|
|
|
if (configuration.epiano.midi_channel == MIDI_CHANNEL_OMNI || configuration.epiano.midi_channel == inChannel) |
|
|
|
|
|
|
|
ep.processMidiController(inCtrl, inValue); |
|
|
|
|
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void handleAfterTouch(byte inChannel, byte inPressure) |
|
|
|
void handleAfterTouch(byte inChannel, byte inPressure) |
|
|
@ -2056,7 +2083,7 @@ void initial_values(bool init) |
|
|
|
Serial.println(F("Found wrong EEPROM marker, initializing EEPROM...")); |
|
|
|
Serial.println(F("Found wrong EEPROM marker, initializing EEPROM...")); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
init_configuration(); |
|
|
|
init_configuration(); |
|
|
|
load_sd_performance_json(PERFORMANCE_NUM_MIN); |
|
|
|
//load_sd_performance_json(PERFORMANCE_NUM_MIN);
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
@ -2106,6 +2133,7 @@ void check_configuration(void) |
|
|
|
check_configuration_fx(); |
|
|
|
check_configuration_fx(); |
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
check_configuration_dexed(instance_id); |
|
|
|
check_configuration_dexed(instance_id); |
|
|
|
|
|
|
|
check_configuration_epiano(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void check_configuration_sys(void) |
|
|
|
void check_configuration_sys(void) |
|
|
@ -2160,10 +2188,6 @@ void check_configuration_fx(void) |
|
|
|
configuration.fx.ep_chorus_waveform = constrain(configuration.fx.ep_chorus_waveform, EP_CHORUS_WAVEFORM_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_chorus_waveform = constrain(configuration.fx.ep_chorus_waveform, EP_CHORUS_WAVEFORM_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_chorus_depth = constrain(configuration.fx.ep_chorus_depth, EP_CHORUS_DEPTH_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_chorus_depth = constrain(configuration.fx.ep_chorus_depth, EP_CHORUS_DEPTH_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_chorus_level = constrain(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_chorus_level = constrain(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_delay_time = constrain(configuration.fx.ep_delay_time / 10, EP_DELAY_TIME_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
|
|
|
|
configuration.fx.ep_delay_feedback = constrain(configuration.fx.ep_delay_feedback, EP_DELAY_FEEDBACK_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
|
|
|
|
configuration.fx.ep_delay_level = constrain(configuration.fx.ep_delay_level, EP_DELAY_LEVEL_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
|
|
|
|
configuration.fx.ep_delay_sync = constrain(configuration.fx.ep_delay_sync, EP_DELAY_SYNC_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
|
|
|
|
configuration.fx.ep_reverb_send = constrain(configuration.fx.ep_reverb_send, EP_REVERB_SEND_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
configuration.fx.ep_reverb_send = constrain(configuration.fx.ep_reverb_send, EP_REVERB_SEND_MIN, EP_CHORUS_FREQUENCY_MAX); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
@ -2203,6 +2227,31 @@ void check_configuration_dexed(uint8_t instance_id) |
|
|
|
configuration.dexed[instance_id].op_enabled = constrain(configuration.dexed[instance_id].op_enabled, OP_ENABLED_MIN, OP_ENABLED_MAX); |
|
|
|
configuration.dexed[instance_id].op_enabled = constrain(configuration.dexed[instance_id].op_enabled, OP_ENABLED_MIN, OP_ENABLED_MAX); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
void check_configuration_epiano(void) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
configuration.epiano.decay = constrain(configuration.epiano.decay, EP_DECAY_MIN, EP_DECAY_MAX); |
|
|
|
|
|
|
|
configuration.epiano.release = constrain(configuration.epiano.release, EP_RELEASE_MIN, EP_RELEASE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.hardness = constrain(configuration.epiano.hardness, EP_HARDNESS_MIN, EP_HARDNESS_MAX); |
|
|
|
|
|
|
|
configuration.epiano.treble = constrain(configuration.epiano.treble, EP_TREBLE_MIN, EP_TREBLE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.pan_tremolo = constrain(configuration.epiano.pan_tremolo, EP_PAN_TREMOLO_MIN, EP_PAN_TREMOLO_MAX); |
|
|
|
|
|
|
|
configuration.epiano.pan_lfo = constrain(configuration.epiano.pan_lfo, EP_PAN_LFO_MIN, EP_PAN_LFO_MAX); |
|
|
|
|
|
|
|
configuration.epiano.velocity_sense = constrain(configuration.epiano.velocity_sense, EP_VELOCITY_SENSE_MIN, EP_VELOCITY_SENSE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.stereo = constrain(configuration.epiano.stereo, EP_STEREO_MIN, EP_STEREO_MAX); |
|
|
|
|
|
|
|
configuration.epiano.polyphony = constrain(configuration.epiano.polyphony, EP_POLYPHONY_MIN, EP_POLYPHONY_MAX); |
|
|
|
|
|
|
|
configuration.epiano.tune = constrain(configuration.epiano.tune, EP_TUNE_MIN, EP_TUNE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.detune = constrain(configuration.epiano.detune, EP_DETUNE_MIN, EP_DETUNE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.overdrive = constrain(configuration.epiano.overdrive, EP_OVERDRIVE_MIN, EP_OVERDRIVE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.lowest_note = constrain(configuration.epiano.lowest_note, EP_LOWEST_NOTE_MIN, EP_LOWEST_NOTE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.highest_note = 108; // TODO!
|
|
|
|
|
|
|
|
configuration.epiano.highest_note = constrain(configuration.epiano.highest_note, EP_HIGHEST_NOTE_MIN, EP_HIGHEST_NOTE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.transpose = constrain(configuration.epiano.transpose, EP_TRANSPOSE_MIN, EP_TRANSPOSE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.sound_intensity = constrain(configuration.epiano.sound_intensity, EP_SOUND_INTENSITY_MIN, EP_SOUND_INTENSITY_MAX); |
|
|
|
|
|
|
|
configuration.epiano.pan = constrain(configuration.epiano.pan, EP_PANORAMA_MIN, EP_PANORAMA_MAX); |
|
|
|
|
|
|
|
configuration.epiano.velocity_sense = constrain(configuration.epiano.velocity_sense, EP_VELOCITY_SENSE_MIN, EP_VELOCITY_SENSE_MAX); |
|
|
|
|
|
|
|
configuration.epiano.monopoly = constrain(configuration.epiano.monopoly, EP_MONOPOLY_MIN, EP_MONOPOLY_MAX); |
|
|
|
|
|
|
|
configuration.epiano.midi_channel = constrain(configuration.epiano.midi_channel, EP_MIDI_CHANNEL_MIN, EP_MIDI_CHANNEL_MAX); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void init_configuration(void) |
|
|
|
void init_configuration(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
@ -2232,10 +2281,6 @@ void init_configuration(void) |
|
|
|
configuration.fx.ep_chorus_waveform = EP_CHORUS_WAVEFORM_DEFAULT; |
|
|
|
configuration.fx.ep_chorus_waveform = EP_CHORUS_WAVEFORM_DEFAULT; |
|
|
|
configuration.fx.ep_chorus_depth = EP_CHORUS_DEPTH_DEFAULT; |
|
|
|
configuration.fx.ep_chorus_depth = EP_CHORUS_DEPTH_DEFAULT; |
|
|
|
configuration.fx.ep_chorus_level = EP_CHORUS_LEVEL_DEFAULT; |
|
|
|
configuration.fx.ep_chorus_level = EP_CHORUS_LEVEL_DEFAULT; |
|
|
|
configuration.fx.ep_delay_time = EP_DELAY_TIME_DEFAULT / 10; |
|
|
|
|
|
|
|
configuration.fx.ep_delay_feedback = EP_DELAY_FEEDBACK_DEFAULT; |
|
|
|
|
|
|
|
configuration.fx.ep_delay_level = EP_DELAY_LEVEL_DEFAULT; |
|
|
|
|
|
|
|
configuration.fx.ep_delay_sync = EP_DELAY_SYNC_DEFAULT; |
|
|
|
|
|
|
|
configuration.fx.ep_reverb_send = EP_REVERB_SEND_DEFAULT; |
|
|
|
configuration.fx.ep_reverb_send = EP_REVERB_SEND_DEFAULT; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
@ -2288,7 +2333,26 @@ void init_configuration(void) |
|
|
|
MicroDexed[instance_id]->ControllersRefresh(); |
|
|
|
MicroDexed[instance_id]->ControllersRefresh(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
set_volume(configuration.sys.vol, configuration.sys.mono); |
|
|
|
configuration.epiano.decay = EP_DECAY_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.release = EP_RELEASE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.hardness = EP_HARDNESS_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.treble = EP_TREBLE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.pan_tremolo = EP_PAN_TREMOLO_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.pan_lfo = EP_PAN_LFO_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.velocity_sense = EP_VELOCITY_SENSE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.stereo = EP_STEREO_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.polyphony = EP_POLYPHONY_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.tune = EP_TUNE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.detune = EP_DETUNE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.overdrive = EP_OVERDRIVE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.lowest_note = EP_LOWEST_NOTE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.highest_note = EP_HIGHEST_NOTE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.transpose = EP_TRANSPOSE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.sound_intensity = EP_SOUND_INTENSITY_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.pan = EP_PANORAMA_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.velocity_sense = EP_VELOCITY_SENSE_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.monopoly = EP_MONOPOLY_DEFAULT; |
|
|
|
|
|
|
|
configuration.epiano.midi_channel = EP_MIDI_CHANNEL_DEFAULT; |
|
|
|
|
|
|
|
|
|
|
|
eeprom_update(); |
|
|
|
eeprom_update(); |
|
|
|
} |
|
|
|
} |
|
|
@ -2459,6 +2523,44 @@ void set_fx_params(void) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if defined(USE_EPIANO) |
|
|
|
|
|
|
|
reverb_mixer_r.gain(3, 1.0); // EPiano Reverb-Send
|
|
|
|
|
|
|
|
reverb_mixer_l.gain(3, 1.0); // EPiano Reverb-Send
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// EP_CHORUS
|
|
|
|
|
|
|
|
switch (configuration.fx.ep_chorus_waveform) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
case 0: |
|
|
|
|
|
|
|
ep_chorus_modulator.begin(WAVEFORM_TRIANGLE); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
case 1: |
|
|
|
|
|
|
|
ep_chorus_modulator.begin(WAVEFORM_SINE); |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
|
|
|
|
ep_chorus_modulator.begin(WAVEFORM_TRIANGLE); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ep_chorus_modulator.phase(0); |
|
|
|
|
|
|
|
ep_chorus_modulator.frequency(configuration.fx.ep_chorus_frequency / 10.0); |
|
|
|
|
|
|
|
ep_chorus_modulator.amplitude(mapfloat(configuration.fx.ep_chorus_depth, EP_CHORUS_DEPTH_MIN, EP_CHORUS_DEPTH_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
ep_chorus_modulator.offset(0.0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if MOD_FILTER_OUTPUT == MOD_BUTTERWORTH_FILTER_OUTPUT |
|
|
|
|
|
|
|
// Butterworth filter, 12 db/octave
|
|
|
|
|
|
|
|
ep_modchorus_filter.setLowpass(0, MOD_FILTER_CUTOFF_HZ, 0.707); |
|
|
|
|
|
|
|
#elif MOD_FILTER_OUTPUT == MOD_LINKWITZ_RILEY_FILTER_OUTPUT |
|
|
|
|
|
|
|
// Linkwitz-Riley filter, 48 dB/octave
|
|
|
|
|
|
|
|
ep_modchorus_filter.setLowpass(0, MOD_FILTER_CUTOFF_HZ, 0.54); |
|
|
|
|
|
|
|
ep_modchorus_filter.setLowpass(1, MOD_FILTER_CUTOFF_HZ, 1.3); |
|
|
|
|
|
|
|
ep_modchorus_filter.setLowpass(2, MOD_FILTER_CUTOFF_HZ, 0.54); |
|
|
|
|
|
|
|
ep_modchorus_filter.setLowpass(3, MOD_FILTER_CUTOFF_HZ, 1.3); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
ep_chorus_mixer_r.gain(0, 1.0); |
|
|
|
|
|
|
|
ep_chorus_mixer_l.gain(0, 1.0); |
|
|
|
|
|
|
|
ep_chorus_mixer_r.gain(1, mapfloat(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_LEVEL_MAX, 0.0, 0.5)); |
|
|
|
|
|
|
|
ep_chorus_mixer_l.gain(1, mapfloat(configuration.fx.ep_chorus_level, EP_CHORUS_LEVEL_MIN, EP_CHORUS_LEVEL_MAX, 0.0, 0.5)); |
|
|
|
|
|
|
|
ep_chorus_inverter.gain(-1.0); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
master_mixer_r.gain(3, volume_transform(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, VOL_MAX_FLOAT))); |
|
|
|
master_mixer_r.gain(3, volume_transform(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, VOL_MAX_FLOAT))); |
|
|
|
master_mixer_l.gain(3, volume_transform(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, VOL_MAX_FLOAT))); |
|
|
|
master_mixer_l.gain(3, volume_transform(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, VOL_MAX_FLOAT))); |
|
|
|
|
|
|
|
|
|
|
|