Merge branch 'dev' of dirkenstein/MicroDexed into dev

Wow - that's really great!!!
pull/7/head
Holger Wirtz 5 years ago committed by Gitea
commit 35222fe302
  1. 74
      MicroDexed.ino
  2. 2
      UI.hpp
  3. 1
      config.h
  4. 2
      dexed.cpp
  5. 3
      dexed.h
  6. 6
      dexed_sysex.cpp
  7. 4
      dexed_sysex.h
  8. 2
      effect_modulated_delay.cpp
  9. 2
      fm_op_kernel.cpp
  10. 29
      source_microdexed.h

@ -22,8 +22,8 @@
Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "config.h"
#include <limits.h>
#include "config.h"
#include <Audio.h>
#include <Wire.h>
#include <SPI.h>
@ -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 <uint8_t> soften_volume;
SoftenValue <uint8_t> soften_filter_res[NUM_DEXED];
SoftenValue <uint8_t> 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

@ -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

@ -26,6 +26,7 @@
#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

@ -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"

@ -38,7 +38,7 @@
#include <Audio.h>
#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;

@ -24,14 +24,14 @@
*/
#include <Arduino.h>
#include "config.h"
#include <Wire.h>
#include <SPI.h>
#include <SD.h>
#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);
}

@ -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];

@ -22,10 +22,10 @@
*/
#include <Arduino.h>
#include "config.h"
#include <Audio.h>
#include "arm_math.h"
#include "effect_modulated_delay.h"
#include "config.h"
extern config_t configuration;

@ -14,6 +14,7 @@
* limitations under the License.
*/
#include "config.h"
#include <math.h>
#include <cstdlib>
@ -25,7 +26,6 @@
#include "synth.h"
#include "sin.h"
#include "fm_op_kernel.h"
#include "config.h"
#ifdef HAVE_NEON
static bool hasNeon() {

@ -0,0 +1,29 @@
#pragma once
#include "config.h"
#include "dexed.h"
#include <AudioStream.h>
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:
};
Loading…
Cancel
Save