Если у вас хотите записать только с помощью 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
Можете ли вы также указать код для использования класса Track? Благодарю. –
@AliSharabiani Вы можете увидеть 'Track' как' List '. Там не так много, [см. Также этот документ Oracle Java на javax.sound.midi.Track] (https://docs.oracle.com/javase/7/docs/api/javax/sound/midi/Track. HTML). –
Yeti