コード例 #1
0
 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)
コード例 #2
0
    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