Bases: ShaderScene
🎧 Piano-Perfect Audio Spectrogram. Unlock a hidden Absolute Pitch in you. Lightning fast, reliable, customizable
Source code in Projects/SpectroNote/SpectroNote/SpectroNote.py
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 | @define
class SpectroNoteScene(ShaderScene):
"""🎧 Piano-Perfect Audio Spectrogram. Unlock a hidden Absolute Pitch in you. Lightning fast, reliable, customizable"""
__name__ = "SpectroNote"
# Scene parameters
piano_bins: bool = False
piano_range: bool = False
piano_size: float = 0.05
black_ratio: float = 0.5
border_ratio: float = 0.1
vertical: bool = False
tuning: Hertz = 440
def build(self):
self.shader.fragment = SPECTRONOTE.RESOURCES.SHADERS/"SpectroNote.frag"
self.audio = ShaderAudio(scene=self, name="Audio", file="/path/to/audio.ogg")
self.spectrogram = ShaderSpectrogram(scene=self, audio=self.audio, smooth=True)
# Act immediately, good visuals and precision
self.spectrogram.dynamics.frequency = 20
# self.spectrogram.sample_rateio = 2
self.spectrogram.length = 5
self.spectrogram.fft_n = 13
# # Define ranges
PIANO_RANGE = dict(start=21, end=108)
FULL_RANGE = dict(start=20.0, end=20000.0)
self.spectrogram.from_notes(
**(PIANO_RANGE if self.piano_range else FULL_RANGE),
piano=self.piano_bins,
tuning=self.tuning,
bins=1440,
)
def pipeline(self) -> Iterable[ShaderVariable]:
yield from ShaderScene.pipeline(self)
yield Uniform("float", "iPianoSize", self.piano_size)
yield Uniform("float", "iBlackRatio", self.black_ratio)
yield Uniform("float", "iBorderRatio", self.border_ratio)
yield Uniform("bool", "iVertical", self.vertical)
|
piano_range
| piano_range: bool = False
|
border_ratio
| border_ratio: float = 0.1
|
build
Source code in Projects/SpectroNote/SpectroNote/SpectroNote.py
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47 | def build(self):
self.shader.fragment = SPECTRONOTE.RESOURCES.SHADERS/"SpectroNote.frag"
self.audio = ShaderAudio(scene=self, name="Audio", file="/path/to/audio.ogg")
self.spectrogram = ShaderSpectrogram(scene=self, audio=self.audio, smooth=True)
# Act immediately, good visuals and precision
self.spectrogram.dynamics.frequency = 20
# self.spectrogram.sample_rateio = 2
self.spectrogram.length = 5
self.spectrogram.fft_n = 13
# # Define ranges
PIANO_RANGE = dict(start=21, end=108)
FULL_RANGE = dict(start=20.0, end=20000.0)
self.spectrogram.from_notes(
**(PIANO_RANGE if self.piano_range else FULL_RANGE),
piano=self.piano_bins,
tuning=self.tuning,
bins=1440,
)
|
pipeline
Source code in Projects/SpectroNote/SpectroNote/SpectroNote.py
| def pipeline(self) -> Iterable[ShaderVariable]:
yield from ShaderScene.pipeline(self)
yield Uniform("float", "iPianoSize", self.piano_size)
yield Uniform("float", "iBlackRatio", self.black_ratio)
yield Uniform("float", "iBorderRatio", self.border_ratio)
yield Uniform("bool", "iVertical", self.vertical)
|