1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 from timeside.core import implements, interfacedoc
23 from timeside.api import IGrapher
24 from timeside.grapher.core import *
25 from timeside.grapher.spectrogram_log import SpectrogramLog
29 """ Builds a PIL image representing a spectrogram of the audio stream (level vs. frequency vs. time).
30 Adds pixels iteratively thanks to the adapter providing fixed size frame buffers."""
31
32 implements(IGrapher)
33
34 @interfacedoc
35 - def __init__(self, width=1024, height=256, bg_color=(0,0,0), color_scheme='default'):
37
38 @staticmethod
39 @interfacedoc
41 return "spectrogram_lin"
42
43 @staticmethod
44 @interfacedoc
46 return "Spectrogram linear"
47
48 @interfacedoc
49 - def setup(self, channels=None, samplerate=None, blocksize=None, totalframes=None):
51
53 """generate the lookup which translates y-coordinate to fft-bin"""
54
55 f_min = float(self.lower_freq)
56 f_max = float(self.higher_freq)
57 y_min = f_min
58 y_max = f_max
59 for y in range(self.image_height):
60 freq = y_min + y / (self.image_height - 1.0) *(y_max - y_min)
61 fft_bin = freq / f_max * (self.fft_size/2 + 1)
62 if fft_bin < self.fft_size/2:
63 alpha = fft_bin - int(fft_bin)
64 self.y_to_bin.append((int(fft_bin), alpha * 255))
65