Skip to content
Snippets Groups Projects
Select Git revision
  • a9eea1257a6dbd8e7895a71c16c0fbbd96350421
  • main default
2 results

node.rs

Blame
  • midiMaker.py 4.31 KiB
    #!/usr/bin/env python
    
    from midiutil import MIDIFile
    import random
    random.seed()
    scale  = [48, 50, 52, 53, 55, 57, 59, 60, 62, 64, 65, 67, 69, 71, 72, 74, 76, 77, 79, 81, 83]
    #scale  = [48, 50, 51, 53, 55, 56, 58, 60, 62, 63, 65, 67, 68, 70, 72, 74, 75, 77, 79, 80, 82] 
    track    = 0
    channel  = 0
    trackTime = 0
    time = 0
    duration = 1    
    tempo    = 60  
    volume   = 100 
    MyMIDI = MIDIFile(1)  
                          
    MyMIDI.addTempo(track, time, tempo)
    def addMotif(pitch, time, trackTime):
        for i in range(0, len(pitch)):
            MyMIDI.addNote(track, channel, pitch[i], trackTime + time[i], duration, volume)
        return trackTime + time[len(time)-1]
    
    def createMotif():
        length = random.randint(5, 10)
        motifPitch = []
        motifTime = []
        previous = 60
        upPercent = 50
        consecutive = 1
        time = 0
        previousJump = 0
        previousTimeInterval = 0
        for i in range(0, length):
            intervalType = random.randint(0, 100)
            upDown = random.randint(0,100)
            y = scale.index(previous)
            if upDown > upPercent:
                upDown = -1
                upPercent += 2 * consecutive
                consecutive += 1
            else:
                upDown = 1
                upPercent += -2 * consecutive
                consecutive += 1
            y = scale.index(previous)
            try:
                if intervalType <= 25:
                    pitch = previous
                elif intervalType <= 27:
                    upDown = -1 * previousJump
                    pitch = scale[y + 7*upDown]
                elif intervalType <= 75:
                    pitch = scale[y + 1*upDown]
                else:
                    skipInterval = random.randint(0, 100)
                    if intervalType <= 25:
                        pitch = scale[y + 4*upDown]
                    elif intervalType <= 27:
                        pitch = scale[y + 3*upDown]
                    elif intervalType <= 75:
                        pitch = scale[y + 2*upDown]
                    else:
                        pitch = scale[y + 5*upDown]
            except IndexError:
                upDown *= -1
                if intervalType <= 25:
                    pitch = previous
                elif intervalType <= 27:
                    pitch = scale[y + 7*upDown]
                elif intervalType <= 75:
                    pitch = scale[y + 1*upDown]
                else:
                    skipInterval = random.randint(0, 100)
                    if intervalType <= 25:
                        pitch = scale[y + 4*upDown]
                    elif intervalType <= 27:
                        pitch = scale[y + 3*upDown]
                    elif intervalType <= 75:
                        pitch = scale[y + 2*upDown]
                    else:
                        pitch = scale[y + 5*upDown]
            timeInterval = random.randint(0, 100)
            if timeInterval <= 10:
                if previousTimeInterval == 1:
                    time = time + 1/4
                    previousTimeInterval = 1/4
                else:
                    time = time + 1/16
                    previousTimeInterval = 1/16
            elif timeInterval <= 41:
                if previousTimeInterval == 1:
                    time = time + 1/4
                    previousTimeInterval = 1/4
                else:
                    time = time + 1/8
                    previousTimeInterval = 1/8
            elif timeInterval <= 81:
                time = time + 1/4
                previousTimeInterval = 1/4
            elif timeInterval <= 88:
                time = time + 1/4 + 1/8
                previousTimeInterval = 1/8 + 1/4
            elif timeInterval <= 97:
                if previousTimeInterval == 1/16:
                    time = time + 1/4
                    previousTimeInterval = 1/4
                else:
                    time = time + 1/2
                    previousTimeInterval = 1/2
            elif timeInterval <= 100:
                if previousTimeInterval == 1/16:
                    time = time + 1/2
                    previousTimeInterval = 1/2
                else:
                    time = time + 1
                    previousTimeInterval = 1
            motifPitch.append(pitch)
            motifTime.append(time)
            previous = pitch
            previousJump = upDown
        return motifPitch, motifTime
        
    x, y = createMotif()
    a, b = createMotif()
    c, d = createMotif()
    trackTime = addMotif(x, y, trackTime)
    trackTime = addMotif(x, y, trackTime)
    trackTime = addMotif(a, b, trackTime)
    trackTime = addMotif(a, b, trackTime)
    trackTime = addMotif(c, d, trackTime)
    
    with open("random.mid", "wb") as output_file:
        MyMIDI.writeFile(output_file)