//////////////////////////////////////////////////////////////////////////////
// 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.util;
import java.io.IOException;
import java.io.InputStream;
public class VariableLengthInt
{
private int mValue;
private byte[] mBytes;
private int mSizeInBytes;
public VariableLengthInt(int value)
{
setValue(value);
}
public VariableLengthInt(InputStream in) throws IOException
{
parseBytes(in);
}
public void setValue(int value)
{
mValue = value;
buildBytes();
}
public int getValue()
{
return mValue;
}
public int getByteCount()
{
return mSizeInBytes;
}
public byte[] getBytes()
{
return mBytes;
}
private void parseBytes(InputStream in) throws IOException
{
int[] ints = new int[4];
mSizeInBytes = 0;
mValue = 0;
int shift = 0;
int b = in.read();
while(mSizeInBytes < 4)
{
mSizeInBytes++;
boolean variable = (b & 0x80) > 0;
if(!variable)
{
ints[mSizeInBytes - 1] = (b & 0x7F);
break;
}
ints[mSizeInBytes - 1] = (b & 0x7F);
b = in.read();
}
for(int i = 1; i < mSizeInBytes; i++)
{
shift += 7;
}
mBytes = new byte[mSizeInBytes];
for(int i = 0; i < mSizeInBytes; i++)
{
mBytes[i] = (byte) ints[i];
mValue += ints[i] << shift;
shift -= 7;
}
}
private void buildBytes()
{
if(mValue == 0)
{
mBytes = new byte[1];
mBytes[0] = 0x00;
mSizeInBytes = 1;
return;
}
mSizeInBytes = 0;
int[] vals = new int[4];
int tmpVal = mValue;
while(mSizeInBytes < 4 && tmpVal > 0)
{
vals[mSizeInBytes] = tmpVal & 0x7F;
mSizeInBytes++;
tmpVal = tmpVal >> 7;
}
for(int i = 1; i < mSizeInBytes; i++)
{
vals[i] |= 0x80;
}
mBytes = new byte[mSizeInBytes];
for(int i = 0; i < mSizeInBytes; i++)
{
mBytes[i] = (byte) vals[mSizeInBytes - i - 1];
}
}
@Override
public String toString()
{
return MidiUtil.bytesToHex(mBytes) + " (" + mValue + ")";
}
}