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.apache.log4j.Logger; import org.herac.tuxguitar.song.models.TGTimeSignature; public class MidiMessageUtils { /** The Logger for this class. */ public static final transient Logger LOG = Logger .getLogger(MidiMessageUtils.class); public static final byte TICK_MOVE = 0x01; 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) { LOG.error(e); } return null; } 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) { try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.NOTE_OFF, fixChannel(channel), fixValue(note), fixValue(velocity)); return message; } catch (InvalidMidiDataException e) { LOG.error(e); } return null; } 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) { LOG.error(e); } 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) { LOG.error(e); } 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) { LOG.error(e); } return null; } public static MidiMessage systemReset() { try { ShortMessage message = new ShortMessage(); message.setMessage(ShortMessage.SYSTEM_RESET); return message; } catch (InvalidMidiDataException e) { LOG.error(e); } 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) { LOG.error(e); } 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) { LOG.error(e); } return null; } }