Я создаю приложение, в котором пользователь может добавить несколько MIDI-нот в коллекцию, отсюда они могут нажать кнопку «Воспроизведение», и приложение будет перебирать каждую ноту и воспроизводить их через динамики.
Я создал класс MIDIMessage, в котором содержатся сведения о заметке, которую пользователь решил добавить в список, причем сохраняются следующие данные: Pitch, Velocity, Delay и Channel.
Каждое из этих сообщений сохраняется вArrayList с типом MIDIMessage.
Затем я продолжаю привязывать итератор коллекции к объекту итератора и воспроизводить звук, пока в коллекции все еще есть элемент, который не использовался.
По какой-то причине, даже если я добавляю только одну ноту в коллекцию, всегда есть две ноты, играющие с одинаковой высотой, длиной и скоростью.
Кроме того, каждая нота играет одновременно, независимо от того,сколько из них присутствует в коллекции, я предположил, что между ними будет какая-то задержка.
Ниже приведен код, который я использую в данный момент:
MIDIMessage:
package javatest;
public class MIDIMessage
{
private int pitch;
private int velocity;
private int channel;
public MIDIMessage(int p, int v, int c)
{
pitch = p;
velocity = v;
channel = c;
}
public int GetPitch()
{
return this.pitch;
}
public int GetVelocity()
{
return this.velocity;
}
public int GetChannel()
{
return this.channel;
}
}
Добавление заметки в коллекцию:
public void AddToList()
{
int channel = jComboBoxChannels.getSelectedIndex();
int pitch = jComboBoxPitch.getSelectedIndex();
int velocity = ((Integer)jSpinnerVelocity.getValue());
collection.add(new MIDIMessage(pitch,velocity,channel));
}
Воспроизведение нот:
try
{
jButton1.setEnabled(false);
Sequencer sequencer = MidiSystem.getSequencer();
sequencer.open();
Sequence sequence = new Sequence(Sequence.PPQ,1);
Track track = sequence.createTrack();
Iterator itr = collection.iterator();
int i = 0;
while(itr.hasNext())
{
MIDIMessage msg = (MIDIMessage)itr.next();
ShortMessage noteOnMsg = new ShortMessage();
//Signal/Channel/Pitch/Velocity
noteOnMsg.setMessage(ShortMessage.NOTE_ON, msg.GetChannel(),msg.GetPitch(),msg.GetVelocity());
ShortMessage noteOffMsg = new ShortMessage();
//Signal/Channel/Pitch/Velocity
noteOffMsg.setMessage(ShortMessage.NOTE_OFF,msg.GetChannel(),msg.GetPitch(),msg.GetVelocity());
track.add(new MidiEvent(noteOnMsg,0));
track.add(new MidiEvent(noteOffMsg,1));
//i = i+1;
}
sequencer.setSequence(sequence);
sequencer.setTempoInBPM(120);
sequencer.setLoopCount(1);
sequencer.start();
Thread.sleep(1000);
}