midicompose.py 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. #!/usr/bin/python
  2. from simplemidi.midiparser import *
  3. from simplemidi.midiplayer import *
  4. import os
  5. """
  6. md=MIDIHeaderChunk()
  7. md.length=6
  8. md.format=MIDIHeaderChunk.FORMAT_MULTIPLE_CHANNEL
  9. md.tracks=5
  10. md.division=960
  11. mt=MIDITrackChunk()
  12. mt.addNote(0.5, 60)
  13. mt.addNote(0.5, 63)
  14. mt.addNote(1, 63)
  15. mt.addNote(0.25, 63)
  16. f=open("test", "wb")
  17. print(f)
  18. md.write(f)
  19. mt.write(f)
  20. f.close()
  21. """
  22. from simplemidi.alsaconnector import AlsaConnector, AlsaPort
  23. from random import randint
  24. os.sched_setscheduler(os.getpid(), os.SCHED_FIFO, os.sched_param(1))
  25. class Compose:
  26. _DEFAULT_PARAM={
  27. 'keys' : [57, 59,60,62,64,65,67],
  28. "times": [ [0.5,10], [1,3], [1.5, 1]]
  29. }
  30. def __init__(self, param=_DEFAULT_PARAM):
  31. self.track = MIDITrackChunk()
  32. keys=param["keys"] if "keys" in param else Compose._DEFAULT_PARAM["keys"]
  33. self.keys=[]
  34. for i in keys: self.keys.append((i, randint(0,10)))
  35. self.times=param["times"] if "times" in param else Compose._DEFAULT_PARAM["times"]
  36. for i in range(128):
  37. temps=16
  38. while temps>0:
  39. x=self.randTime(temps)
  40. k=self.randKey()
  41. self.track.addNote(x, k)
  42. temps-=x
  43. print("Mesure: "+str(8-temps))
  44. def randTime(self, max):
  45. x=0
  46. for i in self.times: x+=i[1] if len(i)>1 and i[1]<=max else 1
  47. dice=randint(0,x-1)
  48. for i in self.times:
  49. if i[1]<=max:
  50. dice-=i[1]
  51. if dice<=0: return i[0]
  52. return self.times[0][0]
  53. def randKey(self):
  54. x = 0
  55. transpose=12
  56. for i in self.keys: x += i[1] if len(i) > 1 else 1
  57. dice = randint(0, x - 1)
  58. for i in self.keys:
  59. dice -= i[1]
  60. if dice <= 0: return i[0]+transpose
  61. return self.keys[0][0]+transpose
  62. def play(self):
  63. self.file=MidiFile()
  64. self.file.tracks=[self.track.events]
  65. mp=MidiPlayer(self.file)
  66. #mp.setBpmRatio(2)
  67. AlsaConnector.connect((133,0), (130,0))
  68. #input("...")
  69. mp.port.send(Stop())
  70. mp.port.send(Continue())
  71. mp.port.send(Start())
  72. while True:
  73. mp.play()
  74. print("===========")
  75. exit(0)
  76. c=Compose()
  77. c.play()