Merge branch 'dump-sfx' into 'master'

Add "dumpsfx" command to dump sound effects to wav files.

See merge request 2009scape/2009scape!301
This commit is contained in:
Ceikry 2021-10-15 11:18:01 +00:00
commit 697d136238
7 changed files with 81 additions and 50 deletions

View file

@ -21,7 +21,7 @@ public final class CacheIndex {
static CacheIndex skinsIndex;
static CacheIndex configurationsIndex;
static CacheIndex interfacesIndex;
static CacheIndex soundFXIndex;
public static CacheIndex soundFXIndex;
static CacheIndex landscapesIndex;
static CacheIndex modelsIndex;
static CacheIndex texturesIndex;

View file

@ -26,7 +26,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
PcmSound var4 = (PcmSound)this.aSound_2544;
int var5 = this.anInt3473 << 8;
int var6 = this.anInt3482 << 8;
int var7 = var4.aByteArray3030.length << 8;
int var7 = var4.samples.length << 8;
int var8 = var6 - var5;
if(var8 <= 0) {
this.anInt3479 = 0;
@ -57,7 +57,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.anInt3479 < 0) {
if(this.aBoolean3477) {
if(this.anInt3470 < 0) {
var9 = this.method436(var1, var2, var5, var3, var4.aByteArray3030[this.anInt3473]);
var9 = this.method436(var1, var2, var5, var3, var4.samples[this.anInt3473]);
if(this.anInt3474 >= var5) {
return;
}
@ -67,14 +67,14 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
while(true) {
var9 = this.method418(var1, var9, var6, var3, var4.aByteArray3030[this.anInt3482 - 1]);
var9 = this.method418(var1, var9, var6, var3, var4.samples[this.anInt3482 - 1]);
if(this.anInt3474 < var6) {
return;
}
this.anInt3474 = var6 + var6 - 1 - this.anInt3474;
this.anInt3470 = -this.anInt3470;
var9 = this.method436(var1, var9, var5, var3, var4.aByteArray3030[this.anInt3473]);
var9 = this.method436(var1, var9, var5, var3, var4.samples[this.anInt3473]);
if(this.anInt3474 >= var5) {
return;
}
@ -84,7 +84,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
} else if(this.anInt3470 < 0) {
while(true) {
var9 = this.method436(var1, var9, var5, var3, var4.aByteArray3030[this.anInt3482 - 1]);
var9 = this.method436(var1, var9, var5, var3, var4.samples[this.anInt3482 - 1]);
if(this.anInt3474 >= var5) {
return;
}
@ -93,7 +93,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
} else {
while(true) {
var9 = this.method418(var1, var9, var6, var3, var4.aByteArray3030[this.anInt3473]);
var9 = this.method418(var1, var9, var6, var3, var4.samples[this.anInt3473]);
if(this.anInt3474 < var6) {
return;
}
@ -106,7 +106,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.aBoolean3477) {
label134: {
if(this.anInt3470 < 0) {
var9 = this.method436(var1, var2, var5, var3, var4.aByteArray3030[this.anInt3473]);
var9 = this.method436(var1, var2, var5, var3, var4.samples[this.anInt3473]);
if(this.anInt3474 >= var5) {
return;
}
@ -119,7 +119,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
do {
var9 = this.method418(var1, var9, var6, var3, var4.aByteArray3030[this.anInt3482 - 1]);
var9 = this.method418(var1, var9, var6, var3, var4.samples[this.anInt3482 - 1]);
if(this.anInt3474 < var6) {
return;
}
@ -130,7 +130,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
break;
}
var9 = this.method436(var1, var9, var5, var3, var4.aByteArray3030[this.anInt3473]);
var9 = this.method436(var1, var9, var5, var3, var4.samples[this.anInt3473]);
if(this.anInt3474 >= var5) {
return;
}
@ -143,7 +143,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
int var10;
if(this.anInt3470 < 0) {
while(true) {
var9 = this.method436(var1, var9, var5, var3, var4.aByteArray3030[this.anInt3482 - 1]);
var9 = this.method436(var1, var9, var5, var3, var4.samples[this.anInt3482 - 1]);
if(this.anInt3474 >= var5) {
return;
}
@ -160,7 +160,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
} else {
while(true) {
var9 = this.method418(var1, var9, var6, var3, var4.aByteArray3030[this.anInt3473]);
var9 = this.method418(var1, var9, var6, var3, var4.samples[this.anInt3473]);
if(this.anInt3474 < var6) {
return;
}
@ -319,14 +319,14 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
this.anInt3480 += var2;
if(this.anInt3470 == 256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) {
var2 = method426(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this);
var2 = method426(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this);
} else {
var2 = method428(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this);
var2 = method428(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this);
}
} else if(AudioChannel.stereo) {
var2 = method421(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this, this.anInt3470, var5);
var2 = method421(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this, this.anInt3470, var5);
} else {
var2 = method422(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this, this.anInt3470, var5);
var2 = method422(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this, this.anInt3470, var5);
}
this.anInt3480 -= var2;
@ -343,17 +343,17 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.anInt3470 == 256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) {
return method420(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this);
return method420(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this);
}
return method424(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this);
return method424(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this);
}
if(AudioChannel.stereo) {
return method433(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this, this.anInt3470, var5);
return method433(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this, this.anInt3470, var5);
}
return method455(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this, this.anInt3470, var5);
return method455(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this, this.anInt3470, var5);
}
}
@ -365,9 +365,9 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
int var1 = this.anInt3476 * 3 >> 6;
var1 = (var1 ^ var1 >> 31) + (var1 >>> 31);
if(this.anInt3479 == 0) {
var1 -= var1 * this.anInt3474 / (((PcmSound)this.aSound_2544).aByteArray3030.length << 8);
var1 -= var1 * this.anInt3474 / (((PcmSound)this.aSound_2544).samples.length << 8);
} else if(this.anInt3479 >= 0) {
var1 -= var1 * this.anInt3473 / ((PcmSound)this.aSound_2544).aByteArray3030.length;
var1 -= var1 * this.anInt3473 / ((PcmSound)this.aSound_2544).samples.length;
}
return var1 > 255?255:var1;
@ -736,7 +736,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
PcmSound var2 = (PcmSound)this.aSound_2544;
int var3 = this.anInt3473 << 8;
int var4 = this.anInt3482 << 8;
int var5 = var2.aByteArray3030.length << 8;
int var5 = var2.samples.length << 8;
int var6 = var4 - var3;
if(var6 <= 0) {
this.anInt3479 = 0;
@ -898,7 +898,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
static Class3_Sub24_Sub1 method432(PcmSound var0, int var1, int var2, int var3) {
return var0.aByteArray3030 != null && var0.aByteArray3030.length != 0?new Class3_Sub24_Sub1(var0, var1, var2, var3):null;
return var0.samples != null && var0.samples.length != 0?new Class3_Sub24_Sub1(var0, var1, var2, var3):null;
}
final Class3_Sub24 method411() {
@ -947,7 +947,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
final synchronized void method434(int var1) {
int var2 = ((PcmSound)this.aSound_2544).aByteArray3030.length << 8;
int var2 = ((PcmSound)this.aSound_2544).samples.length << 8;
if(var1 < -1) {
var1 = -1;
}
@ -1033,14 +1033,14 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
this.anInt3480 += var2;
if(this.anInt3470 == -256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) {
var2 = method435(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this);
var2 = method435(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this);
} else {
var2 = method427(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this);
var2 = method427(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this);
}
} else if(AudioChannel.stereo) {
var2 = method440(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this, this.anInt3470, var5);
var2 = method440(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, this.anInt3475, this.anInt3483, var6, var3, this, this.anInt3470, var5);
} else {
var2 = method448(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this, this.anInt3470, var5);
var2 = method448(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, this.anInt3472, var6, var3, this, this.anInt3470, var5);
}
this.anInt3480 -= var2;
@ -1057,22 +1057,22 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.anInt3470 == -256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) {
return method447(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this);
return method447(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this);
}
return method446(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this);
return method446(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this);
}
if(AudioChannel.stereo) {
return method453(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this, this.anInt3470, var5);
return method453(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3484, this.anInt3481, var4, var3, this, this.anInt3470, var5);
}
return method423(((PcmSound)this.aSound_2544).aByteArray3030, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this, this.anInt3470, var5);
return method423(((PcmSound)this.aSound_2544).samples, var1, this.anInt3474, var2, this.anInt3476, var4, var3, this, this.anInt3470, var5);
}
}
static Class3_Sub24_Sub1 method437(PcmSound var0, int var2) {
return var0.aByteArray3030 != null && var0.aByteArray3030.length != 0?new Class3_Sub24_Sub1(var0, (int)((long)var0.anInt3034 * 256L * (long) 100 / (long)(100 * Class21.sampleRate)), var2 << 6):null;
return var0.samples != null && var0.samples.length != 0?new Class3_Sub24_Sub1(var0, (int)((long)var0.frequency * 256L * (long) 100 / (long)(100 * Class21.sampleRate)), var2 << 6):null;
}
final synchronized int method438() {
@ -1162,7 +1162,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
}
final boolean method444() {
return this.anInt3474 < 0 || this.anInt3474 >= ((PcmSound)this.aSound_2544).aByteArray3030.length << 8;
return this.anInt3474 < 0 || this.anInt3474 >= ((PcmSound)this.aSound_2544).samples.length << 8;
}
final boolean method445() {

View file

@ -1088,7 +1088,7 @@ final class Class3_Sub24_Sub4 extends Class3_Sub24 {
var3 += (int)((double)var5 * var7);
}
var5 = (int)(0.5D + (double)(256 * var2.aPcmSound_2509.anInt3034) * Math.pow(2.0D, (double)var3 * 3.255208333333333E-4D) / (double)Class21.sampleRate);
var5 = (int)(0.5D + (double)(256 * var2.aPcmSound_2509.frequency) * Math.pow(2.0D, (double)var3 * 3.255208333333333E-4D) / (double)Class21.sampleRate);
return var5 >= 1?var5:1;
} catch (RuntimeException var9) {
@ -1132,7 +1132,7 @@ final class Class3_Sub24_Sub4 extends Class3_Sub24 {
final void method501(Class3_Sub22 var1, boolean var2, byte var3) {
try {
int var4 = var1.aPcmSound_2509.aByteArray3030.length;
int var4 = var1.aPcmSound_2509.samples.length;
int var5;
if(var2 && var1.aPcmSound_2509.aBoolean3031) {
int var6 = var4 + (var4 - var1.aPcmSound_2509.anInt3033);

View file

@ -976,7 +976,7 @@ public final class Class83 {
var8 = var9.toPCMSound();
this.aHashTable_1159.put(var6, var8);
if (var1 != null) {
var1[0] -= var8.aByteArray3030.length;
var1[0] -= var8.samples.length;
}
return var8;

View file

@ -1,17 +1,17 @@
package org.runite.client;
final class PcmSound extends Sound {
public final class PcmSound extends Sound {
byte[] aByteArray3030;
public byte[] samples;
boolean aBoolean3031;
int anInt3032;
int anInt3033;
int anInt3034;
public int frequency;
final PcmSound method151(Class157 var1) {
this.aByteArray3030 = var1.method2173(this.aByteArray3030);
this.anInt3034 = var1.method2177(this.anInt3034);
this.samples = var1.method2173(this.samples);
this.frequency = var1.method2177(this.frequency);
if(this.anInt3033 == this.anInt3032) {
this.anInt3033 = this.anInt3032 = var1.method2178(this.anInt3033);
} else {
@ -26,15 +26,15 @@ final class PcmSound extends Sound {
}
PcmSound(byte[] var2, int var3, int var4) {
this.anInt3034 = 22050;
this.aByteArray3030 = var2;
this.frequency = 22050;
this.samples = var2;
this.anInt3033 = var3;
this.anInt3032 = var4;
}
PcmSound(int var1, byte[] var2, int var3, int var4, boolean var5) {
this.anInt3034 = var1;
this.aByteArray3030 = var2;
this.frequency = var1;
this.samples = var2;
this.anInt3033 = var3;
this.anInt3032 = var4;
this.aBoolean3031 = var5;

View file

@ -1,6 +1,6 @@
package org.runite.client;
final class SynthSound {
public final class SynthSound {
private final SynthInstrument[] synthInstruments = new SynthInstrument[10];
private int end;
@ -20,7 +20,7 @@ final class SynthSound {
this.end = buffer.readUnsignedShort();
}
static SynthSound create(CacheIndex var0, int var1, int var2) {
public static SynthSound create(CacheIndex var0, int var1, int var2) {
byte[] var3 = var0.getFile(var1, var2);
return var3 == null ? null : new SynthSound(new DataBuffer(var3));
}
@ -62,7 +62,7 @@ final class SynthSound {
}
}
final PcmSound toPCMSound() {
public final PcmSound toPCMSound() {
byte[] var1 = this.getSamples();
return new PcmSound(var1, 22050 * this.start / 1000, 22050 * this.end / 1000);
}

View file

@ -7,9 +7,16 @@ import org.rs09.client.rendering.RenderingUtils
import org.rs09.client.rendering.Toolkit
import org.runite.client.*
import java.awt.event.KeyEvent
import java.io.ByteArrayInputStream;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.text.SimpleDateFormat
import java.util.*
import java.util.LinkedList
import javax.sound.sampled.AudioFileFormat;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream
import javax.sound.sampled.AudioSystem;
// TODO Escape characters in the string rendering - is this something we can do using RSString / the text renders?
@ -286,6 +293,30 @@ object DeveloperConsole {
println("Error. Plays sound effect. Use: playsoundrange beginID endID delay")
}
}
"dumpsfx" -> {
if (argSize == 3) {
var beginID = if (clientCommand[1].toIntOrNull() == null) 0 else clientCommand[1].toInt()
var endID = if (clientCommand[2].toIntOrNull() == null) 0 else clientCommand[2].toInt()
Thread(object : Runnable {
override fun run() {
Files.createDirectories(FileSystems.getDefault().getPath("sfx"))
for (i in beginID..endID) {
val sfx = SynthSound.create(CacheIndex.soundFXIndex, i, 0).toPCMSound()
println("len of ${i}: ${sfx.samples.size}")
val out = Files.newOutputStream(FileSystems.getDefault().getPath("sfx", String.format("sfx_%05d.wav", i)))
val format = AudioFormat(AudioFormat.Encoding.PCM_SIGNED, sfx.frequency.toFloat(), 8, 1, 1, sfx.frequency.toFloat(), false)
AudioSystem.write(
AudioInputStream(ByteArrayInputStream(sfx.samples), format, sfx.samples.size.toLong()),
AudioFileFormat.Type.WAVE,
out)
out.close()
}
}
}).start()
} else {
println("Error. Dumps sound effects. Use: dumpsfx beginID endID")
}
}
"playsong" -> {
if (argSize in 2..8) {
if (clientCommand[1].toIntOrNull() == null) {