]> vault307.fbx.one Git - Sensory_Wall.git/blob - circuitPython/audioLEDvis.py
more sensory wall projects
[Sensory_Wall.git] / circuitPython / audioLEDvis.py
1 from array import array
2 from math import log
3 from time import monotonic
4 from supervisor import reload
5 import board
6 from audiobusio import PDMIn
7 from busio import I2C
8 import adafruit_is31fl3741
9 from adafruit_is31fl3741 import PREFER_BUFFER
10 from adafruit_is31fl3741.adafruit_rgbmatrixqt import Adafruit_RGBMatrixQT
11 from rainbowio import colorwheel
12 from ulab import numpy as np
13 from ulab.scipy.signal import spectrogram
14
15 i2c=I2C(board.SCL,board.SDA,frequency=1000000)
16
17 is31 = Adafruit_RGBMatrixQT(i2c, allocate=PREFER_BUFFER)
18
19 is31.set_led_scaling(0x19)
20 is31.global_current=0x03
21 is31.enable=True
22
23 heatmap=[0xb000ff,0xa600ff,0x9b00ff,0x8f00ff,0x8200ff,
24 0x7400ff,0x6500ff,0x5200ff,0x3900ff,0x0003ff,
25 0x00a6ff,0x00b7ff,0x0066ff,0x007eff,0x0093ff,
26 0x00e0ff,0x00e6fd,0x00ecf6,0x00f2ea,0x00f6d7,
27 0x00ff16,0xaaff00,0xb8ff00,0xc5ff00,0xffab00,
28 0xedff00,0xf5eb00,0xfcd600,0xffc100,0xff0000,
29 0xff9500,0xff7c00,0xff6100,0xff4100,0xff0000,
30 0xff0000,0xff0000]
31
32 fft_size=64
33 mic=audiobusio.PDMIn(board.D8,board.D9,sample_rate=16000,bit_depth=16)
34
35 samples_bit=array.array('H',[0]*(fft_size+3))
36
37 def waves(data,y):
38 offset=max(0,(13-len(data))//2)
39
40 for x in range(min(13, len(data))):
41 is31.pixel(x+offset,y,heatmap[int(data[x])])
42
43 def main():
44 max_all=10
45 scroll_offset=0
46 y=scroll_offset
47
48 while True:
49 mic.record(samples_bit,len(samples_bit))
50 samples=np.array(samples_bit[3:])
51
52 spectrogram1=spectrogram(samples)
53 spectrogram1=np.log(spectrogram1 + 1e-7)
54 spectrogram1=spectrogram1[1:(fft_size//2)-1]
55
56 min_curr=np.min(spectrogram1)
57 max_curr=np.max(spectrogram1)
58
59 if max_curr>max_all:
60 max_all=max_curr
61 else:
62 max_curr=max_curr-1
63 min_curr=max(min_curr,3)
64
65 data=(spectrogram1-min_curr)*(51./(max_all-mi_curr))
66
67 data=data*np.array((data>0))
68
69 y=scroll_offset
70
71 waves(data,y)
72 scroll_offset=(y+1)%9
73 is31.show()
74
75 main()