Пример #1
0
def compose(sourceFile, outputFileName, length):
    markov = Markov(sourceFile)

    sequenceLength = markov.sequenceLength()

    # Build random beging of song
    notes = []
    for i in range(sequenceLength):
        notes.append(random.randint(50, 60))

    # Build list of notes
    while (len(notes) < length):
        newNote = markov.get(notes[-sequenceLength:])
        if newNote is not None:
            notes.append(int(newNote))
        else:
            print "INFO: No possible note found"
            del notes[-1]

    print "Song Composed:"
    print notes

    # Make patern into
    pattern = midi.Pattern()
    pattern.make_ticks_abs()
    track = midi.Track()
    pattern.append(track)

    for note in notes:
        on = midi.NoteOnEvent(tick=0, velocity=NOTE_VELOCITY, pitch=note)
        off = midi.NoteOffEvent(tick=NOTE_DURATION[get_rand_duration()],
                                pitch=note)
        track.append(on)
        track.append(off)

    eot = midi.EndOfTrackEvent(tick=1)
    track.append(eot)
    midi.write_midifile(outputFileName, pattern)

    print "Song written to file: %s" % outputFileName
Пример #2
0
def compose(pitchInputFileName, rhythmInputFileName, outputFileName,
            songLength):
    pitchTransitions = Markov(pitchInputFileName)
    pithOrder = pitchTransitions.order()
    rhythmTransitions = Markov(rhythmInputFileName)
    rhythmOrder = rhythmTransitions.order()

    print "Markovs loaded into memmory"

    # Build random beging of song
    chords = []
    for i in range(pithOrder):
        chords.append([random.randint(50, 60)])
    # Build list of chords
    while (len(chords) < songLength):
        newChord = pitchTransitions.get(chords[-pithOrder:])
        if newChord is not None:
            newChord = ast.literal_eval(newChord)
            chords.append(newChord)
        else:
            print "INFO: No possible pitch/chord found"
            del chords[-1]
            chords.append([random.randint(50, 60)])
    # prettier endings
    chords[-1] = chords[-2]

    # Create begining of rhythm track
    rhythms = []
    for i in range(rhythmOrder):
        rhythms.append(4)
    # Build list of note lengths
    while (len(rhythms) < songLength):
        newLength = rhythmTransitions.get(rhythms[-rhythmOrder:])
        if newLength is not None:
            newLength = int(newLength)
            rhythms.append(newLength)
        else:
            print "INFO: No possible rhythm found"
            del rhythms[-1]
    #SONG SHOULD END WITH HOLE NOTE
    rhythms[-1] = 16
    rhythms[-2] = 16

    print "Song Composed:"

    # Make patern into
    pattern = midi.Pattern()
    pattern.make_ticks_abs()
    track = midi.Track()
    pattern.append(track)

    for i in range(songLength):
        length = int((220 / 16) * rhythms[i])
        # for pitch in chords[i]:
        for pitch in chords[i]:
            on = midi.NoteOnEvent(tick=0, velocity=NOTE_VELOCITY, pitch=pitch)
            track.append(on)
        for pitch in chords[i]:
            off = midi.NoteOffEvent(tick=length, pitch=pitch)
            track.append(off)

    eot = midi.EndOfTrackEvent(tick=0)
    track.append(eot)
    midi.write_midifile(outputFileName, pattern)

    print "Song written to file: %s" % outputFileName