Запись непрерывных данных контроллера в MIDI-файл - PullRequest
1 голос
/ 24 февраля 2012

Я пытаюсь написать Java-программу, которая считывает данные с изображения и превращает его в MIDI-данные.Я дошел до того, что создал несколько треков с должными миди-нотами и сообщениями-заметками.Однако я также хочу записывать непрерывные данные контроллера для каждой дорожки (неиспользуемый ползунок или регулятор, а не один из заранее определенных каналов, таких как modwheel или pitchbend).Я предполагаю, что мне нужно сделать что-то с коротким сообщением CONTROL_CHANGE, но я могу ошибаться.(http://docs.oracle.com/javase/7/docs/api/javax/sound/midi/ShortMessage.html#CONTROL_CHANGE). На самом деле у меня нет знаний по Java-программированию, чтобы понять это. Вот что я имею до сих пор для создания примечаний о включении / выключении MIDI-данных. Я предполагаю, что непрерывные данные контроллера будут похожи. Любая помощь будет оценена.

    private static MidiEvent createNoteOnEvent(int nKey, long lTick)
    {
        return createNoteEvent(ShortMessage.NOTE_ON,
                               nKey,
                               VELOCITY,
                               lTick);
    }

    private static MidiEvent createNoteOffEvent(int nKey, long lTick)
    {
        return createNoteEvent(ShortMessage.NOTE_OFF,
                               nKey,
                               0,
                               lTick);
    }

    private static MidiEvent createNoteEvent(int nCommand,
                                             int nKey,
                                             int nVelocity,
                                             long lTick)
    {
        ShortMessage message = new ShortMessage();
        try {
            message.setMessage(nCommand,
                               0,   
                               nKey,
                               nVelocity);
        }
        catch (InvalidMidiDataException e)
        {
            e.printStackTrace();
            System.exit(1);
        }
        MidiEvent event = new MidiEvent(message,
                                          lTick);
        return event;
    }

    private static void out(String strMessage)
    {
        System.out.println(strMessage);
    }

Ответы [ 2 ]

1 голос
/ 10 марта 2012

Разобрался, на случай, если кто-то еще столкнется с той же проблемой.Шестнадцатеричный 0xB0 - это просто стандартный канал данных непрерывного контроллера.17 можно просто ввести, гекс не требуется.Другие каналы можно найти в миди-формате Googling или что-то в этом роде:

private static MidiEvent createCCData(int cc, int val, long lTick) {
    ShortMessage mm = new ShortMessage();
    mm = new ShortMessage();
    try {
        mm.setMessage(0xB0,cc,val);
    } 
    catch (InvalidMidiDataException e) {
        e.printStackTrace();
        System.exit(1);
    }
    MidiEvent me = new MidiEvent(mm,lTick);     
    return me;
}
0 голосов
/ 24 февраля 2012

Предопределенные MIDI CC , такие как громкость, высота тона и т. Д., Являются только рекомендованными назначениями, но вы можете технически использовать любую CC для запасной ручки или ползунка, которую вы хотите.

...