package org.herac.tuxguitar.player.impl.jsa.utils; import javax.sound.midi.InvalidMidiDataException; import javax.sound.midi.MetaMessage; import javax.sound.midi.MidiMessage; import javax.sound.midi.ShortMessage; 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){ try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_ON, fixChannel(channel), fixValue(note), fixValue(velocity)); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage noteOff(int channel,int note,int velocity){ try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_OFF, fixChannel(channel), fixValue(note), fixValue(velocity)); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage controlChange(int channel,int controller,int value){ try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.CONTROL_CHANGE,fixChannel(channel),fixValue(controller), fixValue(value)); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage programChange(int channel,int instrument){ try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.PROGRAM_CHANGE, fixChannel(channel), fixValue(instrument), 0); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage pitchBend(int channel,int value){ try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.PITCH_BEND, fixChannel(channel), 0, fixValue(value)); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage systemReset(){ try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.SYSTEM_RESET); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage tempoInUSQ(int usq){ try { MetaMessage message = new MetaMessage(); message.setMessage(0x51, new byte[]{ (byte)((usq >> 16) & 0x00FF),(byte)((usq >> 8) & 0x00FF),(byte)((usq) & 0x00FF) }, 3); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } public static MidiMessage timeSignature(TGTimeSignature ts){ try { MetaMessage message = new MetaMessage(); message.setMessage(0x58, new byte[]{ (byte)ts.getNumerator(),(byte)ts.getDenominator().getIndex(),(byte)(96 / ts.getDenominator().getValue()),8 }, 4); return message; } catch (InvalidMidiDataException e) { e.printStackTrace(); } return null; } }