python keyboard pygame midi piano

Lectura de notas de piano en Python



keyboard pygame (1)

Me gustaría escuchar el puerto que tiene mi dispositivo de salida midi (un piano) con mi RPi, que se ejecuta en Debian. He investigado pygame.midi, me las arreglé para escuchar el puerto, pero de alguna manera no puedo extraer toda la información midi. Encuentra el código debajo [fragmento de código editado]

EDIT: reparado, muchas gracias!


En primer lugar, debe averiguar qué dispositivo-id tiene su teclado dentro de pygame. Escribí esta pequeña función para descubrir:

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

Se ve algo como esto:

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

Del manual de pygame puedes aprender que el primero dentro de esta info-tupla determina que este dispositivo es un dispositivo de entrada adecuado. Así que leamos algunos datos en un bucle infinito:

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)

Eso demuestra:

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

que tenemos una lista de una lista con 2 elementos:

  • Una lista de midi-data y
  • una marca de tiempo

El segundo valor es el que le interesa. Entonces lo imprimimos como una nota:

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)

Espero que esto haya ayudado. Es mi primera respuesta, espero que no sea demasiado larga. :)