From d3bf9fb42229fbceb1d4911d35c9d1aef96f1bf2 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Wed, 23 Oct 2019 15:41:32 +0200 Subject: [PATCH] Added simple stereo->mono effect. --- MicroDexed.ino | 30 ++++++++++-------- UI.hpp | 55 +++++++++++++++++++++++++++++--- config.h | 8 ++++- effect_stereo_mono.cpp | 72 ++++++++++++++++++++++++++++++++++++++++++ effect_stereo_mono.h | 50 +++++++++++++++++++++++++++++ 5 files changed, 197 insertions(+), 18 deletions(-) create mode 100644 effect_stereo_mono.cpp create mode 100644 effect_stereo_mono.h diff --git a/MicroDexed.ino b/MicroDexed.ino index f3762d9..ad0639f 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -36,6 +36,7 @@ #include "dexed.h" #include "dexed_sysex.h" #include "effect_modulated_delay.h" +#include "effect_stereo_mono.h" #include "PluginFx.h" #include "SoftenValue.hpp" @@ -49,6 +50,7 @@ AudioMixer4 master_mixer_r; AudioMixer4 master_mixer_l; AudioAmplifier volume_r; AudioAmplifier volume_l; +AudioEffectStereoMono stereomono1; AudioConnection patchCord0(queue1, peak1); AudioConnection patchCord1(queue1, 0, delay_fb_mixer, 0); AudioConnection patchCord2(queue1, 0, modchorus, 0); @@ -77,35 +79,37 @@ AudioConnection patchCord17(delay1, 0, master_mixer_r, 2); AudioConnection patchCord18(delay1, 0, master_mixer_l, 2); AudioConnection patchCord19(master_mixer_r, volume_r); AudioConnection patchCord20(master_mixer_l, volume_l); +AudioConnection patchCord21(volume_r, 0, stereomono1, 0); +AudioConnection patchCord22(volume_l, 0, stereomono1, 1); #ifdef MIDI_DEVICE_USB AudioOutputUSB usb1; -AudioConnection patchCord21(volume_r, 0, usb1, 0); -AudioConnection patchCord22(volume_l, 0, usb1, 1); +AudioConnection patchCord23(stereomono1, 0, usb1, 0); +AudioConnection patchCord24(stereomono1, 1, usb1, 1); #endif #if defined(TEENSY_AUDIO_BOARD) AudioOutputI2S i2s1; -AudioConnection patchCord23(volume_r, 0, i2s1, 0); -AudioConnection patchCord24(volume_l, 0, i2s1, 1); +AudioConnection patchCord25(stereomono1, 0, i2s1, 0); +AudioConnection patchCord26(stereomono1, 1, i2s1, 1); AudioControlSGTL5000 sgtl5000_1; #elif defined(TGA_AUDIO_BOARD) AudioOutputI2S i2s1; -AudioConnection patchCord25(volume_r, 0, i2s1, 0); -AudioConnection patchCord26(volume_l, 0, i2s1, 1); +AudioConnection patchCord27(stereomono1, 0, i2s1, 0); +AudioConnection patchCord28(stereomono1, 1, i2s1, 1); AudioControlWM8731master wm8731_1; #elif defined(PT8211_AUDIO) AudioOutputPT8211 pt8211_1; -AudioConnection patchCord27(volume_r, 0, pt8211_1, 0); -AudioConnection patchCord28(volume_l, 0, pt8211_1, 1); +AudioConnection patchCord29(stereomono1, 0, pt8211_1, 0); +AudioConnection patchCord30(stereomono1, 1, pt8211_1, 1); #elif defined(TEENSY_DAC_SYMMETRIC) AudioOutputAnalogStereo dacOut; AudioMixer4 invMixer; -AudioConnection patchCord29(volume_l, 0, dacOut , 0); -AudioConnection patchCord30(volume_l, 0, invMixer, 0); -AudioConnection patchCord31(invMixer, 0, dacOut , 1); +AudioConnection patchCord31(stereomono1, 0, dacOut , 0); +AudioConnection patchCord32(stereomono1, 1, invMixer, 0); +AudioConnection patchCord33(invMixer, 0, dacOut , 1); #else AudioOutputAnalogStereo dacOut; -AudioConnection patchCord32(volume_r, 0, dacOut, 0); -AudioConnection patchCord33(volume_l, 0, dacOut, 1); +AudioConnection patchCord34(stereomono1, 0, dacOut, 0); +AudioConnection patchCord35(stereomono1, 1, dacOut, 1); #endif Dexed* MicroDexed[NUM_DEXED]; diff --git a/UI.hpp b/UI.hpp index 2e502c7..466f75c 100644 --- a/UI.hpp +++ b/UI.hpp @@ -1196,12 +1196,11 @@ void UI_func_midi_channel(uint8_t param) if (configuration.midi_channel == 0) { - lcd.print(F("OMNI")); + lcd.print(F("[OMNI]")); } else { - lcd_display_int(configuration.midi_channel, 2, false, true, false); - lcd.print(F(" ")); + lcd_display_int(configuration.midi_channel, 4, false, true, false); } } @@ -1298,7 +1297,55 @@ void UI_func_panorama(uint8_t param) void UI_func_stereo_mono(uint8_t param) { - ; + if (LCDML.FUNC_setup()) // ****** SETUP ********* + { + // setup function + lcd.setCursor(0, 0); + lcd.print(F("Stereo/Mono")); + } + + if (LCDML.FUNC_loop()) // ****** LOOP ********* + { + if (LCDML.BT_checkEnter()) + { + LCDML.FUNC_goBackToMenu(); + } + else if (LCDML.BT_checkDown()) + { + if (configuration.mono < MONO_MAX) + { + configuration.mono++; + } + } + else if (LCDML.BT_checkUp()) + { + if (configuration.mono > MONO_MIN) + { + configuration.mono--; + } + } + lcd.setCursor(0, 1); + switch (configuration.mono) + { + case 0: + lcd.print(F("[MONO ]")); + break; + case 1: + lcd.print(F("[STEREO]")); + break; + case 2: + lcd.print(F("[MONO-R]")); + break; + case 3: + lcd.print(F("[MONO-L]")); + break; + } + } + + if (LCDML.FUNC_close()) // ****** STABLE END ********* + { + // you can here reset some global vars or do nothing + } } void UI_func_polyphony(uint8_t param) diff --git a/config.h b/config.h index 380ed84..896d7eb 100644 --- a/config.h +++ b/config.h @@ -212,9 +212,15 @@ #define MOD_BUTTERWORTH_FILTER_OUTPUT 1 #define MOD_LINKWITZ_RILEY_FILTER_OUTPUT 2 +#if defined(TEENSY_DAC_SYMMETRIC) +#define MONO_MIN 1 +#define MONO_MAX 1 +#define MONO_DEFAULT 1 +#else #define MONO_MIN 0 #define MONO_MAX 3 -#define MONO_DEFAULT 0 +#define MONO_DEFAULT 1 +#endif #define VOLUME_MIN 0 #define VOLUME_MAX 100 diff --git a/effect_stereo_mono.cpp b/effect_stereo_mono.cpp new file mode 100644 index 0000000..3d1038d --- /dev/null +++ b/effect_stereo_mono.cpp @@ -0,0 +1,72 @@ +/* Audio Library for Teensy 3.X + Copyright (c) 2019, Holger Wirtz + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#include +#include +#include "effect_stereo_mono.h" + +/*************************************************************************/ +// A u d i o E f f e c t S t e r e o M o n o +// Written by Holger Wirtz +// 20191023 - inital version + +void AudioEffectStereoMono::stereo(bool mode) +{ + _enabled = mode; +} + +void AudioEffectStereoMono::update(void) +{ + audio_block_t *block[2]; + + if (_enabled == true) + { + block[0] = receiveWritable(0); + block[1] = receiveReadOnly(1); + + if (block[0] && block[1]) + { + int16_t *bp[2] = { block[0]->data, block[1]->data }; + + for (uint16_t i = 0; i < AUDIO_BLOCK_SAMPLES; i++) + { + *bp[0] = (long(*bp[0]) + *bp[1]) >> 1; + *bp[1] = *bp[0]; + + // push the pointers forward + bp[0]++; // next audio data + bp[1]++; // next audio data + } + } + } + + if (block[0]) + { + transmit(block[0], 0); + release(block[0]); + } + if (block[1]) + { + transmit(block[1], 0); + release(block[1]); + } +} diff --git a/effect_stereo_mono.h b/effect_stereo_mono.h new file mode 100644 index 0000000..8e225cb --- /dev/null +++ b/effect_stereo_mono.h @@ -0,0 +1,50 @@ +/* Audio Library for Teensy 3.X + Copyright (c) 2019, Holger Wirtz + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in + all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + THE SOFTWARE. +*/ + +#ifndef effect_stereo_mono_h_ +#define effect_stereo_mono_h_ + +#include "Arduino.h" +#include "AudioStream.h" + +/*************************************************************************/ +// A u d i o E f f e c t M o d u l a t e d D e l a y +// Written by Holger Wirtz +// 20191023 - inital version + +class AudioEffectStereoMono : + public AudioStream +{ + public: + AudioEffectStereoMono(void): + AudioStream(2, inputQueueArray) + { _enabled=false; } + + virtual void update(void); + virtual void stereo(bool mode); + + private: + audio_block_t *inputQueueArray[2]; + bool _enabled; +}; + +#endif