/*
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 < 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 DEXED_H_INCLUDED
# define DEXED_H_INCLUDED
# include <Arduino.h>
# include "controllers.h"
# include "dx7note.h"
# include "lfo.h"
# include "synth.h"
# include "fm_core.h"
# include "EngineMkI.h"
# include "EngineOpl.h"
struct ProcessorVoice {
uint8_t midi_note ;
uint8_t velocity ;
bool keydown ;
bool sustained ;
bool live ;
Dx7Note * dx7_note ;
} ;
enum DexedEngineResolution {
DEXED_ENGINE_MODERN , // 0
DEXED_ENGINE_MARKI , // 1
DEXED_ENGINE_OPL // 2
} ;
enum DexedVoiceOPParameters {
DEXED_OP_EG_R1 , // 0
DEXED_OP_EG_R2 , // 1
DEXED_OP_EG_R3 , // 2
DEXED_OP_EG_R4 , // 3
DEXED_OP_EG_L1 , // 4
DEXED_OP_EG_L2 , // 5
DEXED_OP_EG_L3 , // 6
DEXED_OP_EG_L4 , // 7
DEXED_OP_LEV_SCL_BRK_PT , // 8
DEXED_OP_SCL_LEFT_DEPTH , // 9
DEXED_OP_SCL_RGHT_DEPTH , // 10
DEXED_OP_SCL_LEFT_CURVE , // 11
DEXED_OP_SCL_RGHT_CURVE , // 12
DEXED_OP_OSC_RATE_SCALE , // 13
DEXED_OP_AMP_MOD_SENS , // 14
DEXED_OP_KEY_VEL_SENS , // 15
DEXED_OP_OUTPUT_LEV , // 16
DEXED_OP_OSC_MODE , // 17
DEXED_OP_FREQ_COARSE , // 18
DEXED_OP_FREQ_FINE , // 19
DEXED_OP_OSC_DETUNE // 20
} ;
# define DEXED_VOICE_OFFSET 126
enum DexedVoiceParameters {
DEXED_PITCH_EG_R1 , // 0
DEXED_PITCH_EG_R2 , // 1
DEXED_PITCH_EG_R3 , // 2
DEXED_PITCH_EG_R4 , // 3
DEXED_PITCH_EG_L1 , // 4
DEXED_PITCH_EG_L2 , // 5
DEXED_PITCH_EG_L3 , // 6
DEXED_PITCH_EG_L4 , // 7
DEXED_ALGORITHM , // 8
DEXED_FEEDBACK , // 9
DEXED_OSC_KEY_SYNC , // 10
DEXED_LFO_SPEED , // 11
DEXED_LFO_DELAY , // 12
DEXED_LFO_PITCH_MOD_DEP , // 13
DEXED_LFO_AMP_MOD_DEP , // 14
DEXED_LFO_SYNC , // 15
DEXED_LFO_WAVE , // 16
DEXED_LFO_PITCH_MOD_SENS , // 17
DEXED_TRANSPOSE , // 18
DEXED_NAME // 19
} ;
# define DEXED_GLOBAL_PARAMETER_OFFSET 155
enum DexedGlobalParameters {
DEXED_PITCHBEND_RANGE , // 0
DEXED_PITCHBEND_STEP , // 1
DEXED_MODWHEEL_RANGE , // 2
DEXED_MODWHEEL_ASSIGN , // 3
DEXED_FOOTCTRL_RANGE , // 4
DEXED_FOOTCTRL_ASSIGN , // 5
DEXED_BREATHCTRL_RANGE , // 6
DEXED_BREATHCTRL_ASSIGN , // 7
DEXED_AT_RANGE , // 8
DEXED_AT_ASSIGN , // 9
DEXED_MASTER_TUNE , // 10
DEXED_OP1_ENABLE , // 11
DEXED_OP2_ENABLE , // 12
DEXED_OP3_ENABLE , // 13
DEXED_OP4_ENABLE , // 14
DEXED_OP5_ENABLE , // 15
DEXED_OP6_ENABLE , // 16
DEXED_MAX_NOTES // 17
} ;
// GLOBALS
//==============================================================================
class Dexed
{
public :
Dexed ( int rate ) ;
~ Dexed ( ) ;
void activate ( void ) ;
void deactivate ( void ) ;
uint8_t getEngineType ( ) ;
void setEngineType ( uint8_t tp ) ;
bool isMonoMode ( void ) ;
void setMonoMode ( bool mode ) ;
void getSamples ( uint16_t n_samples , int16_t * buffer ) ;
bool processMidiMessage ( uint8_t type , uint8_t data1 , uint8_t data2 ) ;
void panic ( void ) ;
void notesOff ( void ) ;
void setMaxNotes ( uint8_t n ) ;
void doRefreshVoice ( void ) ;
void setOPs ( uint8_t ops ) ;
bool loadSysexVoice ( uint8_t * data ) ;
Controllers controllers ;
uint8_t data [ 173 ] = {
95 , 29 , 20 , 50 , 99 , 95 , 00 , 00 , 41 , 00 , 19 , 00 , 00 , 03 , 00 , 06 , 79 , 00 , 01 , 00 , 14 , // OP6 eg_rate_1-4, level_1-4, kbd_lev_scl_brk_pt, kbd_lev_scl_lft_depth, kbd_lev_scl_rht_depth, kbd_lev_scl_lft_curve, kbd_lev_scl_rht_curve, kbd_rate_scaling, amp_mod_sensitivity, key_vel_sensitivity, operator_output_level, osc_mode, osc_freq_coarse, osc_freq_fine, osc_detune
95 , 20 , 20 , 50 , 99 , 95 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 03 , 00 , 00 , 99 , 00 , 01 , 00 , 00 , // OP5
95 , 29 , 20 , 50 , 99 , 95 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 03 , 00 , 06 , 89 , 00 , 01 , 00 , 07 , // OP4
95 , 20 , 20 , 50 , 99 , 95 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 03 , 00 , 02 , 99 , 00 , 01 , 00 , 07 , // OP3
95 , 50 , 35 , 78 , 99 , 75 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 03 , 00 , 07 , 58 , 00 , 14 , 00 , 07 , // OP2
96 , 25 , 25 , 67 , 99 , 75 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 03 , 00 , 02 , 99 , 00 , 01 , 00 , 10 , // OP1
94 , 67 , 95 , 60 , 50 , 50 , 50 , 50 , // 4 * pitch EG rates, 4 *pitch EG level
04 , 06 , 00 , // algorithm, feedback, osc sync
34 , 33 , 00 , 00 , 00 , 04 , // lfo speed, lfo delay, lfo pitch_mod_depth, lfo_amp_mod_depth, lfo_sync, lfo_waveform
03 , 24 , // pitch_mod_sensitivity, transpose
00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , 00 , // 10 * char for name
01 , 00 , 99 , 00 , 99 , 00 , 99 , 00 , 99 , 00 , // pitch_bend_range, pitch_bend_step, mod_wheel_range, mod_wheel_assign, foot_ctrl_range, foot_ctrl_assign, breath_ctrl_range, breath_ctrl_assign, aftertouch_range, aftertouch_assign
00 , // master tune
01 , 01 , 01 , 01 , 01 , 01 , // OP1-6 enable
16 // number of voices
} ; // FM-Piano
protected :
//void onParam(uint8_t param_num,float param_val);
void keyup ( uint8_t pitch ) ;
void keydown ( uint8_t pitch , uint8_t velo ) ;
static const uint8_t MAX_ACTIVE_NOTES = 16 ;
uint8_t max_notes = MAX_ACTIVE_NOTES ;
ProcessorVoice voices [ MAX_ACTIVE_NOTES ] ;
uint8_t currentNote ;
bool sustain ;
bool monoMode ;
bool refreshVoice ;
uint8_t engineType ;
Lfo lfo ;
FmCore * engineMsfa ;
EngineMkI * engineMkI ;
EngineOpl * engineOpl ;
} ;
# endif // PLUGINPROCESSOR_H_INCLUDED