|
|
@ -53,56 +53,62 @@ AudioAmplifier modchorus_inverter; |
|
|
|
|
|
|
|
|
|
|
|
// FX chain left
|
|
|
|
// FX chain left
|
|
|
|
AudioMixer4 delay_send_mixer_l; |
|
|
|
AudioMixer4 delay_send_mixer_l; |
|
|
|
|
|
|
|
AudioMixer4 delay_mixer_l; |
|
|
|
AudioMixer4 delay_fb_mixer_l; |
|
|
|
AudioMixer4 delay_fb_mixer_l; |
|
|
|
AudioEffectDelay delay_l; |
|
|
|
AudioEffectDelay delay_l; |
|
|
|
AudioConnection patchCord1(delay_send_mixer_l, 0, delay_fb_mixer_l, 0); |
|
|
|
AudioConnection patchCord1(delay_send_mixer_l, 0, delay_fb_mixer_l, 0); |
|
|
|
AudioConnection patchCord2(delay_fb_mixer_l, delay_l); |
|
|
|
AudioConnection patchCord2(delay_fb_mixer_l, delay_l); |
|
|
|
AudioConnection patchCord3(delay_l, 0, delay_fb_mixer_l, 1); // feedback-loop
|
|
|
|
AudioConnection patchCord3(delay_l, 0, delay_fb_mixer_l, 1); // feedback-loop
|
|
|
|
AudioConnection patchCord4(delay_fb_mixer_l, 0, master_mixer_l, DELAY); |
|
|
|
AudioConnection patchCord4(delay_l, 0, delay_mixer_l, 0); |
|
|
|
|
|
|
|
AudioConnection patchCord5(delay_fb_mixer_l, 0, delay_mixer_l, 1); |
|
|
|
|
|
|
|
AudioConnection patchCord6(delay_mixer_l, 0, master_mixer_l, DELAY); |
|
|
|
AudioMixer4 chorus_send_mixer_l; |
|
|
|
AudioMixer4 chorus_send_mixer_l; |
|
|
|
AudioEffectModulatedDelay modchorus_l; |
|
|
|
AudioEffectModulatedDelay modchorus_l; |
|
|
|
AudioConnection patchCord5(chorus_send_mixer_l, modchorus_l); |
|
|
|
AudioConnection patchCord7(chorus_send_mixer_l, 0, modchorus_l, 0); |
|
|
|
AudioConnection patchCord6(chorus_modulator, 0, modchorus_l, 1); |
|
|
|
AudioConnection patchCord8(chorus_modulator, 0, modchorus_l, 1); |
|
|
|
#if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT |
|
|
|
#if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT |
|
|
|
AudioFilterBiquad modchorus_filter_l; |
|
|
|
AudioFilterBiquad modchorus_filter_l; |
|
|
|
AudioConnection patchCord7(modchorus_l, modchorus_filter_l); |
|
|
|
AudioConnection patchCord9(modchorus_l, modchorus_filter_l); |
|
|
|
AudioConnection patchCord8(modchorus_filter_l, modchorus_inverter); |
|
|
|
AudioConnection patchCord10(modchorus_filter_l, modchorus_inverter); |
|
|
|
AudioConnection patchCord9(modchorus_inverter_l, 0, master_mixer_l, CHORUS ); |
|
|
|
AudioConnection patchCord11(modchorus_inverter_l, 0, master_mixer_l, CHORUS); |
|
|
|
#else |
|
|
|
#else |
|
|
|
AudioConnection patchCord7(modchorus_l, modchorus_inverter); |
|
|
|
AudioConnection patchCord9(modchorus_l, modchorus_inverter); |
|
|
|
AudioConnection patchCord8(modchorus_inverter, 0, master_mixer_l, CHORUS); |
|
|
|
AudioConnection patchCord10(modchorus_inverter, 0, master_mixer_l, CHORUS); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
AudioMixer4 reverb_send_mixer_l; |
|
|
|
AudioMixer4 reverb_send_mixer_l; |
|
|
|
AudioEffectFreeverb freeverb_l; |
|
|
|
AudioEffectFreeverb freeverb_l; |
|
|
|
AudioConnection patchCord10(reverb_send_mixer_l, freeverb_l); |
|
|
|
AudioConnection patchCord12(reverb_send_mixer_l, freeverb_l); |
|
|
|
AudioConnection patchCord11(freeverb_l, 0, master_mixer_r, REVERB); |
|
|
|
AudioConnection patchCord13(freeverb_l, 0, master_mixer_r, REVERB); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// FX chain right
|
|
|
|
// FX chain right
|
|
|
|
AudioMixer4 delay_send_mixer_r; |
|
|
|
AudioMixer4 delay_send_mixer_r; |
|
|
|
|
|
|
|
AudioMixer4 delay_mixer_r; |
|
|
|
AudioMixer4 delay_fb_mixer_r; |
|
|
|
AudioMixer4 delay_fb_mixer_r; |
|
|
|
AudioEffectDelay delay_r; |
|
|
|
AudioEffectDelay delay_r; |
|
|
|
AudioConnection patchCord12(delay_send_mixer_r, 0, delay_fb_mixer_r, 0); |
|
|
|
AudioConnection patchCord14(delay_send_mixer_r, 0, delay_fb_mixer_r, 0); |
|
|
|
AudioConnection patchCord13(delay_fb_mixer_r, delay_r); |
|
|
|
AudioConnection patchCord15(delay_fb_mixer_r, delay_r); |
|
|
|
AudioConnection patchCord14(delay_r, 0, delay_fb_mixer_r, 1); // feedback-loop
|
|
|
|
AudioConnection patchCord16(delay_r, 0, delay_fb_mixer_r, 1); // feedback-loop
|
|
|
|
AudioConnection patchCord15(delay_fb_mixer_r, 0, master_mixer_r, DELAY); |
|
|
|
AudioConnection patchCord17(delay_r, 0, delay_mixer_r, 0); |
|
|
|
|
|
|
|
AudioConnection patchCord18(delay_fb_mixer_r, 0, delay_mixer_r, 1); |
|
|
|
|
|
|
|
AudioConnection patchCord19(delay_mixer_r, 0, master_mixer_r, DELAY); |
|
|
|
AudioMixer4 chorus_send_mixer_r; |
|
|
|
AudioMixer4 chorus_send_mixer_r; |
|
|
|
AudioConnection patchCord16(chorus_send_mixer_r, modchorus_r); |
|
|
|
AudioConnection patchCord20(chorus_send_mixer_r, modchorus_r); |
|
|
|
AudioEffectModulatedDelay modchorus_r; |
|
|
|
AudioEffectModulatedDelay modchorus_r; |
|
|
|
AudioConnection patchCord17(chorus_modulator, 0, modchorus_r, 1); |
|
|
|
AudioConnection patchCord21(chorus_modulator, 0, modchorus_r, 1); |
|
|
|
#if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT |
|
|
|
#if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT |
|
|
|
AudioFilterBiquad modchorus_filter_r; |
|
|
|
AudioFilterBiquad modchorus_filter_r; |
|
|
|
AudioConnection patchCord18(modchorus_r, modchorus_filter_r); |
|
|
|
AudioConnection patchCord22(modchorus_r, modchorus_filter_r); |
|
|
|
AudioConnection patchCord19(modchorus_filter_r, 0, master_mixer_r, CHORUS ); |
|
|
|
AudioConnection patchCord23(modchorus_filter_r, 0, master_mixer_r, CHORUS); |
|
|
|
#else |
|
|
|
#else |
|
|
|
AudioConnection patchCord18(modchorus_r, 0, master_mixer_r, CHORUS); |
|
|
|
AudioConnection patchCord22(modchorus_r, 0, master_mixer_r, CHORUS); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
AudioMixer4 reverb_send_mixer_r; |
|
|
|
AudioMixer4 reverb_send_mixer_r; |
|
|
|
AudioEffectFreeverb freeverb_r; |
|
|
|
AudioEffectFreeverb freeverb_r; |
|
|
|
AudioConnection patchCord20(reverb_send_mixer_r, freeverb_r); |
|
|
|
AudioConnection patchCord24(reverb_send_mixer_r, freeverb_r); |
|
|
|
AudioConnection patchCord21(freeverb_r, 0, master_mixer_r, REVERB); |
|
|
|
AudioConnection patchCord25(freeverb_r, 0, master_mixer_r, REVERB); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
// FX chain tail
|
|
|
|
// FX chain tail
|
|
|
@ -115,50 +121,50 @@ AudioAmplifier volume_l; |
|
|
|
AudioEffectStereoMono stereo2mono; |
|
|
|
AudioEffectStereoMono stereo2mono; |
|
|
|
AudioAnalyzePeak master_peak_r; |
|
|
|
AudioAnalyzePeak master_peak_r; |
|
|
|
AudioAnalyzePeak master_peak_l; |
|
|
|
AudioAnalyzePeak master_peak_l; |
|
|
|
AudioConnection patchCord22(dexed_mixer_r, 0, master_mixer_r, DEXED); |
|
|
|
AudioConnection patchCord26(dexed_mixer_r, 0, master_mixer_r, DEXED); |
|
|
|
AudioConnection patchCord23(dexed_mixer_l, 0, master_mixer_l, DEXED); |
|
|
|
AudioConnection patchCord27(dexed_mixer_l, 0, master_mixer_l, DEXED); |
|
|
|
AudioConnection patchCord24(master_mixer_r, volume_r); |
|
|
|
AudioConnection patchCord28(master_mixer_r, volume_r); |
|
|
|
AudioConnection patchCord25(master_mixer_l, volume_l); |
|
|
|
AudioConnection patchCord29(master_mixer_l, volume_l); |
|
|
|
AudioConnection patchCord26(volume_r, 0, stereo2mono, 0); |
|
|
|
AudioConnection patchCord30(volume_r, 0, stereo2mono, 0); |
|
|
|
AudioConnection patchCord27(volume_l, 0, stereo2mono, 1); |
|
|
|
AudioConnection patchCord31(volume_l, 0, stereo2mono, 1); |
|
|
|
AudioConnection patchCord28(volume_r, master_peak_r); |
|
|
|
AudioConnection patchCord32(volume_r, master_peak_r); |
|
|
|
AudioConnection patchCord29(volume_l, master_peak_l); |
|
|
|
AudioConnection patchCord33(volume_l, master_peak_l); |
|
|
|
AudioConnection patchCord30(microdexed_peak_mixer, microdexed_peak); |
|
|
|
AudioConnection patchCord34(microdexed_peak_mixer, microdexed_peak); |
|
|
|
|
|
|
|
|
|
|
|
// Outputs
|
|
|
|
// Outputs
|
|
|
|
#ifdef AUDIO_DEVICE_USB |
|
|
|
#ifdef AUDIO_DEVICE_USB |
|
|
|
AudioOutputUSB usb1; |
|
|
|
AudioOutputUSB usb1; |
|
|
|
AudioConnection patchCord31(stereo2mono, 0, usb1, 0); |
|
|
|
AudioConnection patchCord35(stereo2mono, 0, usb1, 0); |
|
|
|
AudioConnection patchCord32(stereo2mono, 1, usb1, 1); |
|
|
|
AudioConnection patchCord36(stereo2mono, 1, usb1, 1); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
#if defined(TEENSY_AUDIO_BOARD) |
|
|
|
#if defined(TEENSY_AUDIO_BOARD) |
|
|
|
AudioOutputI2S i2s1; |
|
|
|
AudioOutputI2S i2s1; |
|
|
|
AudioConnection patchCord33(stereo2mono, 0, i2s1, 0); |
|
|
|
AudioConnection patchCord37(stereo2mono, 0, i2s1, 0); |
|
|
|
AudioConnection patchCord34(stereo2mono, 1, i2s1, 1); |
|
|
|
AudioConnection patchCord38(stereo2mono, 1, i2s1, 1); |
|
|
|
AudioControlSGTL5000 sgtl5000_1; |
|
|
|
AudioControlSGTL5000 sgtl5000_1; |
|
|
|
#elif defined (I2S_AUDIO_ONLY) |
|
|
|
#elif defined (I2S_AUDIO_ONLY) |
|
|
|
AudioOutputI2S i2s1; |
|
|
|
AudioOutputI2S i2s1; |
|
|
|
AudioConnection patchCord33(stereo2mono, 0, i2s1, 0); |
|
|
|
AudioConnection patchCord37(stereo2mono, 0, i2s1, 0); |
|
|
|
AudioConnection patchCord34(stereo2mono, 1, i2s1, 1); |
|
|
|
AudioConnection patchCord38(stereo2mono, 1, i2s1, 1); |
|
|
|
#elif defined(TGA_AUDIO_BOARD) |
|
|
|
#elif defined(TGA_AUDIO_BOARD) |
|
|
|
AudioOutputI2S i2s1; |
|
|
|
AudioOutputI2S i2s1; |
|
|
|
AudioConnection patchCord33(stereo2mono, 0, i2s1, 0); |
|
|
|
AudioConnection patchCord37(stereo2mono, 0, i2s1, 0); |
|
|
|
AudioConnection patchCord34(stereo2mono, 1, i2s1, 1); |
|
|
|
AudioConnection patchCord38(stereo2mono, 1, i2s1, 1); |
|
|
|
AudioControlWM8731master wm8731_1; |
|
|
|
AudioControlWM8731master wm8731_1; |
|
|
|
#elif defined(PT8211_AUDIO) |
|
|
|
#elif defined(PT8211_AUDIO) |
|
|
|
AudioOutputPT8211 pt8211_1; |
|
|
|
AudioOutputPT8211 pt8211_1; |
|
|
|
AudioConnection patchCord33(stereo2mono, 0, pt8211_1, 0); |
|
|
|
AudioConnection patchCord37(stereo2mono, 0, pt8211_1, 0); |
|
|
|
AudioConnection patchCord34(stereo2mono, 1, pt8211_1, 1); |
|
|
|
AudioConnection patchCord38(stereo2mono, 1, pt8211_1, 1); |
|
|
|
#elif defined(TEENSY_DAC_SYMMETRIC) |
|
|
|
#elif defined(TEENSY_DAC_SYMMETRIC) |
|
|
|
AudioOutputAnalogStereo dacOut; |
|
|
|
AudioOutputAnalogStereo dacOut; |
|
|
|
AudioMixer4 invMixer; |
|
|
|
AudioMixer4 invMixer; |
|
|
|
AudioConnection patchCord33(stereo2mono, 0, dacOut , 0); |
|
|
|
AudioConnection patchCord37(stereo2mono, 0, dacOut , 0); |
|
|
|
AudioConnection patchCord34(stereo2mono, 1, invMixer, 0); |
|
|
|
AudioConnection patchCord38(stereo2mono, 1, invMixer, 0); |
|
|
|
AudioConnection patchCord35(invMixer, 0, dacOut , 1); |
|
|
|
AudioConnection patchCord39(invMixer, 0, dacOut , 1); |
|
|
|
#else |
|
|
|
#else |
|
|
|
AudioOutputAnalogStereo dacOut; |
|
|
|
AudioOutputAnalogStereo dacOut; |
|
|
|
AudioConnection patchCord33(stereo2mono, 0, dacOut, 0); |
|
|
|
AudioConnection patchCord37(stereo2mono, 0, dacOut, 0); |
|
|
|
AudioConnection patchCord34(stereo2mono, 1, dacOut, 1); |
|
|
|
AudioConnection patchCord38(stereo2mono, 1, dacOut, 1); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
//
|
|
|
|
//
|
|
|
@ -172,18 +178,26 @@ AudioConnection * dynamicConnections[NUM_DEXED * 9]; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
void create_audio_connections(AudioSourceMicroDexed &dexed, AudioEffectMonoStereo &mono2stereo, AudioSynthWaveformDc &pan, uint8_t instance_id) |
|
|
|
void create_audio_connections(AudioSourceMicroDexed &dexed, AudioEffectMonoStereo &mono2stereo, AudioSynthWaveformDc &pan, uint8_t instance_id) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
Serial.print(F("Connecting Dexed ")); |
|
|
|
|
|
|
|
Serial.print(instance_id, DEC); |
|
|
|
|
|
|
|
Serial.println(F(" -> ")); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(dexed, 0, microdexed_peak_mixer, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(dexed, 0, microdexed_peak_mixer, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(dexed, 0, mono2stereo, 0); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(dexed, 0, mono2stereo, 0); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(pan, 0, mono2stereo, 1); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(pan, 0, mono2stereo, 1); |
|
|
|
|
|
|
|
Serial.println(F(" Peakmeter")); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, dexed_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, dexed_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, dexed_mixer_l, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 1, dexed_mixer_l, instance_id); |
|
|
|
|
|
|
|
Serial.println(F(" Dexed mixer")); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, chorus_send_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, chorus_send_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, chorus_send_mixer_l, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 1, chorus_send_mixer_l, instance_id); |
|
|
|
|
|
|
|
Serial.println(F(" Chorus send")); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, delay_send_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, delay_send_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, delay_send_mixer_l, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 1, delay_send_mixer_l, instance_id); |
|
|
|
|
|
|
|
Serial.println(F(" Delay send")); |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, reverb_send_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, reverb_send_mixer_r, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 0, reverb_send_mixer_l, instance_id); |
|
|
|
dynamicConnections[nDynamic++] = new AudioConnection(mono2stereo, 1, reverb_send_mixer_l, instance_id); |
|
|
|
|
|
|
|
Serial.println(F(" Reverb send")); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -275,12 +289,11 @@ void setup() |
|
|
|
if (instance_id < MAX_DEXED) |
|
|
|
if (instance_id < MAX_DEXED) |
|
|
|
{ |
|
|
|
{ |
|
|
|
Serial.print(F("Creating MicroDexed instance ")); |
|
|
|
Serial.print(F("Creating MicroDexed instance ")); |
|
|
|
Serial.print(instance_id, DEC); |
|
|
|
Serial.println(instance_id, DEC); |
|
|
|
MicroDexed[instance_id] = new AudioSourceMicroDexed(SAMPLE_RATE); |
|
|
|
MicroDexed[instance_id] = new AudioSourceMicroDexed(SAMPLE_RATE); |
|
|
|
mono2stereo[instance_id] = new AudioEffectMonoStereo(); |
|
|
|
mono2stereo[instance_id] = new AudioEffectMonoStereo(); |
|
|
|
pan[instance_id] = new AudioSynthWaveformDc(); |
|
|
|
pan[instance_id] = new AudioSynthWaveformDc(); |
|
|
|
create_audio_connections(*MicroDexed[instance_id], *mono2stereo[instance_id], *pan[instance_id], instance_id); |
|
|
|
create_audio_connections(*MicroDexed[instance_id], *mono2stereo[instance_id], *pan[instance_id], instance_id); |
|
|
|
Serial.println(F("... created")); |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
else |
|
|
|
else |
|
|
|
{ |
|
|
|
{ |
|
|
@ -426,7 +439,16 @@ void setup() |
|
|
|
Serial.println(F(" samples")); |
|
|
|
Serial.println(F(" samples")); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
set_master_mixer_gain(DEXED, 1.0); |
|
|
|
master_mixer_r.gain(DEXED, 1.0); |
|
|
|
|
|
|
|
master_mixer_l.gain(DEXED, 1.0); |
|
|
|
|
|
|
|
master_mixer_r.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
#if defined(USE_REVERB) |
|
|
|
|
|
|
|
master_mixer_r.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++) |
|
|
|
{ |
|
|
|
{ |
|
|
@ -462,15 +484,19 @@ void setup() |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// DELAY
|
|
|
|
// DELAY
|
|
|
|
set_master_mixer_gain(DELAY, configuration.delay_level / 100.0); |
|
|
|
|
|
|
|
delay_r.delay(0, mapfloat(configuration.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); |
|
|
|
delay_r.delay(0, mapfloat(configuration.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); |
|
|
|
delay_l.delay(0, mapfloat(configuration.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); |
|
|
|
delay_l.delay(0, mapfloat(configuration.delay_time * 10, DELAY_TIME_MIN, DELAY_TIME_MAX, 0.0, float(DELAY_TIME_MAX))); |
|
|
|
// delay_fb_mixer is the feedback-adding mixer
|
|
|
|
// delay_fb_mixer is the feedback-adding mixer
|
|
|
|
delay_fb_mixer_r.gain(0, 1.0); // original signal
|
|
|
|
delay_fb_mixer_r.gain(0, 1.0); // original signal
|
|
|
|
|
|
|
|
delay_fb_mixer_r.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
|
|
|
|
delay_fb_mixer_l.gain(0, 1.0); // original signal
|
|
|
|
delay_fb_mixer_l.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
delay_fb_mixer_l.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
|
|
|
|
delay_mixer_r.gain(0, 1.0); |
|
|
|
|
|
|
|
delay_mixer_l.gain(0, 1.0); |
|
|
|
|
|
|
|
delay_mixer_r.gain(1, 1.0); |
|
|
|
|
|
|
|
delay_mixer_l.gain(1, 1.0); |
|
|
|
|
|
|
|
|
|
|
|
// CHORUS
|
|
|
|
// CHORUS
|
|
|
|
set_master_mixer_gain(CHORUS, configuration.chorus_level / 100.0); |
|
|
|
|
|
|
|
switch (configuration.chorus_waveform) |
|
|
|
switch (configuration.chorus_waveform) |
|
|
|
{ |
|
|
|
{ |
|
|
|
case 0: |
|
|
|
case 0: |
|
|
@ -504,7 +530,6 @@ void setup() |
|
|
|
|
|
|
|
|
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
// REVERB
|
|
|
|
// REVERB
|
|
|
|
set_master_mixer_gain(REVERB, configuration.reverb_level / 100.0); |
|
|
|
|
|
|
|
freeverb_r.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); |
|
|
|
freeverb_r.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); |
|
|
|
freeverb_r.damping(mapfloat(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); |
|
|
|
freeverb_r.damping(mapfloat(configuration.reverb_damping, REVERB_DAMPING_MIN, REVERB_DAMPING_MAX, 0.0, 1.0)); |
|
|
|
freeverb_l.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); |
|
|
|
freeverb_l.roomsize(mapfloat(configuration.reverb_roomsize, REVERB_ROOMSIZE_MIN, REVERB_ROOMSIZE_MAX, 0.0, 1.0)); |
|
|
@ -555,39 +580,6 @@ void setup() |
|
|
|
|
|
|
|
|
|
|
|
void loop() |
|
|
|
void loop() |
|
|
|
{ |
|
|
|
{ |
|
|
|
#ifdef OLD |
|
|
|
|
|
|
|
int16_t* audio_buffer; // pointer to AUDIO_BLOCK_SAMPLES * int16_t
|
|
|
|
|
|
|
|
const uint16_t audio_block_time_us = 1000000 / (SAMPLE_RATE / AUDIO_BLOCK_SAMPLES); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//while (42 == 42)
|
|
|
|
|
|
|
|
//{
|
|
|
|
|
|
|
|
#ifdef OLD |
|
|
|
|
|
|
|
// Main sound calculation
|
|
|
|
|
|
|
|
if (queue1.available() && fill_audio_buffer > audio_block_time_us - 10) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
fill_audio_buffer = 0; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
audio_buffer = queue1.getBuffer(); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
elapsedMicros t1; |
|
|
|
|
|
|
|
for (uint8_t i = 0; i < NUM_DEXED; i++) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
MicroDexed[i]->getSamples(AUDIO_BLOCK_SAMPLES, audio_buffer); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (t1 > audio_block_time_us) // everything greater 2.9ms is a buffer underrun!
|
|
|
|
|
|
|
|
xrun++; |
|
|
|
|
|
|
|
if (t1 > render_time_max) |
|
|
|
|
|
|
|
render_time_max = t1; |
|
|
|
|
|
|
|
if (peak1.available()) |
|
|
|
|
|
|
|
{ |
|
|
|
|
|
|
|
if (peak1.read() > 0.99) |
|
|
|
|
|
|
|
peak++; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
queue1.playBuffer(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// MIDI input handling
|
|
|
|
// MIDI input handling
|
|
|
|
check_midi_devices(); |
|
|
|
check_midi_devices(); |
|
|
|
|
|
|
|
|
|
|
@ -779,15 +771,16 @@ void handleControlChange(byte inChannel, byte inCtrl, byte inValue) |
|
|
|
eeprom_write(); |
|
|
|
eeprom_write(); |
|
|
|
case 106: // CC 106: delay feedback
|
|
|
|
case 106: // CC 106: delay feedback
|
|
|
|
configuration.delay_feedback = map(inValue, 0, 0x7f, DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX); |
|
|
|
configuration.delay_feedback = map(inValue, 0, 0x7f, DELAY_FEEDBACK_MIN , DELAY_FEEDBACK_MAX); |
|
|
|
delay_fb_mixer_r.gain(1, configuration.delay_feedback / 200.0 ); // amount of feedback
|
|
|
|
//delay_fb_mixer_r.gain(0, 1.0); // original signal
|
|
|
|
delay_fb_mixer_r.gain(0, 1.0 - configuration.delay_feedback / 200.0); // original signalbreak;
|
|
|
|
delay_fb_mixer_r.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
delay_fb_mixer_l.gain(1, configuration.delay_feedback / 200.0 ); // amount of feedback
|
|
|
|
//delay_fb_mixer_l.gain(0, 1.0); // original signal
|
|
|
|
delay_fb_mixer_l.gain(0, 1.0 - configuration.delay_feedback / 200.0); // original signalbreak;
|
|
|
|
delay_fb_mixer_l.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
eeprom_write(); |
|
|
|
eeprom_write(); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 107: // CC 107: delay volume
|
|
|
|
case 107: // CC 107: delay volume
|
|
|
|
configuration.dexed[instance_id].delay_send = map(inValue, 0, 0x7f, DELAY_SEND_MIN, DELAY_SEND_MAX); |
|
|
|
configuration.dexed[instance_id].delay_send = map(inValue, 0, 0x7f, DELAY_SEND_MIN, DELAY_SEND_MAX); |
|
|
|
set_master_mixer_gain(DELAY, configuration.delay_level / 100.0); |
|
|
|
master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
eeprom_write(); |
|
|
|
eeprom_write(); |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 120: |
|
|
|
case 120: |
|
|
@ -1293,8 +1286,10 @@ void initial_values_from_eeprom(bool init) |
|
|
|
|
|
|
|
|
|
|
|
chorus_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].chorus_send / 200.0); |
|
|
|
chorus_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].chorus_send / 200.0); |
|
|
|
chorus_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].chorus_send / 200.0); |
|
|
|
chorus_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].chorus_send / 200.0); |
|
|
|
delay_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].delay_send / 200.0); |
|
|
|
delay_fb_mixer_r.gain(0, 1.0); // original signal
|
|
|
|
delay_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].delay_send / 200.0); |
|
|
|
delay_fb_mixer_r.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
|
|
|
|
delay_fb_mixer_l.gain(0, 1.0); // original signal
|
|
|
|
|
|
|
|
delay_fb_mixer_l.gain(1, mapfloat(configuration.delay_feedback, DELAY_FEEDBACK_MIN, DELAY_FEEDBACK_MAX, 0.0, 1.0)); // amount of feedback
|
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
reverb_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].reverb_send / 200.0); |
|
|
|
reverb_send_mixer_r.gain(instance_id, configuration.dexed[instance_id].reverb_send / 200.0); |
|
|
|
reverb_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].reverb_send / 200.0); |
|
|
|
reverb_send_mixer_l.gain(instance_id, configuration.dexed[instance_id].reverb_send / 200.0); |
|
|
@ -1309,12 +1304,16 @@ void initial_values_from_eeprom(bool init) |
|
|
|
} |
|
|
|
} |
|
|
|
Serial.println(F("OK, loaded!")); |
|
|
|
Serial.println(F("OK, loaded!")); |
|
|
|
|
|
|
|
|
|
|
|
set_master_mixer_gain(CHORUS, configuration.chorus_level / 100.0); |
|
|
|
master_mixer_r.gain(DEXED, 1.0); |
|
|
|
set_master_mixer_gain(DELAY, configuration.delay_level / 100.0); |
|
|
|
master_mixer_l.gain(DEXED, 1.0); |
|
|
|
|
|
|
|
master_mixer_r.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(CHORUS, mapfloat(configuration.chorus_level, CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_r.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(DELAY, mapfloat(configuration.delay_level, DELAY_LEVEL_MIN, DELAY_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
set_master_mixer_gain(REVERB, configuration.reverb_level / 100.0); |
|
|
|
master_mixer_r.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
|
|
|
|
master_mixer_l.gain(REVERB, mapfloat(configuration.reverb_level, REVERB_LEVEL_MIN, REVERB_LEVEL_MAX, 0.0, 1.0)); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
set_master_mixer_gain(DEXED, 1.0); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
set_volume(configuration.vol, configuration.mono); |
|
|
|
set_volume(configuration.vol, configuration.mono); |
|
|
|
} |
|
|
|
} |
|
|
@ -1469,26 +1468,27 @@ uint32_t crc32(byte * calc_start, uint16_t calc_bytes) // base code from https:/ |
|
|
|
return (crc); |
|
|
|
return (crc); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void set_master_mixer_gain(uint8_t type, float level) |
|
|
|
/*
|
|
|
|
{ |
|
|
|
void set_master_mixer_gain(uint8_t type, float level) |
|
|
|
|
|
|
|
{ |
|
|
|
master_mixer_level[type] = constrain(level, 0.0, 1.0); |
|
|
|
master_mixer_level[type] = constrain(level, 0.0, 1.0); |
|
|
|
|
|
|
|
|
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
const uint8_t num_fx = 4; |
|
|
|
const uint8_t num_fx = 4; |
|
|
|
#else |
|
|
|
#else |
|
|
|
const uint8_t num_fx = 3; |
|
|
|
const uint8_t num_fx = 3; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
float new_level[num_fx]; |
|
|
|
float new_level[num_fx]; |
|
|
|
|
|
|
|
|
|
|
|
new_level[CHORUS] = master_mixer_level[CHORUS] / float(num_fx); |
|
|
|
new_level[CHORUS] = master_mixer_level[CHORUS] / float(num_fx); |
|
|
|
new_level[DELAY] = master_mixer_level[DELAY] / float(num_fx); |
|
|
|
new_level[DELAY] = master_mixer_level[DELAY] / float(num_fx); |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
new_level[REVERB] = master_mixer_level[REVERB] / float(num_fx); |
|
|
|
new_level[REVERB] = master_mixer_level[REVERB] / float(num_fx); |
|
|
|
new_level[DEXED] = 1.0 - new_level[CHORUS] - new_level[DELAY] - new_level[REVERB]; |
|
|
|
new_level[DEXED] = 1.0 - new_level[CHORUS] - new_level[DELAY] - new_level[REVERB]; |
|
|
|
#else |
|
|
|
#else |
|
|
|
new_level[DEXED] = 1.0 - new_level[CHORUS] - new_level[DELAY]; |
|
|
|
new_level[DEXED] = 1.0 - new_level[CHORUS] - new_level[DELAY]; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
master_mixer_r.gain(DEXED, new_level[DEXED]); |
|
|
|
master_mixer_r.gain(DEXED, new_level[DEXED]); |
|
|
|
master_mixer_l.gain(DEXED, new_level[DEXED]); |
|
|
|
master_mixer_l.gain(DEXED, new_level[DEXED]); |
|
|
@ -1496,12 +1496,12 @@ void set_master_mixer_gain(uint8_t type, float level) |
|
|
|
master_mixer_l.gain(CHORUS, new_level[CHORUS]); |
|
|
|
master_mixer_l.gain(CHORUS, new_level[CHORUS]); |
|
|
|
master_mixer_r.gain(DELAY, new_level[DELAY]); |
|
|
|
master_mixer_r.gain(DELAY, new_level[DELAY]); |
|
|
|
master_mixer_l.gain(DELAY, new_level[DELAY]); |
|
|
|
master_mixer_l.gain(DELAY, new_level[DELAY]); |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
master_mixer_r.gain(REVERB, new_level[REVERB]); |
|
|
|
master_mixer_r.gain(REVERB, new_level[REVERB]); |
|
|
|
master_mixer_l.gain(REVERB, new_level[REVERB]); |
|
|
|
master_mixer_l.gain(REVERB, new_level[REVERB]); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
#ifdef DEBUG |
|
|
|
#ifdef DEBUG |
|
|
|
Serial.print(F("Volumes for master_mixer(type=")); |
|
|
|
Serial.print(F("Volumes for master_mixer(type=")); |
|
|
|
Serial.print(type, DEC); |
|
|
|
Serial.print(type, DEC); |
|
|
|
Serial.print(F(",level=")); |
|
|
|
Serial.print(F(",level=")); |
|
|
@ -1512,14 +1512,15 @@ void set_master_mixer_gain(uint8_t type, float level) |
|
|
|
Serial.print(new_level[CHORUS], 2); |
|
|
|
Serial.print(new_level[CHORUS], 2); |
|
|
|
Serial.print(F(" DELAY=")); |
|
|
|
Serial.print(F(" DELAY=")); |
|
|
|
Serial.print(new_level[DELAY], 2); |
|
|
|
Serial.print(new_level[DELAY], 2); |
|
|
|
#if defined(USE_REVERB) |
|
|
|
#if defined(USE_REVERB) |
|
|
|
Serial.print(F(" REVERB=")); |
|
|
|
Serial.print(F(" REVERB=")); |
|
|
|
Serial.print(new_level[REVERB], 2); |
|
|
|
Serial.print(new_level[REVERB], 2); |
|
|
|
|
|
|
|
|
|
|
|
#endif |
|
|
|
#endif |
|
|
|
Serial.println(); |
|
|
|
Serial.println(); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
*/ |
|
|
|
|
|
|
|
|
|
|
|
/******************************************************************************
|
|
|
|
/******************************************************************************
|
|
|
|
DEBUG HELPER |
|
|
|
DEBUG HELPER |
|
|
|