260 lines
5.8 KiB
Python
260 lines
5.8 KiB
Python
|
#import evdev
|
||
|
from evdev import InputDevice, categorize, ecodes
|
||
|
import mido
|
||
|
import time
|
||
|
from threading import Thread
|
||
|
import signal
|
||
|
import sys
|
||
|
|
||
|
#creates object 'gamepad' to store the data
|
||
|
#you can call it whatever you like
|
||
|
gamepad = InputDevice('/dev/input/event8')
|
||
|
|
||
|
#prints out device info at start
|
||
|
print(gamepad)
|
||
|
outport = mido.open_output()
|
||
|
|
||
|
class Note:
|
||
|
def __init__(self, cmd, val, vel, delay):
|
||
|
self.cmd = cmd
|
||
|
self.val = val
|
||
|
self.vel = vel
|
||
|
self.delay = delay
|
||
|
|
||
|
class Loop(Thread):
|
||
|
def __init__ (self, ch):
|
||
|
Thread.__init__(self)
|
||
|
self.ch = ch
|
||
|
self.keep = True
|
||
|
self.time = 1
|
||
|
self.seq = []
|
||
|
|
||
|
def run(self):
|
||
|
index = 0
|
||
|
if len(self.seq) != 0:
|
||
|
while self.keep:
|
||
|
n = self.seq[index]
|
||
|
msg = mido.Message(n.cmd, note = n.val, velocity = n.vel)
|
||
|
outport.send(msg)
|
||
|
time.sleep(n.delay * self.time)
|
||
|
index = (index + 1)%len(self.seq)
|
||
|
|
||
|
def terminateProcess(signalNumber, frame):
|
||
|
for i in range(0, 127):
|
||
|
msg = mido.Message('note_off', note = i, velocity = 0)
|
||
|
outport.send(msg)
|
||
|
print(' ')
|
||
|
sys.exit()
|
||
|
|
||
|
buttons = {
|
||
|
288: 60,
|
||
|
289: 62,
|
||
|
290: 64,
|
||
|
291: 65,
|
||
|
292: 67,
|
||
|
293: 69,
|
||
|
294: 71,
|
||
|
295: 72
|
||
|
}
|
||
|
|
||
|
controls = {
|
||
|
288: 0,
|
||
|
289: 1,
|
||
|
290: 2,
|
||
|
291: 3,
|
||
|
292: 4,
|
||
|
293: 5,
|
||
|
294: 6,
|
||
|
295: 7,
|
||
|
0: 8,
|
||
|
1: 9,
|
||
|
2: 10,
|
||
|
5: 11,
|
||
|
}
|
||
|
|
||
|
notes = {
|
||
|
288: 0,
|
||
|
289: 0,
|
||
|
290: 0,
|
||
|
291: 0,
|
||
|
292: 0,
|
||
|
293: 0,
|
||
|
294: 0,
|
||
|
295: 0
|
||
|
}
|
||
|
|
||
|
signal.signal(signal.SIGINT, terminateProcess)
|
||
|
Pad_X = 0
|
||
|
Pad_Y = 0
|
||
|
start = 0
|
||
|
gravar = False
|
||
|
|
||
|
def send_note(event):
|
||
|
if event.value == 1:
|
||
|
msg = mido.Message('note_on', note = buttons.get(event.code), velocity = 100)
|
||
|
notes[event.code] = buttons.get(event.code)
|
||
|
outport.send(msg)
|
||
|
else:
|
||
|
msg = mido.Message('note_off', note = notes.get(event.code), velocity = 0)
|
||
|
outport.send(msg)
|
||
|
|
||
|
def send_control(event):
|
||
|
if event.type == 1:
|
||
|
msg = mido.Message('control_change', control = controls.get(event.code), value = event.value)
|
||
|
outport.send(msg)
|
||
|
if event.type == 3:
|
||
|
if event.code == 16:
|
||
|
if event.value == 1:
|
||
|
msg = mido.Message('control_change', control = 16, value = 1)
|
||
|
outport.send(msg)
|
||
|
Pad_X = 1
|
||
|
if event.value == 0:
|
||
|
if Pad_X == 1:
|
||
|
msg = mido.Message('control_change', control = 16, value = 0)
|
||
|
outport.send(msg)
|
||
|
if Pad_X == -1:
|
||
|
msg = mido.Message('control_change', control = 17, value = 0)
|
||
|
outport.send(msg)
|
||
|
Pad_X = 0
|
||
|
if event.value == -1:
|
||
|
msg = mido.Message('control_change', control = 17, value = 1)
|
||
|
outport.send(msg)
|
||
|
Pad_X = -1
|
||
|
elif event.code == 17:
|
||
|
if event.value == 1:
|
||
|
msg = mido.Message('control_change', control = 18, value = 1)
|
||
|
outport.send(msg)
|
||
|
Pad_Y = 1
|
||
|
if event.value == 0:
|
||
|
if Pad_Y == 1:
|
||
|
msg = mido.Message('control_change', control = 18, value = 0)
|
||
|
outport.send(msg)
|
||
|
if Pad_Y == -1:
|
||
|
msg = mido.Message('control_change', control = 17, value = 0)
|
||
|
outport.send(msg)
|
||
|
Pad_Y = 0
|
||
|
if event.value == -1:
|
||
|
msg = mido.Message('control_change', control = 19, value = 1)
|
||
|
outport.send(msg)
|
||
|
Pad_Y = -1
|
||
|
else:
|
||
|
val = int(event.value/255 * 127)
|
||
|
msg = mido.Message('control_change', control = controls.get(event.code), value = val)
|
||
|
outport.send(msg)
|
||
|
|
||
|
def record(event, loop):
|
||
|
size = len(loop.seq)
|
||
|
if size > 0:
|
||
|
loop.seq[size - 1].delay = event.sec - loop.seq[size - 1].delay
|
||
|
if event.value == 1:
|
||
|
n = Note('note_on', buttons.get(event.code), 100, event.sec)
|
||
|
else:
|
||
|
n = Note('note_off', buttons.get(event.code), 0, event.sec)
|
||
|
loop.seq.append(n)
|
||
|
|
||
|
#evdev takes care of polling the controller in a loop
|
||
|
for event in gamepad.read_loop():
|
||
|
#print(event)
|
||
|
#Botão, codes 288 a 295
|
||
|
if event.type == 1:
|
||
|
if event.code == 288: #TRIANGLE
|
||
|
#print("TRIANGLE")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 289: #CIRCLE
|
||
|
#print("CIRCLE")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 290: #XIS
|
||
|
#print("XIS")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 291: #SQUARE
|
||
|
#print("SQUARE")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 292: #L1
|
||
|
#print("L1")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 293: #R1
|
||
|
#print("R1")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 294: #L2
|
||
|
#print("L2")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 295: #R2
|
||
|
#print("R2")
|
||
|
send_note(event)
|
||
|
if gravar:
|
||
|
record(event, l)
|
||
|
if event.code == 296: #SELECT
|
||
|
#print("SELECT")
|
||
|
send_control(event)
|
||
|
if event.code == 297: #START
|
||
|
#print("START")
|
||
|
if event.value == 1:
|
||
|
if start == 0:
|
||
|
gravar = True
|
||
|
l = Loop(1)
|
||
|
start = 1
|
||
|
print("Gravando")
|
||
|
elif start == 1:
|
||
|
size = len(l.seq)
|
||
|
if size > 0:
|
||
|
l.seq[size - 1].delay = event.sec - l.seq[size - 1].delay
|
||
|
l.start()
|
||
|
print("Loop iniciado")
|
||
|
print(len(l.seq))
|
||
|
for member in l.seq:
|
||
|
print(member.cmd)
|
||
|
print(member.val)
|
||
|
print(member.vel)
|
||
|
print(member.delay)
|
||
|
print('');
|
||
|
start = 2
|
||
|
else:
|
||
|
start = 0
|
||
|
print("Loop nao iniciado")
|
||
|
gravar = False
|
||
|
elif start == 2:
|
||
|
l.keep = False
|
||
|
start = 0
|
||
|
print("Loop interrompido")
|
||
|
|
||
|
if event.code == 298: #L3
|
||
|
#print("L3")
|
||
|
send_control(event)
|
||
|
if event.code == 299: #R3
|
||
|
#print("R3")
|
||
|
send_control(event)
|
||
|
#Eixos
|
||
|
elif event.type == 3:
|
||
|
if event.code == 0: #LEFT JOYSTICK X AXIS
|
||
|
print("LEFT X AXIS")
|
||
|
send_control(event)
|
||
|
if event.code == 1: #LEFT JOYSTICK Y AXIS
|
||
|
print("LEFT Y AXIS")
|
||
|
send_control(event)
|
||
|
if event.code == 2: #RIGHT JOYSTICK X AXIS
|
||
|
print("RIGHT X AXIS")
|
||
|
send_control(event)
|
||
|
if event.code == 5: #RIGHT JOYSTICK Y AXIS
|
||
|
print("RIGHT Y AXIS")
|
||
|
send_control(event)
|
||
|
if event.code == 16: #D-PAD X AXIS
|
||
|
print("D-PAD X AXIS")
|
||
|
send_control(event)
|
||
|
if event.code == 17: #D-PAD Y AXIS
|
||
|
print("D-PAD Y AXIS")
|
||
|
send_control(event)
|