En los sistemas GNU/LINUX, también implementan una forma de controlar distintos software y hardware a través de señales MIDI, de esa forma, uno puede tener un controlador MIDI o un teclado con salida MIDI y controlar distintos programas de audio como LMMS, Hydrogen, Ardour o algunos sintes digitales como qsynth.
La forma de trabajar con auido en GNU/LINUX, puede ser un tanto complicadod e entender al principio, hay varios motores de sonido (OSS, ALSA) pero ademas, esta JACK, que se encarga de capturar el hardware y ser un buffer (o proxy si se quiere) que toma las entradas y salidas de los distintos software y los envía a la placa de audio, permitiendo hacer cosas como tomar la salida de LMMS y meterla dentro de un canal de Ardour y la salida maestra de Ardour derivarla a un multi efecto como Rakarrack, y después, todo eso a la salida de la paca de audio.
Ejemplo de Jack con su front-end qjackctl y LMMS
La idea del proyecto siguiente es poder hacer una interface que tome datos MIDI a traves de Jack y las re envié al puerto /dev/ttyACM0 para poder controlar un robot y hacer música. Para eso, use las librerías de pygame para control MIDI, que si bien son unas librerias gigantes, estan empaquetadas en casi todas las distribuciones GNU/LINUX (Y obviamente en FEDORA) y hay mucha documentación. Para el control del robot usao el modulo apicaro, que forma parte del proyecto ICARO y que me permite andar señales a la placa mediante python-serial y un firmware especial del lado del PIC (firmware tortucaro, que se carga desde la pantalla de icaro-bloques).
boton de carga para el firmware Tortucaro
(para controlar la placa desde puerto /dev/ttyACMx)
Video de un robot que toca el xilofon,
controlado mediante LMMS
y tambien un teclado controlador MIDI.
Aca el código fuente del robot, no es muy difícil de entender, básicamente son 2 clases que controlan el MIDI y el puerto serie (usando apicaro)
import pygame import time import pygame.midi import apicaro class ROBOT: """ clase robot, cotrola mediante apicaro los dos servomotores de moviento del robot (izquierda/derecha, arriba/abajo """ escala={ "c":30, "d":60, "e":80, "f":110, "g":130, "a":155, "b":180, "c2":205 } golpe={ "sube":60, "baja":29 } def __init__ (self): """ Class initialiser """ self.icaro=apicaro.puerto() self.band=self.icaro.iniciar() def mover(self,tecla): self.icaro.activar_servo(1,self.escala[tecla]) def golpear(self): self.icaro.activar_servo(2,self.golpe["baja"]) time.sleep(0.07) self.icaro.activar_servo(2,self.golpe["sube"]) class MIDI: """ inicia pygame.midi y tiene un diccionario con algunas notas MIDI """ notas={ 60:"c", 62:"d", 64:"e", 65:"f", 67:"g", 69:"a", 71:"b", 72:"c2" } def __init__ (self): """ Class initialiser """ pygame.midi.init() print "set player" self.player= pygame.midi.Input(1) print "set instrument" midi=MIDI() robot=ROBOT() while robot.band: # nos fijamos si hay datos en el buffer flag = midi.player.poll() if flag == True: data = midi.player.read(10) senal = data [0][0] nota = senal[1] volumen = senal[2] #~ print volumen # si la nota esta dentro del diccionario, muevo el robot if midi.notas.has_key(nota): if volumen <>0: robot.mover(midi.notas[nota]) time.sleep(0.2) robot.golpear()