def __init__(self, filename): self.measures = [] # Read measures from a file with open(filename, 'r') as songFile: currentMeasure = Measure() # Make a new measure for line in songFile: # This adds a new octave to a measure if (line == "\n"): # Blank lines separate measures self.measures.append(currentMeasure) currentMeasure = Measure() # Reset measure, continue else: currentMeasure.addOctave(line) # add line to current thing # Append final non-newline terminated measure before closing file # File automatically closed following end of `with` block self.measures.append(currentMeasure)
def deMeasureTrack(self): """Get rid of measures and return a simpler representation""" """Print Track such that robots can make music""" # Get set of all octaves used octaves = [] octaveCounts = {} for measure in self.measures: tempOctaveCounts = {} for m in measure.getOctaveList(): if m in tempOctaveCounts: tempOctaveCounts[m] = tempOctaveCounts[m] + 1 else: tempOctaveCounts[m] = 1 for k in tempOctaveCounts: if k in octaveCounts: if tempOctaveCounts[k] > octaveCounts[k]: octaveCounts[k] = tempOctaveCounts[k] else: pass else: octaveCounts[k] = tempOctaveCounts[k] # Get string representing all the octaves we need octaves = [str(key) * octaveCounts[key] for key in octaveCounts] octaves = ''.join(octaves) octaves = [int(octaves[i]) for i in range(0, len(octaves))] octaves.sort() # print(octaves) gives something like [2, 3, 3, 4, 4, 5, 5, 6] # We have 1 measure of pitch 2, 2 measures of pitch 3, 2 measures # of pitch 4, etc. """ Combine all measures Make sure each measure contains all octaves before combining Write a blank (e.g. "5|---------...--|" octave for unused octaves in each measure. """ track = [] measureToWrite = Measure() # Empty measure to write stuff to for measure in self.measures: measureCopy = copy.deepcopy( measure) # can use mutable methods on this copy for o in octaves: if o in measureCopy.getOctaveList(): measureToWrite.addOctave(str(measureCopy.popOctaveN(o))) else: # If octave o is not in the measure's octave list, then # write a blank octave by repeating "-"s. blankLen = 26 # Don't hard code 26 here; get it from somewhere measureToWrite.addOctave("{0}|{1}|".format( o, "-" * blankLen)) track.append(measureToWrite) measureToWrite = Measure() # Clear this """ When all measures contain all octaves, we can combine those measures by simply concatenating strings. """ combined = [["{0}|".format(i)] for i in octaves] for i in range(0, len(track)): measure = track[i] for j in range(0, len(measure.octaves)): octave = measure.octaves[j] combined[j].append(octave.notes) # octave.notes is None! for i in range(0, len(combined)): combined[i].append("|") # ending char combined[i] = ''.join(combined[i]) return combined