Implemented soft volume changing.

Changed volume displaying towards a simpler display algorithm.
Small fixes.
pull/4/head
Holger Wirtz 6 years ago
parent 7b0a83cef8
commit c046111e40
  1. 21
      MicroDexed.ino
  2. 40
      UI.cpp
  3. 1
      UI.h
  4. 9
      config.h

@ -72,8 +72,8 @@ AudioConnection patchCord10(volume_l, 0, i2s1, 1);
AudioControlSGTL5000 sgtl5000_1; AudioControlSGTL5000 sgtl5000_1;
#elif defined(TGA_AUDIO_BOARD) #elif defined(TGA_AUDIO_BOARD)
AudioOutputI2S i2s1; AudioOutputI2S i2s1;
AudioConnection patchCord9(volume_r, 0, i2s1, 1); AudioConnection patchCord9(volume_r, 0, i2s1, 0);
AudioConnection patchCord10(volume_l, 0, i2s1, 0); AudioConnection patchCord10(volume_l, 0, i2s1, 1);
AudioControlWM8731master wm8731_1; AudioControlWM8731master wm8731_1;
#else #else
AudioOutputPT8211 pt8211_1; AudioOutputPT8211 pt8211_1;
@ -111,6 +111,7 @@ elapsedMillis cpu_mem_millis;
#endif #endif
config_t configuration = {0xffff, 0, 0, VOLUME, 0.5f, DEFAULT_MIDI_CHANNEL}; config_t configuration = {0xffff, 0, 0, VOLUME, 0.5f, DEFAULT_MIDI_CHANNEL};
bool eeprom_update_flag = false; bool eeprom_update_flag = false;
value_change_t soften_volume = {0.0, 0};
void setup() void setup()
{ {
@ -323,6 +324,22 @@ void loop()
// Shutdown unused voices // Shutdown unused voices
active_voices = dexed->getNumNotesPlaying(); active_voices = dexed->getNumNotesPlaying();
// check for value changes
if (soften_volume.steps > 0)
{
// soften volume value
soften_volume.steps--;
set_volume(configuration.vol + soften_volume.diff, configuration.pan);
#ifdef DEBUG
Serial.print(F("Volume: "));
Serial.print(configuration.vol, 5);
Serial.print(F(" Volume step: "));
Serial.print(soften_volume.steps);
Serial.print(F(" Volume diff: "));
Serial.println(soften_volume.diff, 5);
#endif
}
} }
#ifdef I2C_DISPLAY #ifdef I2C_DISPLAY

@ -203,6 +203,7 @@ void handle_ui(void)
switch (i) switch (i)
{ {
case 0: // left encoder moved case 0: // left encoder moved
float tmp;
switch (ui_state) switch (ui_state)
{ {
case UI_MAIN: case UI_MAIN:
@ -211,7 +212,18 @@ void handle_ui(void)
enc[i].write(0); enc[i].write(0);
else if (enc[i].read() >= ENC_VOL_STEPS) else if (enc[i].read() >= ENC_VOL_STEPS)
enc[i].write(ENC_VOL_STEPS); enc[i].write(ENC_VOL_STEPS);
set_volume(float(map(enc[i].read(), 0, ENC_VOL_STEPS, 0, 100)) / 100, configuration.pan); //set_volume(float(map(enc[i].read(), 0, ENC_VOL_STEPS, 0, 100)) / 100, configuration.pan);
tmp = (float(map(enc[i].read(), 0, ENC_VOL_STEPS, 0, 100)) / 100) - configuration.vol;
soften_volume.diff = tmp / SOFTEN_VALUE_CHANGE_STEPS;
soften_volume.steps = SOFTEN_VALUE_CHANGE_STEPS;
#ifdef DEBUG
Serial.print(F("Setting soften volume from: "));
Serial.print(configuration.vol, 5);
Serial.print(F(" Volume step: "));
Serial.print(soften_volume.steps);
Serial.print(F(" Volume diff: "));
Serial.println(soften_volume.diff, 5);
#endif
eeprom_write(); eeprom_write();
ui_show_volume(); ui_show_volume();
break; break;
@ -416,28 +428,30 @@ void ui_show_main(void)
void ui_show_volume(void) void ui_show_volume(void)
{ {
uint8_t pos;
static uint8_t old_pos;
ui_back_to_main = 0; ui_back_to_main = 0;
// erase old marker and show new marker
pos = map(configuration.vol * 100, 0, 100, 0, LCD_CHARS);
if (ui_state != UI_VOLUME) if (ui_state != UI_VOLUME)
{ {
lcd.clear(); lcd.clear();
lcd.show(0, 0, LCD_CHARS, "Volume"); lcd.show(0, 0, LCD_CHARS, "Volume");
lcd.show(1, pos, 1, "*");
old_pos = pos;
} }
// show value
lcd.show(0, LCD_CHARS - 3, 3, configuration.vol * 100); lcd.show(0, LCD_CHARS - 3, 3, configuration.vol * 100);
if (configuration.vol == 0.0)
lcd.show(1, 0, LCD_CHARS , " "); if (pos != old_pos)
else
{ {
if (configuration.vol < (float(LCD_CHARS) / 100)) lcd.show(1, pos, 1, "*");
lcd.show(1, 0, LCD_CHARS, "*"); lcd.show(1, old_pos, 1, " ");
else old_pos=pos;
{
for (uint8_t i = 0; i < map(configuration.vol * 100, 0, 100, 0, LCD_CHARS); i++)
lcd.show(1, i, 1, "*");
for (uint8_t i = map(configuration.vol * 100, 0, 100, 0, LCD_CHARS); i < LCD_CHARS; i++)
lcd.show(1, i, 1, " ");
}
} }
ui_state = UI_VOLUME; ui_state = UI_VOLUME;

@ -56,6 +56,7 @@ extern bool effect_delay_sync;
extern AudioEffectDelay delay1; extern AudioEffectDelay delay1;
extern AudioMixer4 mixer1; extern AudioMixer4 mixer1;
extern AudioMixer4 mixer2; extern AudioMixer4 mixer2;
extern value_change_t soften_volume;
void handle_ui(void); void handle_ui(void);
void ui_show_main(void); void ui_show_main(void);

@ -89,11 +89,12 @@
#define REDUCE_LOUDNESS 1 #define REDUCE_LOUDNESS 1
#endif #endif
#define SAMPLE_RATE 44100 #define SAMPLE_RATE 44100
#define SOFTEN_VALUE_CHANGE_STEPS 10
//************************************************************************************************* //*************************************************************************************************
//* UI AND DATA-STORE SETTINGS //* UI AND DATA-STORE SETTINGS
//************************************************************************************************* //*************************************************************************************************
#define CONTROL_RATE_MS 200 #define CONTROL_RATE_MS 100
#define TIMER_UI_HANDLING_MS 100 #define TIMER_UI_HANDLING_MS 100
//************************************************************************************************* //*************************************************************************************************
@ -192,4 +193,10 @@ struct config_t {
float pan; float pan;
uint8_t midi_channel; uint8_t midi_channel;
}; };
// struct for smoothing value changes
struct value_change_t {
float diff;
uint16_t steps;
};
#endif // CONFIG_H_INCLUDED #endif // CONFIG_H_INCLUDED

Loading…
Cancel
Save