////////////////////////////////////////////////////////////////////////////// // Copyright 2011 Alex Leffelman // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. ////////////////////////////////////////////////////////////////////////////// package com.leff.midi.event; import java.io.IOException; import java.io.OutputStream; import com.leff.midi.util.VariableLengthInt; /** * Full Disclosure, SysEx events may not be properly handled by this library. * */ public class SystemExclusiveEvent extends MidiEvent { private int mType; private VariableLengthInt mLength; private byte[] mData; public SystemExclusiveEvent(int type, long tick, byte[] data) { this(type, tick, 0, data); } public SystemExclusiveEvent(int type, long tick, long delta, byte[] data) { super(tick, delta); mType = type & 0xFF; if(mType != 0xF0 && mType != 0xF7) { mType = 0xF0; } mLength = new VariableLengthInt(data.length); mData = data; } public byte[] getData() { return mData; } public void setData(byte[] data) { mLength.setValue(data.length); mData = data; } @Override public boolean requiresStatusByte(MidiEvent prevEvent) { return true; } @Override public void writeToFile(OutputStream out, boolean writeType) throws IOException { super.writeToFile(out, writeType); out.write(mType); out.write(mLength.getBytes()); out.write(mData); } @Override public int compareTo(MidiEvent other) { if(this.mTick < other.mTick) { return -1; } if(this.mTick > other.mTick) { return 1; } if(this.mDelta.getValue() > other.mDelta.getValue()) { return -1; } if(this.mDelta.getValue() < other.mDelta.getValue()) { return 1; } if(other instanceof SystemExclusiveEvent) { String curr = new String(mData); String comp = new String(((SystemExclusiveEvent) other).mData); return curr.compareTo(comp); } return 1; } @Override protected int getEventSize() { return 1 + mLength.getByteCount() + mData.length; } }