Смена инструмента во время воспроизведения трека - MIDI / Java - PullRequest
1 голос
/ 23 января 2011

Я использую трек для воспроизведения своих событий noteOn / noteOff, и все работает как задумано, проблема в том, что я хочу изменить инструменты, используемые в треке.

IМы разработали следующий код, который предназначен для вызова команды «изменение программы» на всех MIDI-каналах с новым инструментом, и у меня возникает проблема, как применить это к треку, чтобы инструменты были другими.

public void LoadInstrument()
{
    for(int i = 0; i < instruments.length; i++)
    {
        if(instruments[i].getName() == "Clean Guitar")
        {
            instrumentToLoad = instruments[i];
        }
    }

    drumPatch = instrumentToLoad.getPatch();
}

Я видел, что вы можете отправить событие Отслеживать событие PROGRAM_CHANGE, чтобы указать, что инструмент меняется, но я не уверен, как создать объект для хранения необходимой информации и добавить ее кТрек.Большое спасибо.

Ответы [ 2 ]

4 голосов
/ 23 января 2011

После того, как я немного покопался, я нашел решение:

         try
        {
             ShortMessage instrumentChange = new ShortMessage();

             instrumentChange.setMessage(ShortMessage.PROGRAM_CHANGE, 0, 6,0);

             //MidiEvent instrumentChange = new MidiEvent(ShortMessage.PROGRAM_CHANGE,drumPatch.getBank(),drumPatch.getProgram());
             track.add(new MidiEvent(instrumentChange,0));
        }
        catch(Exception e)
        {
            //Handle
        }

Примечание. Параметр " 6 " в методе .setMessage - это номер инструмента.играть.

0 голосов
/ 23 января 2011

Я предполагаю, что drumPatch.getBank() и drumPatch.getProgram() будут применять ту же программу к текущему каналу, что и текущий воспроизводимый канал.Вероятно, вам следует передать новый банк и номер программы вашему методу LoadInstrument() и передать его вместо аргумента изменения программы.

...