diff --git a/MicroDexed.ino b/MicroDexed.ino index 178545e..3453404 100644 --- a/MicroDexed.ino +++ b/MicroDexed.ino @@ -39,9 +39,13 @@ #include "PluginFx.h" #include "SoftenValue.hpp" #include "UI.hpp" +#include "source_microdexed.h" -AudioPlayQueue queue1; AudioAnalyzePeak peak1; + +AudioSourceMicroDexed microdexed1; +//AudioPlayQueue queue1; + AudioEffectDelay delay1; AudioEffectModulatedDelay modchorus; AudioSynthWaveform modulator; @@ -54,11 +58,11 @@ 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 patchCord0(microdexed1, peak1); +AudioConnection patchCord1(microdexed1, 0, delay_fb_mixer, 0); +AudioConnection patchCord2(microdexed1, 0, modchorus, 0); +AudioConnection patchCord3(microdexed1, 0 , master_mixer_r, 0); +AudioConnection patchCord4(microdexed1, 0 , master_mixer_l, 0); AudioConnection patchCord5(modulator, 0, modchorus, 1); #if MOD_FILTER_OUTPUT != MOD_NO_FILTER_OUTPUT AudioFilterBiquad modchorus_filter; @@ -71,8 +75,8 @@ 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 patchCord11(microdexed1, 0, freeverbs1, 0); +AudioConnection patchCord12(microdexed1, 0, freeverbs1, 1); AudioConnection patchCord13(freeverbs1, 0, master_mixer_r, 1); AudioConnection patchCord14(freeverbs1, 1, master_mixer_l, 1); #endif @@ -122,10 +126,7 @@ AudioConnection patchCord37(stereomono1, 1, dacOut, 1); Dexed* MicroDexed[NUM_DEXED]; 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 +140,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 +156,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 @@ -188,8 +193,9 @@ void setup() Serial.print(F("Creating MicroDexed engine ")); Serial.println(i, DEC); MicroDexed[i] = new Dexed(SAMPLE_RATE); + } - + microdexed1.setDexeds(NUM_DEXED, MicroDexed); delay(220); Serial.println(F("MicroDexed based on https://github.com/asb2m10/dexed")); @@ -394,11 +400,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 +431,7 @@ void loop() } queue1.playBuffer(); } +#endif // EEPROM update handling if (autostore >= AUTOSTORE_MS && active_voices == 0 && eeprom_update_flag == true) @@ -504,11 +514,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 +541,7 @@ void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity) { if (checkMidiChannel(inChannel)) { - MicroDexed[0]->keyup(inNumber); + MicroDexed[0]->keyup(inNumber); } } @@ -1139,9 +1154,9 @@ 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(microdexed1.render_time_max, DEC); Serial.print(F(" XRUN: ")); - Serial.print(xrun, DEC); + Serial.print(microdexed1.xrun, DEC); Serial.print(F(" OVERLOAD: ")); Serial.print(overload, DEC); Serial.print(F(" PEAK: ")); @@ -1153,7 +1168,7 @@ void show_cpu_and_mem_usage(void) Serial.println(); AudioProcessorUsageMaxReset(); AudioMemoryUsageMaxReset(); - render_time_max = 0; + microdexed1.render_time_max = 0; } #endif diff --git a/dexed_sysex.cpp b/dexed_sysex.cpp index daeccd2..010e79f 100644 --- a/dexed_sysex.cpp +++ b/dexed_sysex.cpp @@ -349,7 +349,7 @@ bool get_sysex_voice(File sysex, uint8_t voice_number, uint8_t* data) return (false); } - render_time_max = 0; + microdexed1.render_time_max = 0; return (true); } diff --git a/dexed_sysex.h b/dexed_sysex.h index e26bea1..88f0d1d 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 microdexed1; +//extern uint16_t render_time_max; extern uint8_t bank; extern uint8_t voice; extern char bank_name[BANK_NAME_LEN]; diff --git a/source_microdexed.h b/source_microdexed.h new file mode 100644 index 0000000..3bd5615 --- /dev/null +++ b/source_microdexed.h @@ -0,0 +1,39 @@ +#pragma once +#include "config.h" +#include "dexed.h" + +#include + +class AudioSourceMicroDexed : public AudioStream { + public: + const uint16_t audio_block_time_us = 1000000 / (SAMPLE_RATE / AUDIO_BLOCK_SAMPLES); + uint32_t xrun = 0; + uint16_t render_time_max = 0; + AudioAnalyzePeak * peak1 =NULL; + int num_dexeds = 0; + Dexed ** dexeds = NULL; + AudioSourceMicroDexed() : AudioStream(0, NULL) { + }; + void setDexeds(int num, Dexed ** pdexed) { + dexeds = pdexed; + num_dexeds = num; + } + void update(void) { + elapsedMicros render_time; + audio_block_t *lblock; + lblock = allocate(); + if (!lblock) return; + for (uint8_t i = 0; i < num_dexeds; i++) + { + dexeds[i]->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: +};