package net.aufdemrand.denizen.utilities.midi;
import net.aufdemrand.denizen.objects.dEntity;
import net.aufdemrand.denizen.objects.dLocation;
import net.aufdemrand.denizen.utilities.debugging.dB;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiSystem;
import javax.sound.midi.MidiUnavailableException;
import javax.sound.midi.Receiver;
import javax.sound.midi.Sequencer;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* Utility for playing midi files for players to hear.
*
* @author authorblues, patched by mcmonkey
*/
public class MidiUtil {
public static Map<String, Receiver> receivers = new HashMap<String, Receiver>();
public static void startSequencer(File file, float tempo, NoteBlockReceiver receiver)
throws InvalidMidiDataException, IOException, MidiUnavailableException {
Sequencer sequencer = MidiSystem.getSequencer(false);
sequencer.setSequence(MidiSystem.getSequence(file));
sequencer.open();
receiver.setSequencer(sequencer);
// Set desired tempo
sequencer.setTempoFactor(tempo);
sequencer.getTransmitter().setReceiver(receiver);
sequencer.start();
}
public static NoteBlockReceiver playMidi(File file, float tempo, float volume, List<dEntity> entities) {
try {
NoteBlockReceiver receiver = new NoteBlockReceiver(entities, entities.get(0).getUUID().toString());
receiver.VOLUME_RANGE = volume;
// If there is already a midi file being played for one of the entities,
// stop playing it
for (dEntity entity : entities) {
stopMidi(entity.getUUID().toString());
}
receivers.put(entities.get(0).getUUID().toString(), receiver);
startSequencer(file, tempo, receiver);
return receiver;
}
catch (Exception e) {
dB.echoError(e);
return null;
}
}
public static NoteBlockReceiver playMidi(File file, float tempo, float volume, dLocation location) {
try {
NoteBlockReceiver receiver = new NoteBlockReceiver(location, location.identify());
receiver.VOLUME_RANGE = volume;
// If there is already a midi file being played for this location,
// stop playing it
stopMidi(location.identify());
receivers.put(location.identify(), receiver);
startSequencer(file, tempo, receiver);
return receiver;
}
catch (Exception e) {
dB.echoError(e);
return null;
}
}
public static void stopMidi(String object) {
if (receivers.containsKey(object)) {
receivers.get(object).close();
}
}
public static void stopMidi(List<dEntity> entities) {
for (dEntity entity : entities) {
stopMidi(entity.getUUID().toString());
}
}
}