18
18
import synthio
19
19
import audiofreeverb
20
20
21
+ from synth_tools .param import ParamRange
22
+ from ui import UI , splash_screen
23
+ splash_screen (hardware .display )
24
+
21
25
# Settings
22
26
23
27
LEVEL = 0.25 # Use `SAMPLES[notenum]["level"]` to override
104
108
voice_count = len (samples ),
105
109
)
106
110
107
- if hardware .is_rp2350 :
108
- effect_filter = audiofilters .Filter (
109
- filter = synthio .Biquad (synthio .FilterMode .LOW_PASS , FILTER_MAX , 1.2 ),
110
- sample_rate = hardware .SAMPLE_RATE ,
111
- channel_count = hardware .CHANNEL_COUNT ,
112
- buffer_size = hardware .BUFFER_SIZE ,
113
- )
114
- effect_reverb = audiofreeverb .Freeverb (
115
- mix = 0.0 ,
116
- sample_rate = hardware .SAMPLE_RATE ,
117
- channel_count = hardware .CHANNEL_COUNT ,
118
- buffer_size = hardware .BUFFER_SIZE ,
119
- )
120
-
121
- hardware .audio .play (effect_reverb )
122
- effect_reverb .play (effect_filter )
123
- effect_filter .play (mixer )
124
-
125
- else :
126
- hardware .audio .play (mixer )
111
+ effect_filter = audiofilters .Filter (
112
+ filter = synthio .Biquad (synthio .FilterMode .LOW_PASS , FILTER_MAX , 1.2 ),
113
+ sample_rate = hardware .SAMPLE_RATE ,
114
+ channel_count = hardware .CHANNEL_COUNT ,
115
+ buffer_size = hardware .BUFFER_SIZE ,
116
+ )
117
+ effect_reverb = audiofreeverb .Freeverb (
118
+ mix = 0.0 ,
119
+ sample_rate = hardware .SAMPLE_RATE ,
120
+ channel_count = hardware .CHANNEL_COUNT ,
121
+ buffer_size = hardware .BUFFER_SIZE ,
122
+ )
127
123
124
+ hardware .audio .play (effect_reverb )
125
+ effect_reverb .play (effect_filter )
126
+ effect_filter .play (mixer )
128
127
129
128
for i , wav in enumerate (samples .values ()):
130
129
mixer .voice [i ].play (wav )
@@ -155,23 +154,11 @@ def play_sample(sample:dict) -> None:
155
154
mixer .voice [i ].loop = sample .get ("loop" , False )
156
155
mixer .voice [i ].play (wav )
157
156
158
- def stop_sample (sample :dict ) -> None :
159
- if sample .get ("loop" , False ):
160
- i = get_sample_index (sample ["name" ])
157
+ def stop_sample (sample :dict | str ) -> None :
158
+ if type ( sample ) is str or sample .get ("loop" , False ):
159
+ i = get_sample_index (sample if type ( sample ) is str else sample ["name" ])
161
160
mixer .voice [i ].stop ()
162
161
163
- # Keyboard
164
-
165
- async def touch_handler ():
166
- while True :
167
- for event in hardware .check_touch ():
168
- if (notenum := event .key_number + 36 ) in SAMPLES and (sample := get_sample (notenum )):
169
- if event .pressed :
170
- play_sample (sample )
171
- elif event .released :
172
- stop_sample (sample )
173
- await asyncio .sleep (0.005 )
174
-
175
162
# MIDI
176
163
177
164
from adafruit_midi .note_off import NoteOff
@@ -190,15 +177,72 @@ async def midi_handler():
190
177
191
178
# Controls
192
179
180
+ button_held = False
181
+ button_with_touch = False
182
+
183
+ params = (
184
+
185
+ ParamRange ("FiltFreq" , "filter frequency" , FILTER_MAX , "%4d" , FILTER_MIN , FILTER_MAX ,
186
+ setter = lambda x : setattr (effect_filter .filter , "frequency" , x ),
187
+ getter = lambda : getattr (effect_filter .filter , "frequency" )
188
+ ),
189
+ ParamRange ("FilterRes" , "filter resonance" , 0.7 , "%1.2f" , 0.1 , 2.5 ,
190
+ setter = lambda x : setattr (effect_filter .filter , "Q" , x ),
191
+ getter = lambda : getattr (effect_filter .filter , "Q" )
192
+ ),
193
+
194
+ ParamRange ("ReverbMix" , "reverb mix" , 0.0 , "%1.2f" , 0.0 , 1.0 ,
195
+ setter = lambda x : setattr (effect_reverb , "mix" , x ),
196
+ getter = lambda : getattr (effect_reverb , "mix" )
197
+ ),
198
+ ParamRange ("RevrbSize" , "reverb roomsize" , 0.5 , "%1.2f" , 0.0 , 1.0 ,
199
+ setter = lambda x : setattr (effect_reverb , "roomsize" , x ),
200
+ getter = lambda : getattr (effect_reverb , "roomsize" )
201
+ ),
202
+
203
+ )
204
+
205
+ ui = UI (hardware .display , params , hardware .knobA .value , hardware .knobB .value )
206
+ ui .set_patch_name ("drums" )
207
+
208
+ async def touch_handler ():
209
+ global button_held , button_with_touch , ui
210
+ while True :
211
+ for event in hardware .check_touch ():
212
+ if not button_held :
213
+ if (notenum := event .key_number + 36 ) in SAMPLES and (sample := get_sample (notenum )):
214
+ if event .pressed :
215
+ play_sample (sample )
216
+ # Special case for hihat
217
+ if notenum in (42 , 44 ):
218
+ stop_sample ("hihat_open" )
219
+ elif event .released :
220
+ stop_sample (sample )
221
+ elif event .pressed and not button_with_touch :
222
+ button_with_touch = True
223
+ if event .key_number < (ui .num_params // 2 ):
224
+ ui .select_pair (event .key_number )
225
+ elif event .released :
226
+ button_with_touch = False
227
+ await asyncio .sleep (0.005 )
228
+
193
229
async def controls_handler ():
230
+ global button_held , button_with_touch , ui
194
231
while True :
232
+ hardware .display .refresh ()
233
+
195
234
for event in hardware .check_buttons ():
196
- pass
235
+ if event .key_number == 0 :
236
+ pass
237
+ elif event .key_number == 1 :
238
+ if event .pressed :
239
+ button_held = True
240
+ if event .released :
241
+ button_held = False
242
+ button_with_touch = False
197
243
198
- knobA , knobB = hardware .knobA .value , hardware .knobB .value
199
- if hardware .is_rp2350 :
200
- effect_filter .filter .frequency = ((knobA / 65535.0 ) ** 2 ) * (FILTER_MAX - FILTER_MIN ) + FILTER_MIN
201
- effect_reverb .mix = knobB / 65535.0
244
+ ui .setA (hardware .knobA .value >> 8 )
245
+ ui .setB (hardware .knobB .value >> 8 )
202
246
203
247
await asyncio .sleep (0.005 )
204
248
0 commit comments