如何使用pygames调试midi输出设备

2024-04-26 03:32:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我用一个BCF2000 Behringer fader作为输入来控制一个使用ROS的机器人。一切都很好,但突然停止了工作。我的意思是在我休假一周后得到消息之后。我需要知道是硬件还是软件问题(也许有人在我不在的时候把它扔了?我不这么认为,但我找不到虫子)。我只运行一个python模块,它从fader读取数据并将其发布到ROS中,以发现问题,即我无法使fader的滑块移动。在

基本上,python模块从参数列表中读取两个整数。如果给出第三个,音量控制器的所有值都应设为0(滑块和按钮)。第一个整数是输入设备id,第二个整数是输出设备id。这是:

   if len(sys.argv) > 1:
      input_dev = int(sys.argv[1])
   else:
      input_dev = pygame.midi.get_default_input_id()
      print "Using DEFAULT input device %d" % input_dev
      if input_dev == -1:
         print "No default MIDI input device"
         exit(-1)
   print "Using input device %d" % input_dev

   if len(sys.argv) > 2:
      output_dev = int(sys.argv[2])
   else:
      output_dev = pygame.midi.get_default_output_id()
      print "Using DEFAULT output device %d" % input_dev
      if output_dev == -1:
         print "No default MIDI output device"
         exit(-1)
   print "Using output device %d" % output_dev

   controller = pygame.midi.Input(input_dev)
   controller_input = pygame.midi.Output(output_dev)

问题是我不知道如何找到正确的输入设备号。上个月我用“3”和“2”来称呼它,意思是:

me@mycpu:ros$ rosrun bcf2000 bcf2000_driver.py 3 2

如果我对发布的数据进行回音,当我移动任何滑块或按下按钮时,我会得到所有已发布的数据。例如:

^{pr2}$

但如果我给音量控制器写,滑块就不会动了。几天前,这个代码又起作用了。根据GIT存储库日志,我百分之百确定代码是相同的。例如,将所有内容设置为0:

for i in range(1,93):
 controller_input.write([[[176, i, 0, 0], 0]])

音量控制器有93个频道。在

可能是我用错了输出设备号。我把数字改在0到10之间,什么也没有。如何找出正确的设备号?如何调试实际上是软件问题(可能是操作系统问题,我不知道)或硬件问题?最后一个不太可能,因为这将是一个非常有选择性的硬件问题。但我可能错了。在

更新:这只发生在我的电脑上,所以这不是硬件问题。在

更新2:这是aseqdump-l的输出

me@mycpu:ros$ aseqdump -l
 Port    Client name                      Port name
  0:0    System                           Timer
  0:1    System                           Announce
 14:0    Midi Through                     Midi Through Port-0
 24:0    BCF2000                          BCF2000 MIDI 1
 24:1    BCF2000                          BCF2000 MIDI 2

我可以使用aseqdump-p24:0收听输入。在

使用get_device_info列出来自所有设备的信息:

('ALSA', 'Midi Through Port-0', 0, 1, 0)
('ALSA', 'Midi Through Port-0', 1, 0, 0)
('ALSA', 'BCF2000 MIDI 1', 0, 1, 0)
('ALSA', 'BCF2000 MIDI 1', 1, 0, 0)
('ALSA', 'BCF2000 MIDI 2', 0, 1, 0)
('ALSA', 'BCF2000 MIDI 2', 1, 0, 0)
('ALSA', 'BCF2000 MIDI 3', 0, 1, 0)
('ALSA', 'aseqdump', 0, 1, 0)

对于设备2、4和6,我无法写入设备。我尝试使用以下方法写入每个输出设备:

#!/usr/bin/env python
import pygame
import pygame.midi
import sys
import time

def main():
    pygame.midi.init()
    devices = pygame.midi.get_count()

    if devices < 1:
        print "No MIDI devices detected"
        exit(-1)

    print "Found %d MIDI devices" % devices
    print("id -- interface -- name -- input -- ouput -- opened")

    for ii in range(devices):
        ll = pygame.midi.get_device_info(ii)
        bool1 = bool(ll[2])
        bool2 = bool(ll[3])
        bool3 = bool(ll[4])
        print(str(ii) + " -- " + str(ll[0]) + " -- " + str(ll[1]) + " -- " + str(bool1) + " -- " + str(bool2) + " -- " + str(bool3))

        if (bool2):
            value = 0
            if ii%2 == 0:
                value = 127

            controller = pygame.midi.Output(ii)
            controller.write([[[176, 48, 0, 0], value]])
            time.sleep(2)

它应该打印每个设备的设备信息,如果它是一个输出设备,它应该移动第一个滑块。它不会移动任何设备。在


Tags: devinputoutputifdevicepygamealsamidi