2014-12-31 18 views
11

Sto cercando di inviare un messaggio MIDI di base a un sintetizzatore, usando Python.Invio di messaggi MIDI usando Python (su Ubuntu)

So che il collegamento PC-Synthesizer è funzionale perché l'applicazione Rosegarden può essere configurata per riprodurre file MIDI sul dispositivo, quando l'uscita MIDI è impostata su porta 'DigitalKBD 20: 0'.

Ho scoperto questa libreria Python (MIDO) e l'ho installata. La buona notizia è che il dispositivo MIDI esterno è riconosciuto e disponibile nell'elenco delle porte. Sfortunatamente il semplice appunto sul test non attiva alcun suono sul dispositivo. Ecco il codice che ho provato:

Utilizzando PortMidi (questo è il valore predefinito per MIDO):

>>> import mido 
>>> output = mido.open_output('DigitalKBD MIDI 1') 
>>> output.send(mido.Message('note_on', note=60, velocity=64)) 

Utilizzando RtMidi:

>>> import mido 
>>> rtmidi = mido.Backend('mido.backends.rtmidi') 
>>> output = rtmidi.open_output('DigitalKBD 20:0') 
>>> output.send(mido.Message('note_on', note=60, velocity=64)) 

In entrambi i casi, non v'è alcun suono proveniente dal sintetizzatore qualunque.

Per favore, posso ricevere consigli su come correggere il codice (o l'impostazione) in modo che lo strumento riceva e interpreti correttamente i messaggi?

+0

Esegui 'aseqdump', gioca su quella porta e controlla se qualcosa arriva. –

+0

mido potrebbe inviare un canale MIDI diverso. Verifica quale canale MIDI il sintetizzatore sta ascoltando per le note e prova ad impostare esplicitamente su 'mido.Message' il campo' channel' di conseguenza. – h7r

+0

Questo potrebbe non essere il forum per la tua domanda perché non è una domanda specifica per il linguaggio Python. È un problema di API, installazione, compatibilità di libreria o ambiente. Hai revisionato la documentazione per la biblioteca? –

risposta

3

Ok, bene, ho ottenuto il MIDI in/out di lavoro, con la creazione di un piccolo script che richiama tutto ciò che si gioca sulla tastiera, con un certo ritardo:

import mido 
import time 
from collections import deque 

print mido.get_output_names() # To list the output ports 
print mido.get_input_names() # To list the input ports 

inport = mido.open_input('DigitalKBD MIDI 1') 
outport = mido.open_output('DigitalKBD MIDI 1') 

msglog = deque() 
echo_delay = 2 

while True: 
    while inport.pending(): 
     msg = inport.receive() 
     if msg.type != "clock": 
      print msg 
      msglog.append({"msg": msg, "due": time.time() + echo_delay}) 
    while len(msglog) > 0 and msglog[0]["due"] <= time.time(): 
     outport.send(msglog.popleft()["msg"]) 

Questo script funziona molto bene, quindi mi ho avuto l'opportunità di camminare con attenzione indietro per vedere perché il mio test iniziale non ha avuto successo. Risulta, per i messaggi di output da ricevere, anche la porta di ingresso deve essere aperta. Non so il motivo per cui, ma questo è il codice più semplice che funziona:

import mido 
inport = mido.open_input('DigitalKBD MIDI 1') 
outport = mido.open_output('DigitalKBD MIDI 1') 
outport.send(mido.Message('note_on', note=72)) 

Cosa c'è di più, se il pitone si esce subito dopo l'esecuzione del codice di cui sopra, potrebbe accadere che Mido non è riuscito a inviare il messaggio, quindi nessun suono verrà riprodotto. Dagli un po 'di tempo per concludere.