package org.herac.tuxguitar.io.midi;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.log4j.Logger;
import org.herac.tuxguitar.gui.editors.chord.ChordSelector;
import org.herac.tuxguitar.io.midi.base.MidiEvent;
import org.herac.tuxguitar.io.midi.base.MidiSequence;
import org.herac.tuxguitar.io.midi.base.MidiTrack;
import org.herac.tuxguitar.player.base.MidiSequenceHandler;
import org.herac.tuxguitar.song.models.TGDuration;
import org.herac.tuxguitar.song.models.TGTimeSignature;
public class MidiSequenceHandlerImpl extends MidiSequenceHandler {
private MidiSequence sequence;
private OutputStream stream;
public MidiSequenceHandlerImpl(int tracks, OutputStream stream) {
super(tracks);
this.stream = stream;
this.init();
}
/** The Logger for this class. */
public static final transient Logger LOG = Logger
.getLogger(MidiSequenceHandlerImpl.class);
@Override
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 < getSequence().countTracks()) {
getSequence().getTrack(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 MidiSequence getSequence() {
return this.sequence;
}
private void init() {
this.sequence = new MidiSequence(MidiSequence.PPQ,
(int) TGDuration.QUARTER_TIME);
for (int i = 0; i < getTracks(); i++) {
this.sequence.addTrack(new MidiTrack());
}
}
public void notifyFinish() {
try {
getSequence().finish();
new MidiFileWriter().write(getSequence(), 1, this.stream);
} catch (IOException e) {
LOG.error(e);
}
}
}