From d8b7045057ff2a319c4b08523814ccecb5769862 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Tue, 15 Jan 2019 07:15:05 +0100 Subject: [PATCH] Simple and stupid chorus... work, but is not nice. --- MicroMDAEPiano.ino | 104 ++++++++++++++++++++++++++++----------------- UI.cpp | 16 +++++-- UI.h | 8 ++-- config.h | 7 +++ 4 files changed, 89 insertions(+), 46 deletions(-) diff --git a/MicroMDAEPiano.ino b/MicroMDAEPiano.ino index 6d2c8b3..8ef0465 100644 --- a/MicroMDAEPiano.ino +++ b/MicroMDAEPiano.ino @@ -44,7 +44,7 @@ #include "Encoder4.h" #include "LiquidCrystalPlus_I2C.h" #include "UI.h" - +#include // had rename libraries/BALibrary/src/peripherals/BAPhysicalControls.cpp //************************************************************************************************* //* GLOBAL VARIABLES @@ -57,33 +57,44 @@ AudioAnalyzePeak peak_r; AudioAnalyzePeak peak_l; AudioEffectFreeverb freeverb_r; AudioEffectFreeverb freeverb_l; -AudioMixer4 mixer_r; -AudioMixer4 mixer_l; +AudioMixer4 reverb_mixer_r; +AudioMixer4 reverb_mixer_l; +AudioEffectDelay delay_r; +AudioEffectDelay delay_l; +AudioMixer4 delay_mixer_r; +AudioMixer4 delay_mixer_l; AudioConnection patchCord0(queue_r, peak_r); AudioConnection patchCord1(queue_l, peak_l); -AudioConnection patchCord4(queue_r, freeverb_r); -AudioConnection patchCord5(queue_l, freeverb_l); -AudioConnection patchCord6(queue_r, 0, mixer_r, 0); -AudioConnection patchCord7(queue_l, 0, mixer_l, 0); -AudioConnection patchCord8(freeverb_r, 0, mixer_r, 1); -AudioConnection patchCord9(freeverb_l, 0, mixer_l, 1); +AudioConnection patchCord2(queue_r, delay_r); +AudioConnection patchCord3(queue_l, delay_l); +AudioConnection patchCord4(queue_r, 0, delay_mixer_r, 0); +AudioConnection patchCord5(delay_r, 0, delay_mixer_r, 1); +AudioConnection patchCord6(queue_l, 0, delay_mixer_l, 0); +AudioConnection patchCord7(delay_l, 0, delay_mixer_l, 1); +AudioConnection patchCord8(delay_mixer_r, freeverb_r); +AudioConnection patchCord9(delay_mixer_l, freeverb_l); +AudioConnection patchCord10(delay_mixer_r, 0, reverb_mixer_r, 0); +AudioConnection patchCord11(delay_mixer_l, 0, reverb_mixer_l, 0); +AudioConnection patchCord12(freeverb_r, 0, reverb_mixer_r, 1); +AudioConnection patchCord13(freeverb_l, 0, reverb_mixer_l, 1); #ifdef TEENSY_AUDIO_BOARD AudioOutputI2S i2s1; -AudioConnection patchCord110(mixer_r, 0, i2s1, 0); -AudioConnection patchCord111(mixer_l, 0, i2s1, 1); +AudioConnection patchCord14(reverb_mixer_r, 0, i2s1, 0); +AudioConnection patchCord15(reverb_mixer_l, 0, i2s1, 1); AudioControlSGTL5000 sgtl5000_1; #else AudioOutputPT8211 pt8211_1; AudioAmplifier volume_r; AudioAmplifier volume_l; -AudioConnection patchCord10(mixer_r, volume_r); -AudioConnection patchCord11(mixer_l, volume_l); -AudioConnection patchCord12(volume_r, 0, pt8211_1, 1); -AudioConnection patchCord13(volume_l, 0, pt8211_1, 0); +AudioConnection patchCord14(reverb_mixer_r, volume_r); +AudioConnection patchCord15(reverb_mixer_l, volume_l); +AudioConnection patchCord16(volume_r, 0, pt8211_1, 1); +AudioConnection patchCord17(volume_l, 0, pt8211_1, 0); #endif // Objects mdaEPiano* ep; +BALibrary::LowFrequencyOscillatorVector chorus_lfo; #ifdef MIDI_DEVICE_DIN MIDI_CREATE_INSTANCE(HardwareSerial, MIDI_DEVICE_DIN, midi_serial); @@ -127,25 +138,26 @@ void setup() Serial.begin(SERIAL_SPEED); delay(220); - // LCD display setup - lcd.init(); - lcd.blink_off(); - lcd.cursor_off(); - lcd.backlight(); - lcd.noAutoscroll(); - lcd.clear(); - lcd.display(); - lcd.show(0, 0, 20, " MicroMDAEPiano"); - lcd.show(1, 0, 16, "(c)parasiTstudio"); - - // Encoder setup - enc[0].write(INITIAL_ENC_L_VALUE); - enc_val[0] = enc[0].read(); - enc[1].write(INITIAL_ENC_R_VALUE); - enc_val[1] = enc[1].read(); - but[0].update(); - but[1].update(); - + /* + // LCD display setup + lcd.init(); + lcd.blink_off(); + lcd.cursor_off(); + lcd.backlight(); + lcd.noAutoscroll(); + lcd.clear(); + lcd.display(); + lcd.show(0, 0, 20, " MicroMDAEPiano"); + lcd.show(1, 0, 16, "(c)parasiTstudio"); + + // Encoder setup + enc[0].write(INITIAL_ENC_L_VALUE); + enc_val[0] = enc[0].read(); + enc[1].write(INITIAL_ENC_R_VALUE); + enc_val[1] = enc[1].read(); + but[0].update(); + but[1].update(); + */ // Debug output Serial.println(F("MicroMDAEPiano based on https://sourceforge.net/projects/mda-vst")); Serial.println(F("(c)2018 H. Wirtz ")); @@ -208,6 +220,7 @@ void setup() Serial.print(1000000 / (SAMPLE_RATE / AUDIO_BLOCK_SAMPLES)); Serial.println(F("ms)")); + // Epiano ep->setParameter(DECAY, 0.5); ep->setParameter(RELEASE, 0.5); ep->setParameter(HARDNESS, 0.7); @@ -217,14 +230,24 @@ void setup() ep->setParameter(STEREO, 0.7); ep->setParameter(OVERDRIVE, 0.3); + // Reverb freeverb_r.roomsize(0.2); freeverb_l.roomsize(0.2); freeverb_r.damping(0.5); freeverb_l.damping(0.5); - mixer_r.gain(0, 0.7); - mixer_l.gain(0, 0.7); - mixer_r.gain(1, 0.3); - mixer_l.gain(1, 0.3); + reverb_mixer_r.gain(0, 0.7); + reverb_mixer_l.gain(0, 0.7); + reverb_mixer_r.gain(1, 0.3); + reverb_mixer_l.gain(1, 0.3); + + // Chorus + delay_mixer_r.gain(0, 1.0 - DELAY_VOLUME); + delay_mixer_r.gain(1, DELAY_VOLUME); + delay_mixer_l.gain(0, 1.0 - DELAY_VOLUME); + delay_mixer_l.gain(1, DELAY_VOLUME); + delay_r.delay(0, DELAY_R_MS); + delay_l.delay(0, DELAY_L_MS); + chorus_lfo.setRateAudio(DELAY_FRQ); Serial.println(F("")); @@ -295,6 +318,11 @@ void loop() } #endif + float c = *chorus_lfo.getNextVector(); + + delay_r.delay(0, DELAY_R_MS / 2 * c * DELAY_R_INTENSITY + DELAY_R_MS / 2); + delay_l.delay(0, DELAY_L_MS / 2 * c * DELAY_R_INTENSITY + DELAY_L_MS / 2); + queue_r.playBuffer(); queue_l.playBuffer(); } diff --git a/UI.cpp b/UI.cpp index 3ae2852..1229798 100644 --- a/UI.cpp +++ b/UI.cpp @@ -26,8 +26,16 @@ UI::UI() { - LiquidCrystalPlus_I2C lcd(LCD_I2C_ADDRESS, LCD_CHARS, LCD_LINES); - enc[] = {Encoder4(ENC_L_PIN_A, ENC_L_PIN_B), Encoder4(ENC_R_PIN_A, ENC_R_PIN_B)}; - enc_val[] = {INITIAL_ENC_L_VALUE, INITIAL_ENC_R_VALUE}; - but[] = {Bounce(BUT_L_PIN, BUT_DEBOUNCE_MS), Bounce(BUT_R_PIN, BUT_DEBOUNCE_MS)}; + lcd=new LiquidCrystalPlus_I2C(LCD_I2C_ADDRESS, LCD_CHARS, LCD_LINES); + enc[0] = new Encoder4(ENC_L_PIN_A, ENC_L_PIN_B); + enc[1] = new Encoder4(ENC_R_PIN_A, ENC_R_PIN_B); + enc_val[0] = INITIAL_ENC_L_VALUE; + enc_val[1] = INITIAL_ENC_R_VALUE; + but[0] = new Bounce(BUT_L_PIN, BUT_DEBOUNCE_MS); + but[1] = new Bounce(BUT_R_PIN, BUT_DEBOUNCE_MS); +} + +UI::~UI() +{ + ; } diff --git a/UI.h b/UI.h index 94eca72..0d36919 100644 --- a/UI.h +++ b/UI.h @@ -36,9 +36,9 @@ class UI ~UI(); private: - LiquidCrystalPlus_I2C lcd; - Encoder4 enc[2]; + LiquidCrystalPlus_I2C* lcd; + Encoder4* enc[2]; int32_t enc_val[2]; - Bounce but[2]; -} + Bounce* but[2]; +}; #endif diff --git a/config.h b/config.h index 798eb21..db32c8a 100644 --- a/config.h +++ b/config.h @@ -26,6 +26,13 @@ #include "midinotes.h" +#define DELAY_R_MS 10.0 +#define DELAY_L_MS 10.0 +#define DELAY_R_INTENSITY 0.5 +#define DELAY_L_INTENSITY 0.5 +#define DELAY_FRQ 1.0 +#define DELAY_VOLUME 0.5 + // ATTENTION! For better latency you have to redefine AUDIO_BLOCK_SAMPLES from // 128 to 64 in /cores/teensy3/AudioStream.h