Browse Source

try to fix looping. not there yet

master
Nils 4 years ago
parent
commit
1fef445f5a
  1. 61
      engine/api.py
  2. 15
      engine/main.py

61
engine/api.py

@ -200,9 +200,39 @@ def startEngine(nsmClient):
for track in session.data.tracks:
callbacks._trackMetaDataChanged(track) #for colors, scale and simpleNoteNames
session.data.buildAllTracks()
session.data.buildAllTracks(buildSongDuration=True) #will set to max track length, we always have a song duration.
updatePlayback()
def _loopOff():
session.data.buildSongDuration() #no parameter removes the loop
updatePlayback()
session.inLoopMode = None
callbacks._loopChanged(None, None, None)
def _loopNow():
now = cbox.Transport.status().pos_ppqn
_setLoop(now)
def _setLoop(loopMeasureAroundPpqn):
if loopMeasureAroundPpqn < 0:
_loopOff()
return
loopStart, loopEnd = session.data.buildSongDuration(loopMeasureAroundPpqn)
updatePlayback()
session.inLoopMode = (loopStart, loopEnd)
assert loopStart <= loopMeasureAroundPpqn < loopEnd
if not playbackStatus():
cbox.Transport.play()
oneMeasureInTicks = (session.data.howManyUnits * session.data.whatTypeOfUnit) / session.data.subdivisions
measurenumber, rest = divmod(loopStart, oneMeasureInTicks)
callbacks._loopChanged(int(measurenumber), loopStart, loopEnd)
def toggleLoop():
"""Plays the current measure as loop.
@ -211,26 +241,9 @@ def toggleLoop():
session.inLoopMode is a tuple (start, end)
"""
if session.inLoopMode:
session.data.buildSongDuration() #no parameter removes the loop
updatePlayback()
session.inLoopMode = None
callbacks._loopChanged(None, None, None)
_loopOff()
else:
now = loopMeasureAroundPpqn=cbox.Transport.status().pos_ppqn
loopStart, loopEnd = session.data.buildSongDuration(now)
updatePlayback()
session.inLoopMode = (loopStart, loopEnd)
assert loopStart <= now < loopEnd
if not playbackStatus():
cbox.Transport.play()
oneMeasureInTicks = (session.data.howManyUnits * session.data.whatTypeOfUnit) / session.data.subdivisions
measurenumber, rest = divmod(loopStart, oneMeasureInTicks)
callbacks._loopChanged(int(measurenumber), loopStart, loopEnd)
_loopNow()
def seek(value):
"""override template one, which does not have a loop"""
@ -262,6 +275,8 @@ def set_whatTypeOfUnit(ticks):
if session.data.whatTypeOfUnit == ticks: return
session.data.whatTypeOfUnit = ticks
session.data.buildAllTracks()
if session.inLoopMode:
_loopNow()
updatePlayback()
callbacks._timeSignatureChanged()
@ -270,6 +285,8 @@ def set_howManyUnits(value):
if session.data.howManyUnits == value: return
session.data.howManyUnits = value
session.data.buildAllTracks()
if session.inLoopMode:
_loopNow()
updatePlayback()
callbacks._timeSignatureChanged()
@ -278,6 +295,8 @@ def set_subdivisions(value):
if session.data.subdivisions == value: return
session.data.subdivisions = value
session.data.buildAllTracks()
if session.inLoopMode:
_loopNow()
updatePlayback()
callbacks._subdivisionsChanged()
@ -293,6 +312,8 @@ def convert_subdivisions(value, errorHandling):
callbacks._patternChanged(tr)
else:
callbacks._subdivisionsChanged() #to reset the GUI value back to the working one.
if session.inLoopMode:
_loopNow()
return result
def set_numberOfMeasures(value):

15
engine/main.py

@ -149,15 +149,22 @@ class Data(template.engine.sequencer.Score):
return True
def buildAllTracks(self):
"""Includes all patterns.
This still needs to be followed by buildSongDuration. Explicit is better than implicit."""
def buildAllTracks(self, buildSongDuration=False):
"""Includes all patterns.
buildSongDuration is True at least once in the programs life time, on startup.
If True it will reset the loop. The api calls buildSongDuration directly when it sets
the loop.
"""
for track in self.tracks:
track.pattern.buildExportCache()
track.buildTrack()
self.buildSongDuration()
if buildSongDuration:
self.buildSongDuration()
def buildSongDuration(self, loopMeasureAroundPpqn=None):
"""Loop does not reset automatically. We keep it until explicitely changed.
If we do not have a loop the song duration is already maxTrackDuration, no update needed."""
oneMeasureInTicks = (self.howManyUnits * self.whatTypeOfUnit) / self.subdivisions
oneMeasureInTicks = int(oneMeasureInTicks)
maxTrackDuration = self.numberOfMeasures * oneMeasureInTicks

Loading…
Cancel
Save