17
17
18
18
# Settings
19
19
20
+ LEVEL = 0.25 # Use `SAMPLES[notenum]["level"]` to override
21
+
20
22
## Velocity is 0->127
21
23
HARD = 100
22
24
SOFT = 0 # Adjust to act as gate
27
29
HARD : "kick_hard" ,
28
30
SOFT : "kick_soft"
29
31
},
30
- "level" : 0.25
32
+ "level" : 0.3
31
33
},
32
34
38 : {
33
35
"samples" : {
34
36
HARD : "snare_hard" ,
35
37
SOFT : "snare_soft"
36
38
},
37
- "level" : 0.25
39
+ "level" : 0.3
38
40
},
39
41
41 : {
40
42
"samples" : {
41
43
HARD : "tom_lo_hard" ,
42
44
SOFT : "tom_lo_soft"
43
- },
44
- "level" : 0.25
45
+ }
45
46
},
46
47
42 : {
47
48
"samples" : {
48
49
SOFT : "hihat_closed"
49
- },
50
- "level" : 0.25
50
+ }
51
51
},
52
52
43 : {
53
53
"samples" : {
54
54
HARD : "tom_mid_hard" ,
55
55
SOFT : "tom_mid_soft"
56
- },
57
- "level" : 0.25
56
+ }
58
57
},
59
58
44 : {
60
59
"samples" : {
61
60
SOFT : "hihat_pedal"
62
- },
63
- "level" : 0.25
61
+ }
64
62
},
65
63
45 : {
66
64
"samples" : {
67
65
HARD : "tom_hi_hard" ,
68
66
SOFT : "tom_hi_soft"
69
- },
70
- "level" : 0.25
67
+ }
71
68
},
72
69
46 : {
73
70
"samples" : {
74
71
SOFT : "hihat_open"
75
- },
76
- "level" : 0.25
72
+ }
77
73
},
78
74
49 : {
79
75
"samples" : {
80
76
HARD : "crash_hard" ,
81
77
SOFT : "crash_soft"
82
- },
83
- "level" : 0.25
78
+ }
84
79
},
85
80
51 : {
86
81
"samples" : {
87
82
HARD : "ride_hard" ,
88
83
SOFT : "ride_soft"
89
- },
90
- "level" : 0.25
84
+ }
91
85
}
92
86
}
93
87
111
105
mixer .voice [i ].play (wav )
112
106
mixer .voice [i ].level = 0.0
113
107
114
- def get_sample (notenum :int , velocity :int = 127 ) -> tuple [str , float ]:
108
+ def get_sample (notenum :int , velocity :int = 127 ) -> tuple [str , float ]| None :
115
109
if notenum in SAMPLES :
116
- for vel , name in SAMPLES [notenum ]["samples" ].items ():
110
+ sample = SAMPLES [notenum ].copy ()
111
+ for vel , name in sample ["samples" ].items ():
117
112
if velocity >= vel :
118
- return (name , SAMPLES [notenum ]["level" ])
113
+ sample ["name" ] = name
114
+ del sample ["samples" ]
115
+ return sample
119
116
return None
120
117
121
- def play_sample (name :str , level :float = 0.25 ) -> None :
118
+ def get_sample_index (name :str ) -> int | None :
119
+ try :
120
+ return list (samples .keys ()).index (name )
121
+ except ValueError :
122
+ return None
123
+
124
+ def play_sample (sample :dict ) -> None :
122
125
global samples
123
- if name in samples :
124
- i = 0
125
- for val , wav in samples .items ():
126
- if val == name :
127
- mixer .voice [i ].level = level
128
- mixer .voice [i ].play (wav )
129
- break
130
- i += 1
126
+ if "name" in sample and sample ["name" ] in samples :
127
+ i = get_sample_index (sample ["name" ])
128
+ wav = samples [sample ["name" ]]
129
+ mixer .voice [i ].level = sample .get ("level" , LEVEL )
130
+ mixer .voice [i ].play (wav )
131
131
132
132
def stop_sample (name :str ) -> None :
133
133
global samples
@@ -142,10 +142,9 @@ def stop_sample(name:str) -> None:
142
142
async def touch_handler ():
143
143
while True :
144
144
for event in hardware .check_touch ():
145
- if (notenum := event .key_number + 36 ) in SAMPLES :
146
- name , level = get_sample (notenum )
145
+ if (notenum := event .key_number + 36 ) in SAMPLES and (sample := get_sample (notenum )):
147
146
if event .pressed :
148
- play_sample (name , level )
147
+ play_sample (sample )
149
148
elif event .released :
150
149
pass
151
150
# stop_sample(name)
@@ -160,10 +159,9 @@ async def midi_handler():
160
159
while True :
161
160
for midi in (hardware .midi_uart , hardware .midi_usb ):
162
161
msg = midi .receive ()
163
- if isinstance (msg , (NoteOn , NoteOff )) and msg .note in SAMPLES :
164
- name , level = get_sample (msg .note , msg .velocity )
162
+ if isinstance (msg , (NoteOn , NoteOff )) and msg .note in SAMPLES and (sample := get_sample (msg .note , msg .velocity )):
165
163
if isinstance (msg , NoteOn ) and msg .velocity != 0 :
166
- play_sample (name , level )
164
+ play_sample (sample )
167
165
elif isinstance (msg , NoteOff ) or (isinstance (msg , NoteOn ) and msg .velocity == 0 ):
168
166
pass
169
167
# stop_sample(name)
0 commit comments