package com.xenoage.zong.android; import android.content.Context; import android.media.MediaPlayer; import android.net.Uri; import com.leff.midi.MidiFile; import com.xenoage.zong.android.io.midi.out.AndroidMidiSequenceWriter; import com.xenoage.zong.core.Score; import com.xenoage.zong.io.midi.out.MidiConverter; import com.xenoage.zong.io.midi.out.MidiSequence; import java.io.File; import java.io.IOException; import static com.xenoage.zong.io.midi.out.MidiConverter.Options.optionsForPlayback; /** * Midi playback of scores. * * @author Andreas Wenger */ public class MidiPlayer { private MediaPlayer mediaPlayer = null; /** * Opens the given {@link Score}. * An Android context must be given, that is needed to determine the directory * for the temporary MIDI file and to create the media player. */ public void open(Score score, Context context) { try { File outputFile = File.createTempFile("zong", ".mid", context.getCacheDir()); MidiSequence<MidiFile> sequence = MidiConverter.convertToSequence(score, optionsForPlayback, new AndroidMidiSequenceWriter()); sequence.getSequence().writeToFile(outputFile); stop(); mediaPlayer = MediaPlayer.create(context, Uri.fromFile(outputFile)); } catch (IOException e) { throw new RuntimeException(e); } } /** * Starts playback, if a file is loaded. */ public void start() { if (mediaPlayer != null) { //TODO: needs prepare() after stopping! /* try { mediaPlayer.prepare(); } catch (IOException e) { } */ mediaPlayer.start(); } } /** * Pauses playback, if a file is loaded. */ public void pause() { if (mediaPlayer != null) mediaPlayer.pause(); } /** * Stops playback, if a file is loaded. */ public void stop() { if (mediaPlayer != null) mediaPlayer.stop(); } }