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;
private static int fixValue(int value){
int fixedValue = value;
fixedValue = Math.min(fixedValue,127);
fixedValue = Math.max(fixedValue,0);
return fixedValue;
}
private static int fixChannel(int channel){
int fixedChannel = channel;
fixedChannel = Math.min(fixedChannel,15);
fixedChannel = Math.max(fixedChannel,0);
return fixedChannel;
}
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 noteOff(int channel,int note,int velocity){
return MidiMessage.shortMessage(MidiMessage.NOTE_OFF, fixChannel(channel), fixValue(note), fixValue(velocity));
}
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 programChange(int channel,int instrument){
return MidiMessage.shortMessage(MidiMessage.PROGRAM_CHANGE, fixChannel(channel), fixValue(instrument));
}
public static MidiMessage pitchBend(int channel,int value){
return MidiMessage.shortMessage(MidiMessage.PITCH_BEND, fixChannel(channel), 0, fixValue(value));
}
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;
}
public static MidiMessage endOfTrack(){
return MidiMessage.metaMessage(47,new byte[]{});
}
}