Pygame读取MIDI输入

Leo*_*olf 3 python midi pygame input

我参考了Pygame MIDI 文档这段代码来尝试让 MIDI 输入正常工作。MIDI 接口 (Avid Eleven Rack) 在我的音频软件 (Pro Tools) 中可以很好地从我的 MIDI 控制器接收 MIDI 数据。然而,使用 Pygame,我似乎根本无法阅读任何信息。

源代码

import pygame
from pygame.locals import *
from pygame import midi

class MidiInput():
    def __init__(self):
        # variables
        self.elevenRackInID = 2

        # init methods
        pygame.init()
        pygame.midi.init()
        self.midiInput = pygame.midi.Input(self.elevenRackInID, 100)

    def run(self):
        # print(pygame.midi.Input(3, 100))
        # for i in range(10):
            # print(pygame.midi.get_device_info(i), i)
        self.read = self.midiInput.read(100)
        # self.convert = pygame.midi.midis2events(self.read, self.elevenRackInID)
        print(self.read)

test = MidiInput()
while True:
   test.run()

Run Code Online (Sandbox Code Playgroud)

打印到控制台的唯一内容是空方括号:

[]
Run Code Online (Sandbox Code Playgroud)

附加信息

我刚刚再次检查:输入 ID 是正确的,它实际上是一个输入。

“self.midiInput.poll()”返回 False。因此根据 Pygame 文档,没有数据传入。

您可以在下面看到数据、民意调查和设备信息:

data: [] || poll: False || device info: (b'MMSystem', b'Eleven Rack', 1, 0, 1)

Run Code Online (Sandbox Code Playgroud)

根据 Pygame 列出我的所有 MIDI 设备(带索引):

(b'MMSystem', b'Microsoft MIDI Mapper', 0, 1, 0) 0
(b'MMSystem', b'External', 1, 0, 0) 1
(b'MMSystem', b'Eleven Rack', 1, 0, 1) 2
(b'MMSystem', b'Maschine Mikro MK2 In', 1, 0, 0) 3
(b'MMSystem', b'Microsoft GS Wavetable Synth', 0, 1, 0) 4
(b'MMSystem', b'External', 0, 1, 0) 5
(b'MMSystem', b'Eleven Rack', 0, 1, 0) 6
(b'MMSystem', b'Maschine Mikro MK2 Out', 0, 1, 0) 7
Run Code Online (Sandbox Code Playgroud)

非常感谢任何帮助或建议!

Leo*_*olf 7

我在另一个论坛得到了答案。事实证明,有一个示例文件展示了如何使代码正常工作。因此,如果其他人偶然发现这个问题,这里是示例代码的有用部分:

import sys
import os

import pygame as pg
import pygame.midi


def print_device_info():
    pygame.midi.init()
    _print_device_info()
    pygame.midi.quit()


def _print_device_info():
    for i in range(pygame.midi.get_count()):
        r = pygame.midi.get_device_info(i)
        (interf, name, input, output, opened) = r

        in_out = ""
        if input:
            in_out = "(input)"
        if output:
            in_out = "(output)"

        print(
            "%2i: interface :%s:, name :%s:, opened :%s:  %s"
            % (i, interf, name, opened, in_out)
        )


def input_main(device_id=None):
    pg.init()
    pg.fastevent.init()
    event_get = pg.fastevent.get
    event_post = pg.fastevent.post

    pygame.midi.init()

    _print_device_info()

    if device_id is None:
        input_id = pygame.midi.get_default_input_id()
    else:
        input_id = device_id

    print("using input_id :%s:" % input_id)
    i = pygame.midi.Input(input_id)

    pg.display.set_mode((1, 1))

    going = True
    while going:
        events = event_get()
        for e in events:
            if e.type in [pg.QUIT]:
                going = False
            if e.type in [pg.KEYDOWN]:
                going = False
            if e.type in [pygame.midi.MIDIIN]:
                print(e)

        if i.poll():
            midi_events = i.read(10)
            # convert them into pygame events.
            midi_evs = pygame.midi.midis2events(midi_events, i.device_id)

            for m_e in midi_evs:
                event_post(m_e)

    del i
    pygame.midi.quit()
Run Code Online (Sandbox Code Playgroud)

您可以在该目录中找到该文件: C:\Users\myUser\AppData\Roaming\Python\Python37\site-packages\pygame\examples\midi.py

替换'myUser'为您的 Win 用户名。此外,'Python37'可能会因您安装的 Python 版本而异。