【问题标题】:Reading piano notes on Python在 Python 上阅读钢琴音符
【发布时间】:2013-04-02 15:28:19
【问题描述】:

我想用我的 RPi 收听在 Debian 上运行的带有我的 midi 输出设备(钢琴)的端口。我查看了 pygame.midi,我设法监听了端口,但不知何故无法提取所有 midi 信息。请在下面找到代码[编辑代码 sn-p]

编辑:已修复,非常感谢!

【问题讨论】:

  • 我不认为 MIDI 是串行的。
  • 你能发布示例代码吗?没有代码真的很难诊断问题。
  • 如果您向我们展示您是如何使用它们的,我们或许能够指出一些事情。向某人展示您的代码可能会让人害怕(尤其是在 Stack Overflow 等专家社区中),但如果获得良好的反馈,这将是值得的。
  • @monkey MIDI 是串行的 (en.wikipedia.org/wiki/MIDI)

标签: python keyboard pygame midi piano


【解决方案1】:

首先,您需要找出您的键盘在 pygame 中的设备 ID。我写了这个小函数来找出答案:

import pygame.midi

def print_devices():
    for n in range(pygame.midi.get_count()):
        print (n,pygame.midi.get_device_info(n))

if __name__ == '__main__':
    pygame.midi.init()
    print_devices()

看起来像这样:

(0, ('MMSystem', 'Microsoft MIDI Mapper', 0, 1, 0))
(1, ('MMSystem', '6- Saffire 6USB', 1, 0, 0))
(2, ('MMSystem', 'MK-249C USB MIDI keyboard', 1, 0, 0))
(3, ('MMSystem', 'Microsoft GS Wavetable Synth', 0, 1, 0))

从 pygame 手册中,您可以了解到此信息元组中的第一个 One 确定此设备为合适的输入设备。 因此,让我们以无限循环的方式从中读取一些数据:

def readInput(input_device):
    while True:
        if input_device.poll():
            event = input_device.read(1)
            print (event)

if __name__ == '__main__':
    pygame.midi.init()
    my_input = pygame.midi.Input(2) #only in my case the id is 2
    readInput(my_input)

这表明:

[[[144, 24, 120, 0], 1321]]

我们有一个包含 2 个项目的列表:

  • midi-data 列表和
  • 时间戳

第二个值是您感兴趣的值。所以我们将其打印出来作为注释:

def number_to_note(number):
    notes = ['c', 'c#', 'd', 'd#', 'e', 'f', 'f#', 'g', 'g#', 'a', 'a#', 'b']
    return notes[number%12]

def readInput(input_device):
    while True:
        if input_device.poll():
            event = input_device.read(1)[0]
            data = event[0]
            timestamp = event[1]
            note_number = data[1]
            velocity = data[2]
            print (number_to_note(note_number), velocity)

我希望这会有所帮助。这是我的第一个答案,我希望它不会太长。 :)

【讨论】:

  • 这不是太长!这是一个伟大而可靠的答案。
猜你喜欢
  • 2011-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多