Trying to fix stopping of unheard notes.

pull/41/head
Holger Wirtz 3 years ago
parent 6fdce7fad2
commit bae8dbe1c9
  1. 12
      MicroDexed.ino
  2. 4
      config.h
  3. 4
      controllers.h
  4. 60
      dexed.cpp
  5. 5
      dexed.h
  6. 41
      fm_core.cpp
  7. 2
      source_microdexed.h

@ -175,7 +175,7 @@ AudioConnection * dynamicConnections[NUM_DEXED * 4];
#endif #endif
void create_audio_engine_chain(uint8_t instance_id) void create_audio_engine_chain(uint8_t instance_id)
{ {
MicroDexed[instance_id] = new AudioSourceMicroDexed(SAMPLE_RATE); MicroDexed[instance_id] = new AudioSourceMicroDexed(SAMPLE_RATE, instance_id);
mono2stereo[instance_id] = new AudioEffectMonoStereo(); mono2stereo[instance_id] = new AudioEffectMonoStereo();
#if defined(USE_FX) #if defined(USE_FX)
chorus_modulator[instance_id] = new AudioSynthWaveform(); chorus_modulator[instance_id] = new AudioSynthWaveform();
@ -2458,6 +2458,7 @@ void SerialPrintFormatInt3(uint8_t num)
Serial.print(buf); Serial.print(buf);
} }
#ifdef TEENSY3_6
/* From: https://forum.pjrc.com/threads/33443-How-to-display-free-ram */ /* From: https://forum.pjrc.com/threads/33443-How-to-display-free-ram */
extern "C" char* sbrk(int incr); extern "C" char* sbrk(int incr);
uint32_t FreeMem(void) uint32_t FreeMem(void)
@ -2465,6 +2466,15 @@ uint32_t FreeMem(void)
char top; char top;
return &top - reinterpret_cast<char*>(sbrk(0)); return &top - reinterpret_cast<char*>(sbrk(0));
} }
#else
/* From: https://forum.pjrc.com/threads/33443-How-to-display-free-ram */
extern unsigned long _heap_end;
extern char *__brkval;
int FreeMem(void)
{
return (char *)&_heap_end - __brkval;
}
#endif
/* /*
uint32_t FreeMem(void) { // for Teensy 3.0 uint32_t FreeMem(void) { // for Teensy 3.0
uint32_t stackTop; uint32_t stackTop;

@ -59,7 +59,7 @@
// sed -i.orig 's/^#define USB_MIDI_SYSEX_MAX 290/#define USB_MIDI_SYSEX_MAX 4104/' /usr/local/arduino-teensy/hardware/teensy/avr/cores/teensy4/usb_midi.h // sed -i.orig 's/^#define USB_MIDI_SYSEX_MAX 290/#define USB_MIDI_SYSEX_MAX 4104/' /usr/local/arduino-teensy/hardware/teensy/avr/cores/teensy4/usb_midi.h
//#define USB_MIDI_SYSEX_MAX 4104 //#define USB_MIDI_SYSEX_MAX 4104
#define VERSION "1.0.17" #define VERSION "1.0.18"
//************************************************************************************************* //*************************************************************************************************
//* DEVICE SETTINGS //* DEVICE SETTINGS
@ -335,7 +335,7 @@
#define TRANSPOSE_FIX 24 #define TRANSPOSE_FIX 24
//#define VOICE_SILENCE_LEVEL 1069 //#define VOICE_SILENCE_LEVEL 1069
#define VOICE_SILENCE_LEVEL 4000 #define VOICE_SILENCE_LEVEL 1100
// Audio // Audio
#ifdef TGA_AUDIO_BOARD #ifdef TGA_AUDIO_BOARD

@ -52,12 +52,12 @@ class FmMod {
void setRange(uint8_t r) void setRange(uint8_t r)
{ {
range = r < 0 && r > 99 ? 0 : r; range = r < 0 || r > 99 ? 0 : r;
} }
void setTarget(uint8_t assign) void setTarget(uint8_t assign)
{ {
assign = assign < 0 && assign > 7 ? 0 : assign; assign = assign < 0 || assign > 7 ? 0 : assign;
pitch = assign & 1; // PITCH pitch = assign & 1; // PITCH
amp = assign & 2; // AMP amp = assign & 2; // AMP
eg = assign & 4; // EG eg = assign & 4; // EG

@ -43,7 +43,7 @@
extern config_t configuration; extern config_t configuration;
Dexed::Dexed(int rate) Dexed::Dexed(uint16_t rate, uint8_t instance_id)
{ {
uint8_t i; uint8_t i;
@ -89,6 +89,8 @@ Dexed::Dexed(int rate)
sustain = false; sustain = false;
setEngineType(DEXED_ENGINE); setEngineType(DEXED_ENGINE);
id = instance_id;
} }
Dexed::~Dexed() Dexed::~Dexed()
@ -265,6 +267,12 @@ void Dexed::keydown(int16_t pitch, uint8_t velo) {
voices[note].dx7_note->oscSync(); voices[note].dx7_note->oscSync();
voices[i].key_pressed_timer = millis(); voices[i].key_pressed_timer = millis();
keydown_counter++; keydown_counter++;
#ifdef DEBUG
Serial.print(F("Start voice: "));
Serial.print(note, DEC);
Serial.print(F(" pitch: "));
Serial.println(pitch, DEC);
#endif
break; break;
} }
else else
@ -309,13 +317,24 @@ void Dexed::keyup(int16_t pitch) {
if ( voices[note].midi_note == pitch && voices[note].keydown ) { if ( voices[note].midi_note == pitch && voices[note].keydown ) {
voices[note].keydown = false; voices[note].keydown = false;
voices[note].key_pressed_timer = 0; voices[note].key_pressed_timer = 0;
#ifdef DEBUG
Serial.print(F("Stop voice: "));
Serial.print(note, DEC);
Serial.print(F(" pitch: "));
Serial.println(pitch, DEC);
Serial.print(F(" id: "));
Serial.println(id, DEC);
#endif
break; break;
} }
} }
// note not found ? // note not found ?
if ( note >= max_notes ) { if ( note >= max_notes ) {
#ifdef DEBUG
Serial.print(F("Note not found: "));
Serial.println(pitch, DEC);
#endif
return; return;
} }
@ -472,7 +491,8 @@ uint8_t Dexed::getNumNotesPlaying(void)
uint8_t op_carrier = controllers.core->get_carrier_operators(data[134]); // look for carriers uint8_t op_carrier = controllers.core->get_carrier_operators(data[134]); // look for carriers
uint8_t i; uint8_t i;
uint8_t count_playing_voices = 0; uint8_t count_playing_voices = 0;
VoiceStatus voiceStatus;
for (i = 0; i < max_notes; i++) for (i = 0; i < max_notes; i++)
{ {
if (voices[i].live == true) if (voices[i].live == true)
@ -483,13 +503,29 @@ uint8_t Dexed::getNumNotesPlaying(void)
memset(&voiceStatus, 0, sizeof(VoiceStatus)); memset(&voiceStatus, 0, sizeof(VoiceStatus));
voices[i].dx7_note->peekVoiceStatus(voiceStatus); voices[i].dx7_note->peekVoiceStatus(voiceStatus);
#ifdef DEBUG
Serial.println(i);
Serial.print("ALG: ");
Serial.println(data[134]+1);
#endif
for (uint8_t op = 0; op < 6; op++) for (uint8_t op = 0; op < 6; op++)
{ {
if ((op_carrier & (1 << op))) if ((op_carrier & (1 << op)))
{ {
// this voice is a carrier! // this voice is a carrier!
op_carrier_num++; op_carrier_num++;
if (voiceStatus.amp[op] <= VOICE_SILENCE_LEVEL && voiceStatus.ampStep[op] == 4)
#ifdef DEBUG
Serial.print("OP: ");
Serial.print(op);
Serial.print(" AMP_STEP: ");
Serial.print(voiceStatus.ampStep[op],DEC);
Serial.print(" AMP: ");
Serial.println(voiceStatus.amp[op],DEC);
#endif
if (voiceStatus.amp[op] < VOICE_SILENCE_LEVEL && voiceStatus.ampStep[op] >= 3)
{ {
// this voice produces no audio output // this voice produces no audio output
op_amp++; op_amp++;
@ -497,6 +533,22 @@ uint8_t Dexed::getNumNotesPlaying(void)
} }
} }
/*
Serial.print(F("ID="));
Serial.print(id, DEC);
Serial.print(F(" OP carrier="));
Serial.print(op_carrier_num, DEC);
Serial.print(F(" OP amp="));
Serial.println(op_amp, DEC);
*/
#ifdef DEBUG
Serial.print("OP_AMP: ");
Serial.print(op_amp);
Serial.print(" OP_CARRIER_NUM: ");
Serial.println(op_carrier_num);
#endif
if (op_amp == op_carrier_num) if (op_amp == op_carrier_num)
{ {
// all carrier-operators are silent -> disable the voice // all carrier-operators are silent -> disable the voice

@ -141,7 +141,7 @@ enum DexedVoiceParameters {
class Dexed class Dexed
{ {
public: public:
Dexed(int rate); Dexed(uint16_t rate, uint8_t id);
~Dexed(); ~Dexed();
void activate(void); void activate(void);
void deactivate(void); void deactivate(void);
@ -202,6 +202,7 @@ class Dexed
protected: protected:
//static const uint8_t MAX_ACTIVE_NOTES = MAX_NOTES; //static const uint8_t MAX_ACTIVE_NOTES = MAX_NOTES;
//uint8_t max_notes = MAX_ACTIVE_NOTES; //uint8_t max_notes = MAX_ACTIVE_NOTES;
uint8_t id;
uint8_t max_notes = 0; uint8_t max_notes = 0;
int16_t currentNote; int16_t currentNote;
bool sustain; bool sustain;
@ -210,7 +211,7 @@ class Dexed
bool refreshMode; bool refreshMode;
bool refreshVoice; bool refreshVoice;
uint8_t engineType; uint8_t engineType;
VoiceStatus voiceStatus; //VoiceStatus voiceStatus;
Lfo lfo; Lfo lfo;
FmCore* engineMsfa; FmCore* engineMsfa;
EngineMkI* engineMkI; EngineMkI* engineMkI;

@ -76,31 +76,40 @@ uint8_t FmCore::get_carrier_operators(uint8_t algorithm)
for (uint8_t i = 0; i < 6; i++) for (uint8_t i = 0; i < 6; i++)
{ {
if ((alg.ops[i]&OUT_BUS_ADD) == OUT_BUS_ADD) if ((alg.ops[i] & 7) == OUT_BUS_ADD)
op_out |= 1 << i; op_out |= 1 << i;
} }
return op_out; return op_out;
} }
void FmCore::dump() { void FmCore::dump(void)
#ifdef VERBOSE {
for (int i = 0; i < 32; i++) { #ifdef DEBUG
cout << (i + 1) << ":"; for (uint8_t i = 0; i < 32; i++)
{
Serial.print(i + 1);
Serial.print(":");
const FmAlgorithm &alg = algorithms[i]; const FmAlgorithm &alg = algorithms[i];
for (int j = 0; j < 6; j++) { for (uint8_t j = 0; j < 6; j++)
int flags = alg.ops[j]; {
cout << " "; uint8_t flags = alg.ops[j];
if (flags & FB_IN) cout << "["; Serial.print(" ");
cout << (flags & IN_BUS_ONE ? "1" : flags & IN_BUS_TWO ? "2" : "0") << "->"; if (flags & FB_IN)
cout << (flags & OUT_BUS_ONE ? "1" : flags & OUT_BUS_TWO ? "2" : "0"); Serial.print("[");
if (flags & OUT_BUS_ADD) cout << "+"; Serial.print(flags & IN_BUS_ONE ? "1" : flags & IN_BUS_TWO ? "2" : "0");
//cout << alg.ops[j].in << "->" << alg.ops[j].out; Serial.print("->");
if (flags & FB_OUT) cout << "]"; Serial.print(flags & OUT_BUS_ONE ? "1" : flags & OUT_BUS_TWO ? "2" : "0");
if (flags & OUT_BUS_ADD)
Serial.print("+");
if (flags & FB_OUT)
Serial.print("]");
} }
cout << " " << n_out(alg); Serial.print(" ");
cout << endl; Serial.println(n_out(alg));
} }
#else
;
#endif #endif
} }

@ -10,7 +10,7 @@ class AudioSourceMicroDexed : public AudioStream, public Dexed {
uint32_t xrun = 0; uint32_t xrun = 0;
uint16_t render_time_max = 0; uint16_t render_time_max = 0;
AudioSourceMicroDexed(int sample_rate) : AudioStream(0, NULL), Dexed(sample_rate) { }; AudioSourceMicroDexed(uint16_t sample_rate, uint8_t id) : AudioStream(0, NULL), Dexed(sample_rate,id) { };
void update(void) void update(void)
{ {

Loading…
Cancel
Save