@@ -10,6 +10,7 @@ def __init__(self, midi_in, midi_out, *, in_channel=None, out_channel=0):
1010 self .in_channel = in_channel
1111 self .out_channel = out_channel
1212 self ._debug = True
13+ self ._outbuf = bytearray (4 )
1314
1415 @property
1516 def in_channel (self ):
@@ -32,15 +33,25 @@ def out_channel(self, channel):
3233 self ._out_channel = channel
3334
3435 def note_on (self , note , vel , channel = None ):
35- if not (0 <= note <= 0x7F ):
36- raise RuntimeError ("Note value invalid" )
37- if not (0 <= vel <= 0x7F ):
38- raise RuntimeError ("Velocity invalid" )
36+ self ._generic_3 (self .NOTE_ON , note , vel , channel )
37+
38+ def note_off (self , note , vel , channel = None ):
39+ self ._generic_3 (self .NOTE_OFF , note , vel , channel )
40+
41+
42+ def _generic_3 (self , cmd , arg1 , arg2 , channel = None ):
43+ if not (0 <= arg1 <= 0x7F ):
44+ raise RuntimeError ("Argument 1 value %d invalid" % arg1 )
45+ if not (0 <= arg2 <= 0x7F ):
46+ raise RuntimeError ("Argument 2 value %d invalid" % arg2 )
3947 if not channel :
4048 channel = self ._out_channel
41- self ._send ([self .NOTE_ON | channel , note , vel ])
49+ self ._outbuf [0 ] = (cmd & 0xF0 ) | channel
50+ self ._outbuf [1 ] = arg1
51+ self ._outbuf [2 ] = arg2
52+ self ._send (self ._outbuf , 3 )
4253
43- def _send (self , packet ):
54+ def _send (self , packet , num ):
4455 if self ._debug :
45- print ("Sending: " , [hex (i ) for i in packet ])
46- print (self ._midi_out (packet ))
56+ print ("Sending: " , [hex (i ) for i in packet [: num ] ])
57+ print (self ._midi_out . write (packet , num ))
0 commit comments