package org.herac.tuxguitar.io.midi;
import org.herac.tuxguitar.io.midi.base.MidiMessage;
import org.herac.tuxguitar.song.models.TGTimeSignature;
public class MidiMessageUtils {
public static final byte TICK_MOVE = 0x01;
public static MidiMessage controlChange(int channel, int controller, int value) {
return MidiMessage.shortMessage(MidiMessage.CONTROL_CHANGE,
fixChannel(channel), fixValue(controller), fixValue(value));
}
public static MidiMessage endOfTrack() {
return MidiMessage.metaMessage(47, new byte[] {});
}
private static int fixChannel(int channel) {
int fixedChannel = channel;
fixedChannel = Math.min(fixedChannel, 15);
fixedChannel = Math.max(fixedChannel, 0);
return fixedChannel;
}
private static int fixValue(int value) {
int fixedValue = value;
fixedValue = Math.min(fixedValue, 127);
fixedValue = Math.max(fixedValue, 0);
return fixedValue;
}
public static MidiMessage noteOff(int channel, int note, int velocity) {
return MidiMessage.shortMessage(MidiMessage.NOTE_OFF, fixChannel(channel),
fixValue(note), fixValue(velocity));
}
public static MidiMessage noteOn(int channel, int note, int velocity) {
return MidiMessage.shortMessage(MidiMessage.NOTE_ON, fixChannel(channel),
fixValue(note), fixValue(velocity));
}
public static MidiMessage pitchBend(int channel, int value) {
return MidiMessage.shortMessage(MidiMessage.PITCH_BEND,
fixChannel(channel), 0, fixValue(value));
}
public static MidiMessage programChange(int channel, int instrument) {
return MidiMessage.shortMessage(MidiMessage.PROGRAM_CHANGE,
fixChannel(channel), fixValue(instrument));
}
public static MidiMessage systemReset() {
return MidiMessage.shortMessage(MidiMessage.SYSTEM_RESET);
}
public static MidiMessage tempoInUSQ(int usq) {
MidiMessage message = new MidiMessage(MidiMessage.TYPE_META,
MidiMessage.TEMPO_CHANGE);
message.setData(new byte[] { (byte) ((usq >> 16) & 0xff),
(byte) ((usq >> 8) & 0xff), (byte) ((usq) & 0xff) });
// message.setData(new byte[]{(byte)((usq >> 16) & 0x00FF),(byte)((usq >> 8)
// & 0x00FF),(byte)((usq) & 0x00FF) });
return message;
}
public static MidiMessage timeSignature(TGTimeSignature ts) {
MidiMessage message = new MidiMessage(MidiMessage.TYPE_META,
MidiMessage.TIME_SIGNATURE_CHANGE);
message.setData(new byte[] { (byte) ts.getNumerator(),
(byte) ts.getDenominator().getIndex(),
(byte) (96 / ts.getDenominator().getValue()), 8 });
return message;
}
}