fazekasgy@1: '''PyZeroCrossing.py - Example plugin demonstrates''' cannam@7: '''how to call a python class using the VamPy Vamp plugin''' fazekasgy@0: cannam@24: from random import * cannam@24: fazekasgy@0: class PyZeroCrossing: fazekasgy@0: cannam@24: def __init__(self,inputSampleRate): cannam@24: self.m_inputSampleRate = inputSampleRate fazekasgy@0: self.m_stepSize = 0 fazekasgy@0: self.m_blockSize = 0 fazekasgy@0: self.m_channels = 0 fazekasgy@0: self.previousSample = 0.0 cannam@23: self.threshold = 0.005 cannam@24: self.identity = random() cannam@24: self.counter = 0 fazekasgy@0: cannam@24: def initialise(self,channels,stepSize,blockSize): fazekasgy@0: self.m_channels = channels fazekasgy@0: self.m_stepSize = stepSize fazekasgy@0: self.m_blockSize = blockSize fazekasgy@0: return True fazekasgy@0: fazekasgy@0: def getMaker(self): fazekasgy@0: return 'VamPy Example Plugins' fazekasgy@0: fazekasgy@0: def getName(self): fazekasgy@8: return 'Vampy Zero Crossings' fazekasgy@0: fazekasgy@0: def getIdentifier(self): fazekasgy@0: return 'python-zc' fazekasgy@0: fazekasgy@0: def getMaxChannelCount(self): fazekasgy@0: return 1 fazekasgy@0: fazekasgy@0: def getInputDomain(self): fazekasgy@0: return 'TimeDomain' fazekasgy@0: fazekasgy@0: def getOutputDescriptors(self): fazekasgy@0: fazekasgy@6: #descriptors are python dictionaries fazekasgy@0: output0={ fazekasgy@0: 'identifier':'vampy-counts', fazekasgy@0: 'name':'Number of Zero Crossings', fazekasgy@0: 'description':'Number of zero crossings per audio frame', fazekasgy@0: 'unit':' ', fazekasgy@0: 'hasFixedBinCount':True, fazekasgy@0: 'binCount':1, fazekasgy@0: #'binNames':['1 Hz',1.5,'2 Hz',3,'4 Hz'], fazekasgy@0: 'hasKnownExtents':False, fazekasgy@0: #'minValue':0.0, fazekasgy@0: #'maxValue':0.0, fazekasgy@0: 'isQuantized':True, fazekasgy@0: 'quantizeStep':1.0, fazekasgy@0: 'sampleType':'OneSamplePerStep' fazekasgy@0: #'sampleRate':48000.0 fazekasgy@0: } fazekasgy@0: fazekasgy@0: output1={ fazekasgy@0: 'identifier':'vampy-crossings', fazekasgy@0: 'name':'Zero Crossing Locations', fazekasgy@0: 'description':'The locations of zero crossing points', fazekasgy@0: 'unit':'discrete', fazekasgy@0: 'hasFixedBinCount':True, fazekasgy@0: 'binCount':0, fazekasgy@0: 'sampleType':'VariableSampleRate' fazekasgy@0: #'sampleRate':48000.0 fazekasgy@0: } fazekasgy@0: fazekasgy@0: #return a list of dictionaries fazekasgy@0: return [output0,output1] fazekasgy@0: fazekasgy@0: def getParameterDescriptors(self): fazekasgy@0: paramlist1={ fazekasgy@0: 'identifier':'threshold', cannam@24: 'name':'Noise threshold', fazekasgy@26: 'description':'Noise threshold', fazekasgy@0: 'unit':'v', fazekasgy@0: 'minValue':0.0, fazekasgy@0: 'maxValue':0.5, fazekasgy@8: 'defaultValue':0.005, fazekasgy@0: 'isQuantized':False fazekasgy@0: } fazekasgy@0: return [paramlist1] fazekasgy@0: fazekasgy@0: def setParameter(self,paramid,newval): fazekasgy@0: if paramid == 'threshold' : fazekasgy@0: self.threshold = newval fazekasgy@0: return fazekasgy@0: fazekasgy@0: def getParameter(self,paramid): fazekasgy@0: if paramid == 'threshold' : fazekasgy@0: return self.threshold fazekasgy@0: else: fazekasgy@0: return 0.0 fazekasgy@0: fazekasgy@8: def process(self,inbuf,timestamp): fazekasgy@0: crossing = False fazekasgy@0: prev = self.previousSample fazekasgy@0: count = 0.0; fazekasgy@8: channel = inbuf[0] fazekasgy@0: cannam@24: print "Identity ", self.identity, ", counter ", self.counter cannam@24: self.counter = self.counter + 1 cannam@24: fazekasgy@0: #we have two outputs defined thus we have to declare fazekasgy@0: #them as empty dictionaries in our output list fazekasgy@0: #in order to be able to return variable rate outputs fazekasgy@0: output0=[] fazekasgy@0: output1=[] fazekasgy@0: fazekasgy@8: if sum([abs(s) for s in channel]) > self.threshold : fazekasgy@8: fazekasgy@8: for x in range(len(channel)-1) : fazekasgy@0: crossing = False fazekasgy@8: sample = channel[x] fazekasgy@0: if sample <= 0.0 : fazekasgy@0: if prev > 0.0 : crossing = True fazekasgy@0: else : fazekasgy@0: if sample > 0.0 : fazekasgy@0: if prev <= 0.0 : crossing = True fazekasgy@0: fazekasgy@0: if crossing == True : fazekasgy@0: count = count + 1 fazekasgy@0: feature1={ fazekasgy@1: 'hasTimestamp':True, fazekasgy@0: #for now return sample position and convert to RealTime in C code fazekasgy@8: 'timeStamp':long(timestamp + x), fazekasgy@8: 'values':[count], fazekasgy@8: 'label':str(count), fazekasgy@0: } fazekasgy@0: output1.append(feature1) fazekasgy@0: fazekasgy@0: prev = sample fazekasgy@0: self.previousSample = prev fazekasgy@8: fazekasgy@0: else : fazekasgy@0: count = 0.0 fazekasgy@8: self.previousSample = channel[len(channel)-1] fazekasgy@0: fazekasgy@0: feature0={ fazekasgy@0: 'hasTimestamp':False, fazekasgy@8: #'timeStamp':timestamp, fazekasgy@1: 'values':[count], #strictly must be a list fazekasgy@0: 'label':str(count) fazekasgy@0: } fazekasgy@0: output0.append(feature0) fazekasgy@0: fazekasgy@0: #return a LIST of list of dictionaries fazekasgy@0: return [output0,output1] cannam@7: