From aabcb40f230803803f8c2faa82b82cc696b6bb1a Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Tue, 15 Oct 2019 19:33:34 +0100 Subject: [PATCH 01/12] Initial commit of SSD1322/u8x8 support --- MicroDexed.ino | 86 ++++++++++++++++++--------------------- SSD1322_Plus.h | 98 ++++++++++++++++++++++++++++++++++++++++++++ UI.hpp | 107 +++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 244 insertions(+), 47 deletions(-) create mode 100644 SSD1322_Plus.h diff --git a/MicroDexed.ino b/MicroDexed.ino index 32476c9..66b67a1 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -42,7 +42,8 @@ AudioPlayQueue dexed1; AudioAnalyzePeak peak1; AudioEffectDelay delay_r; AudioEffectDelay delay_l; -AudioEffectFreeverbStereo freeverbs1; +AudioEffectFreeverb freeverb_r; +AudioEffectFreeverb freeverb_l; AudioEffectModulatedDelay modchorus_r; AudioEffectModulatedDelay modchorus_l; #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT @@ -61,7 +62,7 @@ AudioMixer4 reverb_mixer_r; AudioMixer4 reverb_mixer_l; AudioAmplifier volume_r; AudioAmplifier volume_l; -#ifdef MIDI_DEVICE_USB +#if defined(AUDIO_DEVICE_USB) AudioOutputUSB usb1; #endif AudioConnection patchCord0(dexed1, peak1); @@ -97,30 +98,30 @@ AudioConnection patchCord24(delay_r, 0, delay_mixer_r, 2); AudioConnection patchCord25(delay_l, 0, delay_mixer_l, 2); AudioConnection patchCord26(delay_fb_mixer_r, delay_r); AudioConnection patchCord27(delay_fb_mixer_l, delay_l); -AudioConnection patchCord28(delay_mixer_r, 0, freeverbs1, 1); -AudioConnection patchCord29(delay_mixer_l, 0, freeverbs1, 1); -AudioConnection patchCord30(freeverbs1, 0, reverb_mixer_r, 1); -AudioConnection patchCord31(freeverbs1, 1, reverb_mixer_l, 1); -AudioConnection patchCord32(reverb_mixer_r, volume_r); -AudioConnection patchCord33(reverb_mixer_l, volume_l); -#ifdef MIDI_DEVICE_USB -AudioConnection patchCord34(volume_r, 0, usb1, 0); -AudioConnection patchCord35(volume_l, 0, usb1, 1); +AudioConnection patchCord28(freeverb_r, 0, reverb_mixer_r, 1); +AudioConnection patchCord29(freeverb_l, 0, reverb_mixer_l, 1); +AudioConnection patchCord30(reverb_mixer_r, volume_r); +AudioConnection patchCord31(reverb_mixer_l, volume_l); +#if defined(AUDIO_DEVICE_USB) +AudioConnection patchCord32(volume_r, 0, usb1, 0); +AudioConnection patchCord33(volume_l, 0, usb1, 1); #endif -#if defined(TEENSY_AUDIO_BOARD) +#if defined(TEENSY_AUDIO_BOARD) || defined (I2S_AUDIO_ONLY) AudioOutputI2S i2s1; -AudioConnection patchCord36(volume_r, 0, i2s1, 0); -AudioConnection patchCord37(volume_l, 0, i2s1, 1); +AudioConnection patchCord34(volume_r, 0, i2s1, 0); +AudioConnection patchCord35(volume_l, 0, i2s1, 1); +#endif +#if defined(TEENSY_AUDIO_BOARD) AudioControlSGTL5000 sgtl5000_1; #elif defined(TGA_AUDIO_BOARD) AudioOutputI2S i2s1; -AudioConnection patchCord36(volume_r, 0, i2s1, 0); -AudioConnection patchCord37(volume_l, 0, i2s1, 1); +AudioConnection patchCord34(volume_r, 0, i2s1, 0); +AudioConnection patchCord35(volume_l, 0, i2s1, 1); AudioControlWM8731master wm8731_1; -#else +#elif !defined(I2S_AUDIO_ONLY) AudioOutputPT8211 pt8211_1; -AudioConnection patchCord36(volume_r, 0, pt8211_1, 0); -AudioConnection patchCord37(volume_l, 0, pt8211_1, 1); +AudioConnection patchCord34(volume_r, 0, pt8211_1, 0); +AudioConnection patchCord35(volume_l, 0, pt8211_1, 1); #endif Dexed* dexed = new Dexed(SAMPLE_RATE); @@ -165,42 +166,25 @@ short r_delayline[MOD_DELAY_SAMPLE_BUFFER]; /*********************************************************************** LCDMenuLib2 ***********************************************************************/ -extern LiquidCrystalPlus_I2C lcd; extern LCDMenuLib2 LCDML; extern uint8_t menu_state; #endif +void change_disp_sd(bool disp) +{ + digitalWrite(SDCARD_CS_PIN, disp); + digitalWrite(U8X8_CS_PIN, !disp); +} + void setup() { //while (!Serial) ; // wait for Arduino Serial Monitor Serial.begin(SERIAL_SPEED); - + pinMode(SDCARD_CS_PIN, OUTPUT); + pinMode(U8X8_CS_PIN, OUTPUT); + #ifdef ENABLE_LCD_UI - // LCD Begin - lcd.init(); - lcd.backlight(); - lcd.clear(); - lcd.blink_off(); - lcd.cursor_off(); - lcd.backlight(); - lcd.setCursor(1, 0); - lcd.print("MicroDexed"); - lcd.setCursor(0, 1); - lcd.print("(c)parasiTstudio"); - - // set special chars for scrollbar - lcd.createChar(0, (uint8_t*)scroll_bar[0]); - lcd.createChar(1, (uint8_t*)scroll_bar[1]); - lcd.createChar(2, (uint8_t*)scroll_bar[2]); - lcd.createChar(3, (uint8_t*)scroll_bar[3]); - lcd.createChar(4, (uint8_t*)scroll_bar[4]); - - // LCDMenuLib Setup - LCDML_setup(_LCDML_DISP_cnt); - // Enable Menu Rollover - //LCDML.MENU_enRollover(); - // Enable Screensaver (screensaver menu function, time to activate in ms) - //LCDML.SCREEN_enable(UI_func_voice_selection, VOICE_SELECTION_MS); // set to 10 seconds + setup_ui(); #else Serial.println(F("NO LCD DISPLAY ENABLED!")); #endif @@ -255,13 +239,18 @@ void setup() wm8731_1.enable(); wm8731_1.volume(1.0); Serial.println(F("TGA board enabled.")); +#elif defined(I2S_AUDIO_ONLY) + Serial.println(F("I2S enabled.")); #else Serial.println(F("PT8211 enabled.")); #endif // start SD card +#ifndef __IMXRT1062__ SPI.setMOSI(SDCARD_MOSI_PIN); SPI.setSCK(SDCARD_SCK_PIN); +#endif + change_disp_sd(false); if (!SD.begin(SDCARD_CS_PIN)) { Serial.println(F("SD card not accessable.")); @@ -300,7 +289,7 @@ void setup() // load default SYSEX data load_sysex(configuration.bank, configuration.voice); } - + change_disp_sd(true); // Init effects if (!modchorus_r.begin(r_delayline, MOD_DELAY_SAMPLE_BUFFER)) { Serial.println(F("AudioEffectModulatedDelay - right channel begin failed")); @@ -443,6 +432,7 @@ void loop() { #ifdef ENABLE_LCD_UI // LCD Menu + delay(1); LCDML.loop(); // initial starts voice selection menu as default @@ -637,7 +627,9 @@ void handleProgramChange(byte inChannel, byte inProgram) { if (inProgram < MAX_VOICES) { + change_disp_sd(false); load_sysex(configuration.bank, inProgram); + change_disp_sd(true); } } diff --git a/SSD1322_Plus.h b/SSD1322_Plus.h new file mode 100644 index 0000000..2e20160 --- /dev/null +++ b/SSD1322_Plus.h @@ -0,0 +1,98 @@ +/* + MicroDexed + + MicroDexed is a port of the Dexed sound engine + (https://github.com/asb2m10/dexed) for the Teensy-3.5/3.6 with audio shield. + Dexed ist heavily based on https://github.com/google/music-synthesizer-for-android + + (c)2018 H. Wirtz + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + +*/ + +#include + + +#ifndef SSD1322_PLUS_H_INCLUDED +#define SSD1322_PLUS_H_INCLUDED + +#ifdef U8X8_HAVE_HW_SPI +#include +#endif +#ifdef U8X8_HAVE_HW_I2C +#include +#endif + + +#define STRING_BUF_SIZE 21 + +class SSD1322_Plus : public U8X8_SSD1322_NHD_256X64_4W_HW_SPI +{ + public: + + using U8X8_SSD1322_NHD_256X64_4W_HW_SPI::U8X8_SSD1322_NHD_256X64_4W_HW_SPI; + + void show(uint8_t y, uint8_t x, uint8_t fs, char *str) + { + _show(y, x, fs, str, false, false); + } + + void show(uint8_t y, uint8_t x, uint8_t fs, long num) + { + char _buf10[STRING_BUF_SIZE]; + + _show(y, x, fs, itoa(num, _buf10, 10), true, true); + } + + private: + void _show(uint8_t pos_y, uint8_t pos_x, uint8_t field_size, char *str, bool justify_right, bool fill_zero) + { + { + char tmp[STRING_BUF_SIZE]; + char *s = tmp; + uint8_t l = strlen(str); + + memset(tmp, 0, sizeof(tmp)); + if (fill_zero == true) + memset(tmp, '0', field_size); + else + memset(tmp, 0x20, field_size - 1); // blank + + if (l > field_size) + l = field_size; + + if (justify_right == true) + s += field_size - l; + + strncpy(s, str, l); + + //setCursor(pos_x * getMaxCharWidth(), pos_y * getMaxCharHeight()); + setCursor(pos_x, pos_y ); + print(tmp); + +#ifdef DEBUG + Serial.print(pos_y, DEC); + Serial.print(F("/")); + Serial.print(pos_x, DEC); + Serial.print(F(": [")); + Serial.print(tmp); + Serial.println(F("]")); +#endif + } + } +}; + +#endif diff --git a/UI.hpp b/UI.hpp index 11cbef7..bda5f9e 100644 --- a/UI.hpp +++ b/UI.hpp @@ -27,14 +27,23 @@ #define _UI_HPP_ #include "config.h" +#ifdef I2C_DISPLAY #include "LiquidCrystalPlus_I2C.h" +#endif +#ifdef U8X8_DISPLAY +#include "SSD1322_Plus.h" +#endif #include #include #define _LCDML_DISP_cols LCD_cols #define _LCDML_DISP_rows LCD_rows +#ifdef I2C_DISPLAY #define _LCDML_DISP_cfg_cursor 0x7E // cursor Symbol +#else +#define _LCDML_DISP_cfg_cursor 0x8d // cursor Symbol +#endif #define _LCDML_DISP_cfg_scrollbar 1 // enable a scrollbar extern config_t configuration; @@ -47,6 +56,7 @@ extern void strip_extension(char* s, char *target); extern void eeprom_write(void); extern bool get_voice_names_from_bank(uint8_t b); extern bool load_sysex(uint8_t b, uint8_t v); +extern void change_disp_sd(bool d); extern value_change_t soften_volume; extern value_change_t soften_filter_res; extern value_change_t soften_filter_cut; @@ -56,7 +66,13 @@ extern value_change_t soften_filter_cut; ************************************************************************/ elapsedMillis back_from_volume; +#ifdef I2C_DISPLAY LiquidCrystalPlus_I2C lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_rows); +#endif + +#ifdef U8X8_DISPLAY +SSD1322_Plus lcd(/* cs=*/ U8X8_CS_PIN, /* dc=*/ U8X8_DC_PIN, /* reset=*/ U8X8_RESET_PIN); +#endif const uint8_t scroll_bar[5][8] = { {B10001, B10001, B10001, B10001, B10001, B10001, B10001, B10001}, // scrollbar top @@ -109,6 +125,7 @@ void UI_func_volume(uint8_t param); void UI_func_back(uint8_t param); void UI_func_goToRootMenu(uint8_t param); + // normal menu LCDMenuLib2_menu LCDML_0(255, 0, 0, NULL, NULL); // normal root menu element (do not change) LCDMenuLib2 LCDML(LCDML_0, _LCDML_DISP_rows, _LCDML_DISP_cols, lcdml_menu_display, lcdml_menu_clear, lcdml_menu_control); @@ -158,6 +175,63 @@ long g_LCDML_CONTROL_button_press_time[NUM_ENCODER] = {0, 0}; bool g_LCDML_CONTROL_button_prev[NUM_ENCODER] = {HIGH, HIGH}; uint8_t g_LCDML_CONTROL_prev[NUM_ENCODER] = {0, 0}; +#ifdef U8X8_DISPLAY +const uint8_t * flipped_scroll_bar[5]; + +uint8_t * rotTile(const uint8_t * tile) { + uint8_t * newt = new uint8_t[8]; + for (int x = 0; x < 8; x++) { + uint8_t newb = 0; + for (int y = 0 ; y < 8; y++){ + newb |= (tile[y] << x) & 0x80; + newb >>= 1; + } + newt[x] = newb; + } + return newt; +} +#endif + +void setup_ui(void){ + // LCD Begin +#ifdef I2C_DISPLAY + lcd.init(); + lcd.backlight(); + lcd.clear(); + lcd.blink_off(); + lcd.cursor_off(); + lcd.backlight(); +#else + lcd.begin(); + lcd.clear(); + lcd.setFont(u8x8_font_amstrad_cpc_extended_f); +#endif + lcd.setCursor(1, 0); + lcd.print("MicroDexed"); + lcd.setCursor(0, 1); + lcd.print("(c)parasiTstudio"); + +#ifdef I2C_DISPLAY + // set special chars for scrollbar + lcd.createChar(0, (uint8_t*)scroll_bar[0]); + lcd.createChar(1, (uint8_t*)scroll_bar[1]); + lcd.createChar(2, (uint8_t*)scroll_bar[2]); + lcd.createChar(3, (uint8_t*)scroll_bar[3]); + lcd.createChar(4, (uint8_t*)scroll_bar[4]); +#else + for (int x=0; x < 5; x++) { + flipped_scroll_bar[x] = rotTile(scroll_bar[x]); + } +#endif + +// LCDMenuLib Setup + LCDML_setup(_LCDML_DISP_cnt); + // Enable Menu Rollover + //LCDML.MENU_enRollover(); + // Enable Screensaver (screensaver menu function, time to activate in ms) + //LCDML.SCREEN_enable(UI_func_voice_selection, VOICE_SELECTION_MS); // set to 10 seconds +} + void lcdml_menu_control(void) { // If something must init, put in in the setup condition @@ -326,8 +400,11 @@ void encoder_right_up(void) if (configuration.bank < MAX_BANKS) { configuration.bank++; + change_disp_sd(false); load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); + change_disp_sd(true); + } break; case MENU_VOICE_SOUND: @@ -341,9 +418,12 @@ void encoder_right_up(void) configuration.voice = 0; } } + change_disp_sd(false); load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); + change_disp_sd(true); eeprom_write(); + } UI_func_voice_selection(0); break; @@ -369,8 +449,12 @@ void encoder_right_down(void) if (configuration.bank > 0) { configuration.bank--; + change_disp_sd(false); + load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); + change_disp_sd(true); + } break; case MENU_VOICE_SOUND: @@ -384,8 +468,11 @@ void encoder_right_down(void) configuration.voice = 31; } } + change_disp_sd(false); load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); + change_disp_sd(true); + eeprom_write(); } UI_func_voice_selection(0); @@ -567,8 +654,13 @@ void lcdml_menu_display(void) // delete or reset scrollbar if (_LCDML_DISP_cfg_scrollbar == 1) { if (scrollbar_max > n_max) { +#ifdef I2C_DISPLAY lcd.setCursor((_LCDML_DISP_cols - 1), n); lcd.write((uint8_t)0); +#else + lcd.drawTile((_LCDML_DISP_cols - 1), n, 1, flipped_scroll_bar[0]); + lcd.setCursor((_LCDML_DISP_cols), n+1); +#endif } else { lcd.setCursor((_LCDML_DISP_cols - 1), n); @@ -583,16 +675,31 @@ void lcdml_menu_display(void) //set scroll position if (scrollbar_cur_pos == scrollbar_min) { // min pos +#ifdef I2C_DISPLAY lcd.setCursor((_LCDML_DISP_cols - 1), 0); lcd.write((uint8_t)1); +#else + lcd.drawTile((_LCDML_DISP_cols - 1), 0, 1, flipped_scroll_bar[1]); + lcd.setCursor((_LCDML_DISP_cols), 1); +#endif } else if (scrollbar_cur_pos == (scrollbar_max - 1)) { // max pos +#ifdef I2C_DISPLAY lcd.setCursor((_LCDML_DISP_cols - 1), (n_max - 1)); lcd.write((uint8_t)4); +#else + lcd.drawTile((_LCDML_DISP_cols - 1), (n_max - 1), 1, flipped_scroll_bar[4]); + lcd.setCursor((_LCDML_DISP_cols), (n_max)); +#endif } else { // between +#ifdef I2C_DISPLAY lcd.setCursor((_LCDML_DISP_cols - 1), scroll_pos / n_max); lcd.write((uint8_t)(scroll_pos % n_max) + 1); +#else + lcd.drawTile((_LCDML_DISP_cols - 1), scroll_pos / n_max, 1, flipped_scroll_bar[(scroll_pos % n_max) + 1]); + lcd.setCursor((_LCDML_DISP_cols), (scroll_pos / n_max)+1); +#endif } } } From b63b89ed10a94523f7295df65908a43ac7524a6b Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Tue, 15 Oct 2019 19:44:21 +0100 Subject: [PATCH 02/12] Added holger's latest patch by hand --- MicroDexed.ino | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index 66b67a1..b156ba1 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -42,8 +42,7 @@ AudioPlayQueue dexed1; AudioAnalyzePeak peak1; AudioEffectDelay delay_r; AudioEffectDelay delay_l; -AudioEffectFreeverb freeverb_r; -AudioEffectFreeverb freeverb_l; +iAudioEffectFreeverbStereo freeverbs1; AudioEffectModulatedDelay modchorus_r; AudioEffectModulatedDelay modchorus_l; #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT @@ -98,30 +97,32 @@ AudioConnection patchCord24(delay_r, 0, delay_mixer_r, 2); AudioConnection patchCord25(delay_l, 0, delay_mixer_l, 2); AudioConnection patchCord26(delay_fb_mixer_r, delay_r); AudioConnection patchCord27(delay_fb_mixer_l, delay_l); -AudioConnection patchCord28(freeverb_r, 0, reverb_mixer_r, 1); -AudioConnection patchCord29(freeverb_l, 0, reverb_mixer_l, 1); -AudioConnection patchCord30(reverb_mixer_r, volume_r); -AudioConnection patchCord31(reverb_mixer_l, volume_l); +AudioConnection patchCord28(delay_mixer_r, 0, freeverbs1, 1); +AudioConnection patchCord29(delay_mixer_l, 0, freeverbs1, 1); +AudioConnection patchCord30(freeverbs1, 0, reverb_mixer_r, 1); +AudioConnection patchCord31(freeverbs1, 1, reverb_mixer_l, 1); +AudioConnection patchCord32(reverb_mixer_r, volume_r); +AudioConnection patchCord33(reverb_mixer_l, volume_l); #if defined(AUDIO_DEVICE_USB) -AudioConnection patchCord32(volume_r, 0, usb1, 0); -AudioConnection patchCord33(volume_l, 0, usb1, 1); +AudioConnection patchCord34(volume_r, 0, usb1, 0); +AudioConnection patchCord35(volume_l, 0, usb1, 1); #endif #if defined(TEENSY_AUDIO_BOARD) || defined (I2S_AUDIO_ONLY) AudioOutputI2S i2s1; -AudioConnection patchCord34(volume_r, 0, i2s1, 0); -AudioConnection patchCord35(volume_l, 0, i2s1, 1); +AudioConnection patchCord36(volume_r, 0, i2s1, 0); +AudioConnection patchCord37(volume_l, 0, i2s1, 1); #endif #if defined(TEENSY_AUDIO_BOARD) AudioControlSGTL5000 sgtl5000_1; #elif defined(TGA_AUDIO_BOARD) AudioOutputI2S i2s1; -AudioConnection patchCord34(volume_r, 0, i2s1, 0); -AudioConnection patchCord35(volume_l, 0, i2s1, 1); +AudioConnection patchCord36(volume_r, 0, i2s1, 0); +AudioConnection patchCord37(volume_l, 0, i2s1, 1); AudioControlWM8731master wm8731_1; #elif !defined(I2S_AUDIO_ONLY) AudioOutputPT8211 pt8211_1; -AudioConnection patchCord34(volume_r, 0, pt8211_1, 0); -AudioConnection patchCord35(volume_l, 0, pt8211_1, 1); +AudioConnection patchCord36(volume_r, 0, pt8211_1, 0); +AudioConnection patchCord37(volume_l, 0, pt8211_1, 1); #endif Dexed* dexed = new Dexed(SAMPLE_RATE); From 69a2075de2f001184bb4c47f7ba3c0b5b5fe485e Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Tue, 15 Oct 2019 19:51:36 +0100 Subject: [PATCH 03/12] Added freeverb stereo back in --- MicroDexed.ino | 2 +- config.h | 51 +++++++++++++++++++++++++++++++------------------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index b156ba1..d0fc688 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -42,7 +42,7 @@ AudioPlayQueue dexed1; AudioAnalyzePeak peak1; AudioEffectDelay delay_r; AudioEffectDelay delay_l; -iAudioEffectFreeverbStereo freeverbs1; +AudioEffectFreeverbStereo freeverbs1; AudioEffectModulatedDelay modchorus_r; AudioEffectModulatedDelay modchorus_l; #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT diff --git a/config.h b/config.h index a655988..a58b1d1 100644 --- a/config.h +++ b/config.h @@ -45,14 +45,16 @@ //************************************************************************************************* // MIDI -//#define MIDI_DEVICE_DIN Serial1 -#define MIDI_DEVICE_USB 1 -#define MIDI_DEVICE_USB_HOST 1 -#define MIDI_DEVICE_NUMBER 0 +#define MIDI_DEVICE_DIN Serial1 +//#define MIDI_DEVICE_USB 1 +//#define MIDI_DEVICE_USB_HOST 1 +//#define MIDI_DEVICE_NUMBER 0 // AUDIO // If nothing is defined PT8211 is used as audio output device! +//#define AUDIO_DEVICE_USB //#define TEENSY_AUDIO_BOARD 1 +#define I2S_AUDIO_ONLY //#define TGA_AUDIO_BOARD //************************************************************************************************* @@ -107,9 +109,18 @@ //* UI //************************************************************************************************* #define ENABLE_LCD_UI 1 -#define LCD_I2C_ADDRESS 0x27 +#define LCD_I2C_ADDRESS 0x3f #define LCD_cols 16 -#define LCD_rows 2 +#define LCD_rows 4 +// LCD Display + +#define U8X8_DISPLAY +#define U8X8_CS_PIN 9 +#define U8X8_DC_PIN 15 +#define U8X8_RESET_PIN 14 +//#define I2C_DISPLAY +// [I2C] SCL: Pin 19, SDA: Pin 18 (https://www.pjrc.com/teensy/td_libs_Wire.html) +//#define LCD_GFX 1 #define CONTROL_RATE_MS 50 #define BACK_FROM_VOLUME_MS 1000 @@ -118,7 +129,7 @@ //* DEBUG OUTPUT SETTINGS //************************************************************************************************* #define DEBUG 1 -#define SERIAL_SPEED 38400 +#define SERIAL_SPEED 9600 #define SHOW_XRUN 1 #define SHOW_CPU_LOAD_MSEC 5000 @@ -132,7 +143,8 @@ //#define SDCARD_SCK_PIN 14 #define SGTL5000_LINEOUT_LEVEL 29 // Teensy 3.5 & 3.6 SD card -#define SDCARD_CS_PIN BUILTIN_SDCARD +//#define SDCARD_CS_PIN BUILTIN_SDCARD +#define SDCARD_CS_PIN 10 #define SDCARD_MOSI_PIN 11 // not actually used #define SDCARD_SCK_PIN 13 // not actually used @@ -147,19 +159,13 @@ #define ENC_L_PIN_A 3 #define ENC_L_PIN_B 2 #define BUT_L_PIN 4 -#define ENC_R_PIN_A 28 -#define ENC_R_PIN_B 29 -#define BUT_R_PIN 30 +#define ENC_R_PIN_A 6 +#define ENC_R_PIN_B 5 +#define BUT_R_PIN 8 #define BUT_DEBOUNCE_MS 20 #define LONG_BUTTON_PRESS 500 -// LCD Display -#define I2C_DISPLAY 1 -// [I2C] SCL: Pin 19, SDA: Pin 18 (https://www.pjrc.com/teensy/td_libs_Wire.html) -//#define LCD_GFX 1 -#define LCD_I2C_ADDRESS 0x27 -#define LCD_CHARS 16 -#define LCD_LINES 2 + // Internal timer #define AUTOSTORE_MS 5000 @@ -180,11 +186,18 @@ #ifdef MIDI_DEVICE_USB #define USBCON 1 #endif +#if defined(__IMXRT1062__) //Teensy-4.0 +#undef MIDI_DEVICE_USB_HOST +#define MAX_NOTES 16 +#endif + #if defined(__MK66FX1M0__) // Teensy-3.6 // Teensy-3.6 settings #define MIDI_DEVICE_USB_HOST 1 #define MAX_NOTES 16 -#else +#endif + +#if defined (__MK64FX512__) // Teensy-3.5 settings #undef MIDI_DEVICE_USB_HOST #define MAX_NOTES 11 From 1805cd5325262a14b4a228d337a01b65e4ff64c7 Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Wed, 16 Oct 2019 09:45:54 +0100 Subject: [PATCH 04/12] Replace LiquidCrystalPlus_I2C with template version --- SSD1322_Plus.h => Disp_Plus.h | 24 +++------- LiquidCrystalPlus_I2C.h | 88 ----------------------------------- 2 files changed, 7 insertions(+), 105 deletions(-) rename SSD1322_Plus.h => Disp_Plus.h (83%) delete mode 100644 LiquidCrystalPlus_I2C.h diff --git a/SSD1322_Plus.h b/Disp_Plus.h similarity index 83% rename from SSD1322_Plus.h rename to Disp_Plus.h index 2e20160..4e872cf 100644 --- a/SSD1322_Plus.h +++ b/Disp_Plus.h @@ -23,29 +23,19 @@ */ -#include - - -#ifndef SSD1322_PLUS_H_INCLUDED -#define SSD1322_PLUS_H_INCLUDED - -#ifdef U8X8_HAVE_HW_SPI -#include -#endif -#ifdef U8X8_HAVE_HW_I2C -#include -#endif - +#ifndef DISP_PLUS_H_INCLUDED +#define DISP_PLUS_H_INCLUDED #define STRING_BUF_SIZE 21 -class SSD1322_Plus : public U8X8_SSD1322_NHD_256X64_4W_HW_SPI +template +class Disp_Plus : public T { public: - using U8X8_SSD1322_NHD_256X64_4W_HW_SPI::U8X8_SSD1322_NHD_256X64_4W_HW_SPI; + using T::T; - void show(uint8_t y, uint8_t x, uint8_t fs, char *str) + void show(uint8_t y, uint8_t x, uint8_t fs, const char *str) { _show(y, x, fs, str, false, false); } @@ -58,7 +48,7 @@ class SSD1322_Plus : public U8X8_SSD1322_NHD_256X64_4W_HW_SPI } private: - void _show(uint8_t pos_y, uint8_t pos_x, uint8_t field_size, char *str, bool justify_right, bool fill_zero) + void _show(uint8_t pos_y, uint8_t pos_x, uint8_t field_size, const char *str, bool justify_right, bool fill_zero) { { char tmp[STRING_BUF_SIZE]; diff --git a/LiquidCrystalPlus_I2C.h b/LiquidCrystalPlus_I2C.h deleted file mode 100644 index 6c8cd33..0000000 --- a/LiquidCrystalPlus_I2C.h +++ /dev/null @@ -1,88 +0,0 @@ -/* - MicroDexed - - MicroDexed is a port of the Dexed sound engine - (https://github.com/asb2m10/dexed) for the Teensy-3.5/3.6 with audio shield. - Dexed ist heavily based on https://github.com/google/music-synthesizer-for-android - - (c)2018 H. Wirtz - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software Foundation, - Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - -*/ - -#include // https://www.arduinolibraries.info/libraries/liquid-crystal-i2-c - -#ifndef LIQUIDCRYSTALPLUS_I2C_H_INCLUDED -#define LIQUIDCRYSTALPLUS_I2C_H_INCLUDED - -#define STRING_BUFFER_SIZE 21 - -class LiquidCrystalPlus_I2C : public LiquidCrystal_I2C -{ - public: - - using LiquidCrystal_I2C::LiquidCrystal_I2C; - - void show(uint8_t y, uint8_t x, uint8_t fs, char *str) - { - _show(y, x, fs, str, false, false); - } - - void show(uint8_t y, uint8_t x, uint8_t fs, long num) - { - char _buf10[STRING_BUFFER_SIZE]; - - _show(y, x, fs, itoa(num, _buf10, 10), true, true); - } - - private: - void _show(uint8_t pos_y, uint8_t pos_x, uint8_t field_size, char *str, bool justify_right, bool fill_zero) - { - { - char tmp[STRING_BUFFER_SIZE]; - char *s = tmp; - uint8_t l = strlen(str); - - memset(tmp, 0, sizeof(tmp)); - if (fill_zero == true) - memset(tmp, '0', field_size); - else - memset(tmp, 0x20, field_size - 1); // blank - - if (l > field_size) - l = field_size; - - if (justify_right == true) - s += field_size - l; - - strncpy(s, str, l); - - setCursor(pos_x, pos_y); - print(tmp); - -#ifdef DEBUG - Serial.print(pos_y, DEC); - Serial.print(F("/")); - Serial.print(pos_x, DEC); - Serial.print(F(": [")); - Serial.print(tmp); - Serial.println(F("]")); -#endif - } - } -}; - -#endif From e4e5eb7ef666f37b29e2e906501e6e7ba20e0fe1 Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Wed, 16 Oct 2019 10:02:17 +0100 Subject: [PATCH 05/12] SSD1306 support --- Disp_Plus.h | 4 ++-- UI.hpp | 21 +++++++++++++++++---- config.h | 2 ++ 3 files changed, 21 insertions(+), 6 deletions(-) diff --git a/Disp_Plus.h b/Disp_Plus.h index 4e872cf..d415705 100644 --- a/Disp_Plus.h +++ b/Disp_Plus.h @@ -70,8 +70,8 @@ class Disp_Plus : public T strncpy(s, str, l); //setCursor(pos_x * getMaxCharWidth(), pos_y * getMaxCharHeight()); - setCursor(pos_x, pos_y ); - print(tmp); + this->setCursor(pos_x, pos_y ); + this->print(tmp); #ifdef DEBUG Serial.print(pos_y, DEC); diff --git a/UI.hpp b/UI.hpp index bda5f9e..76fedf6 100644 --- a/UI.hpp +++ b/UI.hpp @@ -27,12 +27,14 @@ #define _UI_HPP_ #include "config.h" -#ifdef I2C_DISPLAY +#include "Disp_Plus.h" +/* #ifdef I2C_DISPLAY #include "LiquidCrystalPlus_I2C.h" #endif #ifdef U8X8_DISPLAY #include "SSD1322_Plus.h" #endif + */ #include #include @@ -67,12 +69,23 @@ extern value_change_t soften_filter_cut; elapsedMillis back_from_volume; #ifdef I2C_DISPLAY -LiquidCrystalPlus_I2C lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_rows); +#include +//LiquidCrystalPlus_I2C lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_rows); +Disp_Plus lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_rows); #endif #ifdef U8X8_DISPLAY -SSD1322_Plus lcd(/* cs=*/ U8X8_CS_PIN, /* dc=*/ U8X8_DC_PIN, /* reset=*/ U8X8_RESET_PIN); -#endif +#include +#ifdef U8X8_HAVE_HW_SPI +#include +#endif +#ifdef U8X8_HAVE_HW_I2C +#include +#endif +//SSD1322_Plus lcd(/* cs=*/ U8X8_CS_PIN, /* dc=*/ U8X8_DC_PIN, /* reset=*/ U8X8_RESET_PIN); +Disp_Plus lcd(/* cs=*/ U8X8_CS_PIN, /* dc=*/ U8X8_DC_PIN, /* reset=*/ U8X8_RESET_PIN); +//Disp_Plus lcd(U8X8_PIN_NONE); +#endif const uint8_t scroll_bar[5][8] = { {B10001, B10001, B10001, B10001, B10001, B10001, B10001, B10001}, // scrollbar top diff --git a/config.h b/config.h index a58b1d1..f794d5b 100644 --- a/config.h +++ b/config.h @@ -115,6 +115,8 @@ // LCD Display #define U8X8_DISPLAY +#define U8X8_DISPLAY_CLASS U8X8_SSD1322_NHD_256X64_4W_HW_SPI +//#define U8X8_DISPLAY_CLASS U8X8_SSD1306_128X64_NONAME_HW_I2C #define U8X8_CS_PIN 9 #define U8X8_DC_PIN 15 #define U8X8_RESET_PIN 14 From 3ac708542a351ba2c5335fabb6b05aea2e20b93a Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Mon, 21 Oct 2019 17:05:14 +0100 Subject: [PATCH 06/12] Fix spelling error in patchcord Fix erroneous scrollbar display on screens with more than 2 lines --- MicroDexed.ino | 2 +- UI.hpp | 4 +++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index 2ad95c7..2c2bf35 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -95,7 +95,7 @@ AudioConnection patchCord18(delay_mixer, volume_l); #endif #if defined(AUDIO_DEVICE_USB) AudioConnection patchCord23(volume_r, 0, usb1, 0); -AudioConnection patchCordcw2435(volume_l, 0, usb1, 1); +AudioConnection patchCord24(volume_l, 0, usb1, 1); #endif #if defined(TEENSY_AUDIO_BOARD) || defined (I2S_AUDIO_ONLY) AudioOutputI2S i2s1; diff --git a/UI.hpp b/UI.hpp index 76fedf6..863c101 100644 --- a/UI.hpp +++ b/UI.hpp @@ -100,7 +100,6 @@ enum { MENU_START, MENU_VOICE, MENU_EDIT, MENU_VOLUME }; enum {MENU_VOICE_BANK, MENU_VOICE_SOUND}; uint8_t menu_state = MENU_START; uint8_t menu_voice = MENU_VOICE_SOUND; - void lcdml_menu_display(void); void lcdml_voice_menu_display(void); void lcdml_menu_clear(void); @@ -895,6 +894,9 @@ void UI_func_voice_selection(uint8_t param) lcd.show(1, 14, 2, "] "); break; } + for (int x = 2; x < LCD_rows; x++) { + lcd.show(x, 0, LCD_cols+1, " "); + } } void UI_func_volume(uint8_t param) From d64bd4e614eb6d5d5bb68af2e198d0c05a412beb Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Mon, 21 Oct 2019 17:27:52 +0100 Subject: [PATCH 07/12] Adjust values for pull --- Disp_Plus.h | 6 +++--- MicroDexed.ino | 9 ++++++++- config.h | 8 +++++++- 3 files changed, 18 insertions(+), 5 deletions(-) diff --git a/Disp_Plus.h b/Disp_Plus.h index d415705..ae73c13 100644 --- a/Disp_Plus.h +++ b/Disp_Plus.h @@ -26,7 +26,7 @@ #ifndef DISP_PLUS_H_INCLUDED #define DISP_PLUS_H_INCLUDED -#define STRING_BUF_SIZE 21 +#define STRING_BUFFER_SIZE 21 template class Disp_Plus : public T @@ -42,7 +42,7 @@ class Disp_Plus : public T void show(uint8_t y, uint8_t x, uint8_t fs, long num) { - char _buf10[STRING_BUF_SIZE]; + char _buf10[STRING_BUFFER_SIZE]; _show(y, x, fs, itoa(num, _buf10, 10), true, true); } @@ -51,7 +51,7 @@ class Disp_Plus : public T void _show(uint8_t pos_y, uint8_t pos_x, uint8_t field_size, const char *str, bool justify_right, bool fill_zero) { { - char tmp[STRING_BUF_SIZE]; + char tmp[STRING_BUFFER_SIZE]; char *s = tmp; uint8_t l = strlen(str); diff --git a/MicroDexed.ino b/MicroDexed.ino index 2c2bf35..475edd6 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -164,18 +164,22 @@ extern LCDMenuLib2 LCDML; extern uint8_t menu_state; #endif +#ifdef DISPLAY_LCD_SPI void change_disp_sd(bool disp) { digitalWrite(SDCARD_CS_PIN, disp); digitalWrite(U8X8_CS_PIN, !disp); } +#endif void setup() { //while (!Serial) ; // wait for Arduino Serial Monitor Serial.begin(SERIAL_SPEED); +#ifdef DISPLAY_LCD_SPI pinMode(SDCARD_CS_PIN, OUTPUT); pinMode(U8X8_CS_PIN, OUTPUT); +#endif #ifdef ENABLE_LCD_UI setup_ui(); @@ -251,7 +255,9 @@ void setup() SPI.setMOSI(SDCARD_MOSI_PIN); SPI.setSCK(SDCARD_SCK_PIN); #endif +#ifdef DISPLAY_LCD_SPI change_disp_sd(false); +#endif if (!SD.begin(SDCARD_CS_PIN)) { Serial.println(F("SD card not accessable.")); @@ -290,7 +296,9 @@ void setup() // load default SYSEX data load_sysex(configuration.bank, configuration.voice); } +#ifdef DISPLAY_LCD_SPI change_disp_sd(true); +#endif // Init effects if (!modchorus.begin(delayline, MOD_DELAY_SAMPLE_BUFFER)) { Serial.println(F("AudioEffectModulatedDelay - right channel begin failed")); @@ -426,7 +434,6 @@ void loop() { #ifdef ENABLE_LCD_UI // LCD Menu - delay(1); LCDML.loop(); // initial starts voice selection menu as default diff --git a/config.h b/config.h index a99a1b9..e7a1a23 100644 --- a/config.h +++ b/config.h @@ -110,17 +110,23 @@ //* UI //************************************************************************************************* #define ENABLE_LCD_UI 1 +// LCD Display +//I2C_DISPLAY only #define LCD_I2C_ADDRESS 0x3f +//Display size, must be set for U8X8 as well #define LCD_cols 16 #define LCD_rows 4 -// LCD Display +//enable U8X8 support #define U8X8_DISPLAY +//enable SPI CS switching +#define DISPLAY_LCD_SPI #define U8X8_DISPLAY_CLASS U8X8_SSD1322_NHD_256X64_4W_HW_SPI //#define U8X8_DISPLAY_CLASS U8X8_SSD1306_128X64_NONAME_HW_I2C #define U8X8_CS_PIN 9 #define U8X8_DC_PIN 15 #define U8X8_RESET_PIN 14 +//Standard 16x2 LCD display (SPI/PCF8874) //#define I2C_DISPLAY // [I2C] SCL: Pin 19, SDA: Pin 18 (https://www.pjrc.com/teensy/td_libs_Wire.html) //#define LCD_GFX 1 From 7e2d2f413317c2f38f9eb0048d28b13e7ab44691 Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Mon, 21 Oct 2019 17:32:49 +0100 Subject: [PATCH 08/12] More cleanups for pull --- MicroDexed.ino | 4 ++++ UI.hpp | 9 --------- 2 files changed, 4 insertions(+), 9 deletions(-) diff --git a/MicroDexed.ino b/MicroDexed.ino index 475edd6..40ec269 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -638,9 +638,13 @@ void handleProgramChange(byte inChannel, byte inProgram) { if (inProgram < MAX_VOICES) { +#ifdef DISPLAY_LCD_SPI change_disp_sd(false); +#endif load_sysex(configuration.bank, inProgram); +#ifdef DISPLAY_LCD_SPI change_disp_sd(true); +#endif } } diff --git a/UI.hpp b/UI.hpp index 863c101..b3fab30 100644 --- a/UI.hpp +++ b/UI.hpp @@ -28,13 +28,6 @@ #include "config.h" #include "Disp_Plus.h" -/* #ifdef I2C_DISPLAY -#include "LiquidCrystalPlus_I2C.h" -#endif -#ifdef U8X8_DISPLAY -#include "SSD1322_Plus.h" -#endif - */ #include #include @@ -70,7 +63,6 @@ elapsedMillis back_from_volume; #ifdef I2C_DISPLAY #include -//LiquidCrystalPlus_I2C lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_rows); Disp_Plus lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_rows); #endif @@ -82,7 +74,6 @@ Disp_Plus lcd(LCD_I2C_ADDRESS, _LCDML_DISP_cols, _LCDML_DISP_ #ifdef U8X8_HAVE_HW_I2C #include #endif -//SSD1322_Plus lcd(/* cs=*/ U8X8_CS_PIN, /* dc=*/ U8X8_DC_PIN, /* reset=*/ U8X8_RESET_PIN); Disp_Plus lcd(/* cs=*/ U8X8_CS_PIN, /* dc=*/ U8X8_DC_PIN, /* reset=*/ U8X8_RESET_PIN); //Disp_Plus lcd(U8X8_PIN_NONE); #endif From dbecd69c55461ca936f0368b68deca2126ca4e5a Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Mon, 21 Oct 2019 17:38:45 +0100 Subject: [PATCH 09/12] Make change_disp_sd an ifdef --- UI.hpp | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/UI.hpp b/UI.hpp index b3fab30..22bc6fb 100644 --- a/UI.hpp +++ b/UI.hpp @@ -51,7 +51,9 @@ extern void strip_extension(char* s, char *target); extern void eeprom_write(void); extern bool get_voice_names_from_bank(uint8_t b); extern bool load_sysex(uint8_t b, uint8_t v); +#ifdef DISPLAY_LCD_SPI extern void change_disp_sd(bool d); +#endif extern value_change_t soften_volume; extern value_change_t soften_filter_res; extern value_change_t soften_filter_cut; @@ -403,10 +405,14 @@ void encoder_right_up(void) if (configuration.bank < MAX_BANKS) { configuration.bank++; +#ifdef DISPLAY_LCD_SPI change_disp_sd(false); +#endif load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); +#ifdef DISPLAY_LCD_SPI change_disp_sd(true); +#endif } break; @@ -421,10 +427,14 @@ void encoder_right_up(void) configuration.voice = 0; } } +#ifdef DISPLAY_LCD_SPI change_disp_sd(false); +#endif load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); +#ifdef DISPLAY_LCD_SPI change_disp_sd(true); +#endif eeprom_write(); } @@ -452,11 +462,15 @@ void encoder_right_down(void) if (configuration.bank > 0) { configuration.bank--; +#ifdef DISPLAY_LCD_SPI change_disp_sd(false); +#endif load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); +#ifdef DISPLAY_LCD_SPI change_disp_sd(true); +#endif } break; @@ -471,10 +485,14 @@ void encoder_right_down(void) configuration.voice = 31; } } +#ifdef DISPLAY_LCD_SPI change_disp_sd(false); +#endif load_sysex(configuration.bank, configuration.voice); get_voice_names_from_bank(configuration.bank); +#ifdef DISPLAY_LCD_SPI change_disp_sd(true); +#endif eeprom_write(); } From de5f2537e074493518f17b7ef762d5b0438fed2d Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Mon, 21 Oct 2019 17:46:20 +0100 Subject: [PATCH 10/12] Cleaned up config.h --- config.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.h b/config.h index e7a1a23..2e0bb3c 100644 --- a/config.h +++ b/config.h @@ -168,6 +168,9 @@ #define ENC_L_PIN_A 3 #define ENC_L_PIN_B 2 #define BUT_L_PIN 4 +//#define ENC_R_PIN_A 28 +//#define ENC_R_PIN_B 29 +//#define BUT_R_PIN 30 #define ENC_R_PIN_A 6 #define ENC_R_PIN_B 5 #define BUT_R_PIN 8 From d53639a68a5f21b134693a344acf87509332276c Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Mon, 21 Oct 2019 17:48:34 +0100 Subject: [PATCH 11/12] More config.h tidyup --- config.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/config.h b/config.h index 2e0bb3c..4de49d8 100644 --- a/config.h +++ b/config.h @@ -112,9 +112,11 @@ #define ENABLE_LCD_UI 1 // LCD Display //I2C_DISPLAY only +//#define LCD_I2C_ADDRESS 0x27 #define LCD_I2C_ADDRESS 0x3f //Display size, must be set for U8X8 as well #define LCD_cols 16 +//#define LCD_rows 2 #define LCD_rows 4 //enable U8X8 support @@ -138,6 +140,7 @@ //* DEBUG OUTPUT SETTINGS //************************************************************************************************* #define DEBUG 1 +//#define SERIAL_SPEED 38400 #define SERIAL_SPEED 9600 #define SHOW_XRUN 1 #define SHOW_CPU_LOAD_MSEC 5000 From a62a6b7d6bbf0ae26b7f8744cb764027983e4269 Mon Sep 17 00:00:00 2001 From: Dirk Niggemann Date: Thu, 24 Oct 2019 12:28:10 +0100 Subject: [PATCH 12/12] Added missing headers deleted in merge --- UI.hpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/UI.hpp b/UI.hpp index 5dfe52e..58c1731 100644 --- a/UI.hpp +++ b/UI.hpp @@ -28,6 +28,10 @@ #include "config.h" #include "Disp_Plus.h" +#include "SoftenValue.hpp" +#include "effect_modulated_delay.h" +#include "dexed.h" + #include #include