Debian で実行されている RPi を使用して、MIDI 出力デバイス (ピアノ) を持つポートを聞きたいと思います。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 のマニュアルから、この 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つのアイテムを持つリストのリストがあること:
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)
これが役に立ったことを願っています。それは私の最初の答えです。長すぎないことを願っています。:)