Java MIDI-получение данных от фортепиано?



Я унаследовал проект Java, который использовал старую библиотеку dll C++ для получения MIDI-данных от пианино, подключенного к компьютеру.



Теперь, когда Java имеет встроенную поддержку MIDI-устройств, я хочу избавиться от устаревшей библиотеки dll C++ и просто использовать чистую Java. Поддерживает ли Java прием данных от пианино, подключенного к компьютеру? я искал примеры в Google, но безрезультатно.

494   2  

2 ответов:

Да, JAVASOUND API можно использовать для чтения MIDI-данных с MIDI-устройства.

JFugue - это Java API для музыкального программирования, который использует JAVASOUND API и может помочь упростить ваше взаимодействие с JavaSound. В JFugue 5.x, пример кода для захвата 10 секунд MIDI-данных с MIDI-устройства выглядит следующим образом:

MidiDevice device = /* specify a MIDI device */
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.listenForMillis(10000); 
Sequence music = transmitter.getSequence();

Вы также можете запускать и останавливать прослушивание устройства:

MidiDevice device = /* specify a MIDI device */
MusicTransmitterToSequence transmitter = new MusicTransmitterToSequence(device); 
transmitter.startListening(); 
// Do stuff
transmitter.stopListening(); 
Sequence music = transmitter.getSequence();

Если вы хотите записывать только с MIDI api Java (javax.звук.миди.* ) это делается очень легко. Это не код для копирования и вставки, но он должен помочь вам начать программировать свой собственный MIDI-рекордер, что на самом деле довольно легко.

Первым шагом является определение вашего входного и выходного MidiDevice. Поэтому сначала вам нужно будет найти список возможностей ввода-вывода и создать графический интерфейс, в котором вы можете выбрать устройство ввода-вывода для записи и воспроизведения MIDI.

Info[] infos = MidiSystem.getMidiDeviceInfo();
for(int i=0;i<infos.length;i++)
{
    System.out.println(infos[i].getName() + " - " + infos[i].getDescription());
}

Итак есть список ваших MIDI-устройств. Далее вы хотите выбрать MIDI-устройство, например, вы можете выбрать индексы в массиве infos.

MidiDevice inputDevice = MidiSystem.getMidiDevice(infos[x]);
MidiDevice outputDevice = MidiSystem.getMidiDevice(infos[y]);

Вы также захотите указать некоторые глобалы: секвенсор, передатчик и приемник.

Sequencer sequencer = MidiSystem.getSequencer();
Transmitter transmitter;
Receiver receiver;
Теперь есть кнопка записи, которую вы хотите использовать.
// Open a connection to your input device
inputDevice.open();
// Open a connection to the default sequencer (as specified by MidiSystem)
sequencer.open();
// Get the transmitter class from your input device
transmitter = inputDevice.getTransmitter();
// Get the receiver class from your sequencer
receiver = sequencer.getReceiver();
// Bind the transmitter to the receiver so the receiver gets input from the transmitter
transmitter.setReceiver(receiver);

// Create a new sequence
Sequence seq = new Sequence(Sequence.PPQ, 24);
// And of course a track to record the input on
Track currentTrack = seq.createTrack();
// Do some sequencer settings
sequencer.setSequence(seq);
sequencer.setTickPosition(0);
sequencer.recordEnable(currentTrack, -1);
// And start recording
sequencer.startRecording();

Будьте осторожны , этот код может вызывать MidiUnavailableExceptions, и вы должны вызывать методы close для всех вещей, которые вы открыли в операторе finally.

Но это только ядро того, как должен выглядеть код. Он записывает все в последовательность seq, Как только вы вызываете метод sequencer.startRecording().

Затем вы хотите остановить запись и иметь возможность сохранить последовательность в виде MIDI-файла или выполнить воспроизведение. Например, это может быть код, когда вы нажимаете кнопку Остановить запись или что-то еще.

// Stop recording
if(sequencer.isRecording())
{
    // Tell sequencer to stop recording
    sequencer.stopRecording();

    // Retrieve the sequence containing the stuff you played on the MIDI instrument
    Sequence tmp = sequencer.getSequence();

    // Save to file
    MidiSystem.write(tmp, 0, new File("MyMidiFile.mid"));
}

Также класс Track (последовательность может иметь несколько дорожек) содержит фактические входные данные, к которым вы можете легко получить доступ с помощью метода get. То Трек-класс состоит из середняков. Например, трек выглядит так:

MidiEvent 0: The C key is pressed
MidiEvent 1: The D key is pressed
MidiEvent 2: The C key of MidiEvent 0 is released
MidiEvent 3: The sustain pedal is pressed
etc...
И каждый MidiEvent имеет определенную метку времени, которая выражается в MIDI-ТИКах, таким образом, вы можете легко изменить темп, увеличивая или уменьшая количество тиков в секунду.

Самая трудная проблема здесь заключается в том, что промежуточные значения выражаются в байтовом коде, поэтому вам придется использовать справочный байт-кодовый лист, который говорит вам, какой байт представляет какое действие. Это должно помочь вам начать с этого: http://www.onicos.com/staff/iz/formats/midi-event.html

Comments

    Ничего не найдено.