diff --git a/components/bl00mbox/bl00mbox_audio.c b/components/bl00mbox/bl00mbox_audio.c index d7e0f9a54922422391819f8ca63e56c62066252f..e54c15d73ba13deafaf5c5e844ba486688c81764 100644 --- a/components/bl00mbox/bl00mbox_audio.c +++ b/components/bl00mbox/bl00mbox_audio.c @@ -280,12 +280,13 @@ static bool bl00mbox_audio_channel_render(bl00mbox_channel_t * chan, int16_t * o } } if(chan->compute_mean_square){ - uint32_t decay = 1000000UL; for(uint16_t i = 0; i < full_buffer_len; i++){ int32_t sq = acc[i]; - sq *= sq; - chan->mean_square = (((uint64_t) chan->mean_square) * (UINT32_MAX-decay-1)) >> 32; - chan->mean_square += (((uint64_t) sq)*decay) >> 32; + sq = (sq * sq) - chan->mean_square; + // always round down with negative sq so that decay always works. + // bitshift instead of div does that for us nicely. + // cannot underflow as ((-a) >> 11) can never be less than -a. + chan->mean_square += sq >> 11; } } return true; diff --git a/components/bl00mbox/radspa/standard_plugin_lib/sequencer.c b/components/bl00mbox/radspa/standard_plugin_lib/sequencer.c index 01de28d7b7af2a8b95b4b2ff6577ddac9a83db97..e5d2e9398781c464d65e7ddb5840be82d7f29bef 100644 --- a/components/bl00mbox/radspa/standard_plugin_lib/sequencer.c +++ b/components/bl00mbox/radspa/standard_plugin_lib/sequencer.c @@ -55,7 +55,7 @@ void sequencer_run(radspa_t * sequencer, uint16_t num_samples, uint32_t render_p int16_t s1 = radspa_signal_get_value(end_step_sig, 0, render_pass_id); int16_t s2 = data->track_step_len - 1; - data->step_end = s1 > 0 ? (s1 > s2 ? s2 : s1) : 1; + data->step_end = s1 > 0 ? (s1 > s2 ? s2 : s1) : 0; data->step_start = radspa_signal_get_value(start_step_sig, 0, render_pass_id); int16_t bpm = radspa_signal_get_value(bpm_sig, 0, render_pass_id); @@ -63,7 +63,6 @@ void sequencer_run(radspa_t * sequencer, uint16_t num_samples, uint32_t render_p if((bpm != data->bpm_prev) || (beat_div != data->beat_div_prev)){ data->counter_target = target(data->track_step_len, bpm, beat_div); - data->is_stopped = data->counter_target ? false : true; data->bpm_prev = bpm; data->beat_div_prev = beat_div; } @@ -71,23 +70,43 @@ void sequencer_run(radspa_t * sequencer, uint16_t num_samples, uint32_t render_p for(uint16_t i = 0; i < num_samples; i++){ int16_t sync_in = radspa_trigger_get(radspa_signal_get_value(sync_in_sig, i, render_pass_id), &(data->sync_in_hist)); - if(sync_in > 0){ + if(sync_in){ data->counter = 0; data->step = data->step_start; - data->sync_out_start = true; - data->sync_out_stop = false; - } else if(sync_in < 0){ - data->is_stopped = true; // stop signal - data->sync_out_start = false; - data->sync_out_stop = true; + bool start = sync_in > 0; + data->is_stopped = !start; + data->sync_out_start = start; + data->sync_out_stop = !start; + if(!start){ + for(uint8_t j = 0; j < data->num_tracks; j++){ + int16_t type = table[j * (data->track_step_len + 1)]; + int16_t stage_val = table[data->step + 1 + (1 + data->track_step_len) * j]; + if(type == -32767) stage_val = -1; + if((!tracks[j].changed) && (tracks[j].stage_val_prev != stage_val)){ + tracks[j].changed = true; + tracks[j].stage_val_prev = stage_val; + for(uint16_t k = 0; k < i; k++){ + radspa_signal_set_value(track_sigs[j], k, tracks[j].track_fill); + } + } + if(type == 32767){ + tracks[j].track_fill = stage_val; + } else if(type == -32767){ + if(stage_val > 0){ + radspa_trigger_start(stage_val, &(tracks[j].track_fill)); + } else if(stage_val < 0){ + radspa_trigger_stop(&(tracks[j].track_fill)); + } + } + tracks[j].stage_val_prev = stage_val; + } + } } else { data->sync_out_start = false; data->sync_out_stop = false; } - if(!data->is_stopped){ - data->counter++; - + if(!data->is_stopped && data->counter_target){ if(data->counter >= data->counter_target){ data->counter = 0; data->step++; @@ -96,7 +115,6 @@ void sequencer_run(radspa_t * sequencer, uint16_t num_samples, uint32_t render_p data->sync_out_start = true; } } - if(!data->counter){ //event just happened for(uint8_t j = 0; j < data->num_tracks; j++){ int16_t type = table[j * (data->track_step_len + 1)]; @@ -120,6 +138,7 @@ void sequencer_run(radspa_t * sequencer, uint16_t num_samples, uint32_t render_p tracks[j].stage_val_prev = stage_val; } } + data->counter++; } for(uint8_t j = 0; j < data->num_tracks; j++){ @@ -136,6 +155,11 @@ void sequencer_run(radspa_t * sequencer, uint16_t num_samples, uint32_t render_p } for(uint8_t j = 0; j < data->num_tracks; j++){ if(!tracks[j].changed){ + int16_t type = table[j * (data->track_step_len + 1)]; + if(type == 32767){ + tracks[j].track_fill = table[data->step + 1 + (1 + data->track_step_len) * j]; + tracks[j].stage_val_prev = tracks[j].track_fill; + } radspa_signal_set_const_value(track_sigs[j], tracks[j].track_fill); } else { tracks[j].changed = false; @@ -170,7 +194,7 @@ radspa_t * sequencer_create(uint32_t init_var){ data->counter_target = target(data->track_step_len, data->bpm_prev, data->beat_div_prev); radspa_signal_set(sequencer, SEQUENCER_STEP, "step", RADSPA_SIGNAL_HINT_OUTPUT, 0); radspa_signal_set(sequencer, SEQUENCER_SYNC_OUT, "sync_out", RADSPA_SIGNAL_HINT_OUTPUT, 0); - radspa_signal_set(sequencer, SEQUENCER_SYNC_IN, "sync_in", RADSPA_SIGNAL_HINT_INPUT | RADSPA_SIGNAL_HINT_TRIGGER, 0); + radspa_signal_set(sequencer, SEQUENCER_SYNC_IN, "sync_in", RADSPA_SIGNAL_HINT_INPUT | RADSPA_SIGNAL_HINT_TRIGGER, 32767); radspa_signal_set(sequencer, SEQUENCER_START_STEP, "step_start", RADSPA_SIGNAL_HINT_INPUT, 0); radspa_signal_set(sequencer, SEQUENCER_END_STEP, "step_end", RADSPA_SIGNAL_HINT_INPUT, num_steps-1); radspa_signal_set(sequencer, SEQUENCER_BPM, "bpm", RADSPA_SIGNAL_HINT_INPUT, data->bpm_prev); @@ -183,7 +207,7 @@ radspa_t * sequencer_create(uint32_t init_var){ data->sync_out_hist = 0; data->sync_out_start = false; data->sync_out_stop = false; - data->is_stopped = false; + data->is_stopped = true; sequencer_track_data_t * tracks = (void *) (&data[1]); for(uint8_t j = 0; j < data->num_tracks; j++){ tracks[j].changed = false;