Skip to content
Snippets Groups Projects
Commit fde9ca22 authored by moon2's avatar moon2 :speech_balloon: Committed by q3k
Browse files

a bit more synth functions

parent 34ae9cfe
No related branches found
No related tags found
No related merge requests found
......@@ -17,7 +17,7 @@ float ks_osc(ks_osc_t * ks, float input){
float waveshaper(uint8_t shape, float in);
float nes_noise(uint16_t * reg, uint8_t mode, uint8_t run);
void trad_env(trad_osc_t * osc){
void run_trad_env(trad_osc_t * osc){
switch(osc->env_phase){
case 0:
osc->env = 0; osc->counter = 0; osc->env_counter = 0;
......@@ -63,8 +63,8 @@ void trad_env(trad_osc_t * osc){
}
}
float trad_osc(trad_osc_t * osc){
trad_env(osc);
float run_trad_osc(trad_osc_t * osc){
run_trad_env(osc);
if(!osc->env_phase) return 0;
float ret = 0;
......@@ -165,3 +165,37 @@ float waveshaper(uint8_t shape, float in){
}
return in;
}
#define NAT_LOG_SEMITONE 0.05776226504666215
void trad_osc_set_freq_semitone(trad_osc_t * osc, float bend){
osc->freq = 440. * exp(bend * NAT_LOG_SEMITONE);
}
void trad_osc_set_freq_Hz(trad_osc_t * osc, float freq){
osc->freq = freq;
}
void trad_osc_set_waveform(trad_osc_t * osc, uint8_t waveform){
osc->waveform = waveform;
}
void trad_osc_set_attack(trad_osc_t * osc, uint16_t attack){
osc->attack_steps = attack;
}
void trad_osc_set_decay(trad_osc_t * osc, uint16_t decay){
osc->decay_steps = decay;
}
void trad_env_stop(trad_osc_t * osc){
if(osc->env_phase) osc->env_phase = 3;
}
void trad_env_fullstop(trad_osc_t * osc){
osc->env_phase = 0; //stop and skip decay phase
}
void trad_env_start(trad_osc_t * osc){
osc->env_phase = 1; //put into attack phase;
}
......@@ -45,4 +45,13 @@ typedef struct {
float real_feedback; //compensated feedback value
} ks_osc_t; //karplus strong
float trad_osc(trad_osc_t * osc);
float run_trad_osc(trad_osc_t * osc);
void trad_osc_set_freq_semitone(trad_osc_t * osc, float bend);
void trad_osc_set_freq_Hz(trad_osc_t * osc, float freq);
void trad_osc_set_waveform(trad_osc_t * osc, uint8_t waveform);
void trad_osc_set_attack(trad_osc_t * osc, uint16_t attack);
void trad_osc_set_decay(trad_osc_t * osc, uint16_t decay);
void trad_env_stop(trad_osc_t * osc);
void trad_env_fullstop(trad_osc_t * osc);
void trad_env_start(trad_osc_t * osc);
......@@ -39,7 +39,7 @@ STATIC mp_obj_t tinysynth_make_new(const mp_obj_type_t *type, size_t n_args, siz
self->osc.waveform = 1;
self->osc.skip_hold = mp_obj_get_int(args[1]);
//set_extra_synth(&(self->osc));
self->source_index = add_audio_source(&(self->osc), trad_osc);
self->source_index = add_audio_source(&(self->osc), run_trad_osc);
return MP_OBJ_FROM_PTR(self);
}
......@@ -47,27 +47,53 @@ STATIC mp_obj_t tinysynth_make_new(const mp_obj_type_t *type, size_t n_args, siz
// Class methods
STATIC mp_obj_t tinysynth_start(mp_obj_t self_in) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
self->osc.env_phase = 1;
trad_env_start(&(self->osc));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(tinysynth_start_obj, tinysynth_start);
STATIC mp_obj_t tinysynth_stop(mp_obj_t self_in) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
if(self->osc.env_phase){
self->osc.env_phase = 3;
}
trad_env_stop(&(self->osc));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_1(tinysynth_stop_obj, tinysynth_stop);
STATIC mp_obj_t tinysynth_freq(mp_obj_t self_in, mp_obj_t freq) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
self->osc.freq = mp_obj_get_float(freq);
trad_osc_set_freq_Hz(&(self->osc), mp_obj_get_float(freq));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(tinysynth_freq_obj, tinysynth_freq);
STATIC mp_obj_t tinysynth_tone(mp_obj_t self_in, mp_obj_t tone) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
trad_osc_set_freq_semitone(&(self->osc), mp_obj_get_float(tone));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(tinysynth_tone_obj, tinysynth_tone);
STATIC mp_obj_t tinysynth_waveform(mp_obj_t self_in, mp_obj_t waveform) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
trad_osc_set_waveform(&(self->osc), mp_obj_get_int(waveform));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(tinysynth_waveform_obj, tinysynth_waveform);
STATIC mp_obj_t tinysynth_attack(mp_obj_t self_in, mp_obj_t attack) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
trad_osc_set_attack(&(self->osc), mp_obj_get_int(attack));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(tinysynth_attack_obj, tinysynth_attack);
STATIC mp_obj_t tinysynth_decay(mp_obj_t self_in, mp_obj_t decay) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
trad_osc_set_decay(&(self->osc), mp_obj_get_int(decay));
return mp_const_none;
}
MP_DEFINE_CONST_FUN_OBJ_2(tinysynth_decay_obj, tinysynth_decay);
STATIC mp_obj_t tinysynth_deinit(mp_obj_t self_in) {
synth_tinysynth_obj_t *self = MP_OBJ_TO_PTR(self_in);
remove_audio_source(self->source_index);
......@@ -80,6 +106,10 @@ STATIC const mp_rom_map_elem_t tinysynth_locals_dict_table[] = {
{ MP_ROM_QSTR(MP_QSTR_start), MP_ROM_PTR(&tinysynth_start_obj) },
{ MP_ROM_QSTR(MP_QSTR_stop), MP_ROM_PTR(&tinysynth_stop_obj) },
{ MP_ROM_QSTR(MP_QSTR_freq), MP_ROM_PTR(&tinysynth_freq_obj) },
{ MP_ROM_QSTR(MP_QSTR_tone), MP_ROM_PTR(&tinysynth_tone_obj) },
{ MP_ROM_QSTR(MP_QSTR_waveform), MP_ROM_PTR(&tinysynth_waveform_obj) },
{ MP_ROM_QSTR(MP_QSTR_attack), MP_ROM_PTR(&tinysynth_attack_obj) },
{ MP_ROM_QSTR(MP_QSTR_decay), MP_ROM_PTR(&tinysynth_decay_obj) },
{ MP_ROM_QSTR(MP_QSTR___del__), MP_ROM_PTR(&tinysynth_deinit_obj) },
};
......
......@@ -6,6 +6,10 @@ synths = []
for i in range(5):
synths += [tinysynth(440,1)]
for synth in synths:
synth.decay(300)
synth.waveform(3)
chords = [[0,3,7,10,12],[-2,2,5,8,10],[-2,3,7,10,14],[-4,0,3,8,12],[-1,2,5,7,11]]
chord = chords[3]
......@@ -17,5 +21,5 @@ while True:
chord = chords[int((i-1)/2)]
else:
i = int(i/2)
synths[i].freq(440*(2**(chord[i]/12)))
synths[i].tone(chord[i])
synths[i].start()
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment