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.

JavaX MIDI, faltan algunos cambios de programa en algunas pistas.

Estoy trabajando en un sencillo analizador de archivos MIDI que convierte archivos MIDI a un formato diferente, y uno de los problemas a los que me enfrento es que ocasionalmente encuentro algunas pistas en el archivo MIDI que no tienen ningún instrumento asignado a ellas (sin eventos de cambio de programa).

Aquí está la sección truncada del código que busca específicamente eventos de cambio de programa. Perdón por el formato desordenado, soy nuevo en esto y tuve algunos problemas para pegar el código, pero espero que la idea general aún sea clara.

    private static final int PROGRAM_CHANGE = 0xC0;
    ArrayList<note> noteSequence = new ArrayList<note>();
    int trackNumber = 0;
    for (Track track : sequence.getTracks()) {
        trackNumber++;
        for (int i = 0; i < track.size(); i++) {
            MidiEvent event = track.get(i);
            MidiMessage message = event.getMessage();
            currentTick = event.getTick();
            ShortMessage sm = (ShortMessage) message;
            if (sm.getCommand() == PROGRAM_CHANGE) {
                noteSequence.add(new Note(currentTick+1,sm.getData1(),0,trackNumber,0,"PROGRAM_CHANGE",0,0,0, 2));
                }}

Uno de los principales problemas a los que me puedo enfrentar es simplemente no capturar los eventos de cambio de programa de la manera correcta. No parecen tener un tic asociado, por lo que simplemente les he estado asignando el evento de sincronización del tic anterior + 1. No estoy seguro si esta es la forma correcta de hacerlo, por lo que esto podría estar causando algunos problemas.

Por ejemplo, un archivo MIDI que ejecuté tenía 23 pistas. Cada pista, excepto la pista número 8, tenía un instrumento asignado, y no entiendo por qué la pista número 8 no tenía un instrumento asignado. Presumo que se supone que debe heredar su instrumento basado en otra pista, pero no tengo mucho conocimiento sobre cómo funcionaría eso.

Sin embargo, otros eventos como los eventos de NOTE_ON se están capturando correctamente de estas pistas. Sé que este es un problema un poco especializado, pero ¿alguien tiene algún conocimiento al respecto?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Como experto en TI especializado en Java, MIDI y javax.sound.midi, tengo algunos conocimientos sobre el problema que estás enfrentando con tu analizador de MIDI.

    En primer lugar, es importante señalar que no todas las pistas de MIDI tienen asignado un instrumento. De hecho, es común que las pistas de percusión no tengan ningún evento de cambio de programa, ya que generalmente se tocan utilizando sonidos de percusión de General MIDI.

    En cuanto a los eventos de cambio de programa, es cierto que no tienen un valor de tick asociado. Sin embargo, asignar el evento de tiempo del tick anterior + 1 es un enfoque razonable, ya que asegura que el evento de cambio de programa esté ordenado correctamente dentro de la pista.

    En cuanto a la pista que no tiene asignado un instrumento, es posible que se deba heredar su instrumento de otra pista. Esto se realiza utilizando mensajes de voz de canal MIDI, específicamente los mensajes de cambio de control (byte de estado de 0xB0-0xBF). El instrumento se puede establecer utilizando el mensaje de cambio de control con un número de controlador de 0 (Bank Select MSB) y un valor del número de banco de instrumento deseado. Esto es seguido por un mensaje de cambio de control con un número de controlador de 32 (Bank Select LSB) y un valor del número de programa de instrumento deseado.

    En resumen, es importante manejar adecuadamente las pistas de MIDI sin instrumentos asignados y tener en cuenta los mensajes de voz de canal MIDI para establecer instrumentos. A medida que sigas trabajando en tu analizador de MIDI, puede ser útil consultar el documento de especificación de MIDI para obtener más información sobre los eventos y mensajes de MIDI.

Comments are closed.