trackloader: refactor more midi messages

This commit is contained in:
Adam
2017-10-08 16:20:49 -04:00
parent 0b3da3bfea
commit 34d277c169

View File

@@ -30,6 +30,53 @@ import net.runelite.cache.io.OutputStream;
public class TrackLoader public class TrackLoader
{ {
// Headers
private static final int MTHD_MAGIC = 1297377380;
private static final int MTRK_MAGIC = 1297379947;
// Major MIDI Messages. Bottom 4 bits are the channel.
private static final int NOTE_ON = 0b1001_0000;
private static final int NOTE_OFF = 0b1000_0000;
private static final int CONTROL_CHANGE = 0b1011_0000;
private static final int PITCH_WHEEL_CHANGE = 0b1110_0000;
private static final int CHANNEL_PRESSURE = 0b1101_0000;
private static final int POLYPHONIC_KEY_PRESSURE = 0b1010_0000;
private static final int PROGRAM_CHANGE = 0b1100_0000;
// Meta Events
private static final int META = 255;
private static final int END_OF_TRACK = 47;
private static final int TEMPO = 81;
// Controller messages
private static final int CONTROLLER_BANK_SELECT = 0;
private static final int CONTROLLER_MODULATION_WHEEL = 1;
private static final int CONTROLLER_CHANNEL_VOLUME = 7;
private static final int CONTROLLER_PAN = 10;
private static final int CONTROLLER_BANK_SELECT_2 = 32;
private static final int CONTROLLER_MODULATION_WHEEL2 = 33;
private static final int CONTROLLER_CHANNEL_VOLUME_2 = 39;
private static final int CONTROLLER_PAN_2 = 42;
private static final int CONTROLLER_DAMPER_PEDAL = 64;
private static final int CONTROLLER_PORTAMENTO = 65;
private static final int CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB = 98;
private static final int CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB = 99;
private static final int CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB = 100;
private static final int CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB = 101;
private static final int CONTROLLER_ALL_SOUND_OFF = 120;
private static final int CONTROLLER_RESET_ALL_CONTROLLERS = 121;
private static final int CONTROLLER_ALL_NOTES_OFF = 123;
private static final int JAG_NOTE_ON = 0;
private static final int JAG_NOTE_OFF = 1;
private static final int JAG_CONTROL_CHANGE = 2;
private static final int JAG_PITCH_BEND = 3;
private static final int JAG_CHANNEL_PRESSURE = 4;
private static final int JAG_POLY_PRESSURE = 5;
private static final int JAG_PROGRAM_CHANGE = 6;
private static final int JAG_END_OF_TRACK = 7;
private static final int JAG_TEMPO = 23;
public TrackDefinition load(byte[] b) public TrackDefinition load(byte[] b)
{ {
TrackDefinition def = new TrackDefinition(); TrackDefinition def = new TrackDefinition();
@@ -56,61 +103,60 @@ public class TrackLoader
int var13; int var13;
int opcode; int opcode;
int var15; int controlChangeIndex;
for (var13 = 0; var13 < tracks; ++var13) for (var13 = 0; var13 < tracks; ++var13)
{ {
opcode = -1; opcode = -1;
while (true) while (true)
{ {
var15 = var1.readUnsignedByte(); controlChangeIndex = var1.readUnsignedByte();
if (var15 != opcode) if (controlChangeIndex != opcode)
{ {
++offset; ++offset;
} }
opcode = var15 & 15; opcode = controlChangeIndex & 15;
if (var15 == 7) if (controlChangeIndex == JAG_END_OF_TRACK)
{ {
break; break;
} }
if (var15 == 23) if (controlChangeIndex == JAG_TEMPO)
{ {
++tempoOpcodes; ++tempoOpcodes;
} }
else if (opcode == 0) else if (opcode == JAG_NOTE_ON)
{ {
++noteOnOpcodes; ++noteOnOpcodes;
} }
else if (opcode == 1) else if (opcode == JAG_NOTE_OFF)
{ {
++noteOffOpcodes; ++noteOffOpcodes;
} }
else if (opcode == 2) else if (opcode == JAG_CONTROL_CHANGE)
{ {
++ctrlChangeOpcodes; ++ctrlChangeOpcodes;
} }
else if (opcode == 3) else if (opcode == JAG_PITCH_BEND)
{ {
++wheelChangeOpcodes; ++wheelChangeOpcodes;
} }
else if (opcode == 4) else if (opcode == JAG_CHANNEL_PRESSURE)
{ {
++chnnlAfterTchOpcodes; ++chnnlAfterTchOpcodes;
} }
else if (opcode == 5) else if (opcode == JAG_POLY_PRESSURE)
{ {
++keyAfterTchOpcodes; ++keyAfterTchOpcodes;
} }
else if (opcode == JAG_PROGRAM_CHANGE)
{
++progmChangeOpcodes;
}
else else
{ {
if (opcode != 6) throw new RuntimeException();
{
throw new RuntimeException();
}
++progmChangeOpcodes;
} }
} }
} }
@@ -121,139 +167,140 @@ public class TrackLoader
var13 = var1.getOffset(); var13 = var1.getOffset();
opcode = tracks + tempoOpcodes + ctrlChangeOpcodes + noteOnOpcodes + noteOffOpcodes + wheelChangeOpcodes + chnnlAfterTchOpcodes + keyAfterTchOpcodes + progmChangeOpcodes; opcode = tracks + tempoOpcodes + ctrlChangeOpcodes + noteOnOpcodes + noteOffOpcodes + wheelChangeOpcodes + chnnlAfterTchOpcodes + keyAfterTchOpcodes + progmChangeOpcodes;
for (var15 = 0; var15 < opcode; ++var15) for (controlChangeIndex = 0; controlChangeIndex < opcode; ++controlChangeIndex)
{ {
var1.readVarInt(); var1.readVarInt();
} }
offset += var1.getOffset() - var13; offset += var1.getOffset() - var13;
var15 = var1.getOffset(); controlChangeIndex = var1.getOffset();
int var16 = 0; int modulationWheelSize = 0;
int var17 = 0; int modulationWheel2Size = 0;
int var18 = 0; int channelVolumeSize = 0;
int var19 = 0; int channelVolume2Size = 0;
int var20 = 0; int panSize = 0;
int var21 = 0; int pan2Size = 0;
int var22 = 0; int nonRegisteredMsbSize = 0;
int var23 = 0; int nonRegisteredLsbSize = 0;
int var24 = 0; int registeredNumberMsb = 0;
int var25 = 0; int registeredLsbSize = 0;
int var26 = 0; int commandsSize = 0;
int var27 = 0; int otherSize = 0;
int var28 = 0; int controllerNumber = 0;
int var29; int var29;
for (var29 = 0; var29 < ctrlChangeOpcodes; ++var29) for (var29 = 0; var29 < ctrlChangeOpcodes; ++var29)
{ {
var28 = var28 + var1.readUnsignedByte() & 127; controllerNumber = controllerNumber + var1.readUnsignedByte() & 127;
if (var28 != 0 && var28 != 32) if (controllerNumber == CONTROLLER_BANK_SELECT || controllerNumber == CONTROLLER_BANK_SELECT_2)
{ {
if (var28 == 1) ++progmChangeOpcodes;
{ }
++var16; else if (controllerNumber == CONTROLLER_MODULATION_WHEEL)
} {
else if (var28 == 33) ++modulationWheelSize;
{ }
++var17; else if (controllerNumber == CONTROLLER_MODULATION_WHEEL2)
} {
else if (var28 == 7) ++modulationWheel2Size;
{ }
++var18; else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME)
} {
else if (var28 == 39) ++channelVolumeSize;
{ }
++var19; else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME_2)
} {
else if (var28 == 10) ++channelVolume2Size;
{ }
++var20; else if (controllerNumber == CONTROLLER_PAN)
} {
else if (var28 == 42) ++panSize;
{ }
++var21; else if (controllerNumber == CONTROLLER_PAN_2)
} {
else if (var28 == 99) ++pan2Size;
{ }
++var22; else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB)
} {
else if (var28 == 98) ++nonRegisteredMsbSize;
{ }
++var23; else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB)
} {
else if (var28 == 101) ++nonRegisteredLsbSize;
{ }
++var24; else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB)
} {
else if (var28 == 100) ++registeredNumberMsb;
{ }
++var25; else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB)
} {
else if (var28 != 64 && var28 != 65 && var28 != 120 && var28 != 121 && var28 != 123) ++registeredLsbSize;
{ }
++var27; else if (controllerNumber != CONTROLLER_DAMPER_PEDAL
} && controllerNumber != CONTROLLER_PORTAMENTO
else && controllerNumber != CONTROLLER_ALL_SOUND_OFF
{ && controllerNumber != CONTROLLER_RESET_ALL_CONTROLLERS
++var26; && controllerNumber != CONTROLLER_ALL_NOTES_OFF)
} {
++otherSize;
} }
else else
{ {
++progmChangeOpcodes; ++commandsSize;
} }
} }
var29 = 0; var29 = 0;
int var30 = var1.getOffset(); int commandsIndex = var1.getOffset();
var1.skip(var26); var1.skip(commandsSize);
int var31 = var1.getOffset(); int polyPressureIndex = var1.getOffset();
var1.skip(keyAfterTchOpcodes); var1.skip(keyAfterTchOpcodes);
int var32 = var1.getOffset(); int channelPressureIndex = var1.getOffset();
var1.skip(chnnlAfterTchOpcodes); var1.skip(chnnlAfterTchOpcodes);
int var33 = var1.getOffset(); int pitchWheelHighIndex = var1.getOffset();
var1.skip(wheelChangeOpcodes); var1.skip(wheelChangeOpcodes);
int var34 = var1.getOffset(); int modulationWheelOffset = var1.getOffset();
var1.skip(var16); var1.skip(modulationWheelSize);
int var35 = var1.getOffset(); int channelVolumeOffset = var1.getOffset();
var1.skip(var18); var1.skip(channelVolumeSize);
int var36 = var1.getOffset(); int panOffset = var1.getOffset();
var1.skip(var20); var1.skip(panSize);
int var37 = var1.getOffset(); int notesIndex = var1.getOffset();
var1.skip(noteOnOpcodes + noteOffOpcodes + keyAfterTchOpcodes); var1.skip(noteOnOpcodes + noteOffOpcodes + keyAfterTchOpcodes);
int var38 = var1.getOffset(); int notesOnIndex = var1.getOffset();
var1.skip(noteOnOpcodes); var1.skip(noteOnOpcodes);
int var39 = var1.getOffset(); int otherIndex = var1.getOffset();
var1.skip(var27); var1.skip(otherSize);
int var40 = var1.getOffset(); int notesOffIndex = var1.getOffset();
var1.skip(noteOffOpcodes); var1.skip(noteOffOpcodes);
int var41 = var1.getOffset(); int modulationWheel2Offset = var1.getOffset();
var1.skip(var17); var1.skip(modulationWheel2Size);
int var42 = var1.getOffset(); int channelVolume2Offset = var1.getOffset();
var1.skip(var19); var1.skip(channelVolume2Size);
int var43 = var1.getOffset(); int pan2Offset = var1.getOffset();
var1.skip(var21); var1.skip(pan2Size);
int var44 = var1.getOffset(); int programChangeIndex = var1.getOffset();
var1.skip(progmChangeOpcodes); var1.skip(progmChangeOpcodes);
int var45 = var1.getOffset(); int pitchWheelLowIndex = var1.getOffset();
var1.skip(wheelChangeOpcodes); var1.skip(wheelChangeOpcodes);
int var46 = var1.getOffset(); int nonRegisteredMsbIndex = var1.getOffset();
var1.skip(var22); var1.skip(nonRegisteredMsbSize);
int var47 = var1.getOffset(); int nonRegisteredLsbIndex = var1.getOffset();
var1.skip(var23); var1.skip(nonRegisteredLsbSize);
int var48 = var1.getOffset(); int registeredMsbIndex = var1.getOffset();
var1.skip(var24); var1.skip(registeredNumberMsb);
int var49 = var1.getOffset(); int registeredLsbIndex = var1.getOffset();
var1.skip(var25); var1.skip(registeredLsbSize);
int var50 = var1.getOffset(); int tempoOffset = var1.getOffset();
var1.skip(tempoOpcodes * 3); var1.skip(tempoOpcodes * 3);
OutputStream var51 = new OutputStream(offset); OutputStream var51 = new OutputStream(offset);
var51.writeInt(1297377380); // MThd header var51.writeInt(MTHD_MAGIC); // MThd header
var51.writeInt(6); // length of header var51.writeInt(6); // length of header
var51.writeShort(tracks > 1 ? 1 : 0); // format var51.writeShort(tracks > 1 ? 1 : 0); // format
var51.writeShort(tracks); // tracks var51.writeShort(tracks); // tracks
var51.writeShort(division); // division var51.writeShort(division); // division
var1.setOffset(var13); var1.setOffset(var13);
int var52 = 0; int channel = 0;
int var53 = 0; int var53 = 0;
int var54 = 0; int var54 = 0;
int var55 = 0; int var55 = 0;
@@ -261,193 +308,194 @@ public class TrackLoader
int var57 = 0; int var57 = 0;
int var58 = 0; int var58 = 0;
int[] var59 = new int[128]; int[] var59 = new int[128];
var28 = 0; controllerNumber = 0;
label361: label361:
for (int var60 = 0; var60 < tracks; ++var60) for (int var60 = 0; var60 < tracks; ++var60)
{ {
var51.writeInt(1297379947); // MTrk var51.writeInt(MTRK_MAGIC); // MTrk
var51.skip(4); // length gets written here later var51.skip(4); // length gets written here later
int var61 = var51.getOffset(); int var61 = var51.getOffset();
int var62 = -1; int var62 = -1;
while (true) while (true)
{ {
int var63 = var1.readVarInt(); int deltaTick = var1.readVarInt();
var51.writeVarInt(var63); // delta time var51.writeVarInt(deltaTick); // delta time
int var64 = var1.getArray()[var29++] & 255; int status = var1.getArray()[var29++] & 255;
boolean var65 = var64 != var62; boolean var65 = status != var62;
var62 = var64 & 15; var62 = status & 15;
if (var64 == 7) if (status == JAG_END_OF_TRACK)
{ {
//if (var65) -- client has this if, but it causes broken midi to be produced //if (var65) -- client has this if, but it causes broken midi to be produced
{ {
var51.writeByte(255); var51.writeByte(META);
} }
var51.writeByte(47); // type - end of track var51.writeByte(END_OF_TRACK); // type - end of track
var51.writeByte(0); // length var51.writeByte(0); // length
var51.writeLengthFromMark(var51.getOffset() - var61); var51.writeLengthFromMark(var51.getOffset() - var61);
continue label361; continue label361;
} }
if (var64 == 23) if (status == JAG_TEMPO)
{ {
//if (var65) -- client has this if, but it causes broken midi to be produced //if (var65) -- client has this if, but it causes broken midi to be produced
{ {
var51.writeByte(255); // meta event FF var51.writeByte(META); // meta event FF
} }
var51.writeByte(81); // type - set tempo var51.writeByte(TEMPO); // type - set tempo
var51.writeByte(3); // length var51.writeByte(3); // length
var51.writeByte(var1.getArray()[var50++]); var51.writeByte(var1.getArray()[tempoOffset++]);
var51.writeByte(var1.getArray()[var50++]); var51.writeByte(var1.getArray()[tempoOffset++]);
var51.writeByte(var1.getArray()[var50++]); var51.writeByte(var1.getArray()[tempoOffset++]);
} }
else else
{ {
var52 ^= var64 >> 4; channel ^= status >> 4;
if (var62 == 0) if (var62 == JAG_NOTE_ON)
{ {
if (var65) if (var65)
{ {
var51.writeByte(144 + var52); var51.writeByte(NOTE_ON + channel);
} }
var53 += var1.getArray()[var37++]; var53 += var1.getArray()[notesIndex++];
var54 += var1.getArray()[var38++]; var54 += var1.getArray()[notesOnIndex++];
var51.writeByte(var53 & 127); var51.writeByte(var53 & 127);
var51.writeByte(var54 & 127); var51.writeByte(var54 & 127);
} }
else if (var62 == 1) else if (var62 == JAG_NOTE_OFF)
{ {
if (var65) if (var65)
{ {
var51.writeByte(128 + var52); var51.writeByte(NOTE_OFF + channel);
} }
var53 += var1.getArray()[var37++]; var53 += var1.getArray()[notesIndex++];
var55 += var1.getArray()[var40++]; var55 += var1.getArray()[notesOffIndex++];
var51.writeByte(var53 & 127); var51.writeByte(var53 & 127);
var51.writeByte(var55 & 127); var51.writeByte(var55 & 127);
} }
else if (var62 == 2) else if (var62 == JAG_CONTROL_CHANGE)
{ {
if (var65) if (var65)
{ {
var51.writeByte(176 + var52); var51.writeByte(CONTROL_CHANGE + channel);
} }
var28 = var28 + var1.getArray()[var15++] & 127; controllerNumber = controllerNumber + var1.getArray()[controlChangeIndex++] & 127;
var51.writeByte(var28); var51.writeByte(controllerNumber);
byte var66; byte var66;
if (var28 != 0 && var28 != 32) if (controllerNumber == CONTROLLER_BANK_SELECT || controllerNumber == CONTROLLER_BANK_SELECT_2)
{ {
if (var28 == 1) var66 = var1.getArray()[programChangeIndex++];
{ }
var66 = var1.getArray()[var34++]; else if (controllerNumber == CONTROLLER_MODULATION_WHEEL)
} {
else if (var28 == 33) var66 = var1.getArray()[modulationWheelOffset++];
{ }
var66 = var1.getArray()[var41++]; else if (controllerNumber == CONTROLLER_MODULATION_WHEEL2)
} {
else if (var28 == 7) var66 = var1.getArray()[modulationWheel2Offset++];
{ }
var66 = var1.getArray()[var35++]; else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME)
} {
else if (var28 == 39) var66 = var1.getArray()[channelVolumeOffset++];
{ }
var66 = var1.getArray()[var42++]; else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME_2)
} {
else if (var28 == 10) var66 = var1.getArray()[channelVolume2Offset++];
{ }
var66 = var1.getArray()[var36++]; else if (controllerNumber == CONTROLLER_PAN)
} {
else if (var28 == 42) var66 = var1.getArray()[panOffset++];
{ }
var66 = var1.getArray()[var43++]; else if (controllerNumber == CONTROLLER_PAN_2)
} {
else if (var28 == 99) var66 = var1.getArray()[pan2Offset++];
{ }
var66 = var1.getArray()[var46++]; else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB)
} {
else if (var28 == 98) var66 = var1.getArray()[nonRegisteredMsbIndex++];
{ }
var66 = var1.getArray()[var47++]; else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB)
} {
else if (var28 == 101) var66 = var1.getArray()[nonRegisteredLsbIndex++];
{ }
var66 = var1.getArray()[var48++]; else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB)
} {
else if (var28 == 100) var66 = var1.getArray()[registeredMsbIndex++];
{ }
var66 = var1.getArray()[var49++]; else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB)
} {
else if (var28 != 64 && var28 != 65 && var28 != 120 && var28 != 121 && var28 != 123) var66 = var1.getArray()[registeredLsbIndex++];
{ }
var66 = var1.getArray()[var39++]; else if (controllerNumber != CONTROLLER_DAMPER_PEDAL
} && controllerNumber != CONTROLLER_PORTAMENTO
else && controllerNumber != CONTROLLER_ALL_SOUND_OFF
{ && controllerNumber != CONTROLLER_RESET_ALL_CONTROLLERS
var66 = var1.getArray()[var30++]; && controllerNumber != CONTROLLER_ALL_NOTES_OFF)
} {
var66 = var1.getArray()[otherIndex++];
} }
else else
{ {
var66 = var1.getArray()[var44++]; var66 = var1.getArray()[commandsIndex++];
} }
int var67 = var66 + var59[var28]; int var67 = var66 + var59[controllerNumber];
var59[var28] = var67; var59[controllerNumber] = var67;
var51.writeByte(var67 & 127); var51.writeByte(var67 & 127);
} }
else if (var62 == 3) else if (var62 == JAG_PITCH_BEND)
{ {
if (var65) if (var65)
{ {
var51.writeByte(224 + var52); var51.writeByte(PITCH_WHEEL_CHANGE + channel);
} }
var56 += var1.getArray()[var45++]; var56 += var1.getArray()[pitchWheelLowIndex++];
var56 += var1.getArray()[var33++] << 7; var56 += var1.getArray()[pitchWheelHighIndex++] << 7;
var51.writeByte(var56 & 127); var51.writeByte(var56 & 127);
var51.writeByte(var56 >> 7 & 127); var51.writeByte(var56 >> 7 & 127);
} }
else if (var62 == 4) else if (var62 == JAG_CHANNEL_PRESSURE)
{ {
if (var65) if (var65)
{ {
var51.writeByte(208 + var52); var51.writeByte(CHANNEL_PRESSURE + channel);
} }
var57 += var1.getArray()[var32++]; var57 += var1.getArray()[channelPressureIndex++];
var51.writeByte(var57 & 127); var51.writeByte(var57 & 127);
} }
else if (var62 == 5) else if (var62 == JAG_POLY_PRESSURE)
{ {
if (var65) if (var65)
{ {
var51.writeByte(160 + var52); var51.writeByte(POLYPHONIC_KEY_PRESSURE + channel);
} }
var53 += var1.getArray()[var37++]; var53 += var1.getArray()[notesIndex++];
var58 += var1.getArray()[var31++]; var58 += var1.getArray()[polyPressureIndex++];
var51.writeByte(var53 & 127); var51.writeByte(var53 & 127);
var51.writeByte(var58 & 127); var51.writeByte(var58 & 127);
} }
else else if (var62 == JAG_PROGRAM_CHANGE)
{ {
if (var62 != 6)
{
throw new RuntimeException();
}
if (var65) if (var65)
{ {
var51.writeByte(192 + var52); var51.writeByte(PROGRAM_CHANGE + channel);
} }
var51.writeByte(var1.getArray()[var44++]); var51.writeByte(var1.getArray()[programChangeIndex++]);
}
else
{
throw new RuntimeException();
} }
} }
} }