Added function for setting max acceptable notes.

Limited to 10 notes at a time to avoid xruns.
pull/4/head
Holger Wirtz 7 years ago
parent bbebaa85d3
commit ba27df8a81
  1. 29
      MicroDexed.ino
  2. 14
      dexed.cpp
  3. 9
      dexed.h

@ -14,14 +14,14 @@
#include <MIDI.h>
#include "dexed.h"
#define AUDIO_MEM 32
#define AUDIO_MEM 2
#define AUDIO_BUFFER_SIZE 128
#define SAMPLEAUDIO_BUFFER_SIZE 44100
#define INIT_AUDIO_QUEUE 1
//#define SHOW_DEXED_TIMING 1
#define SHOW_XRUN 1
#define SHOW_CPU_LOAD
#define SHOW_CPU_LOAD_MSEC 5000
#define MAX_NOTES 10
#define TEST_MIDI 1
#define TEST_NOTE 40
#define TEST_VEL 60
@ -40,7 +40,7 @@ IntervalTimer sched;
void setup()
{
while (!Serial) ; // wait for Arduino Serial Monitor
//while (!Serial) ; // wait for Arduino Serial Monitor
Serial.begin(115200);
Serial.println(F("MicroDexed based on https://github.com/asb2m10/dexed"));
Serial.println(F("(c)2018 H. Wirtz"));
@ -56,7 +56,7 @@ void setup()
sgtl5000_1.volume(0.2);
// Initialize processor and memory measurements
#ifdef SHOW_CPU_LOAD
#ifdef SHOW_CPU_LOAD_MSEC
AudioProcessorUsageMaxReset();
AudioMemoryUsageMaxReset();
#endif
@ -75,6 +75,7 @@ void setup()
#endif
dexed->activate();
dexed->setMaxNotes(MAX_NOTES);
#ifdef TEST_MIDI
@ -89,17 +90,18 @@ void setup()
queue_midi_event(0x90, TEST_NOTE + 32, TEST_VEL); // 9
queue_midi_event(0x90, TEST_NOTE + 37, TEST_VEL); // 10
queue_midi_event(0x90, TEST_NOTE + 40, TEST_VEL); // 11
//queue_midi_event(0x90, TEST_NOTE + 44, TEST_VEL); // 12
//queue_midi_event(0x90, TEST_NOTE + 49, TEST_VEL); // 13
//queue_midi_event(0x90, TEST_NOTE + 52, TEST_VEL); // 14
//queue_midi_event(0x90, TEST_NOTE + 57, TEST_VEL); // 15
//queue_midi_event(0x90, TEST_NOTE + 60, TEST_VEL); // 16
queue_midi_event(0x90, TEST_NOTE + 44, TEST_VEL); // 12
queue_midi_event(0x90, TEST_NOTE + 49, TEST_VEL); // 13
queue_midi_event(0x90, TEST_NOTE + 52, TEST_VEL); // 14
queue_midi_event(0x90, TEST_NOTE + 57, TEST_VEL); // 15
queue_midi_event(0x90, TEST_NOTE + 60, TEST_VEL); // 16
#endif
#ifdef SHOW_CPU_LOAD
sched.begin(cpu_and_mem_usage, SHOW_CPU_LOAD_MSEC*1000);
#ifdef SHOW_CPU_LOAD_MSEC
sched.begin(cpu_and_mem_usage, SHOW_CPU_LOAD_MSEC * 1000);
#endif
Serial.println(F("setup end"));
cpu_and_mem_usage();
}
void loop()
@ -107,6 +109,8 @@ void loop()
int16_t* audio_buffer; // pointer to 128 * int16_t
bool break_for_calculation;
while (42 == 42) // DON'T PANIC!
{
audio_buffer = queue1.getBuffer();
if (audio_buffer == NULL)
{
@ -133,6 +137,7 @@ void loop()
Serial.println(t1, DEC);
#endif
queue1.playBuffer();
}
}
bool queue_midi_event(uint8_t type, uint8_t data1, uint8_t data2)
@ -140,7 +145,7 @@ bool queue_midi_event(uint8_t type, uint8_t data1, uint8_t data2)
return (dexed->ProcessMidiMessage(type, data1, data2));
}
#ifdef SHOW_CPU_LOAD
#ifdef SHOW_CPU_LOAD_MSEC
void cpu_and_mem_usage(void)
{
Serial.print(F("CPU:"));

@ -106,7 +106,7 @@ Dexed::~Dexed()
{
currentNote = -1;
for (uint8_t note = 0; note < MAX_ACTIVE_NOTES; ++note)
for (uint8_t note = 0; note < MAX_ACTIVE_NOTES; note++)
delete voices[note].dx7_note;
delete(engineMsfa);
@ -195,7 +195,7 @@ void Dexed::GetSamples(uint16_t n_samples, int16_t* buffer)
extra_buf_size_ = i - n_samples;
}
/* if (++_k_rate_counter == 0 && !monoMode)
/* if (++_k_rate_counter == 0 && !monoMode)
{
uint8_t op_carrier = controllers.core->get_carrier_operators(data[134]); // look for carriers
@ -575,6 +575,16 @@ void Dexed::notes_off(void) {
}
}
void Dexed::setMaxNotes(uint8_t n) {
if (n <= MAX_ACTIVE_NOTES)
{
notes_off();
max_notes = n;
panic();
controllers.refresh();
}
}
void Dexed::set_params(void)
{
/* //TRACE("Hi");

@ -66,7 +66,9 @@ class Dexed
void set_params(void);
void GetSamples(uint16_t n_samples, int16_t* buffer);
bool ProcessMidiMessage(uint8_t type, uint8_t data1, uint8_t data2);
void panic(void);
void notes_off(void);
void setMaxNotes(uint8_t n);
Controllers controllers;
VoiceStatus voiceStatus;
@ -74,10 +76,9 @@ class Dexed
//void onParam(uint8_t param_num,float param_val);
void keyup(uint8_t pitch);
void keydown(uint8_t pitch, uint8_t velo);
void panic(void);
void notes_off(void);
static const uint8_t MAX_ACTIVE_NOTES = 32;
static const uint8_t MAX_ACTIVE_NOTES = 16;
uint8_t max_notes = MAX_ACTIVE_NOTES;
ProcessorVoice voices[MAX_ACTIVE_NOTES];
uint8_t currentNote;

Loading…
Cancel
Save