midicompose.py 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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,4], [1,4], [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. temps=64
  37. while temps>0:
  38. x=self.randTime(temps)
  39. k=self.randKey()
  40. self.track.addNote(x, k)
  41. temps-=x
  42. print("Mesure: "+str(8-temps))
  43. def randTime(self, max):
  44. x=0
  45. for i in self.times: x+=i[1] if len(i)>1 and i[1]<=max else 1
  46. dice=randint(0,x-1)
  47. for i in self.times:
  48. if i[1]<=max:
  49. dice-=i[1]
  50. if dice<=0: return i[0]
  51. return self.times[0][0]
  52. def randKey(self):
  53. x = 0
  54. for i in self.keys: x += i[1] if len(i) > 1 else 1
  55. dice = randint(0, x - 1)
  56. for i in self.keys:
  57. dice -= i[1]
  58. if dice <= 0: return i[0]
  59. return self.keys[0][0]
  60. def play(self):
  61. self.file=MidiFile()
  62. self.file.tracks=[self.track.events]
  63. mp=MidiPlayer(self.file)
  64. #mp.setBpmRatio(2)
  65. AlsaConnector.connect((133,0), (130,0))
  66. #input("...")
  67. mp.port.send(Stop())
  68. mp.port.send(Continue())
  69. mp.port.send(Start())
  70. while True:
  71. mp.play()
  72. print("===========")
  73. c=Compose()
  74. c.play()