1 # -*- coding: utf-8 -*-
3 Module d'analyse des fichiers de log minwii.
9 from logfilereader
import LogFileReader
10 from pprint
import pprint
11 from musicxml
import musicXml2Song
12 from statlib
import stats
14 DEFAULT_STATS
= ('geometricmean',
31 def computeList(self
):
34 for name
in DEFAULT_STATS
:
35 ret
[name
] = getattr(stats
, name
)(l
)
39 class LogFileAnalyser(LogFileReader
) :
41 POSSIBLE_ANALYSES
= {'BEGINNER' : ('songDuration',
43 'noteEndNoteOnLatency',
52 for name
in self
.POSSIBLE_ANALYSES
[mode
] :
53 meth
= getattr(self
, name
)
54 results
[name
] = meth()
58 def playingDuration(self
) :
59 """ retourne la durée écoulée entre le premier et de dernier message
60 de type événement : correspond à la durée d'interprétation.
62 last
= self
.getLastEventTicks()
63 first
= self
.getFirstEventTicks()
66 def songDuration(self
) :
67 """ retourne la durée de référence de la chanson
68 en prenant en compte le tempo présent dans la transcription
69 et en effectuant toutes les répétitions des couplets / refrains.
71 songFile
= self
.getSongFile()
72 song
= musicXml2Song(songFile
)
74 for note
, verseIndex
in song
.iterNotes() :
75 duration
= duration
+ note
.duration
76 return duration
* song
.quarterNoteDuration
79 def noteEndNoteOnLatency(self
) :
80 eIter
= self
.getEventsIterator()
84 for ticks
, eventName
, message
in eIter
:
85 if eventName
== 'NOTEEND':
87 if eventName
== 'NOTEON' and lastnoteEndT
:
88 latencies
.append(ticks
- lastnoteEndT
)
92 def noteOnCount(self
) :
93 "retourne le nombre d'événements NOTEON"
95 eIter
= self
.getEventsIterator()
98 for ticks
, eventName
, message
in eIter
:
99 if eventName
== 'NOTEON' :
111 from optparse
import OptionParser
112 usage
= "%prog logfile"
113 op
= OptionParser(usage
)
114 options
, args
= op
.parse_args()
116 op
.error("incorrect number of arguments")
119 lfa
= LogFileAnalyser(args
[0])
122 if __name__
== "__main__" :
123 from os
.path
import realpath
, sep
125 minwiipath
= realpath(__file__
).split(sep
)
126 minwiipath
= minwiipath
[:-2]
127 minwiipath
= sep
.join(minwiipath
)
128 sys
.path
.insert(1, minwiipath
)