@@ -37,11 +37,11 @@ STATIC const int16_t square_wave[] = {-32768, 32767};
37
37
STATIC const uint16_t notes [] = {8372 , 8870 , 9397 , 9956 , 10548 , 11175 , 11840 ,
38
38
12544 , 13290 , 14080 , 14917 , 15804 }; // 9th octave
39
39
40
- static int32_t round_float_to_int (mp_float_t f ) {
40
+ STATIC int32_t round_float_to_int (mp_float_t f ) {
41
41
return (int32_t )(f + MICROPY_FLOAT_CONST (0.5 ));
42
42
}
43
43
44
- static int64_t round_float_to_int64 (mp_float_t f ) {
44
+ STATIC int64_t round_float_to_int64 (mp_float_t f ) {
45
45
return (int64_t )(f + MICROPY_FLOAT_CONST (0.5 ));
46
46
}
47
47
@@ -55,7 +55,7 @@ STATIC int16_t convert_time_to_rate(uint32_t sample_rate, mp_obj_t time_in, int1
55
55
mp_float_t time = mp_obj_get_float (time_in );
56
56
int num_samples = (int )MICROPY_FLOAT_C_FUN (round )(time * sample_rate );
57
57
if (num_samples == 0 ) {
58
- return 0 ;
58
+ return 32767 ;
59
59
}
60
60
int16_t result = MIN (32767 , MAX (1 , abs (difference * SYNTHIO_MAX_DUR ) / num_samples ));
61
61
return (difference < 0 ) ? - result : result ;
@@ -102,34 +102,19 @@ STATIC void synthio_envelope_state_step(synthio_envelope_state_t *state, synthio
102
102
case SYNTHIO_ENVELOPE_STATE_SUSTAIN :
103
103
break ;
104
104
case SYNTHIO_ENVELOPE_STATE_ATTACK :
105
- if (def -> attack_step != 0 ) {
106
- state -> level = MIN (state -> level + def -> attack_step , def -> attack_level );
107
- if (state -> level == def -> attack_level ) {
108
- state -> state = SYNTHIO_ENVELOPE_STATE_DECAY ;
109
- }
110
- break ;
105
+ state -> level = MIN (state -> level + def -> attack_step , def -> attack_level );
106
+ if (state -> level == def -> attack_level ) {
107
+ state -> state = SYNTHIO_ENVELOPE_STATE_DECAY ;
111
108
}
112
- state -> state = SYNTHIO_ENVELOPE_STATE_DECAY ;
113
- MP_FALLTHROUGH ;
109
+ break ;
114
110
case SYNTHIO_ENVELOPE_STATE_DECAY :
115
- if (def -> decay_step != 0 ) {
116
- state -> level = MAX (state -> level + def -> decay_step , def -> sustain_level );
117
- assert (state -> level >= 0 );
118
- if (state -> level == def -> sustain_level ) {
119
- state -> state = SYNTHIO_ENVELOPE_STATE_SUSTAIN ;
120
- }
121
- break ;
122
- }
123
- state -> state = SYNTHIO_ENVELOPE_STATE_RELEASE ;
124
- MP_FALLTHROUGH ;
125
- case SYNTHIO_ENVELOPE_STATE_RELEASE :
126
- if (def -> release_step != 0 ) {
127
- int delta = def -> release_step ;
128
- state -> level = MAX (state -> level + delta , 0 );
129
- } else {
130
- state -> level = 0 ;
111
+ state -> level = MAX (state -> level + def -> decay_step , def -> sustain_level );
112
+ if (state -> level == def -> sustain_level ) {
113
+ state -> state = SYNTHIO_ENVELOPE_STATE_SUSTAIN ;
131
114
}
132
115
break ;
116
+ case SYNTHIO_ENVELOPE_STATE_RELEASE :
117
+ state -> level = MAX (state -> level + def -> release_step , 0 );
133
118
}
134
119
}
135
120
}
@@ -146,23 +131,34 @@ STATIC void synthio_envelope_state_release(synthio_envelope_state_t *state, synt
146
131
state -> state = SYNTHIO_ENVELOPE_STATE_RELEASE ;
147
132
}
148
133
134
+ STATIC synthio_envelope_definition_t * synthio_synth_get_note_envelope (synthio_synth_t * synth , mp_obj_t note_obj ) {
135
+ synthio_envelope_definition_t * def = & synth -> global_envelope_definition ;
136
+ if (!mp_obj_is_small_int (note_obj )) {
137
+ synthio_note_obj_t * note = MP_OBJ_TO_PTR (note_obj );
138
+ if (note -> envelope_obj != mp_const_none ) {
139
+ def = & note -> envelope_def ;
140
+ }
141
+ }
142
+ return def ;
143
+ }
144
+
149
145
150
146
STATIC uint32_t synthio_synth_sum_envelope (synthio_synth_t * synth ) {
151
147
uint32_t result = 0 ;
152
148
for (int chan = 0 ; chan < CIRCUITPY_SYNTHIO_MAX_CHANNELS ; chan ++ ) {
153
- if (synth -> span .note_obj [chan ] != SYNTHIO_SILENCE ) {
149
+ mp_obj_t note_obj = synth -> span .note_obj [chan ];
150
+ if (note_obj != SYNTHIO_SILENCE ) {
154
151
synthio_envelope_state_t * state = & synth -> envelope_state [chan ];
155
152
if (state -> state == SYNTHIO_ENVELOPE_STATE_ATTACK ) {
156
153
result += state -> level ;
157
154
} else {
158
- result += synth -> envelope_definition . attack_level ;
155
+ result += synthio_synth_get_note_envelope ( synth , note_obj ) -> attack_level ;
159
156
}
160
157
}
161
158
}
162
159
return result ;
163
160
}
164
161
165
-
166
162
void synthio_synth_synthesize (synthio_synth_t * synth , uint8_t * * bufptr , uint32_t * buffer_length , uint8_t channel ) {
167
163
168
164
if (channel == synth -> other_channel ) {
@@ -265,14 +261,7 @@ void synthio_synth_synthesize(synthio_synth_t *synth, uint8_t **bufptr, uint32_t
265
261
if (note_obj == SYNTHIO_SILENCE ) {
266
262
continue ;
267
263
}
268
- synthio_envelope_definition_t * def = & synth -> envelope_definition ;
269
- if (!mp_obj_is_small_int (note_obj )) {
270
- synthio_note_obj_t * note = MP_OBJ_TO_PTR (note_obj );
271
- if (note -> envelope_obj != mp_const_none ) {
272
- def = & note -> envelope_def ;
273
- }
274
- }
275
- synthio_envelope_state_step (& synth -> envelope_state [chan ], def , dur );
264
+ synthio_envelope_state_step (& synth -> envelope_state [chan ], synthio_synth_get_note_envelope (synth , note_obj ), dur );
276
265
}
277
266
278
267
* buffer_length = synth -> last_buffer_length = dur * SYNTHIO_BYTES_PER_SAMPLE ;
@@ -298,7 +287,7 @@ void synthio_synth_deinit(synthio_synth_t *synth) {
298
287
}
299
288
300
289
void synthio_synth_envelope_set (synthio_synth_t * synth , mp_obj_t envelope_obj ) {
301
- synthio_envelope_definition_set (& synth -> envelope_definition , envelope_obj , synth -> sample_rate );
290
+ synthio_envelope_definition_set (& synth -> global_envelope_definition , envelope_obj , synth -> sample_rate );
302
291
synth -> envelope_obj = envelope_obj ;
303
292
}
304
293
@@ -329,7 +318,7 @@ void synthio_synth_get_buffer_structure(synthio_synth_t *synth, bool single_chan
329
318
* spacing = 1 ;
330
319
}
331
320
332
- static bool parse_common (mp_buffer_info_t * bufinfo , mp_obj_t o , int16_t what ) {
321
+ STATIC bool parse_common (mp_buffer_info_t * bufinfo , mp_obj_t o , int16_t what ) {
333
322
if (o != mp_const_none ) {
334
323
mp_get_buffer_raise (o , bufinfo , MP_BUFFER_READ );
335
324
if (bufinfo -> typecode != 'h' ) {
@@ -379,10 +368,10 @@ bool synthio_span_change_note(synthio_synth_t *synth, mp_obj_t old_note, mp_obj_
379
368
channel = find_channel_with_note (synth , old_note );
380
369
if (channel != -1 ) {
381
370
if (new_note == SYNTHIO_SILENCE ) {
382
- synthio_envelope_state_release (& synth -> envelope_state [channel ], & synth -> envelope_definition );
371
+ synthio_envelope_state_release (& synth -> envelope_state [channel ], synthio_synth_get_note_envelope ( synth , old_note ) );
383
372
} else {
384
373
synth -> span .note_obj [channel ] = new_note ;
385
- synthio_envelope_state_init (& synth -> envelope_state [channel ], & synth -> envelope_definition );
374
+ synthio_envelope_state_init (& synth -> envelope_state [channel ], synthio_synth_get_note_envelope ( synth , new_note ) );
386
375
synth -> accum [channel ] = 0 ;
387
376
}
388
377
return true;
0 commit comments