Per automatizzare Audacity mentre cerco di registrare la chitarra stavo pensando di costruirmi con Arduino una consolle di controllo tipo quello di Elgato quando mi e' venuta in mente una soluzione piu' semplice: utilizzare un controller midi per interagire con Audacity tramite xdotool , un software che simula l'interazione utente con una applicazione X e tramite la libreria Python https://pypi.org/project/python-rtmidi/
In estrema sintesi da rtmidi si riceve un codice del tasto midi premuto sul controller e con xdotool si invia la corrispondente sequenza di caratteri per generare un evento di Audacity
================================================================
import rtmidi
import threading
import os
def print_message(midi, port):
if midi.isNoteOn():
#print '%s: ON: ' % port, midi.getMidiNoteName(midi.getNoteNumber()), midi.getVelocity()
print midi.getNoteNumber()
if (midi.getNoteNumber() == 60):
print "Play/Stop"
os.system("xdotool search --onlyvisible --class 'Audacity' windowfocus key 'space'")
if (midi.getNoteNumber() == 61):
print "Play/Stop Cursor"
os.system("xdotool search --onlyvisible --class 'Audacity' windowfocus key 'x'")
if (midi.getNoteNumber() == 62):
print "Track start"
os.system("xdotool search --onlyvisible --class 'Audacity' windowfocus key 'J'")
if (midi.getNoteNumber() == 64):
print "Record"
os.system("xdotool search --onlyvisible --class 'Audacity' windowfocus key 'shift+R'")
if (midi.getNoteNumber() == 65):
print "Pause"
os.system("xdotool search --onlyvisible --class 'Audacity' windowfocus key 'p'")
class Collector(threading.Thread):
def __init__(self, device, port):
threading.Thread.__init__(self)
self.setDaemon(True)
self.port = port
self.portName = device.getPortName(port)
self.device = device
self.quit = False
def run(self):
self.device.openPort(self.port)
self.device.ignoreTypes(True, False, True)
while True:
if self.quit:
return
msg = self.device.getMessage()
if msg:
print_message(msg, self.portName)
dev = rtmidi.RtMidiIn()
collectors = []
for i in range(dev.getPortCount()):
device = rtmidi.RtMidiIn()
print 'OPENING',dev.getPortName(i)
collector = Collector(device, i)
collector.start()
collectors.append(collector)
print 'HIT ENTER TO EXIT'
sys.stdin.read(1)
for c in collectors:
c.quit = True