Changement de signature de la méthode iterNotes.
[minwii.git] / src / minwii / logfilereader.py
index a08855a..648cdee 100755 (executable)
@@ -12,14 +12,16 @@ from events import eventCodes
 from synth import Synth
 from musicxml import musicXml2Song
 import pygame
 from synth import Synth
 from musicxml import musicXml2Song
 import pygame
+from backwardsfilereader import BackwardsReader
 
 SUPPORTED_FILE_HEADER = 'ENV winwii log format version : 1.0'
 
 def inplaceread(m) :
     def readinplace(self, *args, **kw) :
 
 SUPPORTED_FILE_HEADER = 'ENV winwii log format version : 1.0'
 
 def inplaceread(m) :
     def readinplace(self, *args, **kw) :
-        self.savePos()
+        pos = self.logfile.tell()
+        self.logfile.seek(0)
         ret = m(self, *args, **kw)
         ret = m(self, *args, **kw)
-        self.recallPos()
+        self.logfile.seek(pos)
         return ret
     return readinplace
 
         return ret
     return readinplace
 
@@ -37,18 +39,10 @@ class LogFileReader(object) :
         else :
             self.logfile = logfile
         
         else :
             self.logfile = logfile
         
-        self.__pos = 0
-        
         firstline = self.next()
         assert firstline == SUPPORTED_FILE_HEADER
     
         firstline = self.next()
         assert firstline == SUPPORTED_FILE_HEADER
     
-    def savePos(self) :
-        self.__pos = self.logfile.tell()
-        self.logfile.seek(0)
-    
-    def recallPos(self) :
-        self.logfile.seek(self.__pos)
-    
+        
     @inplaceread
     def getSongFile(self) :
         "retourne le chemin d'accès au fichier musicxml de la chanson"
     @inplaceread
     def getSongFile(self) :
         "retourne le chemin d'accès au fichier musicxml de la chanson"
@@ -113,6 +107,16 @@ class LogFileReader(object) :
         firstTicks = int(l.split(None, 2)[1])
         return firstTicks
     
         firstTicks = int(l.split(None, 2)[1])
         return firstTicks
     
+    @inplaceread
+    def getLastEventTicks(self) :
+        "retourne le timecode du dernier événement (entier)"
+        for l in self.getBackwardLineIterator() :
+            if l.startswith('EVT ') :
+                break
+        
+        lastTicks = int(l.split(None, 2)[1])
+        return lastTicks
+    
     def __del__(self) :
         self.logfile.close()
     
     def __del__(self) :
         self.logfile.close()
     
@@ -146,6 +150,14 @@ class LogFileReader(object) :
                 ticks, eventName = l.split(None, 3)[1:]
                 ticks = int(ticks)
                 yield ticks, eventName, ''
                 ticks, eventName = l.split(None, 3)[1:]
                 ticks = int(ticks)
                 yield ticks, eventName, ''
+    
+    def getBackwardLineIterator(self) :
+        br = BackwardsReader(self.logfile, BLKSIZE=128)
+        line = br.readline()
+        while line :
+            yield line.strip()
+            line = br.readline()
+        
                 
 
 class LogFilePlayer(PlayingScreenBase) :
                 
 
 class LogFilePlayer(PlayingScreenBase) :