Rewrite of delay offset for modulated-delay.

master
Holger Wirtz 5 years ago
parent 2e471e4005
commit 4dcc68e42c
  1. 25
      MicroMDAEPiano.ino
  2. 21
      UI.hpp
  3. 14
      config.h
  4. 3
      effect_modulated_delay.h

@ -166,8 +166,8 @@ elapsedMillis debug_audio_timer;
#endif #endif
// Allocate the delay lines for left and right channels // Allocate the delay lines for left and right channels
short l_delayline[CHORUS_DELAY_LENGTH_SAMPLES]; short l_delayline[MOD_DELAY_SAMPLE_BUFFER];
short r_delayline[CHORUS_DELAY_LENGTH_SAMPLES]; short r_delayline[MOD_DELAY_SAMPLE_BUFFER];
enum { VOL_MAIN, VOL_REVERB, VOL_CHORUS }; enum { VOL_MAIN, VOL_REVERB, VOL_CHORUS };
//************************************************************************************************* //*************************************************************************************************
@ -232,22 +232,33 @@ void setup()
Serial.print(audio_block_time_us); Serial.print(audio_block_time_us);
Serial.println(F("us)")); Serial.println(F("us)"));
if (!modchorus_r.begin(r_delayline, CHORUS_DELAY_LENGTH_SAMPLES)) { if (!modchorus_r.begin(r_delayline, MOD_DELAY_SAMPLE_BUFFER)) {
Serial.println(F("AudioEffectModulatedDelay - right channel begin failed")); Serial.println(F("AudioEffectModulatedDelay - right channel begin failed"));
while (1); while (1);
} }
if (!modchorus_l.begin(l_delayline, CHORUS_DELAY_LENGTH_SAMPLES)) { if (!modchorus_l.begin(l_delayline, MOD_DELAY_SAMPLE_BUFFER)) {
Serial.println(F("AudioEffectModulatedDelay - left channel begin failed")); Serial.println(F("AudioEffectModulatedDelay - left channel begin failed"));
while (1); while (1);
} }
// chorus modulation fixed // chorus modulation fixed
modulator.begin(WAVEFORM_MOD); modulator.begin(MOD_WAVEFORM);
modulator.phase(0); modulator.phase(0);
modulator.amplitude(0.0); modulator.amplitude(0.0);
modulator.offset(0.0); modulator.offset(0.0);
modchorus_r.offset(0); #ifdef DEBUG
modchorus_l.offset(0); Serial.print(F("Modulated delay buffer: "));
Serial.print(MOD_DELAY_SAMPLE_BUFFER, DEC);
Serial.println(F(" samples"));
Serial.print(F("Default delay time: "));
Serial.print(float(ENC_CHORUS_DELAY_DEFAULT) / 10, 2);
Serial.println(" ms");
Serial.print(F("Max delay time: "));
Serial.print(float(ENC_CHORUS_DELAY_MAX) / 10, 2);
Serial.println(F(" ms"));
#endif
modchorus_r.offset(TIME_MS2SAMPLES(float(ENC_CHORUS_DELAY_DEFAULT) / 10));
modchorus_l.offset(TIME_MS2SAMPLES(float(ENC_CHORUS_DELAY_DEFAULT) / 10));
// Butterworth filter, 12 db/octave // Butterworth filter, 12 db/octave
modchorus_filter_r.setLowpass(0, 6000, 0.707); modchorus_filter_r.setLowpass(0, 6000, 0.707);
modchorus_filter_l.setLowpass(0, 6000, 0.707); modchorus_filter_l.setLowpass(0, 6000, 0.707);

@ -240,10 +240,10 @@ char* get_chorus_frequency_value_text(void)
return (chorus_frequency_value_text1); return (chorus_frequency_value_text1);
} }
char chorus_delay_value_text1[] = " "; char chorus_delay_value_text1[] = " ";
char* get_chorus_delay_value_text(void) char* get_chorus_delay_value_text(void)
{ {
sprintf(chorus_delay_value_text1, "%03d%%", configuration.chorus_delay); sprintf(chorus_delay_value_text1, "%02.1f ms", float(configuration.chorus_delay + ENC_CHORUS_DELAY_MAX) / 10);
return (chorus_delay_value_text1); return (chorus_delay_value_text1);
} }
@ -2228,10 +2228,15 @@ void set_chorus_delay(uint8_t value)
value = ENC_CHORUS_DELAY_MAX; value = ENC_CHORUS_DELAY_MAX;
#ifdef SHOW_DEBUG #ifdef SHOW_DEBUG
Serial.print(F("Set CHORUS_DELAY ")); Serial.print(F("Set CHORUS_DELAY "));
Serial.println(value); Serial.print(value);
#endif Serial.print(F("/"));
modchorus_r.offset(value); Serial.print(float(value) / 10);
modchorus_l.offset(value); Serial.print(F("/"));
Serial.print(uint16_t(TIME_MS2SAMPLES(float(value) / 10)));
Serial.println();
#endif
modchorus_r.offset(TIME_MS2SAMPLES(float(value) / 10));
modchorus_l.offset(TIME_MS2SAMPLES(float(value) / 10));
configuration.chorus_delay = value; configuration.chorus_delay = value;
} }
@ -2256,8 +2261,8 @@ void set_chorus_feedback(uint8_t value)
Serial.println(value); Serial.println(value);
#endif #endif
float tmp = mapfloat(float(value), ENC_CHORUS_FEEDBACK_MIN, ENC_CHORUS_FEEDBACK_MAX, 0.0, 0.5); float tmp = mapfloat(float(value), ENC_CHORUS_FEEDBACK_MIN, ENC_CHORUS_FEEDBACK_MAX, 0.0, 0.5);
//modchorus_fbk_mixer_r.gain(0, 1.0 - tmp); modchorus_fbk_mixer_r.gain(0, 1.0 - tmp);
//modchorus_fbk_mixer_l.gain(0, 1.0 - tmp); modchorus_fbk_mixer_l.gain(0, 1.0 - tmp);
modchorus_fbk_mixer_r.gain(1, tmp); modchorus_fbk_mixer_r.gain(1, tmp);
modchorus_fbk_mixer_l.gain(1, tmp); modchorus_fbk_mixer_l.gain(1, tmp);
configuration.chorus_feedback = value; configuration.chorus_feedback = value;

@ -57,9 +57,13 @@
#define SAMPLE_RATE AUDIO_SAMPLE_RATE #define SAMPLE_RATE AUDIO_SAMPLE_RATE
#define REDUCE_LOUDNESS 0 #define REDUCE_LOUDNESS 0
#define USE_XFADE_DATA 1 #define USE_XFADE_DATA 1
/* HELPER MACROS */
#define TIME_MS2SAMPLES(x) floor(x * AUDIO_SAMPLE_RATE / 1000)
#define SAMPLES2TIME_MS(x) float(x * 1000 / AUDIO_SAMPLE_RATE)
// CHORUS parameters // CHORUS parameters
#define CHORUS_DELAY_LENGTH_SAMPLES (16*AUDIO_BLOCK_SAMPLES) // one AUDIO_BLOCK_SAMPLES = 2.902ms #define MOD_DELAY_SAMPLE_BUFFER int32_t(TIME_MS2SAMPLES(10.0))
#define WAVEFORM_MOD WAVEFORM_TRIANGLE // WAVEFORM_SINE WAVEFORM_TRIANGLE WAVEFORM_SAWTOOTH WAVEFORM_SAWTOOTH_REVERSE #define MOD_WAVEFORM WAVEFORM_TRIANGLE // WAVEFORM_SINE WAVEFORM_TRIANGLE WAVEFORM_SAWTOOTH WAVEFORM_SAWTOOTH_REVERSE
//************************************************************************************************* //*************************************************************************************************
//* DEBUG OUTPUT SETTINGS //* DEBUG OUTPUT SETTINGS
@ -137,7 +141,7 @@
//* DO NO CHANGE ANYTHING BEYOND IF YOU DON'T KNOW WHAT YOU ARE DOING !!! //* DO NO CHANGE ANYTHING BEYOND IF YOU DON'T KNOW WHAT YOU ARE DOING !!!
//************************************************************************************************* //*************************************************************************************************
#define MICRO_MDAEPIANO_VERSION "0.9.8" #define MICRO_MDAEPIANO_VERSION "0.9.9"
#define MAX_SOUNDS min(99,int((4096-EEPROM_CONFIGURATIONS)/sizeof(config_t))) #define MAX_SOUNDS min(99,int((4096-EEPROM_CONFIGURATIONS)/sizeof(config_t)))
@ -235,8 +239,8 @@
#define ENC_CHORUS_FREQUENCY_DEFAULT 30 #define ENC_CHORUS_FREQUENCY_DEFAULT 30
// //
#define ENC_CHORUS_DELAY_MIN 0 #define ENC_CHORUS_DELAY_MIN 0
#define ENC_CHORUS_DELAY_MAX 100 #define ENC_CHORUS_DELAY_MAX uint8_t(SAMPLES2TIME_MS(float(MOD_DELAY_SAMPLE_BUFFER/2)*10))
#define ENC_CHORUS_DELAY_DEFAULT 70 #define ENC_CHORUS_DELAY_DEFAULT uint8_t(float(ENC_CHORUS_DELAY_MAX/2))
// //
#define ENC_CHORUS_INTENSITY_MIN 0 #define ENC_CHORUS_INTENSITY_MIN 0
#define ENC_CHORUS_INTENSITY_MAX 100 #define ENC_CHORUS_INTENSITY_MAX 100

@ -34,6 +34,9 @@
// 140219 - correct storage class (not static) // 140219 - correct storage class (not static)
// 190527 - added modulation input handling (Aug 2019 by Holger Wirtz) // 190527 - added modulation input handling (Aug 2019 by Holger Wirtz)
#define TIME_MS2SAMPLES(x) floor(x * AUDIO_SAMPLE_RATE / 1000)
#define SAMPLES2TIME_MS(x) float(x * 1000 / AUDIO_SAMPLE_RATE)
class AudioEffectModulatedDelay : class AudioEffectModulatedDelay :
public AudioStream public AudioStream
{ {

Loading…
Cancel
Save