Вопрос

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

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

Это было полезно?

Решение

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

Джфугуэ это 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.sound.midi.*), это делается очень легко.Это не код для копирования и вставки, но он должен помочь вам начать программировать свой собственный MIDI-рекордер, что на самом деле довольно просто.

Первый шаг - определить ваше промежуточное устройство ввода и вывода.Итак, сначала вам нужно будет найти список возможностей ввода-вывода и создать графический интерфейс, в котором вы сможете выбрать устройство ввода-вывода для вашей 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...

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top