Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Speak.activity/mouth.py
diff options
context:
space:
mode:
authorJoshua Minor <j@lux.vu>2007-12-22 00:23:11 (GMT)
committer Joshua Minor <j@lux.vu>2007-12-22 00:23:11 (GMT)
commit81c32d12cf7ef1619a518a97a93acc994cba031e (patch)
treee8d5574a97cad8f90e668a791af0dc4e26cfebda /Speak.activity/mouth.py
Initial version of Speak.activity
Diffstat (limited to 'Speak.activity/mouth.py')
-rw-r--r--Speak.activity/mouth.py172
1 files changed, 172 insertions, 0 deletions
diff --git a/Speak.activity/mouth.py b/Speak.activity/mouth.py
new file mode 100644
index 0000000..94d156d
--- /dev/null
+++ b/Speak.activity/mouth.py
@@ -0,0 +1,172 @@
+#! /usr/bin/python
+
+import pygst
+pygst.require("0.10")
+import pygtk
+import gtk
+import cairo
+import gobject
+from time import *
+from struct import *
+import pango
+import os
+import audioop
+from Numeric import *
+from FFT import *
+
+class Mouth(gtk.DrawingArea):
+ def __init__(self, audioSource):
+
+ gtk.DrawingArea.__init__(self)
+ self.connect("expose_event",self.expose)
+ self.buffers = []
+ self.str_buffer=''
+ self.integer_buffer=[]
+
+ audioSource.connect("new-buffer", self._new_buffer)
+
+ self.peaks = []
+ self.main_buffers = []
+
+ self.y_mag = 0.7
+ self.freq_range=70
+ self.draw_interval = 1
+ self.num_of_points = 105
+
+ self.details_show = False
+ self.logging_status=False
+ self.f=None
+
+ self.stop=False
+
+ self.fft_show = False
+ self.fftx = []
+
+ self.y_mag_bias_multiplier = 1 #constant to multiply with self.param2 while scaling values
+
+ self.scaleX = "10"
+ self.scaleY = "10"
+
+
+ def _new_buffer(self, obj, buf, status, f):
+ self.str_buffer = buf
+ self.integer_buffer = list(unpack( str(int(len(buf))/2)+'h' , buf))
+ if(len(self.main_buffers)>6301):
+ del self.main_buffers[0:(len(self.main_buffers)-6301)]
+ self.main_buffers += self.integer_buffer
+ self.logging_status=status
+ self.f=f
+ return True
+
+
+ def processBuffer(self, bounds):
+ self.param1 = bounds.height/65536.0
+ self.param2 = bounds.height/2.0
+
+ if(self.stop==False):
+
+ if(self.fft_show==False):
+
+ ######################filtering####################
+ weights = [1,2,3,4,3,2,1]
+ weights_sum = 16.0
+
+ for i in range(3,len(self.integer_buffer)-3):
+ self.integer_buffer[i] = (self.integer_buffer[(i-3)]+2*self.integer_buffer[(i-2)] + 3*self.integer_buffer[(i-1)] + 4*self.integer_buffer[(i)]+3*self.integer_buffer[(i+1)] + 2*self.integer_buffer[(i+2)] + self.integer_buffer[(i+3)]) / weights_sum
+ ###################################################
+
+ self.y_mag_bias_multiplier=1
+ self.draw_interval=10
+
+ #100hz
+ if(self.freq_range==30):
+ self.spacing = 60
+ self.num_of_points=6300
+
+ #1khz
+ if(self.freq_range==50):
+ self.spacing = 6
+ self.num_of_points=630
+
+ #4khz
+ if(self.freq_range==70):
+ self.spacing = 1
+ self.num_of_points = 105
+
+ self.scaleX = str(self.spacing*.104) + " msec" #.104 = 5/48; 5 points per division and 48 khz sampling
+
+ if(len(self.main_buffers)>=self.num_of_points):
+ del self.main_buffers[0:len(self.main_buffers)-(self.num_of_points+1)]
+ self.buffers=[]
+ i=0
+ while i<self.num_of_points:
+ self.buffers.append(self.main_buffers[i])
+ i+=self.spacing
+
+ self.scaleY=" "
+
+ else:
+ ###############fft################
+ Fs = 48000
+ nfft= 65536
+ self.integer_buffer=self.integer_buffer[0:256]
+ self.fftx = fft(self.integer_buffer, 256,-1)
+
+ self.fftx=self.fftx[0:self.freq_range*2]
+ self.draw_interval=bounds.width/(self.freq_range*2)
+
+ NumUniquePts = ceil((nfft+1)/2)
+ self.buffers=abs(self.fftx)*0.02
+ self.y_mag_bias_multiplier=0.1
+ self.scaleX = "hz"
+ self.scaleY = ""
+ ##################################
+
+ if(len(self.buffers)==0):
+ return False
+
+ ###############Scaling the values################
+ val = []
+ for i in self.buffers:
+ temp_val_float = float(self.param1*i*self.y_mag) + self.y_mag_bias_multiplier * self.param2
+
+ if(temp_val_float >= bounds.height):
+ temp_val_float = bounds.height-25
+ if(temp_val_float <= 0):
+ temp_val_float = 25
+ val.append( temp_val_float )
+
+ self.peaks = val
+ #################################################
+
+ def expose(self, widget, event):
+ """This function is the "expose" event handler and does all the drawing."""
+
+ bounds = self.get_allocation()
+
+ self.processBuffer(bounds)
+
+ #Create context, disable antialiasing
+ self.context = widget.window.cairo_create()
+ self.context.set_antialias(cairo.ANTIALIAS_NONE)
+
+ #set a clip region for the expose event. This reduces redrawing work (and time)
+ self.context.rectangle(event.area.x, event.area.y,event.area.width, event.area.height)
+ self.context.clip()
+
+
+ # background
+ self.context.set_source_rgb(.5,.5,.5)
+ self.context.rectangle(0,0, bounds.width,bounds.height)
+ self.context.fill()
+
+ # Draw the waveform
+ self.context.set_line_width(10.0)
+ count = 0
+ for peak in self.peaks:
+ self.context.line_to(count,bounds.height - peak)
+ count += self.draw_interval
+ self.context.set_source_rgb(0,0,0)
+ self.context.stroke()
+
+ return True