From 7d14cb74eefdfd68142b5db4a75bc13b1c4cc0e4 Mon Sep 17 00:00:00 2001 From: Sebastian Krzyszkowiak <dos@dosowisko.net> Date: Wed, 27 Sep 2023 08:47:11 +0200 Subject: [PATCH] Cache tempo marks --- loading.py | 9 +++++++-- midireader.py | 28 ++++++++++++++++------------ 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/loading.py b/loading.py index dc05c52..c49e033 100644 --- a/loading.py +++ b/loading.py @@ -1,6 +1,6 @@ from st3m.ui.view import BaseView, ViewTransitionBlend import gc -import sys_display +import time import song import utils @@ -43,5 +43,10 @@ class LoadingView(BaseView): utils.blm_timeout(self, delta_ms) if self.vm.transitioning or not self.is_active(): return #gc.collect() - self.vm.replace(song.SongView(self.app, self.song, self.difficulty), ViewTransitionBlend()) + t = time.ticks_ms() + view = song.SongView(self.app, self.song, self.difficulty) + t = time.ticks_ms() - t + if t < 2000: + time.sleep_ms(2000 - t) + self.vm.replace(view, ViewTransitionBlend()) gc.collect() diff --git a/midireader.py b/midireader.py index 26a981d..25f2675 100644 --- a/midireader.py +++ b/midireader.py @@ -124,6 +124,9 @@ class MidiReader(midi.MidiOutStream): self.track = Track() self.nTracks = -1 self.ignored = False + + self.current_tempo_marker = 0 + self.scaledTime = 0 def addEvent(self, track, event): time = event.time @@ -139,26 +142,27 @@ class MidiReader(midi.MidiOutStream): #elif track < len(self.tracks): # self.tracks[track].addEvent(time, event) - def abs_time(self): - def ticksToBeats(ticks, bpm): - return (60000.0 * ticks) / (bpm * self.ticksPerBeat) + def ticksToBeats(self, ticks, bpm): + return (60000.0 * ticks) / (bpm * self.ticksPerBeat) + def abs_time(self): if self.bpm: currentTime = midi.MidiOutStream.abs_time(self) - # Find out the current scaled time. - # Yeah, this is reeally slow, but fast enough :) - scaledTime = 0.0 - tempoMarkerTime = 0.0 # Find out the current scaled time. + if self.current_tempo_marker == 0: + tempoMarkerTime, currentBpm = 0.0, self.bpm + else: + tempoMarkerTime, currentBpm = self.tempoMarkers[self.current_tempo_marker - 1] - currentBpm = self.bpm - for i in range(len(self.tempoMarkers)): - time, bpm = self.tempoMarkers[i] + while len(self.tempoMarkers) > self.current_tempo_marker: + time, bpm = self.tempoMarkers[self.current_tempo_marker] if time > currentTime: break - scaledTime += ticksToBeats(time - tempoMarkerTime, currentBpm) + self.scaledTime += self.ticksToBeats(time - tempoMarkerTime, currentBpm) + self.current_tempo_marker += 1 tempoMarkerTime, currentBpm = time, bpm - return scaledTime + ticksToBeats(currentTime - tempoMarkerTime, currentBpm) + + return self.scaledTime + self.ticksToBeats(currentTime - tempoMarkerTime, currentBpm) return 0.0 def header(self, format, nTracks, division): -- GitLab