簡體   English   中英

pygame midi 讀取 PC(程序更改)消息

[英]pygame midi read PC (program change) messages

我的目標是聆聽連接到我的吉他踏板切換器的 MIDI 到 USB 適配器。 當收到程序更改 (PC) 消息時,播放相應的 mp2 文件。

我嘗試了許多不同的 Python MIDI 模塊和 pygame 讓我最接近。

下面是我一直在修改的代碼,當我為踏板切換器發送程序消息時,它正在打印消息。 我只是不知道如何提取和解釋我需要的東西。

例如,踏板切換器發送一條 PC 消息 MIDI Chnl 3, Program Change 1

我的代碼,

print (convert)

退貨,

<Event(34-Unknown {'status': 240, 'data1': 65, 'data2': 0, 'data3': 0, 'timestamp': 4674, 'vice_id': 3})>, <Event(34-Unknown {'status': 0, 'data1': 0, 'data2': 20, 'data3': 18, 'timestamp': 4674, 'vice_id': 3})>, <Event(34-Unknown {'status': 127, 'data1': 1, 'data2': 0, 'data3': 67, 'timestamp': 4674, 'vice_id': 3})>, <Event(34-Unknown {'status': 61, 'data1': 247, 'data2': 0, 'data3': 0, 'timestamp': 4674, 'vice_id': 3})>]

或者,MIDI Chnl 3,程序更改 2

代碼返回,

[[<Event(34-Unknown {'status': 240, 'data1': 65, 'data2': 0, 'data3': 0, 'timestamp': 2248, 'vice_id': 3})>, <Event(34-Unknown {'status': 0, 'data1': 0, 'data2': 20, 'data3': 18, 'timestamp': 2248, 'vice_id': 3})>, <Event(34-Unknown {'status': 127, 'data1': 1, 'data2': 0, 'data3': 68, 'timestamp': 2248, 'vice_id': 3})>, <Event(34-Unknown {'status': 60, 'data1': 247, 'data2': 0, 'data3': 0, 'timestamp': 2248, 'vice_id': 3})>]

對如何將其轉換為 Channel 3, PC 1 和/或 Channel 3, PC 2 感到頭疼

有什么指導嗎?

整個測試腳本,

import pygame, pygame.midi
pygame.midi.init()
pygame.init()
count = pygame.midi.get_count()
print ("There are ", count, "MIDI devices")

dev1 = pygame.midi.get_device_info(1)
print ("1= ",dev1)

dev2 = pygame.midi.get_device_info(2)
print ("2= ",dev2)

dev3 = pygame.midi.get_device_info(3)
print ("3= ",dev3)

inp = pygame.midi.Input(3,100)
print(inp)

while True:
     if inp.poll():
         # no way to find number of messages in queue
         # so we just specify a high max value
         #print (inp.read(1000))
         read = inp.read(100)
         #print(read)
         convert = pygame.midi.midis2events(read,3)
         print (convert)
         

 
     # wait 10ms - this is arbitrary, but wait(0) still resulted
     # in 100% cpu utilization
     pygame.time.wait(10)

好的,所以繼續挖掘......

我發現我的效果器板吐出了一大堆與我正在做的事情無關的 MIDI 信息。 現在,我已經安頓好了效果器板,我收到了有意義的信息。

當我發送 Chnl 3 PC 1 程序更改消息時,我得到,

[<Event(34-Unknown {'status': 196, 'data1': 0, 'data2': 0, 'data3': 0, 'timestamp': 3942, 'vice_id': 3})>, <Event( 34-未知 {'status': 180, 'data1': 80, 'data2': 0, 'data3': 0, 'timestamp': 3943, 'vice_id': 3})>, <Event(34-Unknown { 'status': 180, 'data1': 81, 'data2': 0, 'data3': 0, 'timestamp': 3943, 'vice_id': 3})>]

當我發送 Chnl 3 PC 1 2 get 時,

[<Event(34-Unknown {'status': 196, 'data1': 1, 'data2': 0, 'data3': 0, 'timestamp': 3942, 'vice_id': 3})>, <Event( 34-未知 {'status': 180, 'data1': 80, 'data2': 0, 'data3': 0, 'timestamp': 3943, 'vice_id': 3})>, <Event(34-Unknown { 'status': 180, 'data1': 81, 'data2': 0, 'data3': 0, 'timestamp': 3943, 'vice_id': 3})>]

所以,三個“事件”我只對狀態為 196 的事件感興趣,因為那是 chnl 3。

我發現了這個,它揭示了這些 MIDI 信息,

[url]https://www.midimountain.com/midi/midi_status.htm[/url]

所以,現在我需要掃描這個長字符串以查找“'status': 196”,如果找到,則獲取 data1 的值

如果有人有這樣做的優雅方式,我將不勝感激......

如果您不使用事件循環,則midis2events() function 毫無意義

只需從您讀取的數據中提取值:

...
read = inp.read(100)
for event in read:
    ((status,data1,data2,data3),timestamp) = event
    if status == 196:
        print(f"change to program {data1}")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM