diff --git a/engine/main.py b/engine/main.py index f45a25a..18215c3 100644 --- a/engine/main.py +++ b/engine/main.py @@ -70,7 +70,7 @@ class Data(template.engine.sequencer.Score): def addTrack(self, name="", scale=None, color=None, simpleNoteNames=None): """Overrides the simpler template version""" - track = Track(parentScore=self, name=name, scale=scale, color=color, simpleNoteNames=simpleNoteNames) + track = Track(parentData=self, name=name, scale=scale, color=color, simpleNoteNames=simpleNoteNames) self.tracks.append(track) return track diff --git a/engine/pattern.py b/engine/pattern.py index 2d91850..af4fcc3 100644 --- a/engine/pattern.py +++ b/engine/pattern.py @@ -53,7 +53,7 @@ class Pattern(object): self.parentTrack = parentTrack self.scale = scale if scale else (72, 71, 69, 67, 65, 64, 62, 60) #Scale needs to be set first because on init/load data already depends on it, at least the default scale. The scale is part of the track meta callback. self.data = data if data else list() #For content see docstring. this cannot be the default parameter because we would set the same list for all instances. - self.simpleNoteNames = simpleNoteNames if simpleNoteNames else self.parentTrack.parentScore.lastUsedNotenames #This is mostly for the GUI or other kinds of representation instead midi notes + self.simpleNoteNames = simpleNoteNames if simpleNoteNames else self.parentTrack.parentData.lastUsedNotenames #This is mostly for the GUI or other kinds of representation instead midi notes self._processAfterInit() def _prepareBeforeInit(self): @@ -87,14 +87,14 @@ class Pattern(object): @simpleNoteNames.setter def simpleNoteNames(self, value): self._simpleNoteNames = tuple(value) #we keep it immutable, this is safer to avoid accidental linked structures when creating a clone. - self.parentTrack.parentScore.lastUsedNotenames = self._simpleNoteNames #new default for new tracks + self.parentTrack.parentData.lastUsedNotenames = self._simpleNoteNames #new default for new tracks def fill(self): """Create a 2 dimensional array""" l = len(self.scale) lst = [] vel = self.averageVelocity - for index in range(self.parentTrack.parentScore.howManyUnits): + for index in range(self.parentTrack.parentData.howManyUnits): for pitchindex in range(l): lst.append({"index":index, "factor": 1, "pitch": pitchindex, "velocity":vel}) self.data = lst @@ -107,7 +107,7 @@ class Pattern(object): lst = [] existing = [(d["index"], d["pitch"]) for d in self.data] vel = self.averageVelocity - for index in range(self.parentTrack.parentScore.howManyUnits): + for index in range(self.parentTrack.parentData.howManyUnits): for pitchindex in range(l): if not (index, pitchindex) in existing: lst.append({"index":index, "factor": 1, "pitch": pitchindex, "velocity":vel}) @@ -139,7 +139,7 @@ class Pattern(object): self.exportCache = [] #only used by parentTrack.export() assert self.scale and len(self.scale) == NUMBER_OF_STEPS #from constants - for pattern in (p for p in self.data if p["index"] < self.parentTrack.parentScore.howManyUnits): # < and not <= because index counts from 0 but howManyUnits counts from 1 + for pattern in (p for p in self.data if p["index"] < self.parentTrack.parentData.howManyUnits): # < and not <= because index counts from 0 but howManyUnits counts from 1 note = {} note["pitch"] = pattern["pitch"] note["index"] = pattern["index"] diff --git a/engine/track.py b/engine/track.py index 7a05cfe..dcb4faf 100644 --- a/engine/track.py +++ b/engine/track.py @@ -37,7 +37,7 @@ class Track(object): #injection at the bottom of this file! Init parameters are for cloned and copied tracks, but not for loading from json. """ - def __init__(self, parentScore, + def __init__(self, parentData, name:str="", structure:Set[int]=None, scale:Tuple[int]=None, @@ -46,8 +46,8 @@ class Track(object): #injection at the bottom of this file! whichPatternsAreHalftoneTransposed:Dict[int,int]=None, simpleNoteNames:List[str]=None): - self.parentScore = parentScore - self.sequencerInterface = template.engine.sequencer.SequencerInterface(parentTrack=self, name=name) #needs parentScore + self.parentData = parentData + self.sequencerInterface = template.engine.sequencer.SequencerInterface(parentTrack=self, name=name) #needs parentData self.color = color if color else "#00FFFF" # "#rrggbb" in hex. no alpha. a convenience slot for the GUI to save a color. self.pattern = Pattern(parentTrack=self, scale=scale, simpleNoteNames=simpleNoteNames) self.structure = structure if structure else set() #see buildTrack(). This is the main track data structure besides the pattern. Just integers (starts at 0) as switches which are positions where to play the patterns. In between are automatic rests. @@ -66,10 +66,10 @@ class Track(object): #injection at the bottom of this file! self.whichPatternsAreScaleTransposed = {k:v for k,v in self.whichPatternsAreScaleTransposed.items() if v!=0 and k in self.structure} self.whichPatternsAreHalftoneTransposed = {k:v for k,v in self.whichPatternsAreHalftoneTransposed.items() if v!=0 and k in self.structure} - oneMeasureInTicks = (self.parentScore.howManyUnits * self.parentScore.whatTypeOfUnit) / self.parentScore.subdivisions #subdivisions is 1 by default. bigger values mean shorter values, which is compensated by the user setting bigger howManyUnits manually. + oneMeasureInTicks = (self.parentData.howManyUnits * self.parentData.whatTypeOfUnit) / self.parentData.subdivisions #subdivisions is 1 by default. bigger values mean shorter values, which is compensated by the user setting bigger howManyUnits manually. oneMeasureInTicks = int(oneMeasureInTicks) - filteredStructure = [index for index in sorted(self.structure) if index < self.parentScore.numberOfMeasures] #not <= because we compare count with range + filteredStructure = [index for index in sorted(self.structure) if index < self.parentData.numberOfMeasures] #not <= because we compare count with range cboxclips = [o.clip for o in self.sequencerInterface.calfboxTrack.status().clips] for cboxclip in cboxclips: @@ -77,7 +77,7 @@ class Track(object): #injection at the bottom of this file! for index in filteredStructure: scaleTransposition = self.whichPatternsAreScaleTransposed[index] if index in self.whichPatternsAreScaleTransposed else 0 halftoneTransposition = self.whichPatternsAreHalftoneTransposed[index] if index in self.whichPatternsAreHalftoneTransposed else 0 - cboxPattern = self.pattern.buildPattern(scaleTransposition, halftoneTransposition, self.parentScore.howManyUnits, self.parentScore.whatTypeOfUnit, self.parentScore.subdivisions) + cboxPattern = self.pattern.buildPattern(scaleTransposition, halftoneTransposition, self.parentData.howManyUnits, self.parentData.whatTypeOfUnit, self.parentData.subdivisions) r = self.sequencerInterface.calfboxTrack.add_clip(index*oneMeasureInTicks, 0, oneMeasureInTicks, cboxPattern) #pos, pattern-internal offset, length, pattern. ######Old optimisations. Keep for later#### @@ -101,9 +101,9 @@ class Track(object): #injection at the bottom of this file! } @classmethod - def instanceFromSerializedData(cls, parentScore, serializedData): + def instanceFromSerializedData(cls, parentData, serializedData): self = cls.__new__(cls) - self.parentScore = parentScore + self.parentData = parentData self.sequencerInterface = template.engine.sequencer.SequencerInterface.instanceFromSerializedData(self, serializedData["sequencerInterface"]) self.color = serializedData["color"] self.structure = set(serializedData["structure"]) @@ -122,7 +122,7 @@ class Track(object): #injection at the bottom of this file! "pattern": self.pattern.exportCache, "scale": self.pattern.scale, "simpleNoteNames": self.pattern.simpleNoteNames, - "numberOfMeasures": self.parentScore.numberOfMeasures, + "numberOfMeasures": self.parentData.numberOfMeasures, "whichPatternsAreScaleTransposed": self.whichPatternsAreScaleTransposed, "whichPatternsAreHalftoneTransposed": self.whichPatternsAreHalftoneTransposed, }