/*
* MetaMessage.java
*
* This file is part of Tritonus: http://www.tritonus.org/
*/
/*
* Copyright (c) 1999 by Matthias Pfisterer
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Library General Public License as published
* by the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Library General Public License for more details.
*
* You should have received a copy of the GNU Library General Public
* License along with this program; if not, write to the Free Software
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
/*
|<--- this code is formatted to fit into 80 columns --->|
*/
package javax.sound.midi;
import org.tritonus.share.midi.MidiUtils;
/** Container for meta messages.
This class is used to represent meta events that are commonly stored
in MIDI files.
Note that normally, meta messages are not meaningful when sent over the
wire to a MIDI instrument.<p>
The way
these messages are separated into bytes for storing in
{@link MidiMessage#data data} is the same as specified in the
Standard MIDI File Format, except that no delta time in ticks is stored
here.
*/
public class MetaMessage
extends MidiMessage
{
/** Status byte for meta messages (value 255, 0xff).
*/
public static final int META = 0xFF;
/** TODO:
*/
private static final byte[] DEFAULT_MESSAGE = {(byte) META, 0x2f, 0};
/** Create a container for a MIDI meta message.
This constructor does not create an object containing a legal
MIDI message. You have to use one of the setMessage() methods.
Before calling one of these methods, calling retrieval methods
(getLength(), getMessage(), getStatus(), getType(),
getData()) may have
undesired results.
@see #setMessage(int, byte[], int)
*/
public MetaMessage()
{
super(null);
}
/** TODO:
*/
protected MetaMessage(byte[] abData)
{
super(abData);
}
/** TODO:
*/
public void setMessage(int nType, byte[] abData, int nDataLength)
throws InvalidMidiDataException
{
if (nType > 127)
{
throw new InvalidMidiDataException("type must not exceed 127");
}
//byte[] abLength = MidiUtils.getVariableLengthQuantity(nDataLength);
int nCompleteLength = 2 + nDataLength;
byte[] abCompleteData = new byte[nCompleteLength];
abCompleteData[0] = (byte) META;
abCompleteData[1] = (byte) nType;
System.arraycopy(abData, 0, abCompleteData, 2, nDataLength);
super.setMessage(abCompleteData, nCompleteLength);
}
/** TODO:
*/
public int getType()
{
int nType = MidiUtils.getUnsignedInteger(getMessage()[1]);
return nType;
}
/** TODO:
*/
public byte[] getData()
{
int nDataLength = getLength() - 2;
byte[] abData = new byte[nDataLength];
System.arraycopy(getMessage(), 2, abData, 0, nDataLength);
return abData;
}
/** TODO:
*/
public Object clone()
{
// TODO: re-check
byte[] abData = getMessage();
MetaMessage message = new MetaMessage(abData);
return message;
}
}
/*** MetaMessage.java ***/