Salut !

Alors je suis bien embêtté, j'ai trouvé le moyen d'envoyer des messages midi avec python grâce à pygame.
Jusqu'ici tout vas bien, ça fonctionne bien.

Maintenant, je souhaiterais envoyer des messages SysEx, et là ya un problème.
Selon la doc :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
(assuming o is an onput MIDI stream)
  o.write_sys_ex(0,'\xF0\x7D\x10\x11\x12\x13\xF7')
is equivalent to
  o.write_sys_ex(pygame.midi.time(),
                 [0xF0,0x7D,0x10,0x11,0x12,0x13,0xF7])
Très bien. Je choisi le deuxième example de rédaction en remplaçant les valeurs héxadécimales par ce que je veux, je lance et... :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
Traceback (most recent call last):
  File "/home/ronan/Projets/Python/test_midi.py", line 28, in <module>
    chgShape()
  File "/home/ronan/Projets/Python/test_midi.py", line 22, in chgShape
    [0xF0, 0x3E, 0x13, 0x00, 0x20, 0x00, 0x00, 0x08, value, 0xF7])
  File "/usr/lib/python3.4/site-packages/pygame/midi.py", line 519, in write_sys_ex
    self._output.WriteSysEx(when, msg)
  File "pypm.pyx", line 495, in pypm.Output.WriteSysEx (src/pypm.c:2556)
TypeError: must be a unicode character, not bytes
Rien à faire... c'est un bug ou c'est moi qui ai merdé quelque part ?

Voici mon programme actuel qui ne fait qu'envoyer 100 notes au hasard et qui a 1 chance sur 10 d'envoyer un message de changement de forme d'onde (dans mon synthé).
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
 
#!/usr/bin/python
 
from pygame import midi
from time import sleep
from random import randint
 
midi.init()
noteOn = midi.Output(4) # choisi périf n°4
 
def playNote():
    "joue une note au hasard"
    note = randint(36, 64)
    velo = randint(0, 127)
    dur = randint(1, 10)
    noteOn.note_on(note, 127, 0)
    sleep(1/dur)
    noteOn.note_off(note, 0, 0)
 
def chgShape(): # changement de waveform
    value = hex(randint(0, 72))
    noteOn.write_sys_ex(midi.time(),
                 [0xF0, 0x3E, 0x13, 0x00, 0x20, 0x00, 0x00, 0x08, value, 0xF7])
 
i = 0
while i < 100:
    playNote()
    if randint(0, 10) == 0:
        chgShape()
    i += 1
Avez-vous une idée de ce qu'il se passe s'il vous plait ?
Merci !