EPiano works, but the audio chain is not yet correct.

pull/112/head
Holger Wirtz 3 years ago
parent 85f9a8baf5
commit 64ad2968c7
  1. 222
      MicroDexed.ino
  2. 6
      UI.hpp
  3. 48
      config.h

@ -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)));

@ -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;

@ -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
@ -765,11 +763,11 @@
#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;

Loading…
Cancel
Save