venerdì 7 maggio 2021

Elgato controller clone

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 sys
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


Nessun commento:

Posta un commento

Alpine Linux 2024 su IBM A31

Ho provato a far resuscitare un IBM A31 destinato alla discarica. La macchina ha processore P4, 256 Mb di RAM, la batteria CMOS morta ed e&#...