es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo enviar mensajes MIDI en Perl?

Estoy intentando enviar mensajes MIDI usando Perl. Básicamente quiero cambiar el instrumento de parche. Como no estoy generando un archivo, sino que solo lo estoy reproduciendo, estoy utilizando Win32::MIDI ya que es el único módulo que funciona para lo que necesito, pero no tiene un método de instrumento de parche, por lo tanto me quedo con writeMIDI que requiere el envío de un mensaje MIDI.

Por ejemplo:

evento note_on, canal 1 (0x90), velocidad (127), nota (127), nulo (0x00);

my $data_on = "\x00\127\127\x90";

evento note_off, canal 1 (0x80), velocidad (127), nota (127), nulo (0x00);

my $data_off = "\x00\127\127\x80";

$midi_obj->writeMIDI(unpack("N",$data_on));
sleep(2);
$midi_obj->writeMIDI(unpack("N",$data_off));

$midi_obj->writeMIDI(unpack("N","\x00\C18")); <– NO FUNCIONA cambia el instrumento en el canal #1 al parche #8

Estoy intentando hacer un ‘Cambio de programa’ en el Canal 1, número de parche (por ejemplo, 8) ya que esto cambia el instrumento de parche.

Como dice en mi referencia:

A.1. Mensajes de voz del canal:

Instruir al instrumento receptor a asignar sonidos particulares a su voz.
Encender y apagar notas.
Modificar el sonido de la nota o notas actualmente activas.


Mensaje de Voz      Byte de Estado     Byte de Datos1    Byte de Datos2
Note off                      8x             Número de tecla       Velocidad del apagado de la nota
Note on                       9x             Número de tecla        Velocidad del encendido de la nota
Presión de tecla politónica       Ax          Número de tecla        Cantidad de presión
Cambio de control             Bx             Número del controlador       Valor del controlador
Cambio de programa         Cx             Número del programa       Ninguno
Presión del canal           Dx          Valor de presión        Ninguno
Bendición de tono            Ex            MSB                 LSB
Notas: `x' en el valor hexadecimal del byte de estado representa un número de canal.

La referencia que estoy utilizando es:
https://users.cs.cf.ac.uk/Dave.Marshall/Multimedia/node158.html

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Enviando mensajes MIDI usando Perl

    Problema

    El problema está relacionado con el envío de mensajes MIDI utilizando Perl para cambiar el instrumento de parche. El objetivo es cambiar el instrumento en el Canal 1 al parche #8 utilizando el módulo Win32::MIDI.

    Solución

    Dado que no existe un método de instrumento de parche en el módulo, necesitamos utilizar la función writeMIDI para enviar un mensaje MIDI. En este caso, necesitamos enviar un mensaje de ‘Cambio de Programa’ en el Canal 1, con el número de parche (por ejemplo, 8), ya que esto cambia el instrumento de parche.

    Aquí tienes un ejemplo de cómo enviar un mensaje MIDI para cambiar el instrumento:

    # Evento de Cambio de Programa, canal 1 (0xC1), número de programa (8);
    my $data = "\x00\x08\xC1";
    
    $midi_obj->writeMIDI(unpack("N",$data));
    

    Ten en cuenta que en el ejemplo anterior, "\x00" es un marcador de posición para el valor de tiempo, ya que el evento Cambio de Programa no requiere un valor de tiempo.

    Conclusión

    Esta solución demuestra cómo enviar mensajes MIDI utilizando Perl para cambiar el instrumento de parche. Al utilizar la función writeMIDI, podemos enviar diferentes mensajes MIDI para lograr varios objetivos.

Comments are closed.