2014-12-31 21 views
11

Python kullanarak bir sentezleyiciye temel bir MIDI mesajı göndermeye çalışıyorum.Python kullanarak MIDI mesajlarını gönderme (Ubuntu'da)

PC-Synthesizer bağlantısının işlevsel olduğunu biliyorum çünkü Rosegarden uygulaması MIDI çıktılarını 'DigitalKBD 20: 0' olarak ayarlandığında cihazda MIDI dosyalarını çalmak üzere yapılandırılabilir.

Bu Python kitaplığını (MIDO) keşfettim ve yükledim. İyi haber, harici MIDI cihazının port listesinde tanınması ve mevcut olmasıdır. Ne yazık ki, basit bir notlandırma testi cihazda herhangi bir ses tetiklemiyor.

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

RtMidi Kullanılması:

PortMidi kullanma

(bu MIDO için varsayılan): İşte çalıştı kodudur Her iki durumda da

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

, gelen ses yok ne olursa olsun sentezleyici.

Lütfen, aletin mesajları doğru şekilde alması ve yorumlaması için kodu (veya kurulumu) nasıl düzelteceğimize dair tavsiye alabilir miyim?

+0

'aseqdump' işlevini çalıştırın, bu bağlantı noktasına gidin ve bir şey olup olmadığını kontrol edin. –

+0

mido farklı bir MIDI kanalı üzerinden gönderiyor olabilir. Sentezleyicinin hangi MIDI kanalını notları dinlediğini doğrulayın ve buna göre 'mido.Message' kanalını açık bir şekilde ayarlamayı deneyin. – h7r

+0

Bu, python diline özgü bir soru olmadığı için sorunuzun konusu olmayabilir. Bu bir API, kurulum, kütüphane uyumluluk veya çevre sorunudur. Kütüphanenin belgelerini incelediniz mi? –

cevap

3

Tamam, iyi, ben var MIDI in/out belli bir gecikmeyle, klavyede oynanır olursa olsun yankıları küçük komut dosyası oluşturarak, çalışma: Bu komut dosyası çok iyi çalışıyor

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"]) 

, bu yüzden İlk testimin neden başarısız olduğunu görmek için dikkatli bir şekilde geri dönme fırsatım oldu. Çıktı mesajlarının alınabilmesi için giriş portunun da açılması gerekir. nedenini bilmiyorum, ama bu işleri en basit kodudur etmeyin:

piton yukarıdaki kodu çalıştırdıktan sonra hemen çıkıldı edilirse, Dahası
import mido 
inport = mido.open_input('DigitalKBD MIDI 1') 
outport = mido.open_output('DigitalKBD MIDI 1') 
outport.send(mido.Message('note_on', note=72)) 

, MIDO göndermek başaramadı ortaya çıkabilir mesaj, bu yüzden hiçbir ses çalınmayacak. Sarmak için biraz zaman ver.