Merge pull request 'fixed audio cracks when loading/saving while sequencer is running.' (#109) from positionhigh/MicroDexed:dev into dev

Reviewed-on: https://codeberg.org/dcoredump/MicroDexed/pulls/109
pull/110/head
Holger Wirtz 3 years ago
commit 694e77a17c
  1. 30
      MicroDexed.ino
  2. 19
      UI.hpp
  3. 2
      config.h
  4. 46
      dexed_sd.cpp

@ -1676,11 +1676,29 @@ void handleClock(void)
midi_bpm_counter++;
}
void dac_mute(void)
{
sgtl5000.lineOutLevel(0.0);
sgtl5000.dacVolume(0.0);
sgtl5000.volume(0.0, 0.0); // Headphone volume
}
void dac_unmute(void)
{
sgtl5000.lineOutLevel(SGTL5000_LINEOUT_LEVEL);
sgtl5000.dacVolume(1.0);
sgtl5000.volume(SGTL5000_HEADPHONE_VOLUME, SGTL5000_HEADPHONE_VOLUME); // Headphone volume
}
void handleStart(void)
{
midi_bpm_timer = 0;
midi_bpm_counter = 0;
_midi_bpm = -1;
seq_step = 0;
seq_chain_active_step = 0;
seq_running = true;
timer1.start();
}
void handleContinue(void)
@ -1690,7 +1708,17 @@ void handleContinue(void)
void handleStop(void)
{
;
timer1.stop();
seq_running = false;
seq_recording = false;
seq_note_in = 0;
seq_step = 0;
seq_chain_active_step = 0;
MicroDexed[0]->panic();
#if NUM_DEXED > 1
MicroDexed[1]->panic();
#endif
}
void handleActiveSensing(void)

@ -5217,8 +5217,7 @@ void UI_func_seq_pattern_editor(uint8_t param)
{
if (seq_running == false && seq_recording == false)
{
seq_running = true;
timer1.start();
handleStart();
} else if (seq_running == true && seq_recording == false)
{
seq_running = true;
@ -5226,13 +5225,7 @@ void UI_func_seq_pattern_editor(uint8_t param)
seq_note_in = 0;
} else if (seq_running == true && seq_recording == true)
{
seq_running = false;
seq_recording = false;
seq_note_in = 0;
seq_step = 0;
seq_chain_active_step = 0;
timer1.stop();
MicroDexed[0]->panic();
handleStop();
}
} else if ( seq_menu == 2 && seq_active_function != 40)
{
@ -5716,11 +5709,7 @@ void UI_func_arpeggio(uint8_t param)
if (seq_running) {
seq_running = !seq_running;
timer1.stop();
MicroDexed[0]->panic();
#if NUM_DEXED > 1
MicroDexed[1]->panic();
#endif
handleStop();
arp_refresh_display_play_status();
seq_step = 0;
arp_octave = 0;
@ -5730,7 +5719,7 @@ void UI_func_arpeggio(uint8_t param)
{
seq_running = !seq_running;
arp_refresh_display_play_status();
timer1.start();
handleStart();
}
}
else if ( seq_temp_select_menu == 3 && seq_temp_active_menu == 0 )

@ -666,7 +666,7 @@
// Buffer-size define for load/save configuration as JSON
#define JSON_BUFFER_SIZE 7168
#define JSON_BUFFER_SIZE 8192
// Internal configuration structure
typedef struct dexed_s {

@ -64,6 +64,8 @@ extern uint8_t arp_style;
extern uint8_t seq_chord_velocity;
extern uint8_t seq_chord_dexed_inst;
extern uint8_t seq_inst_dexed[NUM_SEQ_TRACKS];
extern uint8_t seq_step;
extern uint8_t seq_chain_active_step;
extern char seq_name[FILENAME_LEN];
extern char seq_name_temp[FILENAME_LEN];
extern PeriodicTimer timer1;
@ -75,6 +77,10 @@ extern void set_sample_pan(uint8_t sample, float s_pan);
extern void set_sample_vol_max(uint8_t sample, float s_max);
extern void set_sample_vol_min(uint8_t sample, float s_min);
extern void set_sample_reverb_send(uint8_t sample, float s_reverb);
extern void handleStop(void);
extern void handleStart(void);
extern void dac_mute(void);
extern void dac_unmute(void);
extern uint8_t get_sample_note(uint8_t sample);
extern float get_sample_pitch(uint8_t sample);
extern float get_sample_p_offset(uint8_t sample);
@ -1072,7 +1078,14 @@ bool save_sd_seq_json(uint8_t seq_number)
{
char filename[FILENAME_LEN];
int count = 0;
bool seq_was_running = false;
seq_number = constrain(seq_number, 0, 99);
if (seq_running == true ) {
seq_was_running = true;
handleStop();
}
dac_mute();
AudioNoInterrupts();
save_sd_seq_sub_vel_json(seq_number);
save_sd_seq_sub_patterns_json(seq_number);
sprintf(filename, "/%s/%d-fx.json", SEQ_CONFIG_PATH, seq_number);
@ -1106,7 +1119,6 @@ bool save_sd_seq_json(uint8_t seq_number)
int columns = sizeof(seq_patternchain[0]);
int rows = total / columns;
Serial.print(F(" "));
AudioNoInterrupts();
SD.begin();
SD.remove(filename);
json = SD.open(filename, FILE_WRITE);
@ -1164,6 +1176,9 @@ bool save_sd_seq_json(uint8_t seq_number)
serializeJsonPretty(data_json, json);
json.close();
AudioInterrupts();
dac_unmute();
if (seq_was_running == true )
handleStart();
return (true);
}
json.close();
@ -1219,9 +1234,7 @@ bool load_sd_seq_sub_vel_json(uint8_t seq_number)
{
if (seq_number < 0)
return (false);
seq_number = constrain(seq_number, 0, 99);
if (sd_card > 0)
{
File json;
@ -1289,9 +1302,7 @@ bool load_sd_seq_sub_patterns_json(uint8_t seq_number)
{
if (seq_number < 0)
return (false);
seq_number = constrain(seq_number, 0, 99);
if (sd_card > 0)
{
File json;
@ -1359,14 +1370,20 @@ bool load_sd_seq_sub_patterns_json(uint8_t seq_number)
bool load_sd_seq_json(uint8_t seq_number)
{
bool seq_was_running = false;
if (seq_number < 0)
return (false);
if (seq_running)
{
seq_was_running = true;
seq_running = false;
}
dac_mute();
handleStop();
AudioNoInterrupts();
seq_number = constrain(seq_number, 0, 99);
load_sd_seq_sub_patterns_json(seq_number);
load_sd_seq_sub_vel_json(seq_number);
load_sd_fx_json(seq_number, 1);
if (sd_card > 0)
@ -1374,11 +1391,8 @@ bool load_sd_seq_json(uint8_t seq_number)
File json;
StaticJsonDocument<JSON_BUFFER_SIZE> data_json;
char filename[FILENAME_LEN];
sprintf(filename, "/%s/%d-S.json", SEQ_CONFIG_PATH, seq_number);
// first check if file exists...
AudioNoInterrupts();
if (SD.exists(filename))
{
// ... and if: load
@ -1392,10 +1406,8 @@ bool load_sd_seq_json(uint8_t seq_number)
if (json)
{
deserializeJson(data_json, json);
json.close();
AudioInterrupts();
#ifdef DEBUG
Serial.println(F("Read JSON data:"));
serializeJsonPretty(data_json, Serial);
@ -1465,8 +1477,14 @@ bool load_sd_seq_json(uint8_t seq_number)
for (uint8_t instance_id = 0; instance_id < NUM_DEXED; instance_id++)
set_voiceconfig_params(instance_id);
set_fx_params();
if (seq_running)
dac_unmute();
seq_step = 0;
seq_chain_active_step = 0;
if (seq_was_running)
{
timer1.begin(sequencer, seq_tempo_ms / 2);
seq_running = true;
}
else
timer1.begin(sequencer, seq_tempo_ms / 2, false);
return (true);

Loading…
Cancel
Save