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; } }