annotate Example VamPy plugins/PyZeroCrossing.py @ 13:3983172c1db2

fixed PySpectralCentroid example
author fazekasgy
date Wed, 02 Jul 2008 12:11:35 +0000
parents 3af6b5990ad8
children 535d559300dc
rev   line source
fazekasgy@1 1 '''PyZeroCrossing.py - Example plugin demonstrates'''
cannam@7 2 '''how to call a python class using the VamPy Vamp plugin'''
fazekasgy@0 3
fazekasgy@0 4 class PyZeroCrossing:
fazekasgy@0 5
fazekasgy@0 6 def __init__(self):
fazekasgy@6 7 self.m_imputSampleRate = 0.0
fazekasgy@0 8 self.m_stepSize = 0
fazekasgy@0 9 self.m_blockSize = 0
fazekasgy@0 10 self.m_channels = 0
fazekasgy@0 11 self.previousSample = 0.0
fazekasgy@8 12 self.threshold = 0.01
fazekasgy@0 13
fazekasgy@0 14 def initialise(self,channels,stepSize,blockSize,inputSampleRate):
fazekasgy@0 15 self.m_channels = channels
fazekasgy@0 16 self.m_stepSize = stepSize
fazekasgy@0 17 self.m_blockSize = blockSize
fazekasgy@0 18 self.m_inputSampleRate = inputSampleRate
fazekasgy@0 19 return True
fazekasgy@0 20
fazekasgy@0 21 def getMaker(self):
fazekasgy@0 22 return 'VamPy Example Plugins'
fazekasgy@0 23
fazekasgy@0 24 def getName(self):
fazekasgy@8 25 return 'Vampy Zero Crossings'
fazekasgy@0 26
fazekasgy@0 27 def getIdentifier(self):
fazekasgy@0 28 return 'python-zc'
fazekasgy@0 29
fazekasgy@0 30 def getMaxChannelCount(self):
fazekasgy@0 31 return 1
fazekasgy@0 32
fazekasgy@0 33 def getInputDomain(self):
fazekasgy@0 34 return 'TimeDomain'
fazekasgy@0 35
fazekasgy@0 36 def getOutputDescriptors(self):
fazekasgy@0 37
fazekasgy@6 38 #descriptors are python dictionaries
fazekasgy@0 39 output0={
fazekasgy@0 40 'identifier':'vampy-counts',
fazekasgy@0 41 'name':'Number of Zero Crossings',
fazekasgy@0 42 'description':'Number of zero crossings per audio frame',
fazekasgy@0 43 'unit':' ',
fazekasgy@0 44 'hasFixedBinCount':True,
fazekasgy@0 45 'binCount':1,
fazekasgy@0 46 #'binNames':['1 Hz',1.5,'2 Hz',3,'4 Hz'],
fazekasgy@0 47 'hasKnownExtents':False,
fazekasgy@0 48 #'minValue':0.0,
fazekasgy@0 49 #'maxValue':0.0,
fazekasgy@0 50 'isQuantized':True,
fazekasgy@0 51 'quantizeStep':1.0,
fazekasgy@0 52 'sampleType':'OneSamplePerStep'
fazekasgy@0 53 #'sampleRate':48000.0
fazekasgy@0 54 }
fazekasgy@0 55
fazekasgy@0 56 output1={
fazekasgy@0 57 'identifier':'vampy-crossings',
fazekasgy@0 58 'name':'Zero Crossing Locations',
fazekasgy@0 59 'description':'The locations of zero crossing points',
fazekasgy@0 60 'unit':'discrete',
fazekasgy@0 61 'hasFixedBinCount':True,
fazekasgy@0 62 'binCount':0,
fazekasgy@0 63 'sampleType':'VariableSampleRate'
fazekasgy@0 64 #'sampleRate':48000.0
fazekasgy@0 65 }
fazekasgy@0 66
fazekasgy@0 67 #return a list of dictionaries
fazekasgy@0 68 return [output0,output1]
fazekasgy@0 69
fazekasgy@0 70 def getParameterDescriptors(self):
fazekasgy@0 71 paramlist1={
fazekasgy@0 72 'identifier':'threshold',
fazekasgy@0 73 'name':'Noise threshold: ',
fazekasgy@0 74 'description':'Return null or delete this function if not needed.',
fazekasgy@0 75 'unit':'v',
fazekasgy@0 76 'minValue':0.0,
fazekasgy@0 77 'maxValue':0.5,
fazekasgy@8 78 'defaultValue':0.005,
fazekasgy@0 79 'isQuantized':False
fazekasgy@0 80 }
fazekasgy@0 81 return [paramlist1]
fazekasgy@0 82
fazekasgy@0 83 def setParameter(self,paramid,newval):
fazekasgy@0 84 if paramid == 'threshold' :
fazekasgy@0 85 self.threshold = newval
fazekasgy@0 86 return
fazekasgy@0 87
fazekasgy@0 88 def getParameter(self,paramid):
fazekasgy@0 89 if paramid == 'threshold' :
fazekasgy@0 90 return self.threshold
fazekasgy@0 91 else:
fazekasgy@0 92 return 0.0
fazekasgy@0 93
fazekasgy@8 94 def process(self,inbuf,timestamp):
fazekasgy@0 95 crossing = False
fazekasgy@0 96 prev = self.previousSample
fazekasgy@0 97 count = 0.0;
fazekasgy@8 98 channel = inbuf[0]
fazekasgy@0 99
fazekasgy@0 100 #we have two outputs defined thus we have to declare
fazekasgy@0 101 #them as empty dictionaries in our output list
fazekasgy@0 102 #in order to be able to return variable rate outputs
fazekasgy@0 103 output0=[]
fazekasgy@0 104 output1=[]
fazekasgy@0 105
fazekasgy@8 106 if sum([abs(s) for s in channel]) > self.threshold :
fazekasgy@8 107
fazekasgy@8 108 for x in range(len(channel)-1) :
fazekasgy@0 109 crossing = False
fazekasgy@8 110 sample = channel[x]
fazekasgy@0 111 if sample <= 0.0 :
fazekasgy@0 112 if prev > 0.0 : crossing = True
fazekasgy@0 113 else :
fazekasgy@0 114 if sample > 0.0 :
fazekasgy@0 115 if prev <= 0.0 : crossing = True
fazekasgy@0 116
fazekasgy@0 117 if crossing == True :
fazekasgy@0 118 count = count + 1
fazekasgy@0 119 feature1={
fazekasgy@1 120 'hasTimestamp':True,
fazekasgy@0 121 #for now return sample position and convert to RealTime in C code
fazekasgy@8 122 'timeStamp':long(timestamp + x),
fazekasgy@8 123 'values':[count],
fazekasgy@8 124 'label':str(count),
fazekasgy@0 125 }
fazekasgy@0 126 output1.append(feature1)
fazekasgy@0 127
fazekasgy@0 128 prev = sample
fazekasgy@0 129 self.previousSample = prev
fazekasgy@8 130
fazekasgy@0 131 else :
fazekasgy@0 132 count = 0.0
fazekasgy@8 133 self.previousSample = channel[len(channel)-1]
fazekasgy@0 134
fazekasgy@0 135 feature0={
fazekasgy@0 136 'hasTimestamp':False,
fazekasgy@8 137 #'timeStamp':timestamp,
fazekasgy@1 138 'values':[count], #strictly must be a list
fazekasgy@0 139 'label':str(count)
fazekasgy@0 140 }
fazekasgy@0 141 output0.append(feature0)
fazekasgy@0 142
fazekasgy@0 143 #return a LIST of list of dictionaries
fazekasgy@0 144 return [output0,output1]
cannam@7 145