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 skinsIndex;
static CacheIndex configurationsIndex; static CacheIndex configurationsIndex;
static CacheIndex interfacesIndex; static CacheIndex interfacesIndex;
static CacheIndex soundFXIndex; public static CacheIndex soundFXIndex;
static CacheIndex landscapesIndex; static CacheIndex landscapesIndex;
static CacheIndex modelsIndex; static CacheIndex modelsIndex;
static CacheIndex texturesIndex; static CacheIndex texturesIndex;

View file

@ -26,7 +26,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
PcmSound var4 = (PcmSound)this.aSound_2544; PcmSound var4 = (PcmSound)this.aSound_2544;
int var5 = this.anInt3473 << 8; int var5 = this.anInt3473 << 8;
int var6 = this.anInt3482 << 8; int var6 = this.anInt3482 << 8;
int var7 = var4.aByteArray3030.length << 8; int var7 = var4.samples.length << 8;
int var8 = var6 - var5; int var8 = var6 - var5;
if(var8 <= 0) { if(var8 <= 0) {
this.anInt3479 = 0; this.anInt3479 = 0;
@ -57,7 +57,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.anInt3479 < 0) { if(this.anInt3479 < 0) {
if(this.aBoolean3477) { if(this.aBoolean3477) {
if(this.anInt3470 < 0) { 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) { if(this.anInt3474 >= var5) {
return; return;
} }
@ -67,14 +67,14 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
while(true) { 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) { if(this.anInt3474 < var6) {
return; return;
} }
this.anInt3474 = var6 + var6 - 1 - this.anInt3474; this.anInt3474 = var6 + var6 - 1 - this.anInt3474;
this.anInt3470 = -this.anInt3470; 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) { if(this.anInt3474 >= var5) {
return; return;
} }
@ -84,7 +84,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
} else if(this.anInt3470 < 0) { } else if(this.anInt3470 < 0) {
while(true) { 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) { if(this.anInt3474 >= var5) {
return; return;
} }
@ -93,7 +93,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
} else { } else {
while(true) { 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) { if(this.anInt3474 < var6) {
return; return;
} }
@ -106,7 +106,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.aBoolean3477) { if(this.aBoolean3477) {
label134: { label134: {
if(this.anInt3470 < 0) { 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) { if(this.anInt3474 >= var5) {
return; return;
} }
@ -119,7 +119,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
do { 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) { if(this.anInt3474 < var6) {
return; return;
} }
@ -130,7 +130,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
break; 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) { if(this.anInt3474 >= var5) {
return; return;
} }
@ -143,7 +143,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
int var10; int var10;
if(this.anInt3470 < 0) { if(this.anInt3470 < 0) {
while(true) { 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) { if(this.anInt3474 >= var5) {
return; return;
} }
@ -160,7 +160,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
} else { } else {
while(true) { 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) { if(this.anInt3474 < var6) {
return; return;
} }
@ -319,14 +319,14 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
this.anInt3480 += var2; this.anInt3480 += var2;
if(this.anInt3470 == 256 && (this.anInt3474 & 0xFF) == 0) { if(this.anInt3470 == 256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) { 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 { } 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) { } 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 { } 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; this.anInt3480 -= var2;
@ -343,17 +343,17 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.anInt3470 == 256 && (this.anInt3474 & 0xFF) == 0) { if(this.anInt3470 == 256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) { 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) { 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; int var1 = this.anInt3476 * 3 >> 6;
var1 = (var1 ^ var1 >> 31) + (var1 >>> 31); var1 = (var1 ^ var1 >> 31) + (var1 >>> 31);
if(this.anInt3479 == 0) { 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) { } 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; return var1 > 255?255:var1;
@ -736,7 +736,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
PcmSound var2 = (PcmSound)this.aSound_2544; PcmSound var2 = (PcmSound)this.aSound_2544;
int var3 = this.anInt3473 << 8; int var3 = this.anInt3473 << 8;
int var4 = this.anInt3482 << 8; int var4 = this.anInt3482 << 8;
int var5 = var2.aByteArray3030.length << 8; int var5 = var2.samples.length << 8;
int var6 = var4 - var3; int var6 = var4 - var3;
if(var6 <= 0) { if(var6 <= 0) {
this.anInt3479 = 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) { 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() { final Class3_Sub24 method411() {
@ -947,7 +947,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
final synchronized void method434(int var1) { 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) { if(var1 < -1) {
var1 = -1; var1 = -1;
} }
@ -1033,14 +1033,14 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
this.anInt3480 += var2; this.anInt3480 += var2;
if(this.anInt3470 == -256 && (this.anInt3474 & 0xFF) == 0) { if(this.anInt3470 == -256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) { 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 { } 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) { } 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 { } 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; this.anInt3480 -= var2;
@ -1057,22 +1057,22 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
if(this.anInt3470 == -256 && (this.anInt3474 & 0xFF) == 0) { if(this.anInt3470 == -256 && (this.anInt3474 & 0xFF) == 0) {
if(AudioChannel.stereo) { 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) { 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) { 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() { final synchronized int method438() {
@ -1162,7 +1162,7 @@ final class Class3_Sub24_Sub1 extends Class3_Sub24 {
} }
final boolean method444() { 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() { final boolean method445() {

View file

@ -1088,7 +1088,7 @@ final class Class3_Sub24_Sub4 extends Class3_Sub24 {
var3 += (int)((double)var5 * var7); 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; return var5 >= 1?var5:1;
} catch (RuntimeException var9) { } 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) { final void method501(Class3_Sub22 var1, boolean var2, byte var3) {
try { try {
int var4 = var1.aPcmSound_2509.aByteArray3030.length; int var4 = var1.aPcmSound_2509.samples.length;
int var5; int var5;
if(var2 && var1.aPcmSound_2509.aBoolean3031) { if(var2 && var1.aPcmSound_2509.aBoolean3031) {
int var6 = var4 + (var4 - var1.aPcmSound_2509.anInt3033); int var6 = var4 + (var4 - var1.aPcmSound_2509.anInt3033);

View file

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

View file

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

View file

@ -1,6 +1,6 @@
package org.runite.client; package org.runite.client;
final class SynthSound { public final class SynthSound {
private final SynthInstrument[] synthInstruments = new SynthInstrument[10]; private final SynthInstrument[] synthInstruments = new SynthInstrument[10];
private int end; private int end;
@ -20,7 +20,7 @@ final class SynthSound {
this.end = buffer.readUnsignedShort(); 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); byte[] var3 = var0.getFile(var1, var2);
return var3 == null ? null : new SynthSound(new DataBuffer(var3)); 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(); byte[] var1 = this.getSamples();
return new PcmSound(var1, 22050 * this.start / 1000, 22050 * this.end / 1000); 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.rs09.client.rendering.Toolkit
import org.runite.client.* import org.runite.client.*
import java.awt.event.KeyEvent 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.text.SimpleDateFormat
import java.util.* import java.util.*
import java.util.LinkedList 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? // 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") 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" -> { "playsong" -> {
if (argSize in 2..8) { if (argSize in 2..8) {
if (clientCommand[1].toIntOrNull() == null) { if (clientCommand[1].toIntOrNull() == null) {