2525# User input vars
2626mode = 0 # 0=audio, 1=rainbow, 2=larsen_scanner, 3=solid
2727user_color = (127 ,0 ,0 )
28- speed = 6.0 # for larsen scanner
2928
3029# Audio meter vars
3130PEAK_COLOR = (100 , 0 , 255 )
@@ -100,18 +99,17 @@ def wheel(wheel_pos):
10099 b = int (255 - wheel_pos * 3 )
101100 return (r , g , b )
102101
103- def rainbow_cycle (wait ):
102+ def rainbow_cycle (delay ):
104103 for j in range (255 ):
105104 for i in range (NUM_PIXELS ):
106105 pixel_index = (i * 256 // NUM_PIXELS ) + j
107106 pixels [i ] = wheel (pixel_index & 255 )
108107 pixels .show ()
109- time .sleep (wait )
108+ time .sleep (delay )
110109
111- def audio_meter ():
110+ def audio_meter (new_peak ):
112111 mic .record (samples , len (samples ))
113112 magnitude = normalized_rms (samples )
114- global peak
115113
116114 # Compute scaled logarithmic reading in the range 0 to NUM_PIXELS
117115 c = log_scale (constrain (magnitude , input_floor , input_ceiling ),
@@ -123,13 +121,14 @@ def audio_meter():
123121 if i < c :
124122 pixels [i ] = volume_color (i )
125123 # Light up the peak pixel and animate it slowly dropping.
126- if c >= peak :
127- peak = min (c , NUM_PIXELS - 1 )
128- elif peak > 0 :
129- peak = peak - 1
130- if peak > 0 :
131- pixels [int (peak )] = PEAK_COLOR
124+ if c >= new_peak :
125+ new_peak = min (c , NUM_PIXELS - 1 )
126+ elif new_peak > 0 :
127+ new_peak = new_peak - 1
128+ if new_peak > 0 :
129+ pixels [int (new_peak )] = PEAK_COLOR
132130 pixels .show ()
131+ return new_peak
133132
134133pos = 0 # position
135134direction = 1 # direction of "eye"
@@ -140,10 +139,9 @@ def larsen_set(index, color):
140139 else :
141140 pixels [index ] = color
142141
143- def larsen (wait ):
142+ def larsen (delay ):
144143 global pos
145144 global direction
146-
147145 color_dark = (int (user_color [0 ]/ 8 ), int (user_color [1 ]/ 8 ),
148146 int (user_color [2 ]/ 8 ))
149147 color_med = (int (user_color [0 ]/ 2 ), int (user_color [1 ]/ 2 ),
@@ -159,7 +157,7 @@ def larsen(wait):
159157 larsen_set (pos + 2 , color_dark )
160158
161159 pixels .write ()
162- time .sleep (wait )
160+ time .sleep (delay )
163161
164162 # Erase all and draw a new one next time
165163 for j in range (- 2 , 2 ):
@@ -176,24 +174,21 @@ def larsen(wait):
176174 pos = NUM_PIXELS - 2
177175 direction = - direction
178176
179- def solid ():
180- global user_color
181- pixels .fill (user_color )
177+ def solid (new_color ):
178+ pixels .fill (new_color )
182179 pixels .show ()
183180
184181def map_value (value , in_min , in_max , out_min , out_max ):
185182 out_range = out_max - out_min
186183 in_range = in_max - in_min
187184 return out_min + out_range * ((value - in_min ) / in_range )
188185
189- def change_speed (val ):
190- global speed
191- new_speed = speed + val
192- if new_speed > 10.0 :
193- new_speed = 10.0
194- elif new_speed < 1.0 :
195- new_speed = 1.0
196- speed = new_speed
186+ speed = 6.0
187+ wait = 0.097
188+
189+ def change_speed (mod , old_speed ):
190+ new_speed = constrain (old_speed + mod , 1.0 , 10.0 )
191+ return (new_speed , map_value (new_speed , 10.0 , 0.0 , 0.01 , 0.3 ))
197192
198193while True :
199194 # While BLE is *not* connected
@@ -214,9 +209,9 @@ def change_speed(val):
214209 elif isinstance (packet , ButtonPacket ):
215210 if packet .pressed :
216211 if packet .button == ButtonPacket .UP :
217- change_speed (1 )
212+ speed , wait = change_speed (1 , speed )
218213 elif packet .button == ButtonPacket .DOWN :
219- change_speed (- 1 )
214+ speed , wait = change_speed (- 1 , speed )
220215 elif packet .button == ButtonPacket .BUTTON_1 :
221216 mode = 0
222217 elif packet .button == ButtonPacket .BUTTON_2 :
@@ -228,10 +223,10 @@ def change_speed(val):
228223
229224 # Determine animation based on mode
230225 if mode == 0 :
231- audio_meter ()
226+ peak = audio_meter (peak )
232227 elif mode == 1 :
233228 rainbow_cycle (0.001 )
234229 elif mode == 2 :
235- larsen (map_value ( speed , 10.0 , 0.0 , 0.01 , 0.3 ) )
230+ larsen (wait )
236231 elif mode == 3 :
237- solid ()
232+ solid (user_color )
0 commit comments