Csound puede recibir eventos MIDI (tales como notas MIDI y Cambios de Control MIDI) desde una interfaz MIDI externa o desde otro programa a través de un cable MIDI virtual. Estos datos se pueden utilizar para controlar cualquier aspecto en la síntesis o en la ejecución.
La mayoría de los frontends utilizan su propio controlador MIDI. Vea los capítulos sobre CsoundQt, Cabbage y Blue en este manual, o eche un vistazo a la documentación incluida en cada uno de estos entornos. La siguiente descripción sólo es relevante cuando se utilizan los controladores MIDI propios de Csound, por ejemplo cuando se ejecuta Csound a través de la línea de comandos.
Csound recibe datos MIDI a través de los MIDI Realtime Modules. Estos son plugins especiales de Csound que permiten la entrada MIDI usando diferentes métodos de acuerdo a una plataforma específica. Se habilitan mediante la opción de línea de comando -+rtmidi en la sección <CsOptions> del archivo .csd.
Existe un módulo universal "portmidi". PortMidi es un módulo multiplataforma para E/S MIDI y suele estar disponible en todas las plataformas. Para habilitar el módulo "portmidi", pase el siguiente argumento dentro de la sección de opciones:
-+rtmidi=portmidi
Después de seleccionar el módulo RT MIDI desde una interfaz gráfica o desde la línea de comandos, debe seleccionar los dispositivos MIDI para entrada y salida. Éstos se ajustan utilizando las opciones -M y -Q respectivamente, seguidos por el número de dispositivo. Por lo general, puede utilizar:
-M999
para obtener un error de ejecución que le brindará una lista de dispositivos disponibles.
Para el módulo PortMidi (y otros como ALSA), puede obviar el número para usar la dispositivo MIDI predeterminado, o bien usar el carácter 'a' para establecer una comunicación con todos los dispositivos disponibles (que en realidad es el caso más común). Esto incluso funcionará correctamente cuando no haya ningún dispositivo MIDI presente.
-Ma
Por lo tanto, si desea una entrada MIDI usando el módulo portmidi, usando el dispositivo 2 para la entrada y el dispositivo 1 para la salida, su sección <CsOptions> debería contener:
-+rtmidi=portmidi -M2 -Q1
Hay un módulo especial RT MIDI virtual que permite la entrada MIDI desde un teclado virtual. Para habilitarlo, escriba:
-+rtmidi=virtual -M0
Si el módulo "portmidi" no funciona correctamente, puede probar otros módulos específicos de acuerdo a su plataforma.
En sistemas Linux, también podría tener un módulo "alsa" para usar la interfaz MIDI alsa raw. Esta es diferente de la interfaz más común del secuenciador alsa y requerirá típicamente que el módulo snd-virmidi haya sido cargado previamente en el kernel.
En OS X existe un módulo "coremidi" disponible.
En Windows, podría encontrarse con el módulo MIDI "winmme".
Una vez que haya configurado el hardware, estará listo para recibir información MIDI e interpretarla en Csound. De forma predeterminada, cuando se recibe una nota MIDI, se enciende el instrumento de Csound correspondiente al número de canal MIDI, por lo que si se recibe una nota en el canal 3, se encenderá el instrumento 3 y si se recibe en el canal 10, se encenderá el instrumento 10 y así sucesivamente.
Si desea cambiar este enrutamiento de los canales MIDI hacia los instrumentos, puede utilizar el opcode massign. Por ejemplo, esta sentencia le permite enrutar su canal MIDI 1 al instrumento 10:
massign 1, 10
En el siguiente ejemplo, se define un instrumento simple, que reproduce una onda senoidal en el instrumento 1. No hay eventos en la partitura, por lo que no se producirá sonido a menos que se reciba una nota MIDI desde el canal 1.
EXAMPLE 02C01_Midi_Keybd_in.csd
<CsoundSynthesizer> <CsOptions> -+rtmidi=portmidi -Ma -odac </CsOptions> <CsInstruments> ;Example by Andrés Cabrera sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 massign 0, 1 ;assign all MIDI channels to instrument 1 instr 1 iCps cpsmidi ;get the frequency from the key pressed iAmp ampmidi 0dbfs * 0.3 ;get the amplitude aOut poscil iAmp, iCps ;generate a sine tone outs aOut, aOut ;write it to the output endin </CsInstruments> <CsScore> </CsScore> </CsoundSynthesizer>
Cabe resaltar que Csound brinda potencialmente una polifonía ilimitada cuando se usa de esta manera: cada tecla pulsada inicia una nueva instancia del instrumento 1, y se puede tener cualquier número de instancias de un instrumento al mismo tiempo.
Para recibir eventos desde un controlador MIDI, puede utilizar opcodes como ctrl7. En el ejemplo siguiente, el instrumento 1 se enciende durante 60 segundos. Recibiŕa información acerca del mensaje de control MIDI #1(rueda de modulación) en el canal 1 y convertirá el rango MIDI (0-127) a un rango de entre 220 y 440. Este valor a su vez se utiliza posteriormente para ajustar la frecuencia de un oscilador senoidal simple.
EXAMPLE 02C02_Midi_Ctl_in.csd
<CsoundSynthesizer> <CsOptions> -+rtmidi=virtual -M1 -odac </CsOptions> <CsInstruments> ;Example by Andrés Cabrera sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 instr 1 ; --- receive controller number 1 on channel 1 and scale from 220 to 440 kFreq ctrl7 1, 1, 220, 440 ; --- use this value as varying frequency for a sine wave aOut poscil 0.2, kFreq outs aOut, aOut endin </CsInstruments> <CsScore> i 1 0 60 </CsScore> </CsoundSynthesizer>
Csound puede recibir otro tipo de datos MIDI, tales como pitch bend y aftertouch mediante el uso de opcodes específicos. Los datos MIDI genéricos se pueden recibir usando el opcode midiin. El ejemplo siguiente imprime a la consola los datos recibidos vía MIDI.
EXAMPLE 02C03_Midi_all_in.csd
<CsoundSynthesizer> <CsOptions> -+rtmidi=portmidi -Ma -odac </CsOptions> <CsInstruments> ;Example by Andrés Cabrera sr = 44100 ksmps = 32 nchnls = 2 0dbfs = 1 instr 1 kStatus, kChan, kData1, kData2 midiin if kStatus != 0 then ;print if any new MIDI message has been received printk 0, kStatus printk 0, kChan printk 0, kData1 printk 0, kData2 endif endin </CsInstruments> <CsScore> i1 0 3600 </CsScore> </CsoundSynthesizer>
There has been error in communication with Booktype server. Not sure right now where is the problem.
You should refresh this page.