12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091 |
- #!/usr/bin/python
- from simplemidi.midiparser import *
- from simplemidi.midiplayer import *
- import os
- """
- md=MIDIHeaderChunk()
- md.length=6
- md.format=MIDIHeaderChunk.FORMAT_MULTIPLE_CHANNEL
- md.tracks=5
- md.division=960
- mt=MIDITrackChunk()
- mt.addNote(0.5, 60)
- mt.addNote(0.5, 63)
- mt.addNote(1, 63)
- mt.addNote(0.25, 63)
- f=open("test", "wb")
- print(f)
- md.write(f)
- mt.write(f)
- f.close()
- """
- from simplemidi.alsaconnector import AlsaConnector, AlsaPort
- from random import randint
- os.sched_setscheduler(os.getpid(), os.SCHED_FIFO, os.sched_param(1))
- class Compose:
- _DEFAULT_PARAM={
- 'keys' : [57, 59,60,62,64,65,67],
- "times": [ [0.5,10], [1,3], [1.5, 1]]
- }
- def __init__(self, param=_DEFAULT_PARAM):
- self.track = MIDITrackChunk()
- keys=param["keys"] if "keys" in param else Compose._DEFAULT_PARAM["keys"]
- self.keys=[]
- for i in keys: self.keys.append((i, randint(0,10)))
- self.times=param["times"] if "times" in param else Compose._DEFAULT_PARAM["times"]
- for i in range(128):
- temps=16
- while temps>0:
- x=self.randTime(temps)
- k=self.randKey()
- self.track.addNote(x, k)
- temps-=x
- print("Mesure: "+str(8-temps))
- def randTime(self, max):
- x=0
- for i in self.times: x+=i[1] if len(i)>1 and i[1]<=max else 1
- dice=randint(0,x-1)
- for i in self.times:
- if i[1]<=max:
- dice-=i[1]
- if dice<=0: return i[0]
- return self.times[0][0]
- def randKey(self):
- x = 0
- transpose=12
- for i in self.keys: x += i[1] if len(i) > 1 else 1
- dice = randint(0, x - 1)
- for i in self.keys:
- dice -= i[1]
- if dice <= 0: return i[0]+transpose
- return self.keys[0][0]+transpose
- def play(self):
- self.file=MidiFile()
- self.file.tracks=[self.track.events]
- mp=MidiPlayer(self.file)
- #mp.setBpmRatio(2)
- AlsaConnector.connect((133,0), (130,0))
- #input("...")
- mp.port.send(Stop())
- mp.port.send(Continue())
- mp.port.send(Start())
- while True:
- mp.play()
- print("===========")
- exit(0)
- c=Compose()
- c.play()
|