-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
59 lines (46 loc) · 1.5 KB
/
Copy pathmain.py
File metadata and controls
59 lines (46 loc) · 1.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
from textual.app import App, ComposeResult
from textual.containers import Vertical
from textual.widgets import Static
import numpy as np
import config
import audio
from visualizer import SpectrumWidget
class VisualizerApp(App):
CSS_PATH = "styles.tcss"
def compose(self) -> ComposeResult:
self.spectrum = SpectrumWidget()
self.footer = Static(
"1: traffic 2: ice 3: fire 4: neon | Q: quit"
)
self.footer.add_class("footer")
yield Vertical(
self.spectrum,
self.footer
)
def on_mount(self):
self.stream = audio.start_audio_stream()
self.freqs, self.band_edges = audio.setup_frequency_bands()
self.bar_levels = np.zeros(config.NUM_BARS)
self.set_interval(1 / config.FPS, self.update_visualizer)
def update_visualizer(self):
new_levels = audio.compute_spectrum(self.freqs, self.band_edges)
self.bar_levels = np.maximum(
new_levels,
self.bar_levels * config.DECAY
)
self.spectrum.set_levels(self.bar_levels)
def on_key(self, event):
if event.key == "q":
self.exit()
theme_map = {
"1": "traffic_lights",
"2": "ice",
"3": "fire",
"4": "neon",
}
if event.key in theme_map:
self.spectrum.set_theme(theme_map[event.key])
def on_shutdown(self):
self.stream.stop()
if __name__ == "__main__":
VisualizerApp().run()