diff --git a/MicroDexed.ino b/MicroDexed.ino index b46372c..95289a0 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -22,8 +22,8 @@ Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "config.h" #include +#include "config.h" #include #include #include @@ -39,9 +39,14 @@ #include "PluginFx.h" #include "SoftenValue.hpp" #include "UI.hpp" +#include "source_microdexed.h" -AudioPlayQueue queue1; AudioAnalyzePeak peak1; + +//AudioPlayQueue queue1; + +AudioSourceMicroDexed* MicroDexed[NUM_DEXED]; + AudioEffectDelay delay1; AudioEffectModulatedDelay modchorus; AudioSynthWaveform modulator; @@ -54,11 +59,6 @@ AudioAmplifier volume_l; AudioOutputUSB usb1; #endif AudioEffectStereoMono stereomono1; -AudioConnection patchCord0(queue1, peak1); -AudioConnection patchCord1(queue1, 0, delay_fb_mixer, 0); -AudioConnection patchCord2(queue1, 0, modchorus, 0); -AudioConnection patchCord3(queue1, 0 , master_mixer_r, 0); -AudioConnection patchCord4(queue1, 0 , master_mixer_l, 0); AudioConnection patchCord5(modulator, 0, modchorus, 1); #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT AudioFilterBiquad modchorus_filter; @@ -71,8 +71,6 @@ AudioConnection patchCord10(modchorus, 0, master_mixer_l, 3); #endif #if defined(USE_REVERB) AudioEffectFreeverbStereo freeverbs1; -AudioConnection patchCord11(queue1, 0, freeverbs1, 0); -AudioConnection patchCord12(queue1, 0, freeverbs1, 1); AudioConnection patchCord13(freeverbs1, 0, master_mixer_r, 1); AudioConnection patchCord14(freeverbs1, 1, master_mixer_l, 1); #endif @@ -119,13 +117,25 @@ AudioConnection patchCord36(stereomono1, 0, dacOut, 0); AudioConnection patchCord37(stereomono1, 1, dacOut, 1); #endif -Dexed* MicroDexed[NUM_DEXED]; +//Dexed* MicroDexed[NUM_DEXED]; +AudioConnection * dynamicConnections[NUM_DEXED * 7]; +int nDynamic = 0; + +void create_audio_connections(AudioSourceMicroDexed &d) +{ + dynamicConnections[nDynamic++] = new AudioConnection(d, peak1); + dynamicConnections[nDynamic++] = new AudioConnection(d, 0, delay_fb_mixer, 0); + dynamicConnections[nDynamic++] = new AudioConnection(d, 0, modchorus, 0); + dynamicConnections[nDynamic++] = new AudioConnection(d, 0 , master_mixer_r, 0); + dynamicConnections[nDynamic++] = new AudioConnection(d, 0 , master_mixer_l, 0); +#if defined(USE_REVERB) + dynamicConnections[nDynamic++] = new AudioConnection(d, 0, freeverbs1, 0); + dynamicConnections[nDynamic++] = new AudioConnection(d, 0, freeverbs1, 1); +#endif +} bool sd_card_available = false; -uint32_t xrun = 0; -uint32_t overload = 0; -uint32_t peak = 0; -uint16_t render_time_max = 0; + uint8_t max_loaded_banks = 0; char bank_name[BANK_NAME_LEN]; char voice_name[VOICE_NAME_LEN]; @@ -139,12 +149,15 @@ elapsedMillis long_button_pressed; SoftenValue soften_volume; SoftenValue soften_filter_res[NUM_DEXED]; SoftenValue soften_filter_cut[NUM_DEXED]; -elapsedMicros fill_audio_buffer; +//elapsedMicros fill_audio_buffer; elapsedMillis control_rate; uint8_t active_voices = 0; #ifdef SHOW_CPU_LOAD_MSEC elapsedMillis cpu_mem_millis; #endif +//uint32_t overload = 0; +uint32_t peak = 0; + config_t configuration; bool eeprom_update_flag = false; @@ -152,6 +165,7 @@ bool eeprom_update_flag = false; // Allocate the delay lines for left and right channels short delayline[MOD_DELAY_SAMPLE_BUFFER]; + #ifdef ENABLE_LCD_UI /*********************************************************************** LCDMenuLib2 @@ -187,9 +201,10 @@ void setup() { Serial.print(F("Creating MicroDexed engine ")); Serial.println(i, DEC); - MicroDexed[i] = new Dexed(SAMPLE_RATE); + MicroDexed[i] = new AudioSourceMicroDexed(SAMPLE_RATE); + create_audio_connections(*MicroDexed[i]); } - + //microdexed1.setDexeds(NUM_DEXED, MicroDexed); delay(220); Serial.println(F("MicroDexed based on https://github.com/asb2m10/dexed")); @@ -394,11 +409,14 @@ void setup() void loop() { +#ifdef OLD int16_t* audio_buffer; // pointer to AUDIO_BLOCK_SAMPLES * int16_t const uint16_t audio_block_time_us = 1000000 / (SAMPLE_RATE / AUDIO_BLOCK_SAMPLES); +#endif - while (42 == 42) - { + //while (42 == 42) + //{ +#ifdef OLD // Main sound calculation if (queue1.available() && fill_audio_buffer > audio_block_time_us - 10) { @@ -422,6 +440,7 @@ void loop() } queue1.playBuffer(); } +#endif // EEPROM update handling if (autostore >= AUTOSTORE_MS && active_voices == 0 && eeprom_update_flag == true) @@ -504,11 +523,16 @@ void loop() #if defined (DEBUG) && defined (SHOW_CPU_LOAD_MSEC) if (cpu_mem_millis >= SHOW_CPU_LOAD_MSEC) { + if (peak1.available()) + { + if (peak1.read() > 0.99) + peak++; + } cpu_mem_millis -= SHOW_CPU_LOAD_MSEC; show_cpu_and_mem_usage(); } #endif - } + //} } /****************************************************************************** @@ -526,7 +550,7 @@ void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity) { if (checkMidiChannel(inChannel)) { - MicroDexed[0]->keyup(inNumber); + MicroDexed[0]->keyup(inNumber); } } @@ -1139,11 +1163,11 @@ void show_cpu_and_mem_usage(void) Serial.print(F(" MEM MAX: ")); Serial.print(AudioMemoryUsageMax(), DEC); Serial.print(F(" RENDER_TIME_MAX: ")); - Serial.print(render_time_max, DEC); + Serial.print(MicroDexed[0]->render_time_max, DEC); Serial.print(F(" XRUN: ")); - Serial.print(xrun, DEC); + Serial.print(MicroDexed[0]->xrun, DEC); Serial.print(F(" OVERLOAD: ")); - Serial.print(overload, DEC); + Serial.print(MicroDexed[0]->overload, DEC); Serial.print(F(" PEAK: ")); Serial.print(peak, DEC); Serial.print(F(" BLOCKSIZE: ")); @@ -1153,7 +1177,7 @@ void show_cpu_and_mem_usage(void) Serial.println(); AudioProcessorUsageMaxReset(); AudioMemoryUsageMaxReset(); - render_time_max = 0; + MicroDexed[0]->render_time_max = 0; } #endif diff --git a/UI.hpp b/UI.hpp index a56673c..db5be9d 100644 --- a/UI.hpp +++ b/UI.hpp @@ -74,7 +74,7 @@ extern AudioMixer4 master_mixer_l; extern AudioAmplifier volume_r; extern AudioAmplifier volume_l; extern AudioEffectStereoMono stereomono1; -extern Dexed* MicroDexed[NUM_DEXED]; +extern AudioSourceMicroDexed * MicroDexed[NUM_DEXED]; /*********************************************************************** GLOBAL diff --git a/config.h b/config.h index 1051744..0be817d 100644 --- a/config.h +++ b/config.h @@ -26,6 +26,7 @@ #ifndef CONFIG_H_INCLUDED #define CONFIG_H_INCLUDED +#include #include "midinotes.h" // ATTENTION! For better latency you have to redefine AUDIO_BLOCK_SAMPLES from diff --git a/dexed.cpp b/dexed.cpp index b12eb77..31617af 100644 --- a/dexed.cpp +++ b/dexed.cpp @@ -23,9 +23,9 @@ */ +#include "config.h" #include "synth.h" #include "dexed.h" -#include "config.h" #include "EngineMkI.h" #include "EngineOpl.h" #include "fm_core.h" diff --git a/dexed.h b/dexed.h index a3bdaf0..24f69fb 100644 --- a/dexed.h +++ b/dexed.h @@ -38,7 +38,7 @@ #include #include "config.h" -extern uint32_t overload; +//extern uint32_t overload; extern bool load_sysex(uint8_t bank, uint8_t voice_number); extern AudioControlSGTL5000 sgtl5000_1; extern float vol; @@ -187,6 +187,7 @@ class Dexed 16 // number of voices }; // FM-Piano + uint32_t overload = 0; protected: static const uint8_t MAX_ACTIVE_NOTES = MAX_NOTES; uint8_t max_notes = MAX_ACTIVE_NOTES; diff --git a/dexed_sysex.cpp b/dexed_sysex.cpp index 126af77..109d718 100644 --- a/dexed_sysex.cpp +++ b/dexed_sysex.cpp @@ -24,14 +24,14 @@ */ #include +#include "config.h" #include #include #include #include "dexed.h" #include "dexed_sysex.h" -#include "config.h" -extern Dexed* MicroDexed[NUM_DEXED]; +extern AudioSourceMicroDexed * MicroDexed[NUM_DEXED]; void create_sysex_filename(uint8_t b, char* sysex_file_name) { @@ -349,7 +349,7 @@ bool get_sysex_voice(File sysex, uint8_t voice_number, uint8_t* data) return (false); } - render_time_max = 0; + MicroDexed[0]->render_time_max = 0; return (true); } diff --git a/dexed_sysex.h b/dexed_sysex.h index e26bea1..8900008 100644 --- a/dexed_sysex.h +++ b/dexed_sysex.h @@ -24,13 +24,15 @@ */ #include "config.h" +#include "source_microdexed.h" #ifndef DEXED_SYSEX_H_INCLUDED #define DEXED_SYSEX_H_INCLUDED extern bool sd_card_available; extern Dexed* dexed; -extern uint16_t render_time_max; +extern AudioSourceMicroDexed * MicroDexed[NUM_DEXED]; +//extern uint16_t render_time_max; extern uint8_t bank; extern uint8_t voice; extern char bank_name[BANK_NAME_LEN]; diff --git a/effect_modulated_delay.cpp b/effect_modulated_delay.cpp index d9a1f99..afb3697 100644 --- a/effect_modulated_delay.cpp +++ b/effect_modulated_delay.cpp @@ -22,10 +22,10 @@ */ #include +#include "config.h" #include #include "arm_math.h" #include "effect_modulated_delay.h" -#include "config.h" extern config_t configuration; diff --git a/fm_op_kernel.cpp b/fm_op_kernel.cpp index d3bd0cf..f730d63 100644 --- a/fm_op_kernel.cpp +++ b/fm_op_kernel.cpp @@ -14,6 +14,7 @@ * limitations under the License. */ +#include "config.h" #include #include @@ -25,7 +26,6 @@ #include "synth.h" #include "sin.h" #include "fm_op_kernel.h" -#include "config.h" #ifdef HAVE_NEON static bool hasNeon() { diff --git a/source_microdexed.h b/source_microdexed.h new file mode 100644 index 0000000..bcd6b81 --- /dev/null +++ b/source_microdexed.h @@ -0,0 +1,29 @@ +#pragma once +#include "config.h" +#include "dexed.h" + +#include + +class AudioSourceMicroDexed : public AudioStream, public Dexed { + public: + const uint16_t audio_block_time_us = 1000000 / (SAMPLE_RATE / AUDIO_BLOCK_SAMPLES); + uint32_t xrun = 0; + uint16_t render_time_max = 0; + AudioSourceMicroDexed(int sample_rate) : AudioStream(0, NULL), Dexed(sample_rate) { + }; + void update(void) { + elapsedMicros render_time; + audio_block_t *lblock; + lblock = allocate(); + if (!lblock) return; + getSamples(AUDIO_BLOCK_SAMPLES, lblock->data); + if (render_time > audio_block_time_us) // everything greater 2.9ms is a buffer underrun! + xrun++; + if (render_time > render_time_max) + render_time_max = render_time; + + transmit(lblock, 0); + release(lblock); + }; +private: +};