Your ROOT_URL in app.ini is https://source.parasitstudio.de:63000/ but you are visiting https://source.parasitstudio.de/wirtz/MicroDexed/commit/ddb43bd8e01a89fd1af923f4147cc8e07683dfa2?style=split&whitespace=ignore-change You should set ROOT_URL correctly, otherwise the web may not work correctly.

Fixing play mode to "last priority played" and kliing oldest notes at the end of available free sound generators.

Fixing wrong setting of polyphony at startup.
pull/32/head
Holger Wirtz 5 years ago
parent 516bd94cff
commit ddb43bd8e0
  1. 4
      MicroDexed.ino
  2. 4
      UI.hpp
  3. 40
      dexed.cpp
  4. 1
      dexed.h
  5. 4
      source_microdexed.h

@ -1381,6 +1381,8 @@ void initial_values_from_eeprom(bool init)
MicroDexed[instance_id]->controllers.refresh(); MicroDexed[instance_id]->controllers.refresh();
MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled); MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled);
MicroDexed[instance_id]->doRefreshVoice(); MicroDexed[instance_id]->doRefreshVoice();
MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled);
MicroDexed[instance_id]->setMaxNotes(configuration.dexed[instance_id].polyphony);
#if defined(USE_FX) #if defined(USE_FX)
//chorus_mixer[instance_id]->gain(0, 1.0 - pseudo_log_curve(mapfloat(configuration.fx.chorus_level[instance_id], CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0), true)); //chorus_mixer[instance_id]->gain(0, 1.0 - pseudo_log_curve(mapfloat(configuration.fx.chorus_level[instance_id], CHORUS_LEVEL_MIN, CHORUS_LEVEL_MAX, 0.0, 1.0), true));
@ -1400,7 +1402,7 @@ void initial_values_from_eeprom(bool init)
reverb_mixer_r.gain(instance_id, configuration.fx.reverb_send[instance_id] / 100.0); reverb_mixer_r.gain(instance_id, configuration.fx.reverb_send[instance_id] / 100.0);
reverb_mixer_l.gain(instance_id, configuration.fx.reverb_send[instance_id] / 100.0); reverb_mixer_l.gain(instance_id, configuration.fx.reverb_send[instance_id] / 100.0);
#endif #endif
MicroDexed[instance_id]->setOPs(configuration.dexed[instance_id].op_enabled);
dexed_level[instance_id]->gain(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX)); dexed_level[instance_id]->gain(mapfloat(configuration.dexed[instance_id].sound_intensity, SOUND_INTENSITY_MIN, SOUND_INTENSITY_MAX, 0.0, SOUND_INTENSITY_AMP_MAX));
} }

@ -1927,15 +1927,15 @@ void UI_func_polyphony(uint8_t param)
if (poly_instance_id == 0) if (poly_instance_id == 0)
{ {
MicroDexed[0]->setMaxNotes(configuration.dexed[0].polyphony);
sprintf(poly_value_string, "%2d", configuration.dexed[0].polyphony); sprintf(poly_value_string, "%2d", configuration.dexed[0].polyphony);
lcd.show(1, 3, 2, poly_value_string); lcd.show(1, 3, 2, poly_value_string);
MicroDexed[0]->setMaxNotes(configuration.dexed[0].polyphony);
} }
else else
{ {
MicroDexed[1]->setMaxNotes(configuration.dexed[1].polyphony);
sprintf(poly_value_string, "%2d", configuration.dexed[1].polyphony); sprintf(poly_value_string, "%2d", configuration.dexed[1].polyphony);
lcd.show(1, 13, 2, poly_value_string); lcd.show(1, 13, 2, poly_value_string);
MicroDexed[1]->setMaxNotes(configuration.dexed[1].polyphony);
} }
} }

@ -67,6 +67,7 @@ Dexed::Dexed(int rate)
voices[i].keydown = false; voices[i].keydown = false;
voices[i].sustained = false; voices[i].sustained = false;
voices[i].live = false; voices[i].live = false;
voices[i].key_pressed_timer = 0;
} }
max_notes = MAX_NOTES; max_notes = MAX_NOTES;
@ -115,9 +116,6 @@ void Dexed::getSamples(uint16_t n_samples, int16_t* buffer)
uint8_t note; uint8_t note;
float sumbuf[n_samples]; float sumbuf[n_samples];
if (max_notes == 0)
return;
if (refreshVoice) if (refreshVoice)
{ {
for (i = 0; i < max_notes; i++) for (i = 0; i < max_notes; i++)
@ -198,13 +196,37 @@ void Dexed::keydown(int16_t pitch, uint8_t velo) {
voices[i].sustained = sustain; voices[i].sustained = sustain;
voices[i].live = true; voices[i].live = true;
voices[i].dx7_note->init(data, pitch, velo, pitch, porta, &controllers); voices[i].dx7_note->init(data, pitch, velo, pitch, porta, &controllers);
voices[i].key_pressed_timer = millis();
return; return;
} }
} }
} }
for (uint8_t i = 0; i < max_notes; i++) for (uint8_t i = 0; i <= max_notes; i++)
{ {
if (i == max_notes)
{
uint32_t min_timer = 0xffff;
if (monoMode)
break;
// no free sound slot found, so use the oldest note slot
for (uint8_t n = 0; n < max_notes; n++)
{
if (voices[n].key_pressed_timer < min_timer)
{
min_timer = voices[n].key_pressed_timer;
note = n;
}
}
voices[note].keydown = false;
voices[note].sustained = false;
voices[note].live = false;
voices[note].key_pressed_timer = 0;
keydown_counter--;
}
if (!voices[note].keydown) if (!voices[note].keydown)
{ {
currentNote = (note + 1) % max_notes; currentNote = (note + 1) % max_notes;
@ -216,6 +238,8 @@ void Dexed::keydown(int16_t pitch, uint8_t velo) {
voices[note].dx7_note->init(data, pitch, velo, srcnote, porta, &controllers); voices[note].dx7_note->init(data, pitch, velo, srcnote, porta, &controllers);
if ( data[136] ) if ( data[136] )
voices[note].dx7_note->oscSync(); voices[note].dx7_note->oscSync();
voices[i].key_pressed_timer = millis();
keydown_counter++;
break; break;
} }
else else
@ -225,6 +249,7 @@ void Dexed::keydown(int16_t pitch, uint8_t velo) {
note = (note + 1) % max_notes; note = (note + 1) % max_notes;
} }
if (keydown_counter == 0) if (keydown_counter == 0)
lfo.keydown(); lfo.keydown();
@ -254,6 +279,8 @@ void Dexed::keyup(int16_t pitch) {
if (pitch < 0) // for disabling the oldest note when cpu overload is detected if (pitch < 0) // for disabling the oldest note when cpu overload is detected
{ {
voices[currentNote].keydown = false; voices[currentNote].keydown = false;
voices[currentNote].key_pressed_timer = 0;
if (--max_notes == currentNote) if (--max_notes == currentNote)
currentNote = 0; currentNote = 0;
} }
@ -266,6 +293,8 @@ void Dexed::keyup(int16_t pitch) {
for (note = 0; note < max_notes; note++) { for (note = 0; note < max_notes; note++) {
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;
break; break;
} }
} }
@ -287,6 +316,7 @@ void Dexed::keyup(int16_t pitch) {
if ( highNote != -1 && voices[note].live ) { if ( highNote != -1 && voices[note].live ) {
voices[note].live = false; voices[note].live = false;
voices[note].key_pressed_timer = 0;
voices[target].live = true; voices[target].live = true;
voices[target].dx7_note->transferState(*voices[note].dx7_note); voices[target].dx7_note->transferState(*voices[note].dx7_note);
} }
@ -412,7 +442,7 @@ void Dexed::setMaxNotes(uint8_t n) {
{ {
notesOff(); notesOff();
max_notes = n; max_notes = n;
panic(); //panic();
controllers.refresh(); controllers.refresh();
} }
} }

@ -52,6 +52,7 @@ struct ProcessorVoice {
bool keydown; bool keydown;
bool sustained; bool sustained;
bool live; bool live;
uint32_t key_pressed_timer;
Dx7Note *dx7_note; Dx7Note *dx7_note;
}; };

@ -11,6 +11,10 @@ class AudioSourceMicroDexed : public AudioStream, public Dexed {
uint16_t render_time_max = 0; uint16_t render_time_max = 0;
AudioSourceMicroDexed(int sample_rate) : AudioStream(0, NULL), Dexed(sample_rate) { }; AudioSourceMicroDexed(int sample_rate) : AudioStream(0, NULL), Dexed(sample_rate) { };
void update(void) { void update(void) {
if (max_notes == 0)
return;
if (in_update) { if (in_update) {
xrun++; xrun++;
return; return;

Loading…
Cancel
Save