package com.xenoage.zong.desktop.io.midi.out; import com.xenoage.utils.document.io.FileOutput; import com.xenoage.utils.io.OutputStream; import com.xenoage.utils.jse.io.JseOutputStream; import com.xenoage.zong.core.Score; import com.xenoage.zong.io.midi.out.MidiConverter; import javax.sound.midi.MidiSystem; import javax.sound.midi.Sequence; import java.io.IOException; import static com.xenoage.zong.io.midi.out.MidiConverter.Options.optionsForFileExport; /** * This class writes a MIDI file from a given {@link Score}. * * @author Andreas Wenger * @author Uli Teschemacher */ public class MidiScoreFileOutput extends FileOutput<Score> { //ANDROID: using android-midi-lib //MidiFile midi = MidiConverterAndroid.convertToMidiFile(score, false, false); //midi.writeToFile(new File(filePath)); @Override public void write(Score score, int fileIndex, OutputStream stream) throws IOException { writeMidi(score, stream); } /** * Writes the given score as a MIDI file into the given stream. */ public static void writeMidi(Score score, OutputStream stream) throws IOException { Sequence sequence = MidiConverter.convertToSequence(score, optionsForFileExport, new JseMidiSequenceWriter()).getSequence(); int type = MidiScoreFileOutput.getPreferredMidiType(sequence); MidiSystem.write(sequence, type, new JseOutputStream(stream)); } /** * Gets the preferred MIDI type. This is a "Standard-MIDI-File Type 1" file. */ public static int getPreferredMidiType(Sequence sequence) { int[] types = MidiSystem.getMidiFileTypes(sequence); int type = 0; if (types.length != 0) { type = types[types.length - 1]; } return type; } }