Ignore:
Timestamp:
Apr 20, 2006, 2:47:39 PM (18 years ago)
Author:
Paul Brossier <piem@altern.org>
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
Message:

first draft for beat evaluation
first draft for beat evaluation

File:
1 edited

Legend:

Unmodified
Added
Removed
  • python/aubio/task/beat.py

    r4798fdf r9bec8fe  
    1414                self.bt        = beattracking(self.btwinlen,self.channels)
    1515                self.pos2      = 0
     16                self.old       = -1000
    1617
    1718        def __call__(self):
     
    3334                                aubio_silence_detection(self.myvec(),
    3435                                        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
    3640       
    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.