forked from chipmunkmc/chipmunkbot
Begin work on adding custom instruments
This commit is contained in:
parent
e90a964110
commit
183c79ca76
4 changed files with 66 additions and 29 deletions
|
@ -164,7 +164,7 @@ public class SongPlayer extends SessionAdapter {
|
||||||
|
|
||||||
final double floatingPitch = Math.pow(2, (note.pitch - 12) / 12.0);
|
final double floatingPitch = Math.pow(2, (note.pitch - 12) / 12.0);
|
||||||
|
|
||||||
client.core().run("execute as @a at @s run playsound minecraft:block.note_block." + note.instrument.name + " record @s ~ ~ ~ 1 " + floatingPitch);
|
client.core().run("execute as @a at @s run playsound " + note.instrument.sound + " record @s ~ ~ ~ 1 " + floatingPitch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,35 +1,48 @@
|
||||||
package land.chipmunk.chipmunkbot.song;
|
package land.chipmunk.chipmunkbot.song;
|
||||||
|
|
||||||
public enum Instrument {//{"harp", "basedrum", "snare", "hat", "bass", "flute", "bell", "guitar", "chime", "xylophone", "iron_xylophone", "cow_bell", "didgeridoo", "bit", "banjo", "pling"};
|
public class Instrument {
|
||||||
HARP(0, "harp", 54),
|
public static final Instrument HARP = new Instrument(0, "harp", 54);
|
||||||
BASEDRUM(1, "basedrum", 0),
|
public static final Instrument BASEDRUM = new Instrument(1, "basedrum", 0);
|
||||||
SNARE(2, "snare", 0),
|
public static final Instrument SNARE = new Instrument(2, "snare", 0);
|
||||||
HAT(3, "hat", 0),
|
public static final Instrument HAT = new Instrument(3, "hat", 0);
|
||||||
BASS(4, "bass", 30),
|
public static final Instrument BASS = new Instrument(4, "bass", 30);
|
||||||
FLUTE(5, "flute", 66),
|
public static final Instrument FLUTE = new Instrument(5, "flute", 66);
|
||||||
BELL(6, "bell", 78),
|
public static final Instrument BELL = new Instrument(6, "bell", 78);
|
||||||
GUITAR(7, "guitar", 42),
|
public static final Instrument GUITAR = new Instrument(7, "guitar", 42);
|
||||||
CHIME(8, "chime", 78),
|
public static final Instrument CHIME = new Instrument(8, "chime", 78);
|
||||||
XYLOPHONE(9, "xylophone", 78),
|
public static final Instrument XYLOPHONE = new Instrument(9, "xylophone", 78);
|
||||||
IRON_XYLOPHONE(10, "iron_xylophone", 54),
|
public static final Instrument IRON_XYLOPHONE = new Instrument(10, "iron_xylophone", 54);
|
||||||
COW_BELL(11, "cow_bell", 66),
|
public static final Instrument COW_BELL = new Instrument(11, "cow_bell", 66);
|
||||||
DIDGERIDOO(12, "didgeridoo", 30),
|
public static final Instrument DIDGERIDOO = new Instrument(12, "didgeridoo", 30);
|
||||||
BIT(13, "bit", 54),
|
public static final Instrument BIT = new Instrument(13, "bit", 54);
|
||||||
BANJO(14, "banjo", 54),
|
public static final Instrument BANJO = new Instrument(14, "banjo", 54);
|
||||||
PLING(15, "pling", 54);
|
public static final Instrument PLING = new Instrument(15, "pling", 54);
|
||||||
|
|
||||||
public final int id;
|
public final int id;
|
||||||
public final String name;
|
public final String name;
|
||||||
public final int offset;
|
public final int offset;
|
||||||
|
public final String sound;
|
||||||
|
|
||||||
Instrument (int id, String name, int offset) {
|
private Instrument (int id, String name, int offset, String sound) {
|
||||||
this.id = id;
|
this.id = id;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.offset = offset;
|
this.offset = offset;
|
||||||
|
this.sound = name;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Instrument[] values = values();
|
private Instrument (int id, String name, int offset) {
|
||||||
public static Instrument getInstrumentFromId (int instrumentId) {
|
this.id = id;
|
||||||
return values[instrumentId];
|
this.name = name;
|
||||||
|
this.offset = offset;
|
||||||
|
this.sound = "minecraft:block.note_block." + name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static Instrument of (String sound) {
|
||||||
|
return new Instrument(-1, null, 0, sound);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static Instrument[] values = {HARP, BASEDRUM, SNARE, HAT, BASS, FLUTE, BELL, GUITAR, CHIME, XYLOPHONE, IRON_XYLOPHONE, COW_BELL, DIDGERIDOO, BIT, BANJO, PLING};
|
||||||
|
public static Instrument fromId (int id) {
|
||||||
|
return values[id];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -149,7 +149,7 @@ public class MidiConverter {
|
||||||
if (percussionMap.containsKey(midiPitch)) {
|
if (percussionMap.containsKey(midiPitch)) {
|
||||||
int noteId = percussionMap.get(midiPitch);
|
int noteId = percussionMap.get(midiPitch);
|
||||||
int pitch = noteId % 25;
|
int pitch = noteId % 25;
|
||||||
Instrument instrument = Instrument.getInstrumentFromId(noteId / 25);
|
Instrument instrument = Instrument.fromId(noteId / 25);
|
||||||
long time = microTime / 1000L;
|
long time = microTime / 1000L;
|
||||||
|
|
||||||
return new Note(instrument, pitch, time);
|
return new Note(instrument, pitch, time);
|
||||||
|
|
|
@ -42,6 +42,13 @@ public class NBSConverter {
|
||||||
public byte stereo = 100;
|
public byte stereo = 100;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class NBSCustomInstrument {
|
||||||
|
public String name;
|
||||||
|
public String file;
|
||||||
|
public byte pitch = 0;
|
||||||
|
public boolean key = false;
|
||||||
|
}
|
||||||
|
|
||||||
public static Song getSongFromBytes(byte[] bytes, String fileName) throws IOException {
|
public static Song getSongFromBytes(byte[] bytes, String fileName) throws IOException {
|
||||||
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
ByteBuffer buffer = ByteBuffer.wrap(bytes);
|
||||||
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
buffer.order(ByteOrder.LITTLE_ENDIAN);
|
||||||
|
@ -128,6 +135,19 @@ public class NBSConverter {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ArrayList<NBSCustomInstrument> customInstruments = new ArrayList<>();
|
||||||
|
if (buffer.hasRemaining()) {
|
||||||
|
byte customInstrumentCount = buffer.get();
|
||||||
|
for (int i = 0; i < customInstrumentCount; i++) {
|
||||||
|
NBSCustomInstrument customInstrument = new NBSCustomInstrument();
|
||||||
|
customInstrument.name = getString(buffer, bytes.length);
|
||||||
|
customInstrument.file = getString(buffer, bytes.length);
|
||||||
|
customInstrument.pitch = buffer.get();
|
||||||
|
customInstrument.key = buffer.get() == 0 ? false : true;
|
||||||
|
customInstruments.add(customInstrument);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Song song = new Song(songName.trim().length() > 0 ? songName : fileName);
|
Song song = new Song(songName.trim().length() > 0 ? songName : fileName);
|
||||||
if (loop > 0) {
|
if (loop > 0) {
|
||||||
song.looping = true;
|
song.looping = true;
|
||||||
|
@ -136,14 +156,18 @@ public class NBSConverter {
|
||||||
}
|
}
|
||||||
for (NBSNote note : nbsNotes) {
|
for (NBSNote note : nbsNotes) {
|
||||||
Instrument instrument;
|
Instrument instrument;
|
||||||
|
int key = note.key;
|
||||||
if (note.instrument < instrumentIndex.length) {
|
if (note.instrument < instrumentIndex.length) {
|
||||||
instrument = instrumentIndex[note.instrument];
|
instrument = instrumentIndex[note.instrument];
|
||||||
}
|
} else {
|
||||||
else {
|
int index = note.instrument - instrumentIndex.length;
|
||||||
continue;
|
if (index >= customInstruments.size()) continue;
|
||||||
|
NBSCustomInstrument customInstrument = customInstruments.get(index);
|
||||||
|
instrument = Instrument.of(customInstrument.name);
|
||||||
|
key += customInstrument.pitch;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (note.key < 33 || note.key > 57) {
|
if (key < 33 || key > 57) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -152,7 +176,7 @@ public class NBSConverter {
|
||||||
layerVolume = nbsLayers.get(note.layer).volume;
|
layerVolume = nbsLayers.get(note.layer).volume;
|
||||||
}
|
}
|
||||||
|
|
||||||
int pitch = note.key-33;
|
int pitch = key-33;
|
||||||
song.add(new Note(instrument, pitch, getMilliTime(note.tick, tempo)));
|
song.add(new Note(instrument, pitch, getMilliTime(note.tick, tempo)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -161,7 +185,7 @@ public class NBSConverter {
|
||||||
return song;
|
return song;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String getString(ByteBuffer buffer, int maxSize) throws IOException {
|
private static String getString (ByteBuffer buffer, int maxSize) throws IOException {
|
||||||
int length = buffer.getInt();
|
int length = buffer.getInt();
|
||||||
if (length > maxSize) {
|
if (length > maxSize) {
|
||||||
throw new IOException("String is too large");
|
throw new IOException("String is too large");
|
||||||
|
|
Loading…
Reference in a new issue