Fixed delay level.

Added mirrored numbers for displaying instance when polyphony of the voice is zero.
pull/32/head
Holger Wirtz 5 years ago
parent 0d35d9afcf
commit efebfc9375
  1. 2
      MicroDexed.ino
  2. 139
      UI.hpp
  3. 2
      config.h
  4. 2
      doc/MicroDexed-Audio-FlowChart.drawio
  5. BIN
      doc/MicroDexed-Audio-FlowChart.png

@ -165,9 +165,9 @@ void create_audio_engine_chain(uint8_t instance_id)
dynamicConnections[nDynamic++] = new AudioConnection(*chorus_mixer[instance_id], 0, *delay_fb_mixer[instance_id], 0);
dynamicConnections[nDynamic++] = new AudioConnection(*chorus_mixer[instance_id], 0, *delay_mixer[instance_id], 0);
dynamicConnections[nDynamic++] = new AudioConnection(*delay_fb_mixer[instance_id], 0, *delay_fx[instance_id], 0);
dynamicConnections[nDynamic++] = new AudioConnection(*delay_fx[instance_id], 0, *delay_fb_mixer[instance_id], 1);
dynamicConnections[nDynamic++] = new AudioConnection(*delay_fx[instance_id], 0, *delay_mixer[instance_id], 1);
dynamicConnections[nDynamic++] = new AudioConnection(*delay_mixer[instance_id], 0, *mono2stereo[instance_id], 0);
dynamicConnections[nDynamic++] = new AudioConnection(*delay_mixer[instance_id], 0, *delay_fb_mixer[instance_id], 1);
dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 0, reverb_mixer_r, instance_id);
dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 1, reverb_mixer_l, instance_id);
dynamicConnections[nDynamic++] = new AudioConnection(*mono2stereo[instance_id], 0, master_mixer_r, instance_id);

139
UI.hpp

@ -158,18 +158,11 @@ const uint8_t meter_bar[5][8] = {
{B00000, B00001, B00001, B00001, B00001, B00001, B00001, B00000}
};
const uint8_t inverse_num[2][8] = {
{B11111, B11011, B10011, B11011, B11011, B11011, B10001, B11111},
{B11111, B11011, B10101, B11101, B11011, B10111, B10001, B11111}
const uint8_t inverse_num[6][8] = {
{B11111, B11011, B10011, B11011, B11011, B11011, B11011, B11111}, // 1 invers
{B11111, B11011, B10101, B11101, B11011, B10111, B10001, B11111} // 2 invers
};
/* const uint8_t inverse_num[4][8] = {
{B11111, B11011, B10011, B11011, B11011, B11011, B10001, B11111},
{B11111, B11011, B10101, B11101, B11011, B10111, B10001, B11111},
{B00000, B00100, B01100, B00100, B00100, B00100, B01110, B00000},
{B00000, B00100, B01010, B00010, B00100, B01000, B01110, B00000}
};*/
enum { SCROLLBAR, BLOCKBAR, METERBAR };
enum { ENC_R, ENC_L };
enum {MENU_VOICE_BANK, MENU_VOICE_SOUND};
@ -2125,6 +2118,7 @@ void UI_func_polyphony(uint8_t param)
lcd.write(6);
}
#endif
lcd_active_instance_number(instance_id);
}
lcd_display_bar_int("Polyphony", configuration.dexed[instance_id].polyphony, 1.0, POLYPHONY_MIN, POLYPHONY_MAX, 3, false, false, false, false);
@ -2331,6 +2325,7 @@ void UI_func_mono_poly(uint8_t param)
lcd.write(6);
}
#endif
lcd_active_instance_number(instance_id);
}
MicroDexed[instance_id]->setMonoMode(!configuration.dexed[instance_id].monopoly);
@ -2640,28 +2635,28 @@ void UI_func_mw_assign(uint8_t param)
switch (configuration.dexed[instance_id].mw_assign)
{
case 0:
lcd.print(F("[ NONE ]"));
lcd.print(F("[ NONE ]"));
break;
case 1:
lcd.print(F("[PTCH ]"));
lcd.print(F("[PTCH ]"));
break;
case 2:
lcd.print(F("[ AMP ]"));
lcd.print(F("[ AMP ]"));
break;
case 3:
lcd.print(F("[PTCH AMP ]"));
lcd.print(F("[PTCH AMP ]"));
break;
case 4:
lcd.print(F("[ EG-BS]"));
lcd.print(F("[ EG]"));
break;
case 5:
lcd.print(F("[PTCH EG-BS]"));
lcd.print(F("[PTCH EG]"));
break;
case 6:
lcd.print(F("[ AMP EG-BS]"));
lcd.print(F("[ AMP EG]"));
break;
case 7:
lcd.print(F("[PTCH AMP EG-BS]"));
lcd.print(F("[PTCH AMP EG]"));
break;
}
}
@ -2724,13 +2719,13 @@ void UI_func_mw_mode(uint8_t param)
switch (configuration.dexed[instance_id].mw_mode)
{
case 0:
lcd.print(F("[LINEAR ]"));
lcd.print(F("[LINEAR ]"));
break;
case 1:
lcd.print(F("[REVERSE LINEAR]"));
lcd.print(F("[REVERSE LIN.]"));
break;
case 2:
lcd.print(F("[DIRECT ]"));
lcd.print(F("[DIRECT ]"));
break;
}
}
@ -2850,28 +2845,28 @@ void UI_func_fc_assign(uint8_t param)
switch (configuration.dexed[instance_id].fc_assign)
{
case 0:
lcd.print(F("[ NONE ]"));
lcd.print(F("[ NONE ]"));
break;
case 1:
lcd.print(F("[PTCH ]"));
lcd.print(F("[PTCH ]"));
break;
case 2:
lcd.print(F("[ AMP ]"));
lcd.print(F("[ AMP ]"));
break;
case 3:
lcd.print(F("[PTCH AMP ]"));
lcd.print(F("[PTCH AMP ]"));
break;
case 4:
lcd.print(F("[ EG-BS]"));
lcd.print(F("[ EG]"));
break;
case 5:
lcd.print(F("[PTCH EG-BS]"));
lcd.print(F("[PTCH EG]"));
break;
case 6:
lcd.print(F("[ AMP EG-BS]"));
lcd.print(F("[ AMP EG]"));
break;
case 7:
lcd.print(F("[PTCH AMP EG-BS]"));
lcd.print(F("[PTCH AMP EG]"));
break;
}
}
@ -2934,13 +2929,13 @@ void UI_func_fc_mode(uint8_t param)
switch (configuration.dexed[instance_id].fc_mode)
{
case 0:
lcd.print(F("[LINEAR ]"));
lcd.print(F("[LINEAR ]"));
break;
case 1:
lcd.print(F("[REVERSE LINEAR]"));
lcd.print(F("[REVERSE LIN.]"));
break;
case 2:
lcd.print(F("[DIRECT ]"));
lcd.print(F("[DIRECT ]"));
break;
}
}
@ -3059,28 +3054,28 @@ void UI_func_bc_assign(uint8_t param)
switch (configuration.dexed[instance_id].bc_assign)
{
case 0:
lcd.print(F("[ NONE ]"));
lcd.print(F("[ NONE ]"));
break;
case 1:
lcd.print(F("[PTCH ]"));
lcd.print(F("[PTCH ]"));
break;
case 2:
lcd.print(F("[ AMP ]"));
lcd.print(F("[ AMP ]"));
break;
case 3:
lcd.print(F("[PTCH AMP ]"));
lcd.print(F("[PTCH AMP ]"));
break;
case 4:
lcd.print(F("[ EG-BS]"));
lcd.print(F("[ EG]"));
break;
case 5:
lcd.print(F("[PTCH EG-BS]"));
lcd.print(F("[PTCH EG]"));
break;
case 6:
lcd.print(F("[ AMP EG-BS]"));
lcd.print(F("[ AMP EG]"));
break;
case 7:
lcd.print(F("[PTCH AMP EG-BS]"));
lcd.print(F("[PTCH AMP EG]"));
break;
}
}
@ -3143,13 +3138,13 @@ void UI_func_bc_mode(uint8_t param)
switch (configuration.dexed[instance_id].bc_mode)
{
case 0:
lcd.print(F("[DIRECT ]"));
lcd.print(F("[LINEAR ]"));
break;
case 1:
lcd.print(F("[LINEAR]"));
lcd.print(F("[REVERSE LIN.]"));
break;
case 2:
lcd.print(F("[REVERSE]"));
lcd.print(F("[DIRECT ]"));
break;
}
}
@ -3268,28 +3263,28 @@ void UI_func_at_assign(uint8_t param)
switch (configuration.dexed[instance_id].at_assign)
{
case 0:
lcd.print(F("[ NONE ]"));
lcd.print(F("[ NONE ]"));
break;
case 1:
lcd.print(F("[PTCH ]"));
lcd.print(F("[PTCH ]"));
break;
case 2:
lcd.print(F("[ AMP ]"));
lcd.print(F("[ AMP ]"));
break;
case 3:
lcd.print(F("[PTCH AMP ]"));
lcd.print(F("[PTCH AMP ]"));
break;
case 4:
lcd.print(F("[ EG-BS]"));
lcd.print(F("[ EG]"));
break;
case 5:
lcd.print(F("[PTCH EG-BS]"));
lcd.print(F("[PTCH EG]"));
break;
case 6:
lcd.print(F("[ AMP EG-BS]"));
lcd.print(F("[ AMP EG]"));
break;
case 7:
lcd.print(F("[PTCH AMP EG-BS]"));
lcd.print(F("[PTCH AMP EG]"));
break;
}
}
@ -3352,13 +3347,13 @@ void UI_func_at_mode(uint8_t param)
switch (configuration.dexed[instance_id].at_mode)
{
case 0:
lcd.print(F("[DIRECT ]"));
lcd.print(F("[LINEAR ]"));
break;
case 1:
lcd.print(F("[LINEAR]"));
lcd.print(F("[REVERSE LIN.]"));
break;
case 2:
lcd.print(F("[REVERSE]"));
lcd.print(F("[DIRECT ]"));
break;
}
}
@ -5318,19 +5313,47 @@ void lcd_display_meter_float(const char* title, float value, float factor, float
}
}
uint8_t bit_reverse8(uint8_t v)
{
uint8_t result = 0;
for ( ; v > 0; v >>= 1 )
(result <<= 1) |= (v & 1);
return (result);
}
void lcd_active_instance_number(uint8_t instance_id)
{
for (uint8_t i = 0; i < 8; i++)
{
if (instance_id == 0)
{
instance_num[0][i] = inverse_num[0][i];
instance_num[1][i] = ~inverse_num[1][i];
if (configuration.dexed[instance_id].polyphony == 0)
instance_num[0][i] = bit_reverse8(inverse_num[0][i]);
else
instance_num[0][i] = inverse_num[0][i];
if (configuration.dexed[!instance_id].polyphony == 0)
{
instance_num[1][i] = bit_reverse8(inverse_num[1][i]);
instance_num[1][i] = ~instance_num[1][i];
}
else
instance_num[1][i] = ~inverse_num[1][i];
}
else
{
instance_num[0][i] = ~inverse_num[0][i];
instance_num[1][i] = inverse_num[1][i];
if (configuration.dexed[!instance_id].polyphony == 0)
{
instance_num[0][i] = bit_reverse8(inverse_num[0][i]);
instance_num[0][i] = ~instance_num[0][i];
}
else
instance_num[0][i] = ~inverse_num[0][i];
if (configuration.dexed[instance_id].polyphony == 0)
instance_num[1][i] = bit_reverse8(inverse_num[1][i]);
else
instance_num[1][i] = inverse_num[1][i];
}
}

@ -407,7 +407,7 @@
#define SOUND_INTENSITY_DEFAULT 100
#define SOUND_INTENSITY_AMP_MAX 1.27
#define POLYPHONY_MIN 1
#define POLYPHONY_MIN 0
#define POLYPHONY_MAX MAX_NOTES
#define POLYPHONY_DEFAULT MAX_NOTES

@ -1 +1 @@
<mxfile host="app.diagrams.net" modified="2020-05-07T06:46:11.238Z" agent="5.0 (X11)" etag="qHCBIrCcC9J0hP5IfsDD" version="13.0.8" type="device"><diagram id="7c-kAhelgARxgBjdLmgF" name="Page-1">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</diagram></mxfile>
<mxfile host="app.diagrams.net" modified="2020-05-14T07:34:21.858Z" agent="5.0 (X11)" etag="Wgzkr1ci5wFEz9j1DWu6" version="13.1.1" type="device"><diagram id="7c-kAhelgARxgBjdLmgF" name="Page-1">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</diagram></mxfile>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 101 KiB

After

Width:  |  Height:  |  Size: 100 KiB

Loading…
Cancel
Save