Guido van Rossum | e1f069e | 1990-10-25 18:51:42 +0000 | [diff] [blame^] | 1 | # Module 'Soundogram' |
| 2 | |
| 3 | import audio |
| 4 | from minmax import min, max |
| 5 | from Histogram import Histogram |
| 6 | |
| 7 | class Soundogram() = Histogram(): |
| 8 | # |
| 9 | def define(self, (win, chunk)): |
| 10 | width, height = corner = win.getwinsize() |
| 11 | bounds = (0, 0), corner |
| 12 | self.chunk = chunk |
| 13 | self.step = (len(chunk)-1)/(width/2+1) + 1 |
| 14 | ydata = _make_ydata(chunk, self.step) |
| 15 | return Histogram.define(self, (win, bounds, ydata, (0, 128))) |
| 16 | # |
| 17 | def setchunk(self, chunk): |
| 18 | self.chunk = chunk |
| 19 | self.recompute() |
| 20 | # |
| 21 | def recompute(self): |
| 22 | (left, top), (right, bottom) = self.bounds |
| 23 | width = right - left |
| 24 | self.step = (len(chunk)-1)/width + 1 |
| 25 | ydata = _make_ydata(chunk, self.step) |
| 26 | self.setdata(ydata, (0, 128)) |
| 27 | # |
| 28 | |
| 29 | |
| 30 | def _make_ydata(chunk, step): |
| 31 | ydata = [] |
| 32 | for i in range(0, len(chunk), step): |
| 33 | piece = audio.chr2num(chunk[i:i+step]) |
| 34 | mi, ma = min(piece), max(piece) |
| 35 | y = max(abs(mi), abs(ma)) |
| 36 | ydata.append(y) |
| 37 | return ydata |