|
2 | 2 | import time, random |
3 | 3 | import ulab.numpy as np |
4 | 4 | import synthio |
5 | | -from synth_setup import synth |
| 5 | +from synth_setup import synth, knobA |
6 | 6 |
|
7 | | -filter_attack_time = 1.3 |
8 | | -filter_release_time = 0.5 |
9 | | -filter_min_freq = 200 |
10 | | -filter_max_freq = 2000 |
| 7 | +filter_attack_time = 0.1 # some example values to start out with |
| 8 | +filter_release_time = 0.6 # change them to see how it affects the sound |
| 9 | +filter_min_freq = 100 |
| 10 | +filter_max_freq = 4000 |
11 | 11 |
|
12 | 12 | # this LFO will automatically run the lerp position from 0 to 1 over a given timea |
13 | | -lerp_pos = synthio.LFO(once=True, rate=1, waveform=np.array((0,32767), dtype=np.int16)) |
| 13 | +lerp_pos = synthio.LFO(once=True, waveform=np.array((0,32767), dtype=np.int16)) |
14 | 14 |
|
15 | | -# this MathOperation will then range from "start_val" to "end_val" over "lerp_time" |
| 15 | +# this MathOperation will range from "start_val" to "end_val" over "lerp_time" |
16 | 16 | # where "start_val" is our starting frequency and "end_val" is our hold frequency) |
17 | | -filter_env = synthio.Math(synthio.MathOperation.CONSTRAINED_LERP, 500, 2000, lerp_pos) |
| 17 | +filter_env = synthio.Math(synthio.MathOperation.CONSTRAINED_LERP, |
| 18 | + filter_min_freq, filter_max_freq, lerp_pos) |
18 | 19 |
|
| 20 | +def set_filter_lerp(fstart, fend, ftime): |
| 21 | + filter_env.a = fstart |
| 22 | + filter_env.b = fend |
| 23 | + lerp_pos.rate = 1 / ftime |
| 24 | + lerp_pos.retrigger() # must make sure to retrigger the positioner |
| 25 | + |
| 26 | +# nice little saw wave oscillator sounds better than default sqaure |
19 | 27 | wave_saw = np.linspace(32000, -32000, num=128, dtype=np.int16) |
20 | 28 |
|
21 | 29 | while True: |
22 | | - midi_note = random.randint(48,72) |
| 30 | + midi_note = 32 + int((knobA.value/65535)*32) #random.randint(48,60) |
| 31 | + print("playing note:", midi_note) |
23 | 32 | note = synthio.Note(synthio.midi_to_hz(midi_note), waveform=wave_saw) |
24 | 33 | note.filter = synthio.Biquad(synthio.FilterMode.LOW_PASS, |
25 | | - frequency=filter_env, Q=1.8) |
26 | | - # press the note |
27 | | - # which means setting up the attack stage, the lerp and retriggering |
28 | | - filter_env.a = filter_min_freq |
29 | | - filter_env.b = filter_max_freq |
30 | | - lerp_pos.rate = 1 / filter_attack_time |
31 | | - lerp_pos.retrigger() |
| 34 | + frequency=filter_env, Q=1.8) |
| 35 | + # press the note, e.g. set up the attack lerp vals and retriggering |
| 36 | + set_filter_lerp(filter_min_freq, filter_max_freq, filter_attack_time) |
32 | 37 | synth.press(note) |
33 | | - time.sleep(1.5) |
| 38 | + time.sleep(filter_attack_time) |
34 | 39 |
|
35 | | - # release the note |
36 | | - # which hmeans setting up the release stage, the lerp and retriggering |
37 | | - filter_env.a = filter_max_freq |
38 | | - filter_env.b = filter_min_freq |
39 | | - lerp_pos.rate = 1 / filter_release_time |
40 | | - lerp_pos.retrigger() |
| 40 | + # release the note, e.g. set up the release lerp vals and retriggering |
| 41 | + set_filter_lerp(filter_max_freq, filter_min_freq, filter_release_time) |
41 | 42 | synth.release(note) |
42 | | - time.sleep(1.0) |
| 43 | + time.sleep(filter_release_time) |
0 commit comments