From 64ad2968c775b40035d92178d6d849b25351911e Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Tue, 2 Nov 2021 14:48:55 +0100 Subject: [PATCH] EPiano works, but the audio chain is not yet correct. --- MicroDexed.ino | 222 ++++++++++++++++++++++++++++++++++++------------- UI.hpp | 10 +-- config.h | 50 +++++------ 3 files changed, 189 insertions(+), 93 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index 8719b3d..5752117 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -86,12 +86,6 @@ AudioEffectModulatedDelay ep_modchorus_l; AudioAmplifier ep_chorus_inverter; AudioMixer<2> ep_chorus_mixer_r; 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 AudioMixer<2> microdexed_peak_mixer; @@ -114,11 +108,11 @@ AudioEffectFreeverbStereoFloat freeverb; #endif #if defined(USE_EPIANO) -AudioMixer<5> master_mixer_r; -AudioMixer<5> master_mixer_l; -#else AudioMixer<4> master_mixer_r; AudioMixer<4> master_mixer_l; +#else +AudioMixer<5> master_mixer_r; +AudioMixer<5> master_mixer_l; #endif AudioAmplifier volume_r; AudioAmplifier volume_l; @@ -260,30 +254,18 @@ AudioConnection patchCord[] = { {ep_chorus_modulator, 0, ep_modchorus_filter, 0}, {ep_modchorus_filter, 0, ep_modchorus_r, 1}, {ep_modchorus_filter, 0, ep_chorus_inverter, 0}, - {ep_chorus_inverter, 0, ep_modchorus_l, 1}, #else {ep_chorus_modulator, 0, ep_modchorus_r, 1}, {ep_chorus_modulator, 0, ep_chorus_inverter, 0}, - {ep_chorus_inverter, 0, ep_modchorus_l, 1}, #endif + {ep_chorus_inverter, 0, ep_modchorus_l, 1}, {ep_modchorus_r, 0, ep_chorus_mixer_r, 1}, {ep_modchorus_l, 0, ep_chorus_mixer_l, 1}, - - {ep_chorus_mixer_r, 0, ep_delay_fb_mixer_r, 0}, - {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}, + {ep_chorus_mixer_r, 0, reverb_mixer_r, 3}, + {ep_chorus_mixer_l, 0, reverb_mixer_l, 3}, #else {ep, 0, master_mixer_r, 4}, - {ep, 1, master_mixer_l, 4}, , + {ep, 1, master_mixer_l, 4}, #endif #endif }; @@ -418,6 +400,10 @@ int perform_release_mod[NUM_DEXED] = { 0 }; #if defined(USE_FX) // Allocate the delay lines for chorus 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 #if NUM_DRUMS > 0 @@ -594,22 +580,24 @@ void setup() // Setup EPiano #if defined(USE_FX) #if defined(USE_EPIANO) + // 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: - ep_chorus_modulator.begin(WAVEFORM_TRIANGLE); - break; - case 1: - ep_chorus_modulator.begin(WAVEFORM_SINE); - break; - default: - ep_chorus_modulator.begin(WAVEFORM_TRIANGLE); +#ifdef DEBUG + Serial.println(F("AudioEffectModulatedDelay R - begin failed EP")); +#endif + while (1); + } + memset(ep_delayline_l, 0, sizeof(ep_delayline_l)); + if (!ep_modchorus_l.begin(ep_delayline_l, MOD_DELAY_SAMPLE_BUFFER)) + { +#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 // 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_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_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 -#else - master_mixer_r.gain(3, 1.0); - master_mixer_l.gain(3, 1.0); #endif // Setup effects @@ -752,6 +729,11 @@ void setup() #endif master_mixer_r.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) audio_thru_mixer_r.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 char note_name[4]; getNoteName(note_name, inNumber); - Serial.print(F("Keydown ")); + Serial.print(F("KeyDown ")); Serial.print(note_name); Serial.print(F(" instance ")); Serial.print(instance_id, DEC); @@ -1063,6 +1045,26 @@ void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity) } #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 @@ -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) @@ -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) @@ -2056,7 +2083,7 @@ void initial_values(bool init) Serial.println(F("Found wrong EEPROM marker, initializing EEPROM...")); #endif init_configuration(); - load_sd_performance_json(PERFORMANCE_NUM_MIN); + //load_sd_performance_json(PERFORMANCE_NUM_MIN); } else { @@ -2106,6 +2133,7 @@ void check_configuration(void) check_configuration_fx(); for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) check_configuration_dexed(instance_id); + check_configuration_epiano(); } 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_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_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); #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); } +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) { #ifdef DEBUG @@ -2232,10 +2281,6 @@ void init_configuration(void) configuration.fx.ep_chorus_waveform = EP_CHORUS_WAVEFORM_DEFAULT; configuration.fx.ep_chorus_depth = EP_CHORUS_DEPTH_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; #endif @@ -2288,7 +2333,26 @@ void init_configuration(void) 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(); } @@ -2459,6 +2523,44 @@ void set_fx_params(void) #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_l.gain(3, volume_transform(mapfloat(configuration.fx.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, VOL_MAX_FLOAT))); diff --git a/UI.hpp b/UI.hpp index 3083cb9..973b618 100644 --- a/UI.hpp +++ b/UI.hpp @@ -106,8 +106,8 @@ extern AudioMixer<2> microdexed_peak_mixer; extern AudioAnalyzePeak microdexed_peak; #if defined(USE_FX) #if defined(USE_EPIANO) -extern AudioMixer<4> reverb_mixer_r; -extern AudioMixer<4> reverb_mixer_l; +extern AudioMixer<4> reverb_mixer_r; +extern AudioMixer<4> reverb_mixer_l; #else extern AudioMixer<3> reverb_mixer_r; extern AudioMixer<3> reverb_mixer_l; @@ -139,11 +139,11 @@ extern AudioMixer<2> ep_delay_mixer_l; #endif #if defined(USE_EPIANO) -extern AudioMixer<5> master_mixer_r; -extern AudioMixer<5> master_mixer_l; -#else extern AudioMixer<4> master_mixer_r; extern AudioMixer<4> master_mixer_l; +#else +extern AudioMixer<5> master_mixer_r; +extern AudioMixer<5> master_mixer_l; #endif extern AudioEffectStereoMono stereo2mono; extern AudioAnalyzePeak master_peak_r; diff --git a/config.h b/config.h index 40e67ed..ecbd239 100644 --- a/config.h +++ b/config.h @@ -138,6 +138,8 @@ #define USE_EPIANO #ifdef USE_EPIANO #define NUM_EPIANO_VOICES 16 +//#define DEFAULT_EP_MIDI_CHANNEL 3 +#define DEFAULT_EP_MIDI_CHANNEL 1 #endif // CHORUS parameters @@ -181,9 +183,17 @@ #define SAMPLE_RATE 44100 #ifdef USE_FX -#define AUDIO_MEM SAMPLE_RATE * NUM_DEXED * DELAY_MAX_TIME / 128000 + 36 +#if defined(USE_EPIANO) +#define AUDIO_MEM (SAMPLE_RATE * NUM_DEXED * DELAY_MAX_TIME / 128000) + (NUM_DEXED * 15) + 18 #else -#define AUDIO_MEM NUM_DEXED * 15 +#define AUDIO_MEM (SAMPLE_RATE * NUM_DEXED * DELAY_MAX_TIME / 128000) + (NUM_DEXED * 15) + 6 +#endif +#else +#if defined(USE_EPIANO) +#define AUDIO_MEM (NUM_DEXED * 15) + 2 +#else +#define AUDIO_MEM (NUM_DEXED * 15) +#endif #endif #ifdef TEENSY_AUDIO_BOARD @@ -695,22 +705,6 @@ #define EP_CHORUS_LEVEL_MAX 100 #define EP_CHORUS_LEVEL_DEFAULT 0 -#define EP_DELAY_TIME_MIN 0 -#define EP_DELAY_TIME_MAX DELAY_MAX_TIME/10 -#define EP_DELAY_TIME_DEFAULT 0 - -#define EP_DELAY_FEEDBACK_MIN 0 -#define EP_DELAY_FEEDBACK_MAX 100 -#define EP_DELAY_FEEDBACK_DEFAULT 0 - -#define EP_DELAY_LEVEL_MIN 0 -#define EP_DELAY_LEVEL_MAX 100 -#define EP_DELAY_LEVEL_DEFAULT 0 - -#define EP_DELAY_SYNC_MIN 0 -#define EP_DELAY_SYNC_MAX 9 -#define EP_DELAY_SYNC_DEFAULT 0 - #define EP_REVERB_SEND_MIN 0 #define EP_REVERB_SEND_MAX 100 #define EP_REVERB_SEND_DEFAULT 0 @@ -743,12 +737,16 @@ #define EP_VELOCITY_SENSE_MAX 100 #define EP_VELOCITY_SENSE_DEFAULT 25 +#define EP_PANORAMA_MIN 0 +#define EP_PANORAMA_MAX 40 +#define EP_PANORAMA_DEFAULT 20 + #define EP_STEREO_MIN 0 #define EP_STEREO_MAX 100 #define EP_STEREO_DEFAULT 50 #define EP_POLYPHONY_MIN 0 -#define EP_POLOYPHONY_MAX NUM_EPIANO_VOICES +#define EP_POLYPHONY_MAX NUM_EPIANO_VOICES #define EP_POLYPHONY_DEFAULT NUM_EPIANO_VOICES #define EP_TUNE_MIN 1 @@ -761,15 +759,15 @@ #define EP_OVERDRIVE_MIN 0 #define EP_OVERDRIVE_MAX 100 -#define EP_OVERDRIVE _DEFAULT 0 +#define EP_OVERDRIVE_DEFAULT 0 #define EP_LOWEST_NOTE_MIN 21 #define EP_LOWEST_NOTE_MAX 108 -#define EP_LOWEST_NOTE_DEFAULT 21 +#define EP_LOWEST_NOTE_DEFAULT EP_LOWEST_NOTE_MIN #define EP_HIGHEST_NOTE_MIN 21 #define EP_HIGHEST_NOTE_MAX 108 -#define EP_HIGHEST_NOTE_DEFAULT 108 +#define EP_HIGHEST_NOTE_DEFAULT EP_HIGHEST_NOTE_MAX #define EP_TRANSPOSE_MIN 0 #define EP_TRANSPOSE_MAX 48 @@ -785,7 +783,7 @@ #define EP_MIDI_CHANNEL_MIN MIDI_CHANNEL_OMNI #define EP_MIDI_CHANNEL_MAX 16 -#define EP_MIDI_CHANNEL_DEFAULT MIDI_CHANNEL_OMNI +#define EP_MIDI_CHANNEL_DEFAULT DEFAULT_EP_MIDI_CHANNEL #define FAVORITES_NUM_MIN 0 #define FAVORITES_NUM_MAX 100 @@ -865,10 +863,6 @@ typedef struct fx_s { uint8_t ep_chorus_waveform; uint8_t ep_chorus_depth; uint8_t ep_chorus_level; - uint8_t ep_delay_time; - uint8_t ep_delay_feedback; - uint8_t ep_delay_level; - uint8_t ep_delay_sync; uint8_t ep_reverb_send; } fx_t; @@ -890,7 +884,6 @@ typedef struct epiano_s { uint8_t transpose; uint8_t sound_intensity; uint8_t pan; - uint8_t velocity_level; uint8_t monopoly; uint8_t midi_channel; } epiano_t; @@ -907,6 +900,7 @@ typedef struct sys_s { typedef struct configuration_s { sys_t sys; dexed_t dexed[MAX_DEXED]; + epiano_t epiano; fx_t fx; } config_t;