Skip to content

Instantly share code, notes, and snippets.

@libbkmz
Created November 13, 2012 18:15
Show Gist options
  • Select an option

  • Save libbkmz/4067417 to your computer and use it in GitHub Desktop.

Select an option

Save libbkmz/4067417 to your computer and use it in GitHub Desktop.
Microphon visualization
#!/usr/bin/env python2
import alsaaudio, time, audioop
try:
from Tkinter import * # python2
except ImportError:
from tkinter import * # python3
try:
xrange # py 2
except NameError:
xrange = range # py 3
inp = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE,mode=alsaaudio.PCM_NORMAL)
# inp = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE,mode=alsaaudio.PCM_NONBLOCK)
bits = 2
max_bit = 2**(8*bits)
max_bit_2 = max_bit/2
# print "bits: %s max_bit: %s max_bit_2: %s" % (bits, max_bit, max_bit_2)
inp.setchannels(1)
inp.setrate(32000)
# inp.setformat(alsaaudio.PCM_FORMAT_S32_LE)
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
# inp.setformat(alsaaudio.PCM_FORMAT_S8)
class Gui():
def __init__(self, master):
self.master = master
self.canvas = Canvas(master)
# window resize
# self.master.bind("<Configure>", self)
# left mouse click
self.canvas.bind("<Button-1>", self.toggle_drawing)
self.canvas.configure({"bg": "white"})
self.canvas.pack({"fill": "both", "expand": True})
self.width = 1360
self.heigth = 768/2
self.master.title("RealTime Segmentation")
self.master.geometry("%ix%i+%i+%i" % (self.width, self.heigth, 0, (768/2)-(self.heigth/2) ))
self.drawing = False
self.first_pause = True
inp.setperiodsize(self.width+1)
self.master.after_idle(self.toggle_drawing)
def toggle_drawing(self, *args):
if not self.first_pause == True:
inp.pause(self.drawing)
self.drawing = not self.drawing
self.first_pause = False
self.master.after_idle(self.draw)
def draw(self):
h = self.heigth
if not self.drawing:
return
self.canvas.delete("all || !line")
l, data = inp.read()
# print audioop.rms(data, bits)
num = [0,0,0]
num[0] = audioop.getsample(data, bits, 0)
num[0] = ((h*num[0])/max_bit_2)+h/2
for i in xrange(0,l-1):
num[1] = audioop.getsample(data, bits, i+1)
# fitting points into window
num[1] = ((h*num[1])/max_bit_2)+h/2
num[2] = ((h*num[2])/max_bit_2)+h/2
self.canvas.create_line(i, num[0],
i+1, num[1],
)
# print "x: %s y: %s" % (i, num[0])
# print "x: %s y: %s\n" % (i, num[1])
num[0] = num[1]
num[1] = num[2]
self.master.update_idletasks()
self.canvas.update_idletasks()
self.master.after(0, self.draw)
root = Tk()
app = Gui(root)
root.mainloop()
#!/usr/bin/env python2
import alsaaudio, time, audioop
try:
from Tkinter import * # python2
except ImportError:
from tkinter import * # python3
try:
xrange # py 2
except NameError:
xrange = range # py 3
inp = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE,mode=alsaaudio.PCM_NORMAL)
# inp = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE,mode=alsaaudio.PCM_NONBLOCK)
buffer = ""
factor = []
factor_len = 24
bits = 2
max_bit = 2**(8*bits)
max_bit_2 = max_bit/2
HZ = 44100
frame_time = 128 # in ms
frame_len = ((HZ/1000)*frame_time)*bits
period_size = 1024
inp.setchannels(1)
inp.setrate(HZ)
inp.setperiodsize(period_size)
# 8 000 Hz
# 11 025 Hz
# 16 000 Hz
# 22 050 Hz
# 32 000 Hz
# 44 100 Hz
# 48 000 Hz
# 96 000 Hz
if bits == 2:
inp.setformat(alsaaudio.PCM_FORMAT_S16_LE)
elif bits == 4:
inp.setformat(alsaaudio.PCM_FORMAT_S32_LE)
else:
print "Error, only 2 or 4 bits"
import sys
sys.exit(1)
class Gui():
def __init__(self, master):
self.master = master
self.canvas = Canvas(master)
# window resize
# self.master.bind("<Configure>", self)
# left mouse click
self.canvas.bind("<Button-1>", self.toggle_drawing)
self.canvas.configure({"bg": "white"})
self.canvas.pack({"fill": "both", "expand": True})
self.width = 1360
self.heigth = 600
self.master.title("RealTime Segmentation")
self.master.geometry("%ix%i+%i+%i" % (self.width, self.heigth, 0, (768/2)-(self.heigth/2) ))
self.drawing = False
self.first_pause = True
# inp.setperiodsize(self.width+1)
self.master.after_idle(self.toggle_drawing)
# dirty vars
self.prev = 0.0
self.prev2 = 0.0
self.index = 0
def toggle_drawing(self, *args):
if not self.first_pause == True:
inp.pause(self.drawing)
self.drawing = not self.drawing
self.first_pause = False
self.master.after_idle(self.draw)
def draw(self):
global buffer, factor, factor_len, bits, max_bit, max_bit_2, HZ, frame_time, frame_len, period_size
h = self.heigth
if not self.drawing:
return
if self.index >= self.width :
self.canvas.delete("all || !line")
self.index = 1
l, data = inp.read()
buffer += data
while len(buffer)> frame_len:
vl = audioop.rms(buffer[:frame_len], bits)
factor.append(vl)
if len(factor) > factor_len:
factor = factor[1:]
avg_factor = 0
for item in factor:
avg_factor += item
avg_factor /= len(factor)
ratio = 50
offset = (self.heigth/2)-200
self.canvas.create_line(self.index, ratio*self.prev+offset,
self.index+1, ratio*(float(vl)/avg_factor)+offset,
fill="blue", width="1")
self.canvas.create_line(self.index, ratio*self.prev2+offset,
self.index+1, ratio*(avg_factor/float(vl))+offset,
fill="red", width="1")
# print "\r%s\t%s\t%s\t%.4f\t%.4f" % (vl, avg_factor, (vl-avg_factor), (float(vl)/avg_factor)*10, (avg_factor/float(vl))*10)
# print "len(buffer): %s frame_len: %s" % (len(buffer), frame_len)
buffer = buffer[-frame_len:]
self.prev = (float(vl)/avg_factor)
self.prev2 = (avg_factor/float(vl))
self.index += 1
# for i in xrange(0,l-1):
# self.canvas.create_line(i, num[0],
# i+1, num[1],
# )
self.master.update_idletasks()
self.canvas.update_idletasks()
self.master.after(0, self.draw)
root = Tk()
app = Gui(root)
root.mainloop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment