From 2c9c54c517dc2bc98dc2d43563a23fc64b4039b0 Mon Sep 17 00:00:00 2001 From: Holger Wirtz Date: Sat, 10 Jul 2021 10:06:18 +0200 Subject: [PATCH] Added fixed version of Synth_Dexed to third-party software folder. --- third-party/Synth_Dexed/README.md | 172 +++++++++++++++++- .../Synth_Dexed/examples/synth_dexed.ino | 2 +- third-party/Synth_Dexed/src/synth_dexed.cpp | 5 +- third-party/Synth_Dexed/src/synth_dexed.h | 2 +- 4 files changed, 174 insertions(+), 7 deletions(-) diff --git a/third-party/Synth_Dexed/README.md b/third-party/Synth_Dexed/README.md index bcedf2d..87b548e 100644 --- a/third-party/Synth_Dexed/README.md +++ b/third-party/Synth_Dexed/README.md @@ -1,2 +1,172 @@ -# synth_dexed +# Synth_Dexed +Synth_Dexed is a port of the Dexed sound engine +(https://github.com/asb2m10/dexed) as library for the Teensy-3.5/3.6/4.x with +an audio shield. Dexed ist heavily based on +https://github.com/google/music-synthesizer-for-android . +Synth_Dexed ist SYSEX compatible with a famous 6-OP FM synth and is used in MicroDexed (https://codeberg.org/dcoredump/MicroDexed). + +## License +MicroDexed is licensed on the GPL v3. The msfa component (acronym for music synthesizer for android, see https://github.com/google/music-synthesizer-for-android) stays on the Apache 2.0 license to able to collaborate between projects. + +## Credits & thanks + +* Dexed engine by Pascal Gauthier (asb2m10) +* DX Synth engine (as part of Dexed): Raph Levien and the msfa team +* PPPlay : Great OPL3 implementation, with documented code :D +* Thierry Pottier: for extreme testing, discussing about different options, images and many good suggestions for UI handling +* Lars Pelz: Testing and documentation +* Mark (@positionhigh) for testing + +## Usage + +See example sketch. + +## API + + AudioSynthDexed(uint8_t max_notes, uint16_t sample_rate); + + // Global methods + void activate(void); + void deactivate(void); + void setMonoMode(bool mode); + bool getMonoMode(void); + void setRefreshMode(bool mode); + bool getRefreshMode(void); + void setMaxNotes(uint8_t n); + uint8_t getMaxNotes(void); + void doRefreshVoice(void); + bool decodeVoice(uint8_t* encoded_data, uint8_t* data); + bool encodeVoice(uint8_t* encoded_data); + bool getVoiceData(uint8_t* data_copy); + void setVoiceDataElement(uint8_t address, uint8_t value); + uint8_t getVoiceDataElement(uint8_t address); + void loadInitVoice(void); + void loadVoiceParameters(uint8_t* data); + uint8_t getNumNotesPlaying(void); + uint32_t getXRun(void); + uint16_t getRenderTimeMax(void); + void resetRenderTimeMax(void); + void ControllersRefresh(void); + + // Sound methods + void keyup(int16_t pitch); + void keydown(int16_t pitch, uint8_t velo); + void setSustain(bool sustain); + bool getSustain(void); + void panic(void); + void notesOff(void); + void resetControllers(void); + void setMasterTune(int8_t mastertune); + int8_t getMasterTune(void); + void setPortamentoMode(uint8_t portamento_mode, uint8_t portamento_glissando, uint8_t portamento_time); + void setPBController(uint8_t pb_range, uint8_t pb_step); + void setMWController(uint8_t mw_range, uint8_t mw_assign, uint8_t mw_mode); + void setFCController(uint8_t fc_range, uint8_t fc_assign, uint8_t fc_mode); + void setBCController(uint8_t bc_range, uint8_t bc_assign, uint8_t bc_mode); + void setATController(uint8_t at_range, uint8_t at_assign, uint8_t at_mode); + void setModWheel(uint8_t value); + uint8_t getModWheel(void); + void setBreathController(uint8_t value); + uint8_t getBreathController(void); + void setFootController(uint8_t value); + uint8_t getFootController(void); + void setAftertouch(uint8_t value); + uint8_t getAftertouch(void); + void setPitchbend(int16_t value); + int16_t getPitchbend(void); + void setPitchbendRange(uint8_t range); + uint8_t getPitchbendRange(void); + void setPitchbendStep(uint8_t step); + uint8_t getPitchbendStep(void); + void setModWheelRange(uint8_t range); + uint8_t getModWheelRange(void); + void setModWheelTarget(uint8_t target); + uint8_t getModWheelTarget(void); + void setFootControllerRange(uint8_t range); + uint8_t getFootControllerRange(void); + void setFootControllerTarget(uint8_t target); + uint8_t getFootControllerTarget(void); + void setBreathControllerRange(uint8_t range); + uint8_t getBreathControllerRange(void); + void setBreathControllerTarget(uint8_t target); + uint8_t getBreathControllerTarget(void); + void setAftertouchRange(uint8_t range); + uint8_t getAftertouchRange(void); + void setAftertouchTarget(uint8_t target); + uint8_t getAftertouchTarget(void); + void setFilterCutoff(float cutoff); + float getFilterCutoff(void); + void setFilterResonance(float resonance); + float getFilterResonance(void); + void setGain(float gain); + float getGain(void); + + // Voice configuration methods + void setOPAll(uint8_t ops); + void setOP(uint8_t op, bool state); + bool getOP(uint8_t op); + void setOPRateAll(uint8_t rate); + void setOPLevelAll(uint8_t level); + void setOPRateAllCarrier(uint8_t step, uint8_t rate); + void setOPLevelAllCarrier(uint8_t step, uint8_t level); + void setOPRateAllModulator(uint8_t step, uint8_t rate); + void setOPLevelAllModulator(uint8_t step, uint8_t level); + void setOPRate(uint8_t op, uint8_t step, uint8_t rate); + uint8_t getOPRate(uint8_t op, uint8_t step); + void setOPLevel(uint8_t op, uint8_t step, uint8_t level); + uint8_t getOPLevel(uint8_t op, uint8_t step); + void setOPKeyboardLevelScalingBreakPoint(uint8_t op, uint8_t level); + uint8_t getOPKeyboardLevelScalingBreakPoint(uint8_t op); + void setOPKeyboardLevelScalingDepthLeft(uint8_t op, uint8_t depth); + uint8_t getOPKeyboardLevelScalingDepthLeft(uint8_t op); + void setOPKeyboardLevelScalingDepthRight(uint8_t op, uint8_t depth); + uint8_t getOPKeyboardLevelScalingDepthRight(uint8_t op); + void setOPKeyboardLevelScalingCurveLeft(uint8_t op, uint8_t curve); + uint8_t getOPKeyboardLevelScalingCurveLeft(uint8_t op); + void setOPKeyboardLevelScalingCurveRight(uint8_t op, uint8_t curve); + uint8_t getOPKeyboardLevelScalingCurveRight(uint8_t op); + void setOPKeyboardRateScale(uint8_t op, uint8_t scale); + uint8_t getOPKeyboardRateScale(uint8_t op); + void setOPAmpModulationSensity(uint8_t op, uint8_t sensitivity); + uint8_t getOPAmpModulationSensity(uint8_t op); + void setOPKeyboardVelocitySensity(uint8_t op, uint8_t sensitivity); + uint8_t getOPKeyboardVelocitySensity(uint8_t op); + void setOPOutputLevel(uint8_t op, uint8_t level); + uint8_t getOPOutputLevel(uint8_t op); + void setOPMode(uint8_t op, uint8_t mode); + uint8_t getOPMode(uint8_t op); + void setOPFrequencyCoarse(uint8_t op, uint8_t frq_coarse); + uint8_t getOPFrequencyCoarse(uint8_t op); + void setOPFrequencyFine(uint8_t op, uint8_t frq_fine); + uint8_t getOPFrequencyFine(uint8_t op); + void setOPDetune(uint8_t op, uint8_t detune); + uint8_t getOPDetune(uint8_t op); + void setPitchRate(uint8_t step, uint8_t rate); + uint8_t getPitchRate(uint8_t step); + void setPitchLevel(uint8_t step, uint8_t level); + uint8_t getPitchLevel(uint8_t step); + void setAlgorithm(uint8_t algorithm); + uint8_t getAlgorithm(void); + void setFeedback(uint8_t feedback); + uint8_t getFeedback(void); + void setOscillatorSync(bool sync); + bool getOscillatorSync(void); + void setLFOSpeed(uint8_t speed); + uint8_t getLFOSpeed(void); + void setLFODelay(uint8_t delay); + uint8_t getLFODelay(void); + void setLFOPitchModulationDepth(uint8_t depth); + uint8_t getLFOPitchModulationDepth(void); + void setLFOAmpModulationDepth(uint8_t delay); + uint8_t getLFOAmpModulationDepth(void); + void setLFOSync(bool sync); + bool getLFOSync(void); + void setLFOWaveform(uint8_t waveform); + uint8_t getLFOWaveform(void); + void setLFOPitchModulationSensitivity(uint8_t sensitivity); + uint8_t getLFOPitchModulationSensitivity(void); + void setTranspose(uint8_t transpose); + uint8_t getTranspose(void); + void setName(char* name); + void getName(char* buffer); \ No newline at end of file diff --git a/third-party/Synth_Dexed/examples/synth_dexed.ino b/third-party/Synth_Dexed/examples/synth_dexed.ino index 8f89666..e3132af 100644 --- a/third-party/Synth_Dexed/examples/synth_dexed.ino +++ b/third-party/Synth_Dexed/examples/synth_dexed.ino @@ -15,7 +15,7 @@ uint8_t fmpiano_sysex[156] = { 70, 77, 45, 80, 73, 65, 78, 79, 00, 00 // 10 * char for name ("DEFAULT ") }; // FM-Piano -AudioSynthDexed dexed(SAMPLE_RATE); +AudioSynthDexed dexed(4,SAMPLE_RATE); // 4 voices max AudioOutputI2S i2s1; AudioControlSGTL5000 sgtl5000_1; AudioConnection patchCord1(dexed, 0, i2s1, 0); diff --git a/third-party/Synth_Dexed/src/synth_dexed.cpp b/third-party/Synth_Dexed/src/synth_dexed.cpp index dbd28f8..95b5de0 100644 --- a/third-party/Synth_Dexed/src/synth_dexed.cpp +++ b/third-party/Synth_Dexed/src/synth_dexed.cpp @@ -48,9 +48,6 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -extern int perform_attack_mod; -extern int perform_release_mod; - const float dc = 1e-18; inline static float tptpc(float& state, float inp, float cutoff) { @@ -594,7 +591,7 @@ void Dexed::doRefreshVoice(void) refreshVoice = true; } -void Dexed::setOPs(uint8_t ops) +void Dexed::setOPAll(uint8_t ops) { controllers.opSwitch = ops; } diff --git a/third-party/Synth_Dexed/src/synth_dexed.h b/third-party/Synth_Dexed/src/synth_dexed.h index 70a70f2..6a799d3 100644 --- a/third-party/Synth_Dexed/src/synth_dexed.h +++ b/third-party/Synth_Dexed/src/synth_dexed.h @@ -1156,7 +1156,7 @@ class Dexed void setMaxNotes(uint8_t n); uint8_t getMaxNotes(void); void doRefreshVoice(void); - void setOPs(uint8_t ops); + void setOPAll(uint8_t ops); bool decodeVoice(uint8_t* encoded_data, uint8_t* data); bool encodeVoice(uint8_t* encoded_data); bool getVoiceData(uint8_t* data_copy);