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.apache.log4j.Logger; import org.herac.tuxguitar.player.base.MidiSequenceHandler; import org.herac.tuxguitar.player.impl.jsa.midiport.MidiPortSynthesizer; 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 { /** The Logger for this class. */ public static final transient Logger LOG = Logger .getLogger(MidiSequenceHandler.class); private MidiSequenceLoader loader; private Track[] midiTracks; private Sequence sequence; public MidiSequenceHandlerImpl(MidiSequenceLoader loader, int tracks) { super(tracks); this.loader = loader; this.init(); } 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 addEvent(int track, MidiEvent event) { if (track >= 0 && track < this.midiTracks.length) { this.midiTracks[track].add(event); } } 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 Sequence getSequence() { return this.sequence; } 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) { LOG.error(e); } } public void notifyFinish() { this.loader.setSequence(getSequence()); } }