From 34d277c169d2a97d1cb1bc5bf55189aa1b87d296 Mon Sep 17 00:00:00 2001 From: Adam Date: Sun, 8 Oct 2017 16:20:49 -0400 Subject: [PATCH] trackloader: refactor more midi messages --- .../definitions/loaders/TrackLoader.java | 484 ++++++++++-------- 1 file changed, 266 insertions(+), 218 deletions(-) diff --git a/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java b/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java index ef85c8489b..6911b9de27 100644 --- a/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java +++ b/cache/src/main/java/net/runelite/cache/definitions/loaders/TrackLoader.java @@ -30,6 +30,53 @@ import net.runelite.cache.io.OutputStream; 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) { TrackDefinition def = new TrackDefinition(); @@ -56,61 +103,60 @@ public class TrackLoader int var13; int opcode; - int var15; + int controlChangeIndex; for (var13 = 0; var13 < tracks; ++var13) { opcode = -1; while (true) { - var15 = var1.readUnsignedByte(); - if (var15 != opcode) + controlChangeIndex = var1.readUnsignedByte(); + if (controlChangeIndex != opcode) { ++offset; } - opcode = var15 & 15; - if (var15 == 7) + opcode = controlChangeIndex & 15; + if (controlChangeIndex == JAG_END_OF_TRACK) { break; } - if (var15 == 23) + if (controlChangeIndex == JAG_TEMPO) { ++tempoOpcodes; } - else if (opcode == 0) + else if (opcode == JAG_NOTE_ON) { ++noteOnOpcodes; } - else if (opcode == 1) + else if (opcode == JAG_NOTE_OFF) { ++noteOffOpcodes; } - else if (opcode == 2) + else if (opcode == JAG_CONTROL_CHANGE) { ++ctrlChangeOpcodes; } - else if (opcode == 3) + else if (opcode == JAG_PITCH_BEND) { ++wheelChangeOpcodes; } - else if (opcode == 4) + else if (opcode == JAG_CHANNEL_PRESSURE) { ++chnnlAfterTchOpcodes; } - else if (opcode == 5) + else if (opcode == JAG_POLY_PRESSURE) { ++keyAfterTchOpcodes; } + else if (opcode == JAG_PROGRAM_CHANGE) + { + ++progmChangeOpcodes; + } else { - if (opcode != 6) - { - throw new RuntimeException(); - } - - ++progmChangeOpcodes; + throw new RuntimeException(); } } } @@ -121,139 +167,140 @@ public class TrackLoader var13 = var1.getOffset(); opcode = tracks + tempoOpcodes + ctrlChangeOpcodes + noteOnOpcodes + noteOffOpcodes + wheelChangeOpcodes + chnnlAfterTchOpcodes + keyAfterTchOpcodes + progmChangeOpcodes; - for (var15 = 0; var15 < opcode; ++var15) + for (controlChangeIndex = 0; controlChangeIndex < opcode; ++controlChangeIndex) { var1.readVarInt(); } offset += var1.getOffset() - var13; - var15 = var1.getOffset(); - int var16 = 0; - int var17 = 0; - int var18 = 0; - int var19 = 0; - int var20 = 0; - int var21 = 0; - int var22 = 0; - int var23 = 0; - int var24 = 0; - int var25 = 0; - int var26 = 0; - int var27 = 0; - int var28 = 0; + controlChangeIndex = var1.getOffset(); + int modulationWheelSize = 0; + int modulationWheel2Size = 0; + int channelVolumeSize = 0; + int channelVolume2Size = 0; + int panSize = 0; + int pan2Size = 0; + int nonRegisteredMsbSize = 0; + int nonRegisteredLsbSize = 0; + int registeredNumberMsb = 0; + int registeredLsbSize = 0; + int commandsSize = 0; + int otherSize = 0; + int controllerNumber = 0; int var29; for (var29 = 0; var29 < ctrlChangeOpcodes; ++var29) { - var28 = var28 + var1.readUnsignedByte() & 127; - if (var28 != 0 && var28 != 32) + controllerNumber = controllerNumber + var1.readUnsignedByte() & 127; + if (controllerNumber == CONTROLLER_BANK_SELECT || controllerNumber == CONTROLLER_BANK_SELECT_2) { - if (var28 == 1) - { - ++var16; - } - else if (var28 == 33) - { - ++var17; - } - else if (var28 == 7) - { - ++var18; - } - else if (var28 == 39) - { - ++var19; - } - else if (var28 == 10) - { - ++var20; - } - else if (var28 == 42) - { - ++var21; - } - else if (var28 == 99) - { - ++var22; - } - else if (var28 == 98) - { - ++var23; - } - else if (var28 == 101) - { - ++var24; - } - else if (var28 == 100) - { - ++var25; - } - else if (var28 != 64 && var28 != 65 && var28 != 120 && var28 != 121 && var28 != 123) - { - ++var27; - } - else - { - ++var26; - } + ++progmChangeOpcodes; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL) + { + ++modulationWheelSize; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL2) + { + ++modulationWheel2Size; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME) + { + ++channelVolumeSize; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME_2) + { + ++channelVolume2Size; + } + else if (controllerNumber == CONTROLLER_PAN) + { + ++panSize; + } + else if (controllerNumber == CONTROLLER_PAN_2) + { + ++pan2Size; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB) + { + ++nonRegisteredMsbSize; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB) + { + ++nonRegisteredLsbSize; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB) + { + ++registeredNumberMsb; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB) + { + ++registeredLsbSize; + } + else if (controllerNumber != CONTROLLER_DAMPER_PEDAL + && controllerNumber != CONTROLLER_PORTAMENTO + && controllerNumber != CONTROLLER_ALL_SOUND_OFF + && controllerNumber != CONTROLLER_RESET_ALL_CONTROLLERS + && controllerNumber != CONTROLLER_ALL_NOTES_OFF) + { + ++otherSize; } else { - ++progmChangeOpcodes; + ++commandsSize; } } var29 = 0; - int var30 = var1.getOffset(); - var1.skip(var26); - int var31 = var1.getOffset(); + int commandsIndex = var1.getOffset(); + var1.skip(commandsSize); + int polyPressureIndex = var1.getOffset(); var1.skip(keyAfterTchOpcodes); - int var32 = var1.getOffset(); + int channelPressureIndex = var1.getOffset(); var1.skip(chnnlAfterTchOpcodes); - int var33 = var1.getOffset(); + int pitchWheelHighIndex = var1.getOffset(); var1.skip(wheelChangeOpcodes); - int var34 = var1.getOffset(); - var1.skip(var16); - int var35 = var1.getOffset(); - var1.skip(var18); - int var36 = var1.getOffset(); - var1.skip(var20); - int var37 = var1.getOffset(); + int modulationWheelOffset = var1.getOffset(); + var1.skip(modulationWheelSize); + int channelVolumeOffset = var1.getOffset(); + var1.skip(channelVolumeSize); + int panOffset = var1.getOffset(); + var1.skip(panSize); + int notesIndex = var1.getOffset(); var1.skip(noteOnOpcodes + noteOffOpcodes + keyAfterTchOpcodes); - int var38 = var1.getOffset(); + int notesOnIndex = var1.getOffset(); var1.skip(noteOnOpcodes); - int var39 = var1.getOffset(); - var1.skip(var27); - int var40 = var1.getOffset(); + int otherIndex = var1.getOffset(); + var1.skip(otherSize); + int notesOffIndex = var1.getOffset(); var1.skip(noteOffOpcodes); - int var41 = var1.getOffset(); - var1.skip(var17); - int var42 = var1.getOffset(); - var1.skip(var19); - int var43 = var1.getOffset(); - var1.skip(var21); - int var44 = var1.getOffset(); + int modulationWheel2Offset = var1.getOffset(); + var1.skip(modulationWheel2Size); + int channelVolume2Offset = var1.getOffset(); + var1.skip(channelVolume2Size); + int pan2Offset = var1.getOffset(); + var1.skip(pan2Size); + int programChangeIndex = var1.getOffset(); var1.skip(progmChangeOpcodes); - int var45 = var1.getOffset(); + int pitchWheelLowIndex = var1.getOffset(); var1.skip(wheelChangeOpcodes); - int var46 = var1.getOffset(); - var1.skip(var22); - int var47 = var1.getOffset(); - var1.skip(var23); - int var48 = var1.getOffset(); - var1.skip(var24); - int var49 = var1.getOffset(); - var1.skip(var25); - int var50 = var1.getOffset(); + int nonRegisteredMsbIndex = var1.getOffset(); + var1.skip(nonRegisteredMsbSize); + int nonRegisteredLsbIndex = var1.getOffset(); + var1.skip(nonRegisteredLsbSize); + int registeredMsbIndex = var1.getOffset(); + var1.skip(registeredNumberMsb); + int registeredLsbIndex = var1.getOffset(); + var1.skip(registeredLsbSize); + int tempoOffset = var1.getOffset(); var1.skip(tempoOpcodes * 3); OutputStream var51 = new OutputStream(offset); - var51.writeInt(1297377380); // MThd header + var51.writeInt(MTHD_MAGIC); // MThd header var51.writeInt(6); // length of header var51.writeShort(tracks > 1 ? 1 : 0); // format var51.writeShort(tracks); // tracks var51.writeShort(division); // division var1.setOffset(var13); - int var52 = 0; + int channel = 0; int var53 = 0; int var54 = 0; int var55 = 0; @@ -261,193 +308,194 @@ public class TrackLoader int var57 = 0; int var58 = 0; int[] var59 = new int[128]; - var28 = 0; + controllerNumber = 0; label361: for (int var60 = 0; var60 < tracks; ++var60) { - var51.writeInt(1297379947); // MTrk + var51.writeInt(MTRK_MAGIC); // MTrk var51.skip(4); // length gets written here later int var61 = var51.getOffset(); int var62 = -1; while (true) { - int var63 = var1.readVarInt(); - var51.writeVarInt(var63); // delta time - int var64 = var1.getArray()[var29++] & 255; - boolean var65 = var64 != var62; - var62 = var64 & 15; - if (var64 == 7) + int deltaTick = var1.readVarInt(); + var51.writeVarInt(deltaTick); // delta time + int status = var1.getArray()[var29++] & 255; + boolean var65 = status != var62; + var62 = status & 15; + if (status == JAG_END_OF_TRACK) { //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.writeLengthFromMark(var51.getOffset() - var61); continue label361; } - if (var64 == 23) + if (status == JAG_TEMPO) { //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(var1.getArray()[var50++]); - var51.writeByte(var1.getArray()[var50++]); - var51.writeByte(var1.getArray()[var50++]); + var51.writeByte(var1.getArray()[tempoOffset++]); + var51.writeByte(var1.getArray()[tempoOffset++]); + var51.writeByte(var1.getArray()[tempoOffset++]); } else { - var52 ^= var64 >> 4; - if (var62 == 0) + channel ^= status >> 4; + if (var62 == JAG_NOTE_ON) { if (var65) { - var51.writeByte(144 + var52); + var51.writeByte(NOTE_ON + channel); } - var53 += var1.getArray()[var37++]; - var54 += var1.getArray()[var38++]; + var53 += var1.getArray()[notesIndex++]; + var54 += var1.getArray()[notesOnIndex++]; var51.writeByte(var53 & 127); var51.writeByte(var54 & 127); } - else if (var62 == 1) + else if (var62 == JAG_NOTE_OFF) { if (var65) { - var51.writeByte(128 + var52); + var51.writeByte(NOTE_OFF + channel); } - var53 += var1.getArray()[var37++]; - var55 += var1.getArray()[var40++]; + var53 += var1.getArray()[notesIndex++]; + var55 += var1.getArray()[notesOffIndex++]; var51.writeByte(var53 & 127); var51.writeByte(var55 & 127); } - else if (var62 == 2) + else if (var62 == JAG_CONTROL_CHANGE) { if (var65) { - var51.writeByte(176 + var52); + var51.writeByte(CONTROL_CHANGE + channel); } - var28 = var28 + var1.getArray()[var15++] & 127; - var51.writeByte(var28); + controllerNumber = controllerNumber + var1.getArray()[controlChangeIndex++] & 127; + var51.writeByte(controllerNumber); byte var66; - if (var28 != 0 && var28 != 32) + if (controllerNumber == CONTROLLER_BANK_SELECT || controllerNumber == CONTROLLER_BANK_SELECT_2) { - if (var28 == 1) - { - var66 = var1.getArray()[var34++]; - } - else if (var28 == 33) - { - var66 = var1.getArray()[var41++]; - } - else if (var28 == 7) - { - var66 = var1.getArray()[var35++]; - } - else if (var28 == 39) - { - var66 = var1.getArray()[var42++]; - } - else if (var28 == 10) - { - var66 = var1.getArray()[var36++]; - } - else if (var28 == 42) - { - var66 = var1.getArray()[var43++]; - } - else if (var28 == 99) - { - var66 = var1.getArray()[var46++]; - } - else if (var28 == 98) - { - var66 = var1.getArray()[var47++]; - } - else if (var28 == 101) - { - var66 = var1.getArray()[var48++]; - } - else if (var28 == 100) - { - var66 = var1.getArray()[var49++]; - } - else if (var28 != 64 && var28 != 65 && var28 != 120 && var28 != 121 && var28 != 123) - { - var66 = var1.getArray()[var39++]; - } - else - { - var66 = var1.getArray()[var30++]; - } + var66 = var1.getArray()[programChangeIndex++]; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL) + { + var66 = var1.getArray()[modulationWheelOffset++]; + } + else if (controllerNumber == CONTROLLER_MODULATION_WHEEL2) + { + var66 = var1.getArray()[modulationWheel2Offset++]; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME) + { + var66 = var1.getArray()[channelVolumeOffset++]; + } + else if (controllerNumber == CONTROLLER_CHANNEL_VOLUME_2) + { + var66 = var1.getArray()[channelVolume2Offset++]; + } + else if (controllerNumber == CONTROLLER_PAN) + { + var66 = var1.getArray()[panOffset++]; + } + else if (controllerNumber == CONTROLLER_PAN_2) + { + var66 = var1.getArray()[pan2Offset++]; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_MSB) + { + var66 = var1.getArray()[nonRegisteredMsbIndex++]; + } + else if (controllerNumber == CONTROLLER_NON_REGISTERED_PARAMETER_NUMBER_LSB) + { + var66 = var1.getArray()[nonRegisteredLsbIndex++]; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_MSB) + { + var66 = var1.getArray()[registeredMsbIndex++]; + } + else if (controllerNumber == CONTROLLER_REGISTERED_PARAMETER_NUMBER_LSB) + { + var66 = var1.getArray()[registeredLsbIndex++]; + } + else if (controllerNumber != CONTROLLER_DAMPER_PEDAL + && controllerNumber != CONTROLLER_PORTAMENTO + && controllerNumber != CONTROLLER_ALL_SOUND_OFF + && controllerNumber != CONTROLLER_RESET_ALL_CONTROLLERS + && controllerNumber != CONTROLLER_ALL_NOTES_OFF) + { + var66 = var1.getArray()[otherIndex++]; } else { - var66 = var1.getArray()[var44++]; + var66 = var1.getArray()[commandsIndex++]; } - int var67 = var66 + var59[var28]; - var59[var28] = var67; + int var67 = var66 + var59[controllerNumber]; + var59[controllerNumber] = var67; var51.writeByte(var67 & 127); } - else if (var62 == 3) + else if (var62 == JAG_PITCH_BEND) { if (var65) { - var51.writeByte(224 + var52); + var51.writeByte(PITCH_WHEEL_CHANGE + channel); } - var56 += var1.getArray()[var45++]; - var56 += var1.getArray()[var33++] << 7; + var56 += var1.getArray()[pitchWheelLowIndex++]; + var56 += var1.getArray()[pitchWheelHighIndex++] << 7; var51.writeByte(var56 & 127); var51.writeByte(var56 >> 7 & 127); } - else if (var62 == 4) + else if (var62 == JAG_CHANNEL_PRESSURE) { if (var65) { - var51.writeByte(208 + var52); + var51.writeByte(CHANNEL_PRESSURE + channel); } - var57 += var1.getArray()[var32++]; + var57 += var1.getArray()[channelPressureIndex++]; var51.writeByte(var57 & 127); } - else if (var62 == 5) + else if (var62 == JAG_POLY_PRESSURE) { if (var65) { - var51.writeByte(160 + var52); + var51.writeByte(POLYPHONIC_KEY_PRESSURE + channel); } - var53 += var1.getArray()[var37++]; - var58 += var1.getArray()[var31++]; + var53 += var1.getArray()[notesIndex++]; + var58 += var1.getArray()[polyPressureIndex++]; var51.writeByte(var53 & 127); var51.writeByte(var58 & 127); } - else + else if (var62 == JAG_PROGRAM_CHANGE) { - if (var62 != 6) - { - throw new RuntimeException(); - } 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(); } } }