Changeset 9bec8fe
- Timestamp:
- Apr 20, 2006, 2:47:39 PM (19 years ago)
- Branches:
- feature/autosink, feature/cnn, feature/cnn_org, feature/constantq, feature/crepe, feature/crepe_org, feature/pitchshift, feature/pydocstrings, feature/timestretch, fix/ffmpeg5, master, pitchshift, sampler, timestretch, yinfft+
- Children:
- b1585fd
- Parents:
- 4798fdf
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
python/aubio/task/beat.py
r4798fdf r9bec8fe 14 14 self.bt = beattracking(self.btwinlen,self.channels) 15 15 self.pos2 = 0 16 self.old = -1000 16 17 17 18 def __call__(self): … … 33 34 aubio_silence_detection(self.myvec(), 34 35 self.params.silence)!=1: 35 return self.frameread, 0 36 now = self.frameread-0 37 period = (60 * self.params.samplerate) / ((now - self.old) * self.params.hopsize) 38 self.old = now 39 return now*self.params.step,period 36 40 37 def eval(self,results): 38 pass 39 41 def eval(self,results,tol=0.20,tolcontext=0.25): 42 obeats = self.gettruth() 43 etime = [result[0] for result in results] 44 otime = [obeat[0] for obeat in obeats] 45 CML_tot, CML_max, CML_start, CML_end = 0,0,0,0 46 AML_tot, AML_max, AML_start, AML_end = 0,0,0,0 47 AMLd_tot, AMLd_max, AMLd_start, AMLd_end = 0,0,0,0 48 AMLh_tot, AMLh_max, AMLh_start, AMLh_end = 0,0,0,0 49 AMLo_tot, AMLo_max, AMLo_start, AMLo_end = 0,0,0,0 50 # results iteration 51 j = 1 52 # for each annotation 53 for i in range(2,len(otime)-2): 54 if j+1 >= len(etime): break 55 count = 0 56 # look for next matching beat 57 while otime[i] > etime[j] - (otime[i] - otime[i+1])*tol: 58 if count > 0: 59 #print "spurious etime" 60 if CML_end - CML_start > CML_max: 61 CML_max = CML_end - CML_start 62 CML_start, CML_end = j, j 63 if AMLh_end - AMLh_start > AMLh_max: 64 AMLh_max = AMLh_end - AMLh_start 65 AMLh_start, AMLh_end = j, j 66 if AMLd_end - AMLd_start > AMLd_max: 67 AMLd_max = AMLd_end - AMLd_start 68 AMLd_start, AMLd_end = j, j 69 if AMLo_end - AMLo_start > AMLo_max: 70 AMLo_max = AMLo_end - AMLo_start 71 AMLo_start, AMLo_end = j, j 72 j += 1 73 count += 1 74 if j+1 >= len(etime): break 75 #print otime[i-1],etime[j-1]," ",otime[i],etime[j]," ",otime[i+1],etime[j+1] 76 prevtempo = (otime[i] - otime[i-1]) 77 nexttempo = (otime[i+1] - otime[i]) 78 79 current0 = (etime[j] > otime[i] - prevtempo*tol) 80 current1 = (etime[j] < otime[i] + prevtempo*tol) 81 82 # check correct tempo 83 prev0 = (etime[j-1] > otime[i-1] - prevtempo*tolcontext) 84 prev1 = (etime[j-1] < otime[i-1] + prevtempo*tolcontext) 85 next0 = (etime[j+1] > otime[i+1] - nexttempo*tolcontext) 86 next1 = (etime[j+1] < otime[i+1] + nexttempo*tolcontext) 87 88 # check for off beat 89 prevoffb0 = (etime[j-1] > otime[i-1] - prevtempo/2 - prevtempo*tolcontext) 90 prevoffb1 = (etime[j-1] < otime[i-1] - prevtempo/2 + prevtempo*tolcontext) 91 nextoffb0 = (etime[j+1] > otime[i+1] - nexttempo/2 - nexttempo*tolcontext) 92 nextoffb1 = (etime[j+1] < otime[i+1] - nexttempo/2 + nexttempo*tolcontext) 93 94 # check half tempo 95 prevhalf0 = (etime[j-1] > otime[i-1] + prevtempo - prevtempo/2*tolcontext) 96 prevhalf1 = (etime[j-1] < otime[i-1] + prevtempo + prevtempo/2*tolcontext) 97 nexthalf0 = (etime[j+1] > otime[i+1] - nexttempo - nexttempo/2*tolcontext) 98 nexthalf1 = (etime[j+1] < otime[i+1] - nexttempo + nexttempo/2*tolcontext) 99 100 # check double tempo 101 prevdoub0 = (etime[j-1] > otime[i-1] - prevtempo - prevtempo*2*tolcontext) 102 prevdoub1 = (etime[j-1] < otime[i-1] - prevtempo + prevtempo*2*tolcontext) 103 nextdoub0 = (etime[j+1] > otime[i+1] + nexttempo - nexttempo*2*tolcontext) 104 nextdoub1 = (etime[j+1] < otime[i+1] + nexttempo + nexttempo*2*tolcontext) 105 106 if current0 and current1 and prev0 and prev1 and next0 and next1: 107 #print "YES!" 108 CML_end = j 109 CML_tot += 1 110 else: 111 if CML_end - CML_start > CML_max: 112 CML_max = CML_end - CML_start 113 CML_start, CML_end = j, j 114 if current0 and current1 and prevhalf0 and prevhalf1 and nexthalf0 and nexthalf1: 115 AMLh_end = j 116 AMLh_tot += 1 117 else: 118 if AMLh_end - AMLh_start > AMLh_max: 119 AMLh_max = AMLh_end - AMLh_start 120 AMLh_start, AMLh_end = j, j 121 if current0 and current1 and prevdoub0 and prevdoub1 and nextdoub0 and nextdoub1: 122 AMLd_end = j 123 AMLd_tot += 1 124 else: 125 if AMLd_end - AMLd_start > AMLd_max: 126 AMLd_max = AMLd_end - AMLd_start 127 AMLd_start, AMLd_end = j, j 128 if current0 and current1 and prevoffb0 and prevoffb1 and nextoffb0 and nextoffb1: 129 AMLo_end = j 130 AMLo_tot += 1 131 else: 132 if AMLo_end - AMLo_start > AMLo_max: 133 AMLo_max = AMLo_end - AMLo_start 134 AMLo_start, AMLo_end = j, j 135 # look for next matching beat 136 count = 0 137 while otime[i] > etime[j] - (otime[i] - otime[i+1])*tolcontext: 138 j += 1 139 if count > 0: 140 #print "spurious etime" 141 start = j 142 count += 1 143 total = float(len(otime)) 144 CML_tot /= total 145 AMLh_tot /= total 146 AMLd_tot /= total 147 AMLo_tot /= total 148 CML_cont = CML_max/total 149 AMLh_cont = AMLh_max/total 150 AMLd_cont = AMLd_max/total 151 AMLo_cont = AMLo_max/total 152 return CML_cont, CML_tot, AMLh_cont, AMLh_tot, AMLd_cont, AMLd_tot, AMLo_cont, AMLo_tot 153 154 # for i in allfreq: 155 # freq.append(float(i) / 2. / N * samplerate ) 156 # while freq[i]>freqs[j]: 157 # j += 1 158 # a0 = weight[j-1] 159 # a1 = weight[j] 160 # f0 = freqs[j-1] 161 # f1 = freqs[j] 162 # if f0!=0: 163 # iweight.append((a1-a0)/(f1-f0)*freq[i] + (a0 - (a1 - a0)/(f1/f0 -1.))) 164 # else: 165 # iweight.append((a1-a0)/(f1-f0)*freq[i] + a0) 166 # while freq[i]>freqs[j]: 167 # j += 1 168 169 170 def gettruth(self): 171 import os.path 172 from aubio.txtfile import read_datafile 173 datafile = self.input.replace('.wav','.txt') 174 if not os.path.isfile(datafile): 175 print "no ground truth " 176 return False,False 177 else: 178 values = read_datafile(datafile,depth=0) 179 old = -1000 180 for i in range(len(values)): 181 now = values[i] 182 period = 60 / (now - old) 183 old = now 184 values[i] = [now,period] 185 return values 186 187 188 def plot(self,oplots,results): 189 import Gnuplot 190 oplots.append(Gnuplot.Data(results,with='linespoints',title="auto")) 191 192 def plotplot(self,oplots,outplot=None): 193 import Gnuplot 194 from aubio.gnuplot import gnuplot_init, audio_to_array, make_audio_plot 195 import re 196 # audio data 197 #time,data = audio_to_array(self.input) 198 #f = make_audio_plot(time,data) 199 200 g = gnuplot_init(outplot) 201 oplots = [Gnuplot.Data(self.gettruth(),with='linespoints',title="orig")] + oplots 202 g.plot(*oplots)
Note: See TracChangeset
for help on using the changeset viewer.