2009-09-28 5 views
7

Я унаследовал проект Java, который использовал an old C++ dll to receive MIDI data с пианино, подключенного к компьютеру.Java MIDI - получение данных с фортепиано?

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

ответ

4

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

JFugue - это Java API для музыкального программирования, который использует API JavaSound и может упростить ваше взаимодействие с 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(); 
13

Если у вас хотите записать только с помощью MIDI api на Java (javax.sound.midi. *), это делается очень легко. Это не код для копирования и вставки, но он должен помочь вам начать программирование собственного 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 и вы должны вызывать близкие методы на всех вещей, которые вы открыли в заявлении, наконец.

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

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

// 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. Класс Track состоит из MidiEvents.Например Трек:

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

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

+0

Можете ли вы также указать код для использования класса Track? Благодарю. –

+1

@AliSharabiani Вы можете увидеть 'Track' как' List '. Там не так много, [см. Также этот документ Oracle Java на javax.sound.midi.Track] (https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track. HTML). – Yeti

 Смежные вопросы

  • Нет связанных вопросов^_^