From 81c32d12cf7ef1619a518a97a93acc994cba031e Mon Sep 17 00:00:00 2001 From: Joshua Minor Date: Sat, 22 Dec 2007 00:23:11 +0000 Subject: Initial version of Speak.activity --- (limited to 'Speak.activity/mouth.py') 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= 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 -- cgit v0.9.1