fazekasgy@9: '''PySpectralCentroid.py - Example plugin demonstrates''' fazekasgy@9: '''how to write a C style plugin using VamPy.''' fazekasgy@9: fazekasgy@9: from numpy import * fazekasgy@9: fazekasgy@9: class PySpectralCentroid: fazekasgy@9: fazekasgy@9: def __init__(self): fazekasgy@9: self.m_imputSampleRate = 0.0 fazekasgy@9: self.m_stepSize = 0 fazekasgy@9: self.m_blockSize = 0 fazekasgy@9: self.m_channels = 0 fazekasgy@9: self.previousSample = 0.0 cannam@23: self.threshold = 0.05 fazekasgy@9: fazekasgy@9: def initialise(self,channels,stepSize,blockSize,inputSampleRate): fazekasgy@9: self.m_channels = channels fazekasgy@9: self.m_stepSize = stepSize fazekasgy@9: self.m_blockSize = blockSize fazekasgy@9: self.m_inputSampleRate = inputSampleRate fazekasgy@9: return True fazekasgy@9: fazekasgy@9: def getMaker(self): fazekasgy@9: return 'VamPy Example Plugins' fazekasgy@9: fazekasgy@9: def getName(self): fazekasgy@9: return 'Spectral Centroid (VamPy Legacy Interface)' fazekasgy@9: fazekasgy@9: def getIdentifier(self): fazekasgy@9: return 'python-sf1' fazekasgy@9: fazekasgy@9: def getMaxChannelCount(self): fazekasgy@9: return 1 fazekasgy@9: fazekasgy@9: def getInputDomain(self): fazekasgy@9: return 'FrequencyDomain' fazekasgy@9: fazekasgy@9: def getOutputDescriptors(self): fazekasgy@9: fazekasgy@9: #descriptors are python dictionaries fazekasgy@9: output0={ fazekasgy@9: 'identifier':'vampy-sf1', fazekasgy@9: 'name':'Spectral Centroid', fazekasgy@9: 'description':'Spectral Centroid (Brightness)', fazekasgy@9: 'unit':' ', fazekasgy@9: 'hasFixedBinCount':True, fazekasgy@9: 'binCount':1, fazekasgy@9: #'binNames':['1 Hz',1.5,'2 Hz',3,'4 Hz'], fazekasgy@9: 'hasKnownExtents':False, fazekasgy@9: #'minValue':0.0, fazekasgy@9: #'maxValue':0.0, fazekasgy@9: 'isQuantized':True, fazekasgy@9: 'quantizeStep':1.0, fazekasgy@9: 'sampleType':'OneSamplePerStep' fazekasgy@9: #'sampleRate':48000.0 fazekasgy@9: } fazekasgy@9: fazekasgy@9: #return a list of dictionaries fazekasgy@9: return [output0] fazekasgy@9: fazekasgy@9: def getParameterDescriptors(self): fazekasgy@9: paramlist1={ fazekasgy@9: 'identifier':'threshold', fazekasgy@9: 'name':'Noise threshold: ', fazekasgy@9: 'description':'Return null or delete this function if not needed.', fazekasgy@9: 'unit':'v', fazekasgy@9: 'minValue':0.0, fazekasgy@9: 'maxValue':0.5, fazekasgy@9: 'defaultValue':0.05, fazekasgy@9: 'isQuantized':False fazekasgy@9: } fazekasgy@9: return [paramlist1] fazekasgy@9: fazekasgy@9: def setParameter(self,paramid,newval): fazekasgy@9: if paramid == 'threshold' : fazekasgy@9: self.threshold = newval fazekasgy@9: return fazekasgy@9: fazekasgy@9: def getParameter(self,paramid): fazekasgy@9: if paramid == 'threshold' : fazekasgy@9: return self.threshold fazekasgy@9: else: fazekasgy@9: return 0.0 fazekasgy@9: fazekasgy@13: def process(self,inbuf,timestamp): fazekasgy@9: inArray = array(inbuf[0]) fazekasgy@9: crossing = False fazekasgy@9: prev = self.previousSample fazekasgy@9: count = 0.0 fazekasgy@9: numLin = 0.0 fazekasgy@9: denom = 0.0 fazekasgy@9: centroid = 0.0 fazekasgy@9: fazekasgy@9: fazekasgy@9: re = array(inbuf[2:len(inArray):2]) fazekasgy@9: im = array(inbuf[3:len(inArray):2]) fazekasgy@9: #we have two outputs defined thus we have to declare fazekasgy@9: #them as empty dictionaries in our output list fazekasgy@9: #in order to be able to return variable rate outputs fazekasgy@9: output0=[] fazekasgy@9: output1=[] fazekasgy@9: fazekasgy@9: if sum(abs(inArray)) > self.threshold : fazekasgy@9: for i in range(1,(len(inArray)/2)) : fazekasgy@9: fazekasgy@9: re = inArray[i*2] fazekasgy@9: im = inArray[i*2+1] fazekasgy@9: freq = i * self.m_inputSampleRate / self.m_blockSize fazekasgy@9: power = sqrt (re*re + im*im) / (self.m_blockSize/2) fazekasgy@9: denom = denom + power fazekasgy@9: numLin = numLin + freq * power fazekasgy@9: fazekasgy@9: if denom != 0 : fazekasgy@9: centroid = numLin / denom fazekasgy@9: fazekasgy@9: else : fazekasgy@9: centroid = 0.0 fazekasgy@9: fazekasgy@9: feature0={ fazekasgy@9: 'hasTimestamp':False, fazekasgy@9: 'values':[centroid], #strictly must be a list fazekasgy@9: 'label':str(centroid) fazekasgy@9: } fazekasgy@9: output0.append(feature0) fazekasgy@9: fazekasgy@9: #return a LIST of list of dictionaries fazekasgy@9: return [output0]