在Python上阅读钢琴音符



我想用我的RPi听midi输出设备(钢琴)的端口,在Debian上运行。我调查过pygame。midi,我设法听端口,但不知何故不能提取所有的midi信息。请找到下面的代码[编辑过的代码片段]

编辑:修复,非常感谢!

首先,您需要找出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]]

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

  • 中间数据和
  • 列表
  • 时间戳

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

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)

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

相关内容

  • 没有找到相关文章

最新更新