synthio: Finish ading SWEEP_IN
This commit is contained in:
parent
17df238145
commit
53e13f15a3
@ -30,7 +30,7 @@
|
|||||||
#include "py/enum.h"
|
#include "py/enum.h"
|
||||||
|
|
||||||
typedef enum synthio_bend_mode_e {
|
typedef enum synthio_bend_mode_e {
|
||||||
SYNTHIO_BEND_MODE_STATIC, SYNTHIO_BEND_MODE_VIBRATO, SYNTHIO_BEND_MODE_SWEEP
|
SYNTHIO_BEND_MODE_STATIC, SYNTHIO_BEND_MODE_VIBRATO, SYNTHIO_BEND_MODE_SWEEP, SYNTHIO_BEND_MODE_SWEEP_IN
|
||||||
} synthio_bend_mode_t;
|
} synthio_bend_mode_t;
|
||||||
|
|
||||||
extern const cp_enum_obj_t bend_mode_VIBRATO_obj;
|
extern const cp_enum_obj_t bend_mode_VIBRATO_obj;
|
||||||
|
@ -224,6 +224,8 @@ STATIC int synthio_bend_value(synthio_note_obj_t *self, int16_t dur) {
|
|||||||
return synthio_lfo_step(&self->bend_state, dur);
|
return synthio_lfo_step(&self->bend_state, dur);
|
||||||
case SYNTHIO_BEND_MODE_SWEEP:
|
case SYNTHIO_BEND_MODE_SWEEP:
|
||||||
return synthio_sweep_step(&self->bend_state, dur);
|
return synthio_sweep_step(&self->bend_state, dur);
|
||||||
|
case SYNTHIO_BEND_MODE_SWEEP_IN:
|
||||||
|
return synthio_sweep_in_step(&self->bend_state, dur);
|
||||||
default:
|
default:
|
||||||
return 32768;
|
return 32768;
|
||||||
}
|
}
|
||||||
|
@ -480,25 +480,35 @@ void synthio_lfo_set(synthio_lfo_state_t *state, const synthio_lfo_descr_t *desc
|
|||||||
state->dds = synthio_frequency_convert_float_to_dds(descr->frequency * 65536, sample_rate);
|
state->dds = synthio_frequency_convert_float_to_dds(descr->frequency * 65536, sample_rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
int synthio_sweep_step(synthio_lfo_state_t *state, uint16_t dur) {
|
STATIC int synthio_lfo_step_common(synthio_lfo_state_t *state, uint16_t dur) {
|
||||||
uint32_t phase = state->phase;
|
uint32_t phase = state->phase;
|
||||||
uint16_t whole_phase = phase >> 16;
|
uint16_t whole_phase = phase >> 16;
|
||||||
|
|
||||||
// advance the phase accumulator
|
// advance the phase accumulator
|
||||||
state->phase = phase + state->dds * dur;
|
state->phase = phase + state->dds * dur;
|
||||||
if (state->phase < phase) {
|
|
||||||
|
return whole_phase;
|
||||||
|
}
|
||||||
|
STATIC int synthio_lfo_sweep_common(synthio_lfo_state_t *state, uint16_t dur) {
|
||||||
|
uint16_t whole_phase = synthio_lfo_step_common(state, dur);
|
||||||
|
if (state->phase < state->dds) {
|
||||||
state->phase = 0xffffffff;
|
state->phase = 0xffffffff;
|
||||||
}
|
}
|
||||||
|
return whole_phase;
|
||||||
|
}
|
||||||
|
|
||||||
|
int synthio_sweep_step(synthio_lfo_state_t *state, uint16_t dur) {
|
||||||
|
uint16_t whole_phase = synthio_lfo_sweep_common(state, dur);
|
||||||
|
return (state->amplitude_scaled * whole_phase) / 65536 + state->offset_scaled;
|
||||||
|
}
|
||||||
|
|
||||||
|
int synthio_sweep_in_step(synthio_lfo_state_t *state, uint16_t dur) {
|
||||||
|
uint16_t whole_phase = 65535 - synthio_lfo_sweep_common(state, dur);
|
||||||
return (state->amplitude_scaled * whole_phase) / 65536 + state->offset_scaled;
|
return (state->amplitude_scaled * whole_phase) / 65536 + state->offset_scaled;
|
||||||
}
|
}
|
||||||
|
|
||||||
int synthio_lfo_step(synthio_lfo_state_t *state, uint16_t dur) {
|
int synthio_lfo_step(synthio_lfo_state_t *state, uint16_t dur) {
|
||||||
uint32_t phase = state->phase;
|
uint16_t whole_phase = synthio_lfo_step_common(state, dur);
|
||||||
uint16_t whole_phase = phase >> 16;
|
|
||||||
|
|
||||||
// advance the phase accumulator
|
|
||||||
state->phase = phase + state->dds * dur;
|
|
||||||
|
|
||||||
// create a triangle wave, it's quick and easy
|
// create a triangle wave, it's quick and easy
|
||||||
int v;
|
int v;
|
||||||
if (whole_phase < 16384) { // ramp from 0 to amplitude
|
if (whole_phase < 16384) { // ramp from 0 to amplitude
|
||||||
|
@ -111,3 +111,4 @@ uint32_t synthio_frequency_convert_scaled_to_dds(uint64_t frequency_scaled, int3
|
|||||||
void synthio_lfo_set(synthio_lfo_state_t *state, const synthio_lfo_descr_t *descr, uint32_t sample_rate);
|
void synthio_lfo_set(synthio_lfo_state_t *state, const synthio_lfo_descr_t *descr, uint32_t sample_rate);
|
||||||
int synthio_lfo_step(synthio_lfo_state_t *state, uint16_t dur);
|
int synthio_lfo_step(synthio_lfo_state_t *state, uint16_t dur);
|
||||||
int synthio_sweep_step(synthio_lfo_state_t *state, uint16_t dur);
|
int synthio_sweep_step(synthio_lfo_state_t *state, uint16_t dur);
|
||||||
|
int synthio_sweep_in_step(synthio_lfo_state_t *state, uint16_t dur);
|
||||||
|
Loading…
Reference in New Issue
Block a user