annotate Example VamPy plugins/PyZeroCrossing.py @ 6:e1b508f2f914

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