mirror of
https://github.com/python/cpython.git
synced 2025-07-23 11:15:24 +00:00
Initial revision
This commit is contained in:
parent
6acc1b539a
commit
36ddc9e318
4 changed files with 226 additions and 0 deletions
67
Lib/lib-stdwin/StripChart.py
Normal file
67
Lib/lib-stdwin/StripChart.py
Normal file
|
@ -0,0 +1,67 @@
|
||||||
|
# Module 'StripChart'
|
||||||
|
|
||||||
|
|
||||||
|
import rect
|
||||||
|
from Buttons import *
|
||||||
|
from Resize import *
|
||||||
|
|
||||||
|
|
||||||
|
class StripChart() = LabelAppearance(), NoReactivity(), NoResize():
|
||||||
|
#
|
||||||
|
def define(self, (win, bounds, scale)):
|
||||||
|
self.init_appearance(win, bounds)
|
||||||
|
self.init_reactivity()
|
||||||
|
self.init_resize()
|
||||||
|
self.ydata = []
|
||||||
|
self.scale = scale
|
||||||
|
self.resetbounds()
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
def setbounds(self, bounds):
|
||||||
|
LabelAppearance.setbounds(self, bounds)
|
||||||
|
self.resetbounds()
|
||||||
|
#
|
||||||
|
def resetbounds(self):
|
||||||
|
(left, top), (right, bottom) = self.bounds
|
||||||
|
self.width = right-left
|
||||||
|
self.height = bottom-top
|
||||||
|
excess = len(self.ydata) - self.width
|
||||||
|
if excess > 0:
|
||||||
|
del self.ydata[:excess]
|
||||||
|
elif excess < 0:
|
||||||
|
while len(self.ydata) < self.width:
|
||||||
|
self.ydata.insert(0, 0)
|
||||||
|
#
|
||||||
|
def append(self, y):
|
||||||
|
self.ydata.append(y)
|
||||||
|
excess = len(self.ydata) - self.width
|
||||||
|
if excess > 0:
|
||||||
|
del self.ydata[:excess]
|
||||||
|
if not self.limbo:
|
||||||
|
self.win.scroll(self.bounds, (-excess, 0))
|
||||||
|
if not self.limbo:
|
||||||
|
(left, top), (right, bottom) = self.bounds
|
||||||
|
i = len(self.ydata)
|
||||||
|
area = (left+i-1, top), (left+i, bottom)
|
||||||
|
self.draw(self.win.begindrawing(), area)
|
||||||
|
#
|
||||||
|
def draw(self, (d, area)):
|
||||||
|
self.limbo = 0
|
||||||
|
area = rect.intersect(area, self.bounds)
|
||||||
|
if area = rect.empty:
|
||||||
|
return
|
||||||
|
d.cliprect(area)
|
||||||
|
d.erase(self.bounds)
|
||||||
|
(a_left, a_top), (a_right, a_bottom) = area
|
||||||
|
(left, top), (right, bottom) = self.bounds
|
||||||
|
height = bottom - top
|
||||||
|
i1 = a_left - left
|
||||||
|
i2 = a_right - left
|
||||||
|
for i in range(max(0, i1), min(len(self.ydata), i2)):
|
||||||
|
split = bottom-self.ydata[i]*height/self.scale
|
||||||
|
d.paint((left+i, split), (left+i+1, bottom))
|
||||||
|
if not self.enabled:
|
||||||
|
self.flipenable(d)
|
||||||
|
if self.hilited:
|
||||||
|
self.fliphilite(d)
|
||||||
|
d.noclip()
|
46
Lib/lib-stdwin/VUMeter.py
Normal file
46
Lib/lib-stdwin/VUMeter.py
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
# Module VUMeter
|
||||||
|
|
||||||
|
import audio
|
||||||
|
from StripChart import StripChart
|
||||||
|
|
||||||
|
K = 1024
|
||||||
|
Rates = [0, 32*K, 16*K, 8*K]
|
||||||
|
|
||||||
|
class VUMeter() = StripChart():
|
||||||
|
#
|
||||||
|
# Override define() and timer() methods
|
||||||
|
#
|
||||||
|
def define(self, (win, bounds)):
|
||||||
|
self = StripChart.define(self, (win, bounds, 128))
|
||||||
|
self.sampling = 0
|
||||||
|
self.rate = 3
|
||||||
|
self.enable(0)
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
def timer(self):
|
||||||
|
if self.sampling:
|
||||||
|
chunk = audio.wait_recording()
|
||||||
|
self.sampling = 0
|
||||||
|
nums = audio.chr2num(chunk)
|
||||||
|
ampl = max(abs(min(nums)), abs(max(nums)))
|
||||||
|
self.append(ampl)
|
||||||
|
if self.enabled and not self.sampling:
|
||||||
|
audio.setrate(self.rate)
|
||||||
|
size = Rates[self.rate]/10
|
||||||
|
size = size/48*48
|
||||||
|
audio.start_recording(size)
|
||||||
|
self.sampling = 1
|
||||||
|
if self.sampling:
|
||||||
|
self.win.settimer(1)
|
||||||
|
#
|
||||||
|
# New methods: start() and stop()
|
||||||
|
#
|
||||||
|
def stop(self):
|
||||||
|
if self.sampling:
|
||||||
|
chunk = audio.stop_recording()
|
||||||
|
self.sampling = 0
|
||||||
|
self.enable(0)
|
||||||
|
#
|
||||||
|
def start(self):
|
||||||
|
self.enable(1)
|
||||||
|
self.timer()
|
67
Lib/stdwin/StripChart.py
Executable file
67
Lib/stdwin/StripChart.py
Executable file
|
@ -0,0 +1,67 @@
|
||||||
|
# Module 'StripChart'
|
||||||
|
|
||||||
|
|
||||||
|
import rect
|
||||||
|
from Buttons import *
|
||||||
|
from Resize import *
|
||||||
|
|
||||||
|
|
||||||
|
class StripChart() = LabelAppearance(), NoReactivity(), NoResize():
|
||||||
|
#
|
||||||
|
def define(self, (win, bounds, scale)):
|
||||||
|
self.init_appearance(win, bounds)
|
||||||
|
self.init_reactivity()
|
||||||
|
self.init_resize()
|
||||||
|
self.ydata = []
|
||||||
|
self.scale = scale
|
||||||
|
self.resetbounds()
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
def setbounds(self, bounds):
|
||||||
|
LabelAppearance.setbounds(self, bounds)
|
||||||
|
self.resetbounds()
|
||||||
|
#
|
||||||
|
def resetbounds(self):
|
||||||
|
(left, top), (right, bottom) = self.bounds
|
||||||
|
self.width = right-left
|
||||||
|
self.height = bottom-top
|
||||||
|
excess = len(self.ydata) - self.width
|
||||||
|
if excess > 0:
|
||||||
|
del self.ydata[:excess]
|
||||||
|
elif excess < 0:
|
||||||
|
while len(self.ydata) < self.width:
|
||||||
|
self.ydata.insert(0, 0)
|
||||||
|
#
|
||||||
|
def append(self, y):
|
||||||
|
self.ydata.append(y)
|
||||||
|
excess = len(self.ydata) - self.width
|
||||||
|
if excess > 0:
|
||||||
|
del self.ydata[:excess]
|
||||||
|
if not self.limbo:
|
||||||
|
self.win.scroll(self.bounds, (-excess, 0))
|
||||||
|
if not self.limbo:
|
||||||
|
(left, top), (right, bottom) = self.bounds
|
||||||
|
i = len(self.ydata)
|
||||||
|
area = (left+i-1, top), (left+i, bottom)
|
||||||
|
self.draw(self.win.begindrawing(), area)
|
||||||
|
#
|
||||||
|
def draw(self, (d, area)):
|
||||||
|
self.limbo = 0
|
||||||
|
area = rect.intersect(area, self.bounds)
|
||||||
|
if area = rect.empty:
|
||||||
|
return
|
||||||
|
d.cliprect(area)
|
||||||
|
d.erase(self.bounds)
|
||||||
|
(a_left, a_top), (a_right, a_bottom) = area
|
||||||
|
(left, top), (right, bottom) = self.bounds
|
||||||
|
height = bottom - top
|
||||||
|
i1 = a_left - left
|
||||||
|
i2 = a_right - left
|
||||||
|
for i in range(max(0, i1), min(len(self.ydata), i2)):
|
||||||
|
split = bottom-self.ydata[i]*height/self.scale
|
||||||
|
d.paint((left+i, split), (left+i+1, bottom))
|
||||||
|
if not self.enabled:
|
||||||
|
self.flipenable(d)
|
||||||
|
if self.hilited:
|
||||||
|
self.fliphilite(d)
|
||||||
|
d.noclip()
|
46
Lib/stdwin/VUMeter.py
Executable file
46
Lib/stdwin/VUMeter.py
Executable file
|
@ -0,0 +1,46 @@
|
||||||
|
# Module VUMeter
|
||||||
|
|
||||||
|
import audio
|
||||||
|
from StripChart import StripChart
|
||||||
|
|
||||||
|
K = 1024
|
||||||
|
Rates = [0, 32*K, 16*K, 8*K]
|
||||||
|
|
||||||
|
class VUMeter() = StripChart():
|
||||||
|
#
|
||||||
|
# Override define() and timer() methods
|
||||||
|
#
|
||||||
|
def define(self, (win, bounds)):
|
||||||
|
self = StripChart.define(self, (win, bounds, 128))
|
||||||
|
self.sampling = 0
|
||||||
|
self.rate = 3
|
||||||
|
self.enable(0)
|
||||||
|
return self
|
||||||
|
#
|
||||||
|
def timer(self):
|
||||||
|
if self.sampling:
|
||||||
|
chunk = audio.wait_recording()
|
||||||
|
self.sampling = 0
|
||||||
|
nums = audio.chr2num(chunk)
|
||||||
|
ampl = max(abs(min(nums)), abs(max(nums)))
|
||||||
|
self.append(ampl)
|
||||||
|
if self.enabled and not self.sampling:
|
||||||
|
audio.setrate(self.rate)
|
||||||
|
size = Rates[self.rate]/10
|
||||||
|
size = size/48*48
|
||||||
|
audio.start_recording(size)
|
||||||
|
self.sampling = 1
|
||||||
|
if self.sampling:
|
||||||
|
self.win.settimer(1)
|
||||||
|
#
|
||||||
|
# New methods: start() and stop()
|
||||||
|
#
|
||||||
|
def stop(self):
|
||||||
|
if self.sampling:
|
||||||
|
chunk = audio.stop_recording()
|
||||||
|
self.sampling = 0
|
||||||
|
self.enable(0)
|
||||||
|
#
|
||||||
|
def start(self):
|
||||||
|
self.enable(1)
|
||||||
|
self.timer()
|
Loading…
Add table
Add a link
Reference in a new issue