MfiContext mfiContext = new MfiContext();
mfiContext.setType(fileType);
mfiContext.setMidiSequence(midiSequence);
for (int i = 0; i < mfiContext.getSequenceSize(); i++) {
MidiEvent midiEvent = mfiContext.getMidiEvent(i);
MidiMessage midiMessage = midiEvent.getMessage();
Track[] mfiTracks = mfiSequence.getTracks();
int maxTracks = mfiTracks.length;
String key = null;
int mfiTrackNumber = 0;
//
if (midiMessage instanceof ShortMessage) {
ShortMessage shortMessage = (ShortMessage) midiMessage;
int channel = shortMessage.getChannel();
int command = shortMessage.getCommand();
int data1 = shortMessage.getData1();
// int data2 = shortMessage.getData2();
mfiTrackNumber = mfiContext.retrieveMfiTrack(channel);
if (!mfiContext.isTrackUsed(mfiTrackNumber) &&
maxTracks <= mfiTrackNumber) {
for (int j = maxTracks; j <= mfiTrackNumber; j++) {
mfiSequence.createTrack();
Debug.println(">>>> create MFi track: " + j);
mfiTracks = mfiSequence.getTracks();
maxTracks = mfiTracks.length;
}
}
mfiContext.setTrackUsed(mfiTrackNumber, true);
// 0xc_ program change
// 0xb_ 1: modulation depth
// 0xb_ 7: volume
// 0xb0 100, 101, 6: rpn H, rpn L, data entry
// 0xe_ pitch bend
// 0xb0 10: panpot
if ((command & 0xf0) == 0xb0) {
key = "midi.short." + (command & 0xf0) + "." + data1;
} else {
key = "midi.short." + (command & 0xf0);
}
} else if (midiMessage instanceof SysexMessage) {
SysexMessage sysexMessage = (SysexMessage) midiMessage;
byte[] data = sysexMessage.getData();
// GM system on
// master volume
if (maxTracks == 0) {
mfiSequence.createTrack();
Debug.println("create MFi track: 0");
mfiTracks = mfiSequence.getTracks();
maxTracks = mfiTracks.length;
}
mfiContext.setTrackUsed(0, true);
mfiTrackNumber = 0;
key = "midi.sysex." + data[0];
} else if (midiMessage instanceof MetaMessage) {
// 1 -> ProtInfo
// 2 -> CopyInfo
// 3 -> TitlInfo
// 0x51 tempo
MetaMessage metaMessage = (MetaMessage) midiMessage;
int meta = metaMessage.getType();
// byte[] data = metaMessage.getData();
if (maxTracks == 0) {
mfiSequence.createTrack();
Debug.println("create MFi track: 0");
mfiTracks = mfiSequence.getTracks();
maxTracks = mfiTracks.length;
}
mfiContext.setTrackUsed(0, true);
mfiTrackNumber = 0;
key = "midi.meta." + meta;
}
// convert
MfiConvertible converter = MfiConvertibleFactory.getConverter(key);
if (converter instanceof EndOfTrackMessage) { // TODO
// converted
MfiEvent[] mfiEvents = converter.getMfiEvents(midiEvent, mfiContext);
for (int t = 0; t < mfiEvents.length && t < maxTracks; t++) {
if (mfiEvents[t] != null) {
if (!mfiContext.isEofSet(t)) {
MfiEvent[] nops = mfiContext.getIntervalMfiEvents(t);
if (nops != null) {
for (int j = 0; j < nops.length; j++) {
mfiTracks[t].add(nops[j]);
}
}
mfiTracks[t].add(mfiEvents[t]);
mfiContext.setEofSet(t, true);
} else {
//Debug.println("EOF already set[" + t + "]");
}
} else {
Debug.println("message is null[" + mfiTracks[t].size() + "]: " + midiMessage);
}
}
} else if (converter != null) {
// interval
MfiEvent[] mfiEvents = mfiContext.getIntervalMfiEvents(mfiTrackNumber);
if (mfiEvents != null) {
for (int j = 0; j < mfiEvents.length; j++) {
if (mfiEvents[j] == null) {
Debug.println(Level.WARNING, "NOP is null[" + mfiTracks[mfiTrackNumber].size() + "]: " + MidiUtil.paramString(midiMessage));
}
addEventToTrack(mfiContext, midiEvent.getTick(), mfiTracks[mfiTrackNumber], mfiTrackNumber, mfiEvents[j]);
}
}
// converted
mfiEvents = converter.getMfiEvents(midiEvent, mfiContext);
if (mfiEvents != null) {
for (int j = 0; j < mfiEvents.length; j++) {
if (mfiEvents[j] == null) {
Debug.println(Level.WARNING, "event is null[" + mfiTracks[mfiTrackNumber].size() + ", " + mfiEvents.length + "]: " + converter.getClass() + ", " + MidiUtil.paramString(midiMessage));
}
addEventToTrack(mfiContext, midiEvent.getTick(), mfiTracks[mfiTrackNumber], mfiTrackNumber, mfiEvents[j]);
}
}
} else {
//Debug.println("not convertible: " + key);
}