Java MIDI-получение данных от фортепиано?
Я унаследовал проект Java, который использовал старую библиотеку dll C++ для получения MIDI-данных от пианино, подключенного к компьютеру.
Теперь, когда Java имеет встроенную поддержку MIDI-устройств, я хочу избавиться от устаревшей библиотеки dll C++ и просто использовать чистую Java. Поддерживает ли Java прием данных от пианино, подключенного к компьютеру? я искал примеры в Google, но безрезультатно.
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 имеет определенную метку времени, которая выражается в MIDI-ТИКах, таким образом, вы можете легко изменить темп, увеличивая или уменьшая количество тиков в секунду.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...Самая трудная проблема здесь заключается в том, что промежуточные значения выражаются в байтовом коде, поэтому вам придется использовать справочный байт-кодовый лист, который говорит вам, какой байт представляет какое действие. Это должно помочь вам начать с этого: http://www.onicos.com/staff/iz/formats/midi-event.html
Comments