2013-04-02 3 views
4

데비안에서 실행중인 RPi로 내 MIDI 출력 장치 (피아노)가있는 포트를 듣고 싶습니다. 나는 pygame.midi를 조사해 봤지만 포트를 경청했지만 어떻게 든 모든 미디 정보를 추출 할 수는 없습니다. 아래의 코드를 찾으십시오 [편집 된 코드 스 니펫]피아노 노트를 파이썬에서 읽는 것

편집 : 고마워요.

+0

나는 Pyserial http://pyserial.sourceforge.net/shortintro.html을 보았습니다. – That1Guy

+0

나는 MIDI가 연속적이라고 생각하지 않습니다. – ninMonkey

+2

샘플 코드를 게시 할 수 있습니까? 코드없이 문제를 진단하는 것은 정말로 어렵습니다. – adahlin

답변

5

먼저 키보드에 pygame이있는 장치 ID를 알아야합니다. 이 정보 튜플 내부의 첫 번째 하나는로이 장치를 결정한다는

(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)) 

당신이 배울 수있는 파이 게임 설명서에서 :

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() 

그것은이 같은 같습니다 나는 알이 작은 기능을 썼다 적합한 입력 장치.

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) 

보여줍니다 :

  • A : 우리는이 개 항목이 목록의 목록을 가지고

    [[[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) 

난이 도움이되기를 바랍니다. 그것은 내 첫 번째 대답이고, 너무 길지 않기를 바랍니다. :)

+0

이것은 너무 길지 않았습니다! 이것은 위대하고 확실한 대답입니다. –