package com.xenoage.zong.android.io.midi.out; import static com.xenoage.utils.collections.CollectionUtils.alist; import static com.xenoage.zong.io.midi.out.MidiSequenceWriter.getMicrosecondsPerBeat; import java.util.ArrayList; import com.leff.midi.MidiFile; import com.leff.midi.MidiTrack; import com.leff.midi.event.MidiEvent; import com.leff.midi.event.NoteOff; import com.leff.midi.event.NoteOn; import com.leff.midi.event.ProgramChange; import com.leff.midi.event.meta.Tempo; import com.xenoage.zong.io.midi.out.MidiSequenceWriter; /** * Android implementation of a {@link MidiSequenceWriter}. * * @author Andreas Wenger */ public class AndroidMidiSequenceWriter extends MidiSequenceWriter<MidiFile> { private int resolutionPpq; private ArrayList<MidiTrack> tracks; @Override public void init(int tracksCount, int resolutionPpq) { this.resolutionPpq = resolutionPpq; //add tracks tracks = alist(tracksCount); for (int i = 0; i < tracksCount; i++) { tracks.add(new MidiTrack()); } } @Override public void writeNote(int track, int channel, long tick, int note, boolean on, int velocity) { MidiEvent event; if (on) event = new NoteOn(tick, channel, note, velocity); else event = new NoteOff(tick, channel, note, velocity); tracks.get(track).insertEvent(event); } @Override public void writeProgramChange(int track, int channel, long tick, int program) { MidiEvent event = new ProgramChange(tick, channel, program); tracks.get(track).insertEvent(event); } @Override public void writeVolumeChange(int track, int channel, long tick, float volume) { //TODO } @Override public void writePanChange(int track, int channel, long tick, float pan) { //TODO } @Override public void writeControlChange(int track, int channel, long tick, int data1, int data2) { //TODO } @Override public void writeTempoChange(int track, long tick, int bpm) { MidiEvent event = new Tempo(tick, 0, getMicrosecondsPerBeat(bpm)); tracks.get(track).insertEvent(event); } @Override public void writeShortMessage(int track, int channel, long tick, int command, int data1, int data2) { //TODO //ShortMessageEvent event = new ShortMessageEvent(tick, command, channel, data1, data2); //tracks.get(track).insertEvent(event); } @Override public void writeMetaMessage(int track, long tick, int type, byte[] data) { //TODO //MetaMessage event = new MetaMessage(tick, type, data); //tracks.get(track).insertEvent(event); } @Override public long getLength() { return getSequence().getLengthInTicks(); } @Override public long tickToMicrosecond(long tick) { return tick * 1000; //unsupported } @Override protected MidiFile getSequence() { return new MidiFile(resolutionPpq, tracks); } }