/*
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 , 2019 H . Wirtz < wirtz @ parasitstudio . de >
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
*/
# ifndef CONFIG_H_INCLUDED
# define CONFIG_H_INCLUDED
# include <Arduino.h>
# include "midinotes.h"
// ATTENTION! For better latency you have to redefine AUDIO_BLOCK_SAMPLES from
// 128 to 64 in <ARDUINO-IDE-DIR>/cores/teensy3/AudioStream.h
# define AUDIO_BLOCK_SAMPLES 64
// If you want to test the system with Linux and withous any keyboard and/or audio equipment, you can do the following:
// 1. In Arduino-IDE enable "Tools->USB-Type->Serial + MIDI + Audio"
// 2. Build the firmware with "MIDI_DEVICE_USB" enabled in config.h.
// 3. Afterconnecting to a Linux system there should be a MIDI an audio device available that is called "MicroMDAEPiano", so you can start the following:
// $ aplaymidi -p 20:0 <MIDI-File> # e.g. test.mid
// $ arecord -f cd -Dhw:1,0 /tmp/bla.wav
# define VERSION "0.9.7"
//*************************************************************************************************
//* DEVICE SETTINGS
//*************************************************************************************************
// MIDI
# define MIDI_DEVICE_DIN Serial1
//#define AUDIO_DEVICE_USB
//#define MIDI_DEVICE_USB 1
//#define MIDI_DEVICE_USB_HOST 1
//#define MIDI_DEVICE_NUMBER 0
// AUDIO
// If nothing is defined Teensy internal DAC is used as audio output device!
// Left and right channel audio signal is presented on pins A21 and A22.
//#define AUDIO_DEVICE_USB
//#define TEENSY_DAC
//#define TEENSY_DAC_SYMMETRIC
//#define TEENSY_AUDIO_BOARD
//#define I2S_AUDIO_ONLY
//#define TGA_AUDIO_BOARD
# define PT8211_AUDIO
//*************************************************************************************************
//* MIDI SETTINGS
//*************************************************************************************************
# define DEFAULT_MIDI_CHANNEL MIDI_CHANNEL_OMNI
# define MIDI_MERGE_THRU 1
# define SYSEXBANK_DEFAULT 0
# define SYSEXSOUND_DEFAULT 0
//*************************************************************************************************
//* DEXED AND EFECTS SETTINGS
//*************************************************************************************************
# define DEXED_ENGINE DEXED_ENGINE_MODERN // DEXED_ENGINE_MARKI // DEXED_ENGINE_OPL
// CHORUS parameters
# define MOD_DELAY_SAMPLE_BUFFER int32_t(TIME_MS2SAMPLES(20.0)) // 20.0 ms delay buffer.
# define MOD_WAVEFORM WAVEFORM_TRIANGLE // WAVEFORM_SINE WAVEFORM_TRIANGLE WAVEFORM_SAWTOOTH WAVEFORM_SAWTOOTH_REVERSE
# define MOD_FILTER_OUTPUT MOD_LINKWITZ_RILEY_FILTER_OUTPUT // MOD_LINKWITZ_RILEY_FILTER_OUTPUT MOD_BUTTERWORTH_FILTER_OUTPUT MOD_NO_FILTER_OUTPUT
# define MOD_FILTER_CUTOFF_HZ 3000
# define USE_REVERB 1
//*************************************************************************************************
//* AUDIO SETTINGS
//*************************************************************************************************
// https://rechneronline.de/funktionsgraphen/
# define VOLUME_CURVE 0.07
# ifndef TEENSY_AUDIO_BOARD
# if AUDIO_BLOCK_SAMPLES == 64
# define AUDIO_MEM 450
# else
# define AUDIO_MEM 225
# endif
# define DELAY_MAX_TIME 600
# define REDUCE_LOUDNESS 1
# else
# if AUDIO_BLOCK_SAMPLES == 64
# define AUDIO_MEM 900
# else
# define AUDIO_MEM 450
# endif
# define DELAY_MAX_TIME 1200
# define REDUCE_LOUDNESS 1
# endif
# define SAMPLE_RATE 44100
# define SOFTEN_VALUE_CHANGE_STEPS 5
//*************************************************************************************************
//* UI
//*************************************************************************************************
# define ENABLE_LCD_UI 1
# define STANDARD_LCD_I2C
//#define OLED_SPI
// LCD Display
//I2C_DISPLAY only
# ifdef STANDARD_LCD_I2C
# 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 I2C_DISPLAY
// [I2C] SCL: Pin 19, SDA: Pin 18 (https://www.pjrc.com/teensy/td_libs_Wire.html)
//#define LCD_GFX 1
# endif
# ifdef OLED_SPI
# define LCD_cols 16
# define LCD_rows 4
//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
# endif
# define CONTROL_RATE_MS 50
# define BACK_FROM_VOLUME_MS 1000
//*************************************************************************************************
//* DEBUG OUTPUT SETTINGS
//*************************************************************************************************
# define DEBUG 1
//#define SERIAL_SPEED 38400
# define SERIAL_SPEED 9600
# define SHOW_XRUN 1
# define SHOW_CPU_LOAD_MSEC 5000
//*************************************************************************************************
//* HARDWARE SETTINGS
//*************************************************************************************************
# if defined(__IMXRT1062__) //Teensy-4.0
# define TEENSY4
# endif
// Teensy Audio Shield:
//#define SDCARD_CS_PIN 10
//#define SDCARD_MOSI_PIN 7
//#define SDCARD_SCK_PIN 14
# define SGTL5000_LINEOUT_LEVEL 29
# ifndef TEENSY4
// Teensy 3.5 & 3.6 SD card
# define SDCARD_CS_PIN BUILTIN_SDCARD
# define SDCARD_MOSI_PIN 11 // not actually used
# define SDCARD_SCK_PIN 13 // not actually used
# else
# define SDCARD_CS_PIN 10
# define SDCARD_MOSI_PIN 11 // not actually used
# define SDCARD_SCK_PIN 13 // not actually used
# endif
// Encoder with button
# define ENCODER_USE_INTERRUPTS
# define NUM_ENCODER 2
# define ENC_L_PIN_A 3
# define ENC_L_PIN_B 2
# define BUT_L_PIN 4
# ifndef TEENSY4
# define ENC_R_PIN_A 28
# define ENC_R_PIN_B 29
# define BUT_R_PIN 30
# else
# define ENC_R_PIN_A 6
# define ENC_R_PIN_B 5
# define BUT_R_PIN 8
# endif
# define BUT_DEBOUNCE_MS 20
# define LONG_BUTTON_PRESS 500
// Internal timer
# define AUTOSTORE_MS 5000
# define VOICE_SELECTION_MS 2000
// EEPROM address
# define EEPROM_START_ADDRESS 0
# define MAX_BANKS 100
# define MAX_VOICES 32 // voices per bank
# define BANK_NAME_LEN 13 // FAT12 filenames (plus '\0')
# define VOICE_NAME_LEN 11 // 10 (plus '\0')
//*************************************************************************************************
//* DO NO CHANGE ANYTHING BEYOND IF YOU DON'T KNOW WHAT YOU ARE DOING !!!
//*************************************************************************************************
# define NUM_DEXED 1
// MIDI
# ifdef MIDI_DEVICE_USB
# define USBCON 1
# endif
# if defined(__IMXRT1062__) //Teensy-4.0
# undef MIDI_DEVICE_USB_HOST
# undef MIDI_DEVICE_USB
# define MAX_NOTES 16
# endif
# if defined(__MK66FX1M0__) // Teensy-3.6
// Teensy-3.6 settings
# define MIDI_DEVICE_USB_HOST 1
# if defined(USE_REVERB)
# define MAX_NOTES 14
# else
# define MAX_NOTES 16
# endif
# endif
# if defined (__MK64FX512__)
// Teensy-3.5 settings
# undef MIDI_DEVICE_USB_HOST
# define MAX_NOTES 11
# undef USE_REVERB
# endif
# define TRANSPOSE_FIX 24
// Audio
# ifdef TGA_AUDIO_BOARD
# define REDUCE_LOUDNESS 2
# endif
// Some optimizations
# define USE_TEENSY_DSP 1
# define SUM_UP_AS_INT 1
/* HELPER MACROS */
# define TIME_MS2SAMPLES(x) floor(uint32_t(x) * AUDIO_SAMPLE_RATE / 1000)
# define SAMPLES2TIME_MS(x) float(uint32_t(x) * 1000 / AUDIO_SAMPLE_RATE)
// Modulated delay options
# define MOD_NO_FILTER_OUTPUT 0
# 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 1
# endif
# define VOLUME_MIN 0
# define VOLUME_MAX 100
# define VOLUME_DEFAULT 80
# define VOLUME_ENC_STEPS 20
# define PANORAMA_MIN -20
# define PANORAMA_MAX 20
# define PANORAMA_DEFAULT 0
# define MIDI_CHANNEL_MIN MIDI_CHANNEL_OMNI
# define MIDI_CHANNEL_MAX 16
# define MIDI_CHANNEL_DEFAULT MIDI_CHANNEL_OMNI
# define REVERB_ROOMSIZE_MIN 0
# define REVERB_ROOMSIZE_MAX 100
# define REVERB_ROOMSIZE_DEFAULT 0
# define REVERB_DAMPING_MIN 0
# define REVERB_DAMPING_MAX 100
# define REVERB_DAMPING_DEFAULT 0
# define REVERB_LEVEL_MIN 0
# define REVERB_LEVEL_MAX 100
# define REVERB_LEVEL_DEFAULT 0
# define CHORUS_FREQUENCY_MIN 0
# define CHORUS_FREQUENCY_MAX 100
# define CHORUS_FREQUENCY_DEFAULT 0
# define CHORUS_WAVEFORM_MIN 0
# define CHORUS_WAVEFORM_MAX 1
# define CHORUS_WAVEFORM_DEFAULT 0
# define CHORUS_DEPTH_MIN 0
# define CHORUS_DEPTH_MAX 100
# define CHORUS_DEPTH_DEFAULT 0
# define CHORUS_LEVEL_MIN 0
# define CHORUS_LEVEL_MAX 100
# define CHORUS_LEVEL_DEFAULT 0
# define DELAY_TIME_MIN 0
# define DELAY_TIME_MAX DELAY_MAX_TIME / 10
# define DELAY_TIME_DEFAULT 0
# define DELAY_FEEDBACK_MIN 0
# define DELAY_FEEDBACK_MAX 100
# define DELAY_FEEDBACK_DEFAULT 0
# define DELAY_LEVEL_MIN 0
# define DELAY_LEVEL_MAX 100
# define DELAY_LEVEL_DEFAULT 0
# define FILTER_CUTOFF_MIN 0
# define FILTER_CUTOFF_MAX 100
# define FILTER_CUTOFF_DEFAULT 0
# define FILTER_RESONANCE_MIN 0
# define FILTER_RESONANCE_MAX 100
# define FILTER_RESONANCE_DEFAULT 0
# define LOUDNESS_MIN 0
# define LOUDNESS_MAX 100
# define LOUDNESS_DEFAULT 100
# define POLYPHONY_MIN 1
# define POLYPHONY_MAX MAX_NOTES
# define POLYPHONY_DEFAULT MAX_NOTES
# define ENGINE_MIN 0
# define ENGINE_MAX 2
# define ENGINE_DEFAULT 0
// struct for holding the current configuration
struct config_t {
uint32_t checksum ;
uint8_t bank ;
uint8_t voice ;
uint8_t vol ;
int8_t pan ;
uint8_t mono ;
uint8_t midi_channel ;
uint8_t reverb_roomsize ;
uint8_t reverb_damping ;
uint8_t reverb_level ;
uint8_t chorus_frequency ;
uint8_t chorus_waveform ;
uint8_t chorus_depth ;
uint8_t chorus_level ;
uint8_t delay_time ;
uint8_t delay_feedback ;
uint8_t delay_level ;
uint8_t filter_cutoff ;
uint8_t filter_resonance ;
uint8_t loudness ;
uint8_t polyphony ;
uint8_t engine ;
} ;
// struct for smoothing value changes
struct value_change_t {
float diff ;
uint16_t steps ;
} ;
inline float mapfloat ( float val , float in_min , float in_max , float out_min , float out_max )
{
return ( val - in_min ) * ( out_max - out_min ) / ( in_max - in_min ) + out_min ;
}
# endif // CONFIG_H_INCLUDED