Fixes for dual instances.

pull/32/head
Holger Wirtz 4 years ago
parent 938bc40e71
commit 350568d2ca
  1. 49
      MicroDexed.ino
  2. 132
      UI.hpp
  3. 14
      UI_2.h
  4. 3
      dexed.cpp

@ -149,7 +149,6 @@ void create_audio_engine_chain(uint8_t instance_id)
delay_fx[instance_id] = new AudioEffectDelay();
delay_mixer[instance_id] = new AudioMixer4();
#endif
mono2stereo[instance_id] = new AudioEffectMonoStereo();
dynamicConnections[nDynamic++] = new AudioConnection(*MicroDexed[instance_id], 0, microdexed_peak_mixer, instance_id);
dynamicConnections[nDynamic++] = new AudioConnection(*MicroDexed[instance_id], 0, *dexed_level[instance_id], 0);
@ -217,6 +216,8 @@ int16_t delayline[MOD_DELAY_SAMPLE_BUFFER][NUM_DEXED];
extern LCDMenuLib2 LCDML;
#endif
extern void getNoteName(char* noteName, uint8_t noteNumber);
/***********************************************************************
SETUP
***********************************************************************/
@ -544,7 +545,20 @@ void handleNoteOn(byte inChannel, byte inNumber, byte inVelocity)
if (checkMidiChannel(inChannel, instance_id))
{
if (inNumber >= configuration.dexed[instance_id].lowest_note && inNumber <= configuration.dexed[instance_id].highest_note)
{
MicroDexed[instance_id]->keydown(inNumber, uint8_t(float(configuration.dexed[instance_id].velocity_level / 127.0)*inVelocity + 0.5));
#ifdef DEBUG
char note_name[4];
getNoteName(note_name, inNumber);
Serial.print(F("Keydown "));
Serial.print(note_name);
Serial.print(F(" instance "));
Serial.print(instance_id, DEC);
Serial.print(F(" MIDI-channel "));
Serial.print(inChannel, DEC);
Serial.println();
#endif
}
}
}
}
@ -556,7 +570,20 @@ void handleNoteOff(byte inChannel, byte inNumber, byte inVelocity)
if (checkMidiChannel(inChannel, instance_id))
{
if (inNumber >= configuration.dexed[instance_id].lowest_note && inNumber <= configuration.dexed[instance_id].highest_note)
{
MicroDexed[instance_id]->keyup(inNumber);
#ifdef DEBUG
char note_name[4];
getNoteName(note_name, inNumber);
Serial.print(F("KeyUp "));
Serial.print(note_name);
Serial.print(F(" instance "));
Serial.print(instance_id, DEC);
Serial.print(F(" MIDI-channel "));
Serial.print(inChannel, DEC);
Serial.println();
#endif
}
}
}
}
@ -1369,10 +1396,6 @@ void initial_values_from_eeprom(bool init)
MicroDexed[instance_id]->fx.Gain = 1.0;
MicroDexed[instance_id]->fx.Reso = mapfloat(configuration.dexed[instance_id].filter_resonance, FILTER_RESONANCE_MIN, FILTER_RESONANCE_MAX, 1.0, 0.0);
MicroDexed[instance_id]->fx.Cutoff = mapfloat(configuration.dexed[instance_id].filter_cutoff, FILTER_CUTOFF_MIN, FILTER_CUTOFF_MAX, 1.0, 0.0);
#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));
#if NUM_DEXED >1
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);
@ -1380,7 +1403,9 @@ void initial_values_from_eeprom(bool init)
reverb_mixer_r.gain(instance_id, 1.0);
reverb_mixer_l.gain(instance_id, 1.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));
}
set_volume(configuration.sys.vol, configuration.sys.mono);
@ -1632,11 +1657,13 @@ void eeprom_update_dexed(uint8_t instance_id)
bool eeprom_get_dexed(uint8_t instance_id)
{
#if NUM_DEXED>1
EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1]), configuration.dexed[1]);
#else
EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0]), configuration.dexed[0]);
#endif
for (uint8_t instance_id = 0; instance_id < MAX_DEXED; instance_id++)
{
if (instance_id == 0)
EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[0]), configuration.dexed[0]);
else
EEPROM.get(EEPROM_START_ADDRESS + offsetof(configuration_s, dexed[1]), configuration.dexed[1]);
}
return (true);
}

132
UI.hpp

@ -1874,19 +1874,19 @@ void UI_func_polyphony(uint8_t param)
void UI_func_polyphony(uint8_t param)
{
char poly_value_string[3];
static uint8_t instance_id;
static uint8_t poly_instance_id;
if (LCDML.FUNC_setup()) // ****** SETUP *********
{
encoderDir[ENC_R].reset();
if (LCDML.FUNC_getID() > MENU_ID_OF_INSTANCE_2)
instance_id = 1;
poly_instance_id = 1;
else
instance_id = 0;
poly_instance_id = 0;
lcd.show(0, 0, 16, "Polyphony");
if (instance_id == 0)
if (poly_instance_id == 0)
lcd.show(1, 0, 16, "1:[ ] 2:");
else
lcd.show(1, 0, 16, "1: 2:[ ]");
@ -1904,19 +1904,19 @@ void UI_func_polyphony(uint8_t param)
if (LCDML.BT_checkDown())
{
if (configuration.dexed[0].polyphony + configuration.dexed[1].polyphony + 1 <= POLYPHONY_MAX)
configuration.dexed[instance_id].polyphony = constrain(configuration.dexed[instance_id].polyphony + 1, POLYPHONY_MIN, POLYPHONY_MAX);
configuration.dexed[poly_instance_id].polyphony = constrain(configuration.dexed[poly_instance_id].polyphony + 1, POLYPHONY_MIN, POLYPHONY_MAX);
}
else if (LCDML.BT_checkUp())
{
if (configuration.dexed[instance_id].polyphony - 1 < 0)
configuration.dexed[instance_id].polyphony = 0;
if (configuration.dexed[poly_instance_id].polyphony - 1 < 0)
configuration.dexed[poly_instance_id].polyphony = 0;
else
configuration.dexed[instance_id].polyphony = constrain(configuration.dexed[instance_id].polyphony - 1, POLYPHONY_MIN - 1, POLYPHONY_MAX);
configuration.dexed[poly_instance_id].polyphony = constrain(configuration.dexed[poly_instance_id].polyphony - 1, POLYPHONY_MIN - 1, POLYPHONY_MAX);
}
else if (LCDML.BT_checkEnter())
{
instance_id = !instance_id;
if (instance_id == 0)
poly_instance_id = !poly_instance_id;
if (poly_instance_id == 0)
lcd.show(1, 0, 16, "1:[ ] 2:");
else
lcd.show(1, 0, 16, "1: 2:[ ]");
@ -1927,7 +1927,7 @@ void UI_func_polyphony(uint8_t param)
}
}
if (instance_id == 0)
if (poly_instance_id == 0)
{
sprintf(poly_value_string, "%2d", configuration.dexed[0].polyphony);
lcd.show(1, 3, 2, poly_value_string);
@ -3307,7 +3307,7 @@ void UI_func_eeprom_reset(uint8_t param)
void UI_func_voice_select(uint8_t param)
{
static uint8_t instance_id = 0;
static uint8_t voice_select_instance_id;
static uint8_t menu_voice_select = MENU_VOICE_SOUND;
if (LCDML.FUNC_setup()) // ****** SETUP *********
@ -3317,32 +3317,32 @@ void UI_func_voice_select(uint8_t param)
encoderDir[ENC_R].reset();
if (LCDML.FUNC_getID() > MENU_ID_OF_INSTANCE_2)
instance_id = 1;
voice_select_instance_id = 1;
else
instance_id = 0;
voice_select_instance_id = 0;
char bank_name[BANK_NAME_LEN];
char voice_name[VOICE_NAME_LEN];
if (!get_bank_name(configuration.performance.bank[instance_id], bank_name, sizeof(bank_name)))
if (!get_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, sizeof(bank_name)))
strncpy(bank_name, "*ERROR*", sizeof(bank_name));
if (!get_voice_by_bank_name(configuration.performance.bank[instance_id], bank_name, configuration.performance.voice[instance_id], voice_name, sizeof(voice_name)))
if (!get_voice_by_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, configuration.performance.voice[voice_select_instance_id], voice_name, sizeof(voice_name)))
strncpy(voice_name, "*ERROR*", sizeof(voice_name));
lcd.show(0, 0, 2, configuration.performance.bank[instance_id]);
lcd.show(1, 0, 2, configuration.performance.voice[instance_id] + 1);
lcd.show(0, 0, 2, configuration.performance.bank[voice_select_instance_id]);
lcd.show(1, 0, 2, configuration.performance.voice[voice_select_instance_id] + 1);
lcd.show(0, 4, 10, bank_name);
lcd.show(1, 4, 10, voice_name);
#if NUM_DEXED > 1
lcd.setCursor(15, 0);
if (instance_id == 0)
lcd.write(instance_id);
if (voice_select_instance_id == 0)
lcd.write(voice_select_instance_id);
else
lcd.write(2);
lcd.setCursor(15, 1);
if (instance_id == 1)
lcd.write(instance_id);
if (voice_select_instance_id == 1)
lcd.write(voice_select_instance_id);
else
lcd.write(3);
#endif
@ -3379,37 +3379,37 @@ void UI_func_voice_select(uint8_t param)
switch (menu_voice_select)
{
case MENU_VOICE_BANK:
memset(g_bank_name[instance_id], 0, BANK_NAME_LEN);
bank_tmp = constrain(configuration.performance.bank[instance_id] - ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1);
configuration.performance.bank[instance_id] = bank_tmp;
memset(g_bank_name[voice_select_instance_id], 0, BANK_NAME_LEN);
bank_tmp = constrain(configuration.performance.bank[voice_select_instance_id] - ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1);
configuration.performance.bank[voice_select_instance_id] = bank_tmp;
#ifdef DISPLAY_LCD_SPI
change_disp_sd(false);
#endif
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id);
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id);
#ifdef DISPLAY_LCD_SPI
change_disp_sd(true);
#endif
break;
case MENU_VOICE_SOUND:
memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN);
voice_tmp = configuration.performance.voice[instance_id] - ENCODER[ENC_R].speed();
if (voice_tmp < 0 && configuration.performance.bank[instance_id] - 1 >= 0)
memset(g_voice_name[voice_select_instance_id], 0, VOICE_NAME_LEN);
voice_tmp = configuration.performance.voice[voice_select_instance_id] - ENCODER[ENC_R].speed();
if (voice_tmp < 0 && configuration.performance.bank[voice_select_instance_id] - 1 >= 0)
{
configuration.performance.bank[instance_id]--;
configuration.performance.bank[instance_id] = constrain(configuration.performance.bank[instance_id], 0, MAX_BANKS - 1);
configuration.performance.bank[voice_select_instance_id]--;
configuration.performance.bank[voice_select_instance_id] = constrain(configuration.performance.bank[voice_select_instance_id], 0, MAX_BANKS - 1);
}
else if (voice_tmp < 0 && configuration.performance.bank[instance_id] - 1 <= 0)
else if (voice_tmp < 0 && configuration.performance.bank[voice_select_instance_id] - 1 <= 0)
{
voice_tmp = 0;
}
if (voice_tmp < 0)
voice_tmp = MAX_VOICES + voice_tmp;
configuration.performance.voice[instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1);
configuration.performance.voice[voice_select_instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1);
#ifdef DISPLAY_LCD_SPI
change_disp_sd(false);
#endif
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id);
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id);
#ifdef DISPLAY_LCD_SPI
change_disp_sd(true);
#endif
@ -3421,36 +3421,36 @@ void UI_func_voice_select(uint8_t param)
switch (menu_voice_select)
{
case MENU_VOICE_BANK:
memset(g_bank_name[instance_id], 0, BANK_NAME_LEN);
bank_tmp = constrain(configuration.performance.bank[instance_id] + ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1);
configuration.performance.bank[instance_id] = bank_tmp;
memset(g_bank_name[voice_select_instance_id], 0, BANK_NAME_LEN);
bank_tmp = constrain(configuration.performance.bank[voice_select_instance_id] + ENCODER[ENC_R].speed(), 0, MAX_BANKS - 1);
configuration.performance.bank[voice_select_instance_id] = bank_tmp;
#ifdef DISPLAY_LCD_SPI
change_disp_sd(false);
#endif
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id);
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id);
#ifdef DISPLAY_LCD_SPI
change_disp_sd(true);
#endif
break;
case MENU_VOICE_SOUND:
memset(g_voice_name[instance_id], 0, VOICE_NAME_LEN);
voice_tmp = configuration.performance.voice[instance_id] + ENCODER[ENC_R].speed();
if (voice_tmp >= MAX_VOICES && configuration.performance.bank[instance_id] + 1 < MAX_BANKS)
memset(g_voice_name[voice_select_instance_id], 0, VOICE_NAME_LEN);
voice_tmp = configuration.performance.voice[voice_select_instance_id] + ENCODER[ENC_R].speed();
if (voice_tmp >= MAX_VOICES && configuration.performance.bank[voice_select_instance_id] + 1 < MAX_BANKS)
{
voice_tmp %= MAX_VOICES;
configuration.performance.bank[instance_id]++;
configuration.performance.bank[instance_id] = constrain(configuration.performance.bank[instance_id], 0, MAX_BANKS - 1);
configuration.performance.bank[voice_select_instance_id]++;
configuration.performance.bank[voice_select_instance_id] = constrain(configuration.performance.bank[voice_select_instance_id], 0, MAX_BANKS - 1);
}
else if (voice_tmp >= MAX_VOICES && configuration.performance.bank[instance_id] + 1 >= MAX_BANKS)
else if (voice_tmp >= MAX_VOICES && configuration.performance.bank[voice_select_instance_id] + 1 >= MAX_BANKS)
{
voice_tmp = MAX_VOICES - 1;
}
configuration.performance.voice[instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1);
configuration.performance.voice[voice_select_instance_id] = constrain(voice_tmp, 0, MAX_VOICES - 1);
#ifdef DISPLAY_LCD_SPI
change_disp_sd(false);
#endif
load_sd_voice(configuration.performance.bank[instance_id], configuration.performance.voice[instance_id], instance_id);
load_sd_voice(configuration.performance.bank[voice_select_instance_id], configuration.performance.voice[voice_select_instance_id], voice_select_instance_id);
#ifdef DISPLAY_LCD_SPI
change_disp_sd(true);
#endif
@ -3471,29 +3471,29 @@ void UI_func_voice_select(uint8_t param)
if (menu_voice_select == MENU_VOICE_BANK)
{
menu_voice_select = MENU_VOICE_SOUND;
instance_id = !instance_id;
voice_select_instance_id = !voice_select_instance_id;
char bank_name[BANK_NAME_LEN];
char voice_name[VOICE_NAME_LEN];
if (!get_bank_name(configuration.performance.bank[instance_id], bank_name, sizeof(bank_name)))
if (!get_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, sizeof(bank_name)))
strncpy(bank_name, "*ERROR*", sizeof(bank_name));
if (!get_voice_by_bank_name(configuration.performance.bank[instance_id], bank_name, configuration.performance.voice[instance_id], voice_name, sizeof(voice_name)))
if (!get_voice_by_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, configuration.performance.voice[voice_select_instance_id], voice_name, sizeof(voice_name)))
strncpy(voice_name, "*ERROR*", sizeof(voice_name));
lcd.show(0, 0, 2, configuration.performance.bank[instance_id]);
lcd.show(1, 0, 2, configuration.performance.voice[instance_id] + 1);
lcd.show(0, 0, 2, configuration.performance.bank[voice_select_instance_id]);
lcd.show(1, 0, 2, configuration.performance.voice[voice_select_instance_id] + 1);
lcd.show(0, 4, 10, bank_name);
lcd.show(1, 4, 10, voice_name);
lcd.setCursor(15, 0);
if (instance_id == 0)
lcd.write(instance_id);
if (voice_select_instance_id == 0)
lcd.write(voice_select_instance_id);
else
lcd.write(2);
lcd.setCursor(15, 1);
if (instance_id == 1)
lcd.write(instance_id);
if (voice_select_instance_id == 1)
lcd.write(voice_select_instance_id);
else
lcd.write(3);
}
@ -3503,28 +3503,28 @@ void UI_func_voice_select(uint8_t param)
#endif
}
if (strlen(g_bank_name[instance_id]) > 0)
if (strlen(g_bank_name[voice_select_instance_id]) > 0)
{
strncpy(bank_name, g_bank_name[instance_id], sizeof(bank_name));
strncpy(bank_name, g_bank_name[voice_select_instance_id], sizeof(bank_name));
}
else
{
if (!get_bank_name(configuration.performance.bank[instance_id], bank_name, sizeof(bank_name)))
if (!get_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, sizeof(bank_name)))
strncpy(bank_name, "*ERROR*", sizeof(bank_name));
}
if (strlen(g_voice_name[instance_id]) > 0)
if (strlen(g_voice_name[voice_select_instance_id]) > 0)
{
strncpy(voice_name, g_voice_name[instance_id], sizeof(voice_name));
strncpy(voice_name, g_voice_name[voice_select_instance_id], sizeof(voice_name));
}
else
{
if (!get_voice_by_bank_name(configuration.performance.bank[instance_id], bank_name, configuration.performance.voice[instance_id], voice_name, sizeof(voice_name)))
if (!get_voice_by_bank_name(configuration.performance.bank[voice_select_instance_id], bank_name, configuration.performance.voice[voice_select_instance_id], voice_name, sizeof(voice_name)))
strncpy(voice_name, "*ERROR*", sizeof(voice_name));
}
lcd.show(0, 0, 2, configuration.performance.bank[instance_id]);
lcd.show(1, 0, 2, configuration.performance.voice[instance_id] + 1);
lcd.show(0, 0, 2, configuration.performance.bank[voice_select_instance_id]);
lcd.show(1, 0, 2, configuration.performance.voice[voice_select_instance_id] + 1);
lcd.show(0, 4, 10, bank_name);
lcd.show(1, 4, 10, voice_name);
@ -3550,7 +3550,7 @@ void UI_func_voice_select(uint8_t param)
lcd_special_chars(SCROLLBAR);
encoderDir[ENC_R].reset();
if (instance_id == 0)
if (voice_select_instance_id == 0)
{
//eeprom_update_var(offsetof(configuration_s, performance.voice[0]), configuration.performance.voice[0], "configuration.performance.voice[0]");
//eeprom_update_var(offsetof(configuration_s, performance.bank[0]), configuration.performance.bank[0], "configuration.performance.bank[0]");
@ -3560,8 +3560,8 @@ void UI_func_voice_select(uint8_t param)
#if NUM_DEXED > 1
else
{
EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.voice[0]), configuration.performance.voice[1]);
EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.bank[0]), configuration.performance.bank[1]);
EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.voice[1]), configuration.performance.voice[1]);
EEPROM.update(EEPROM_START_ADDRESS + offsetof(configuration_s, performance.bank[1]), configuration.performance.bank[1]);
}
#endif
}

@ -140,13 +140,13 @@ LCDML_add(111, LCDML_0_2_2, 2, "Save Voice Cfg", UI_func_save_voiceconfig);
LCDML_add(112, LCDML_0_2, 4, "MIDI", NULL);
LCDML_add(113, LCDML_0_2_4, 1, "MIDI Recv Bank", UI_func_sysex_receive_bank);
LCDML_add(114, LCDML_0_2_4, 2, "MIDI Send Bank", UI_func_sysex_send_bank);
LCDML_add(116, LCDML_0, 3, "System", NULL);
LCDML_add(117, LCDML_0_3, 1, "Volume", UI_func_volume);
LCDML_add(118, LCDML_0_3, 2, "Stereo/Mono", UI_func_stereo_mono);
LCDML_add(119, LCDML_0_3, 3, "MIDI Soft THRU", UI_func_midi_soft_thru);
LCDML_add(120, LCDML_0_2, 4, "EEPROM Reset", UI_func_eeprom_reset);
LCDML_add(121, LCDML_0, 4, "Info", UI_func_information);
#define _LCDML_DISP_cnt 121
LCDML_add(115, LCDML_0, 3, "System", NULL);
LCDML_add(116, LCDML_0_3, 1, "Volume", UI_func_volume);
LCDML_add(117, LCDML_0_3, 2, "Stereo/Mono", UI_func_stereo_mono);
LCDML_add(118, LCDML_0_3, 3, "MIDI Soft THRU", UI_func_midi_soft_thru);
LCDML_add(119, LCDML_0_3, 4, "EEPROM Reset", UI_func_eeprom_reset);
LCDML_add(120, LCDML_0, 4, "Info", UI_func_information);
#define _LCDML_DISP_cnt 120
#define MENU_ID_OF_INSTANCE_2 52
#endif

@ -115,6 +115,9 @@ void Dexed::getSamples(uint16_t n_samples, int16_t* buffer)
uint8_t note;
float sumbuf[n_samples];
if (max_notes == 0)
return;
if (refreshVoice)
{
for (i = 0; i < max_notes; i++)

Loading…
Cancel
Save