9

Debian で実行されている RPi を使用して、MIDI 出力デバイス (ピアノ) を持つポートを聞きたいと思います。pygame.midi を調べたところ、ポートをリッスンすることはできましたが、どういうわけかすべての midi 情報を抽出できません。以下のコードを見つけてください [編集されたコード スニペット]

編集:修正しました、どうもありがとう!

4

1 に答える 1

14

まず、キーボードが 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 のマニュアルから、この info-tuple 内の最初の One がこのデバイスを適切な Input-Device として決定することがわかります。それでは、無限ループでデータを読み取りましょう。

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データの一覧と
  • タイムスタンプ

2 番目の値は、関心のある値です。したがって、メモとして出力します。

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)

これが役に立ったことを願っています。それは私の最初の答えです。長すぎないことを願っています。:)

于 2014-07-18T09:21:57.390 に答える