package org.herac.tuxguitar.player.impl.jsa.sequencer;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.Sequence;
import javax.sound.midi.Track;
import org.herac.tuxguitar.player.base.MidiSequenceHandler;
import org.herac.tuxguitar.player.impl.jsa.utils.MidiMessageUtils;
import org.herac.tuxguitar.song.models.TGDuration;
import org.herac.tuxguitar.song.models.TGTimeSignature;
public class MidiSequenceHandlerImpl extends MidiSequenceHandler{
private MidiSequenceLoader loader;
private Sequence sequence;
private Track[] midiTracks;
public MidiSequenceHandlerImpl(MidiSequenceLoader loader,int tracks){
super(tracks);
this.loader = loader;
this.init();
}
private void init(){
try {
this.sequence = new Sequence(Sequence.PPQ,(int)TGDuration.QUARTER_TIME);
this.midiTracks = new Track[getTracks()];
for (int i = 0; i < this.midiTracks.length; i++) {
this.midiTracks[i] = this.sequence.createTrack();
}
} catch (InvalidMidiDataException e) {
e.printStackTrace();
}
}
public Sequence getSequence(){
return this.sequence;
}
public void addEvent(int track, MidiEvent event) {
if(track >= 0 && track < this.midiTracks.length){
this.midiTracks[track].add(event);
}
}
public void addControlChange(long tick,int track,int channel, int controller, int value) {
addEvent(track,new MidiEvent(MidiMessageUtils.controlChange(channel, controller, value), tick ));
}
public void addNoteOff(long tick,int track,int channel, int note, int velocity) {
addEvent(track,new MidiEvent(MidiMessageUtils.noteOff(channel, note, velocity), tick ));
}
public void addNoteOn(long tick,int track,int channel, int note, int velocity) {
addEvent(track,new MidiEvent(MidiMessageUtils.noteOn(channel, note, velocity), tick ));
}
public void addPitchBend(long tick,int track,int channel, int value) {
addEvent(track,new MidiEvent(MidiMessageUtils.pitchBend(channel, value), tick ));
}
public void addProgramChange(long tick,int track,int channel, int instrument) {
addEvent(track,new MidiEvent(MidiMessageUtils.programChange(channel, instrument), tick ));
}
public void addTempoInUSQ(long tick,int track,int usq) {
addEvent(track,new MidiEvent(MidiMessageUtils.tempoInUSQ(usq), tick ));
}
public void addTimeSignature(long tick,int track,TGTimeSignature ts) {
addEvent(track,new MidiEvent(MidiMessageUtils.timeSignature(ts), tick ));
}
public void notifyFinish(){
this.loader.setSequence(getSequence());
}
}