use of javax.sound.midi.SysexMessage in project sponge by softelnet.
the class MidiSpongeEventReceiver method send.
@Override
public void send(MidiMessage message, long timeStamp) {
try {
if (sound) {
midiPlugin.sound(message);
}
MidiMessageEvent<?> event;
if (message instanceof ShortMessage) {
event = MidiUtils.createShortMessageEvent(midiPlugin, (ShortMessage) message, timeStamp);
} else if (message instanceof SysexMessage) {
event = new MidiSysexMessageEvent(midiPlugin.getMidiSysexMessageEventName(), midiPlugin.getEngine().getDefaultParameters().getEventClonePolicy(), (SysexMessage) message, timeStamp);
} else if (message instanceof MetaMessage) {
event = new MidiMetaMessageEvent(midiPlugin.getMidiMetaMessageEventName(), midiPlugin.getEngine().getDefaultParameters().getEventClonePolicy(), (MetaMessage) message, timeStamp);
} else {
throw new SpongeException("Unknown MIDI message type: " + message.getClass());
}
midiPlugin.getEngine().getOperations().event(event).send();
} catch (Exception e) {
logger.error("send", e);
}
}
use of javax.sound.midi.SysexMessage in project jdk8u_jdk by JetBrains.
the class SMFParser method readTrack.
void readTrack(Track track) throws IOException, InvalidMidiDataException {
try {
// reset current tick to 0
long tick = 0;
// reset current status byte to 0 (invalid value).
// this should cause us to throw an InvalidMidiDataException if we don't
// get a valid status byte from the beginning of the track.
int status = 0;
boolean endOfTrackFound = false;
while (!trackFinished() && !endOfTrackFound) {
MidiMessage message;
// initialize to invalid value
int data1 = -1;
int data2 = 0;
// each event has a tick delay and then the event data.
// first read the delay (a variable-length int) and update our tick value
tick += readVarInt();
// check for new status
int byteValue = readUnsigned();
if (byteValue >= 0x80) {
status = byteValue;
} else {
data1 = byteValue;
}
switch(status & 0xF0) {
case 0x80:
case 0x90:
case 0xA0:
case 0xB0:
case 0xE0:
// two data bytes
if (data1 == -1) {
data1 = readUnsigned();
}
data2 = readUnsigned();
message = new FastShortMessage(status | (data1 << 8) | (data2 << 16));
break;
case 0xC0:
case 0xD0:
// one data byte
if (data1 == -1) {
data1 = readUnsigned();
}
message = new FastShortMessage(status | (data1 << 8));
break;
case 0xF0:
// sys-ex or meta
switch(status) {
case 0xF0:
case 0xF7:
// sys ex
int sysexLength = (int) readVarInt();
byte[] sysexData = new byte[sysexLength];
read(sysexData);
SysexMessage sysexMessage = new SysexMessage();
sysexMessage.setMessage(status, sysexData, sysexLength);
message = sysexMessage;
break;
case 0xFF:
// meta
int metaType = readUnsigned();
int metaLength = (int) readVarInt();
final byte[] metaData;
try {
metaData = new byte[metaLength];
} catch (final OutOfMemoryError oom) {
throw new IOException("Meta length too big", oom);
}
read(metaData);
MetaMessage metaMessage = new MetaMessage();
metaMessage.setMessage(metaType, metaData, metaLength);
message = metaMessage;
if (metaType == 0x2F) {
// end of track means it!
endOfTrackFound = true;
}
break;
default:
throw new InvalidMidiDataException("Invalid status byte: " + status);
}
// switch sys-ex or meta
break;
default:
throw new InvalidMidiDataException("Invalid status byte: " + status);
}
// switch
track.add(new MidiEvent(message, tick));
}
// while
} catch (ArrayIndexOutOfBoundsException e) {
if (DEBUG)
e.printStackTrace();
// fix for 4834374
throw new EOFException("invalid MIDI file");
}
}
use of javax.sound.midi.SysexMessage in project jdk8u_jdk by JetBrains.
the class StandardMidiFileWriter method writeTrack.
private InputStream writeTrack(Track track, int type) throws IOException, InvalidMidiDataException {
int bytesWritten = 0;
int lastBytesWritten = 0;
int size = track.size();
PipedOutputStream thpos = new PipedOutputStream();
DataOutputStream thdos = new DataOutputStream(thpos);
PipedInputStream thpis = new PipedInputStream(thpos);
ByteArrayOutputStream tdbos = new ByteArrayOutputStream();
tddos = new DataOutputStream(tdbos);
ByteArrayInputStream tdbis = null;
SequenceInputStream fStream = null;
long currentTick = 0;
long deltaTick = 0;
long eventTick = 0;
int runningStatus = -1;
// -----------------------------
for (int i = 0; i < size; i++) {
MidiEvent event = track.get(i);
int status;
int eventtype;
int metatype;
int data1, data2;
int length;
byte[] data = null;
ShortMessage shortMessage = null;
MetaMessage metaMessage = null;
SysexMessage sysexMessage = null;
// get the tick
// $$jb: this gets easier if we change all system-wide time to delta ticks
eventTick = event.getTick();
deltaTick = event.getTick() - currentTick;
currentTick = event.getTick();
// get the status byte
status = event.getMessage().getStatus();
eventtype = getType(status);
switch(eventtype) {
case ONE_BYTE:
shortMessage = (ShortMessage) event.getMessage();
data1 = shortMessage.getData1();
bytesWritten += writeVarInt(deltaTick);
if (status != runningStatus) {
runningStatus = status;
tddos.writeByte(status);
bytesWritten += 1;
}
tddos.writeByte(data1);
bytesWritten += 1;
break;
case TWO_BYTE:
shortMessage = (ShortMessage) event.getMessage();
data1 = shortMessage.getData1();
data2 = shortMessage.getData2();
bytesWritten += writeVarInt(deltaTick);
if (status != runningStatus) {
runningStatus = status;
tddos.writeByte(status);
bytesWritten += 1;
}
tddos.writeByte(data1);
bytesWritten += 1;
tddos.writeByte(data2);
bytesWritten += 1;
break;
case SYSEX:
sysexMessage = (SysexMessage) event.getMessage();
length = sysexMessage.getLength();
data = sysexMessage.getMessage();
bytesWritten += writeVarInt(deltaTick);
// $$jb: 04.08.99: always write status for sysex
runningStatus = status;
tddos.writeByte(data[0]);
bytesWritten += 1;
// $$jb: 10.18.99: we don't maintain length in
// the message data for SysEx (it is not transmitted
// over the line), so write the calculated length
// minus the status byte
bytesWritten += writeVarInt((data.length - 1));
// $$jb: 10.18.99: now write the rest of the
// message
tddos.write(data, 1, (data.length - 1));
bytesWritten += (data.length - 1);
break;
case META:
metaMessage = (MetaMessage) event.getMessage();
length = metaMessage.getLength();
data = metaMessage.getMessage();
bytesWritten += writeVarInt(deltaTick);
// $$jb: 10.18.99: getMessage() returns the
// entire valid midi message for a file,
// including the status byte and the var-length-int
// length value, so we can just write the data
// here. note that we must _always_ write the
// status byte, regardless of runningStatus.
runningStatus = status;
tddos.write(data, 0, data.length);
bytesWritten += data.length;
break;
case IGNORE:
// ignore this event
break;
case ERROR:
// ignore this event
break;
default:
throw new InvalidMidiDataException("internal file writer error");
}
}
// ---------------------------------
// End write each event in the track
// ---------------------------------
// Build Track header now that we know length
thdos.writeInt(MTrk_MAGIC);
thdos.writeInt(bytesWritten);
bytesWritten += 8;
// Now sequence them
tdbis = new ByteArrayInputStream(tdbos.toByteArray());
fStream = new SequenceInputStream(thpis, tdbis);
thdos.close();
tddos.close();
return fStream;
}
Aggregations