From e69c007b637e4431c7eda4db3c0036e8c2892dae Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Thu, 19 Sep 2019 12:31:39 +0200 Subject: [PATCH] Added Mono/Stereo switch. --- MicroMDAEPiano.ino | 17 +++++--- UI.hpp | 97 ++++++++++++++++++++++++++++++++++++++++++---- config.h | 11 ++++-- mdaEPiano.cpp | 2 +- 4 files changed, 110 insertions(+), 17 deletions(-) diff --git a/MicroMDAEPiano.ino b/MicroMDAEPiano.ino index 17957a5..c454b97 100644 --- a/MicroMDAEPiano.ino +++ b/MicroMDAEPiano.ino @@ -147,6 +147,7 @@ config_t configuration = { ENC_MIDI_CHANNEL_DEFAULT, // midi_channel ENC_MIDI_SOFT_THRU_DEFAULT, // midi_soft_thru ENC_MAX_POLY_DEFAULT, // max_poly + ENC_MONO_DEFAULT, // mono ENC_MASTER_PAN_DEFAULT // pan }; @@ -245,11 +246,6 @@ void setup() modulator.phase(0); modulator.amplitude(1.0); modulator.offset(0.0); -#ifdef MOD_STEREO - inverter.gain(-1.0); // change phase for second modulated delay (faked stereo mode) -#else - inverter.gain(1.0); -#endif modchorus_r.offset(15.0); modchorus_l.offset(15.0); // Butterworth filter, 12 db/octave @@ -277,6 +273,17 @@ void setup() mixer_r.gain(VOL_CHORUS, 0.2); mixer_l.gain(VOL_CHORUS, 0.2); + // Stereo/Mono initial setup + if (configuration.mono == false) + { + inverter.gain(-1.0); // change phase for second modulated delay (faked stereo mode) + } + else + { + inverter.gain(1.0); + configuration.pan = ENC_MASTER_PAN_DEFAULT; + } + // set master volume set_master_volume(master_volume); diff --git a/UI.hpp b/UI.hpp index a182ada..7f56123 100644 --- a/UI.hpp +++ b/UI.hpp @@ -28,16 +28,16 @@ const uint8_t MAX_VARIABLES = 5; ///< @note Default: 5 /// Configures the number of available functions per line. - const uint8_t MAX_FUNCTIONS = 42; ///< @note Default: 8 + const uint8_t MAX_FUNCTIONS = 43; ///< @note Default: 8 /// Configures the number of available lines per screen. - const uint8_t MAX_LINES = 20; ///< @note Default: 12 + const uint8_t MAX_LINES = 22; ///< @note Default: 12 /// Configures the number of available screens per menu. const uint8_t MAX_SCREENS = 2; ///< @note Default: 14 /// Configures the number of available menus per menus system. - const uint8_t MAX_MENUS = 45; ///< @note Default: 8 + const uint8_t MAX_MENUS = 46; ///< @note Default: 8 */ @@ -56,7 +56,7 @@ int32_t encoder_value[NUM_ENCODER]; Bounce but[NUM_ENCODER] = {Bounce(BUT_L_PIN, BUT_DEBOUNCE_MS), Bounce(BUT_R_PIN, BUT_DEBOUNCE_MS)}; elapsedMillis back_to_main; -#define NUM_MENUS 45 +#define NUM_MENUS 46 #define MAIN 0 /*************************************/ @@ -104,10 +104,11 @@ elapsedMillis back_to_main; #define MIDI_CHANNEL 39 #define MIDI_SOFT_THRU 40 #define MAX_POLY 41 +#define MONO 42 /*************************************/ -#define STORE_QUESTION 42 +#define STORE_QUESTION 43 /*************************************/ -#define MASTER_VOLUME 43 +#define MASTER_VOLUME 44 /*************************************/ int8_t menu_position[NUM_MENUS]; @@ -132,6 +133,7 @@ extern AudioMixer4 mixer_r; extern AudioMixer4 mixer_l; extern AudioAmplifier volume_r; extern AudioAmplifier volume_l; +extern AudioAmplifier inverter; extern mdaEPiano* ep; extern config_t configuration; extern uint8_t sound; @@ -285,6 +287,17 @@ char* get_midi_soft_thru_value_text(void) return (midi_soft_thru_value_text1); } +char mono_value_text1[] = " "; +char* get_mono_value_text(void) +{ + if (configuration.mono == 0) + sprintf(mono_value_text1, "Stereo"); + else + sprintf(mono_value_text1, "Mono "); + + return (mono_value_text1); +} + char yes_no_value_text1[] = " "; char* get_yes_no_value_text(void) { @@ -727,15 +740,17 @@ LiquidMenu save_sound_menu(lcd); /****************************************** SYSTEM MENU ******************************************/ -#define NUM_SYSTEM_MENUS 4 +#define NUM_SYSTEM_MENUS 5 const char system_text1[] PROGMEM = "Loudness"; const char system_text2[] PROGMEM = "MIDI Channel"; const char system_text3[] PROGMEM = "MIDI Soft-Thru"; const char system_text4[] PROGMEM = "Max. Polyphony"; +const char system_text5[] PROGMEM = "Mono/Stereo"; LiquidLine system_line1(1, 0, system_text1); LiquidLine system_line2(1, 1, system_text2); LiquidLine system_line3(1, 1, system_text3); LiquidLine system_line4(1, 1, system_text4); +LiquidLine system_line5(1, 1, system_text5); LiquidScreen system_screen; LiquidMenu system_menu(lcd); @@ -779,6 +794,16 @@ LiquidLine max_poly_line2(1, 1, configuration.max_poly); LiquidScreen max_poly_screen; LiquidMenu max_poly_menu(lcd); +/****************************************** + MONO/STEREO MENU + ******************************************/ +#define NUM_MONO_MENUS 1 +const char mono_text1[] PROGMEM = "Mono/Stereo"; +LiquidLine mono_line1(1, 0, mono_text1); +LiquidLine mono_line2(1, 1, get_mono_value_text); +LiquidScreen mono_screen; +LiquidMenu mono_menu(lcd); + /****************************************** INFO MENU ******************************************/ @@ -1349,11 +1374,23 @@ void callback_max_poly_function(void) #endif menu_system.change_menu(max_poly_menu); menu_position[SYSTEM] = encoder_value[RIGHT_ENCODER]; - encoder_value[RIGHT_ENCODER] = configuration. max_poly; + encoder_value[RIGHT_ENCODER] = configuration.max_poly; enc[RIGHT_ENCODER].write(configuration.max_poly, ENC_MAX_POLY_MIN, ENC_MAX_POLY_MAX); menu_system.update(); } +void callback_mono_function(void) +{ +#ifdef SHOW_DEBUG + Serial.println(F("callback_mono_function")); +#endif + menu_system.change_menu(mono_menu); + menu_position[SYSTEM] = encoder_value[RIGHT_ENCODER]; + encoder_value[RIGHT_ENCODER] = configuration.mono; + enc[RIGHT_ENCODER].write(configuration.mono, ENC_MONO_MIN, ENC_MONO_MAX); + menu_system.update(); +} + /****************************************** INFO MENU CALLBACKS ******************************************/ @@ -1757,6 +1794,7 @@ void init_menus(void) system_screen.add_line(system_line2); system_screen.add_line(system_line3); system_screen.add_line(system_line4); + system_screen.add_line(system_line5); system_screen.set_displayLineCount(2); system_menu.add_screen(system_screen); @@ -1764,6 +1802,7 @@ void init_menus(void) system_line2.attach_function(MIDI_CHANNEL, callback_midi_channel_function); system_line3.attach_function(MIDI_SOFT_THRU, callback_midi_soft_thru_function); system_line4.attach_function(MAX_POLY, callback_max_poly_function); + system_line5.attach_function(MONO, callback_mono_function); // setup loudness loudness_screen.add_line(loudness_line1); @@ -1789,6 +1828,12 @@ void init_menus(void) max_poly_screen.set_displayLineCount(2); max_poly_menu.add_screen(max_poly_screen); + // setup mono + mono_screen.add_line(mono_line1); + mono_screen.add_line(mono_line2); + mono_screen.set_displayLineCount(2); + mono_menu.add_screen(mono_screen); + // setup info menu info_screen.add_line(info_line1); info_screen.add_line(info_line2); @@ -1845,6 +1890,7 @@ void init_menus(void) menu_system.add_menu(midi_channel_menu); menu_system.add_menu(midi_soft_thru_menu); menu_system.add_menu(max_poly_menu); + menu_system.add_menu(mono_menu); menu_system.add_menu(info_menu); menu_system.add_menu(master_volume_menu); @@ -2359,6 +2405,24 @@ void set_max_poly(uint8_t value) ep->reset_voices(); } +void set_mono(uint8_t mode) +{ +#ifdef SHOW_DEBUG + Serial.print(F("Set MONO ")); + Serial.println(mode); +#endif + if (mode == 0) + { + set_stereo(configuration.stereo); + inverter.gain(-1.0); // change phase for second modulated delay (faked stereo mode) + } + else + { + set_stereo(ENC_STEREO_MIN); + inverter.gain(1.0); + } +} + void set_complete_configuration(void) { set_decay(configuration.decay); @@ -2395,6 +2459,7 @@ void set_complete_configuration(void) set_midi_channel(configuration.midi_channel); set_midi_soft_thru(configuration.midi_soft_thru); set_max_poly(configuration.max_poly); + set_mono(configuration.mono); } //********************************************************************************************+ @@ -2765,6 +2830,15 @@ void handle_ui(void) menu_system.update(); } } + else if (menu_system.get_currentScreen() == &mono_screen) + { + if (encoder_tmp != encoder_value[RIGHT_ENCODER]) + { + // value up/down + set_mono(encoder_tmp); + menu_system.update(); + } + } else { // Move menu focus @@ -3199,6 +3273,13 @@ void handle_ui(void) #endif goto_system_menu(MAX_POLY); } + else if (menu_system.get_currentScreen() == &mono_screen) // mono menu + { +#ifdef SHOW_DEBUG + Serial.println(F("from mono to system")); +#endif + goto_system_menu(MONO); + } else if (menu_system.get_currentScreen() == &info_screen) // info menu { #ifdef SHOW_DEBUG diff --git a/config.h b/config.h index 0e28e9d..49850dd 100644 --- a/config.h +++ b/config.h @@ -31,7 +31,7 @@ // 128 to 64 in /cores/teensy3/AudioStream.h // arecord -f cd -Dhw:1,0 /tmp/bla.wav -// aplaymidi -p 20:0 test.mid +// aplaymidi -p 20:0 test.mid //************************************************************************************************* //* DEVICE SETTINGS @@ -60,7 +60,7 @@ // CHORUS parameters #define CHORUS_DELAY_LENGTH_SAMPLES (16*AUDIO_BLOCK_SAMPLES) // one AUDIO_BLOCK_SAMPLES = 2.902ms #define WAVEFORM_MOD WAVEFORM_TRIANGLE // WAVEFORM_SINE WAVEFORM_TRIANGLE WAVEFORM_SAWTOOTH WAVEFORM_SAWTOOTH_REVERSE -//#define MOD_STEREO 1 + //************************************************************************************************* //* DEBUG OUTPUT SETTINGS //************************************************************************************************* @@ -99,7 +99,7 @@ 30: 1.22 Volts p-p 31: 1.16 Volts p-p */ -#define SGTL5000_LINEOUT_LEVEL 26 +#define SGTL5000_LINEOUT_LEVEL 25 //#define SDCARD_CS_PIN 10 //#define SDCARD_MOSI_PIN 7 //#define SDCARD_SCK_PIN 14 @@ -286,6 +286,10 @@ #define ENC_MAX_POLY_MAX NVOICES #define ENC_MAX_POLY_DEFAULT NVOICES // +#define ENC_MONO_MIN 0 // stereo +#define ENC_MONO_MAX 1 // mono +#define ENC_MONO_DEFAULT 1 +// #define ENC_MASTER_VOLUME_MIN 0 #define ENC_MASTER_VOLUME_MAX 99 #define ENC_MASTER_VOLUME_DEFAULT 80 @@ -351,6 +355,7 @@ struct config_t { uint8_t midi_channel; bool midi_soft_thru; uint8_t max_poly; + uint8_t mono; int8_t pan; }; diff --git a/mdaEPiano.cpp b/mdaEPiano.cpp index 45af0fe..f23886a 100644 --- a/mdaEPiano.cpp +++ b/mdaEPiano.cpp @@ -257,7 +257,7 @@ void mdaEPiano::setOverdrive(float value) void mdaEPiano::setLoudness(float value) { //volume = value * 0.32258; // 0.00002 * 127^2 - volume = value * 0.18f; + volume = value * 0.17f; } void mdaEPiano::setParameter(int32_t index, float value)