X-Git-Url: https://ruin.nu/git/?p=moosique.git;a=blobdiff_plain;f=Moosique.java;h=795772f46e9b04742b81fb4dffc72d65b3f43769;hp=c9ed3ae003931b43f74d9c7ad3e7609dd0ca5d0e;hb=8183d3bd4989dc30165b8f3a4656819ce086fbef;hpb=2875ce498e9bf83ed635156599dd29a3c3b379de diff --git a/Moosique.java b/Moosique.java index c9ed3ae..795772f 100644 --- a/Moosique.java +++ b/Moosique.java @@ -19,8 +19,7 @@ public class Moosique { private static Synthesizer synthesizer; private static MidiChannel[] channels; private static MidiChannel activeChannel; - private static MetaMessage timeSigMsg; - private static MetaMessage[] tempoChgMsgs; + private static MidiEvent[] timeSignatures, tempoChanges; private static String filename, fileArg; private static long editPosition; @@ -319,27 +318,90 @@ public class Moosique { Track[] tracks = seq.getTracks(); - // Stores tempo and time signature. - MidiMessage msg; + // Searches track 0 for changes in tempo and time signature. + MidiEvent event; MetaMessage metaMsg; + ArrayList ts = new ArrayList(), tc = new ArrayList(); for (int i = 0; i < tracks[0].size(); i++) { - msg = tracks[0].get(i).getMessage(); - if (msg.getStatus() == MetaMessage.META) { - metaMsg = (MetaMessage)msg; - if (metaMsg.getType() == 81) { -// FLERA!!! tempoMsg = metaMsg; - } else if (metaMsg.getType() == 88) { - timeSigMsg = (MetaMessage)msg; + event = tracks[0].get(i); + if (event.getMessage().getStatus() == MetaMessage.META) { + metaMsg = (MetaMessage)event.getMessage(); + switch(metaMsg.getType()) { + case 81: tc.add(event); break; + case 88: ts.add(event); } + } + } +// timeSignatures = ts.toArray(timeSignatures); +// tempoChanges = tc.toArray(tempoChanges); + // Wraps each NoteOn event with its NoteOff event in a MooNote + ArrayList noteOns, noteOffs; + for (int i = 0; i < tracks.length; i++) { + // Searches the sequence for NoteOn and NoteOff events + noteOns = new ArrayList(tracks[i].size() / 2); + noteOffs = new ArrayList(tracks[i].size() / 2); + for (int j = 0; j < tracks[i].size(); j++) { + event = tracks[i].get(j); + if (event.getMessage().getStatus() >= 144 && + event.getMessage().getStatus() < 160) noteOns.add(event); + if (event.getMessage().getStatus() >= 128 && + event.getMessage().getStatus() < 144) noteOffs.add(event); + } + noteOns.trimToSize(); + noteOffs.trimToSize(); + + // Sorts the note lists by tick position. + Comparator c = new Comparator() { + public int compare(Object o1, Object o2) { + return (int)(((MidiEvent)o1).getTick() - ((MidiEvent)o2).getTick()); + } + }; + Collections.sort(noteOns, c); + Collections.sort(noteOffs, c); + + // For each NoteOn event, finds its NoteOff event and replaces it with a MooNote. + Iterator iOn = noteOns.iterator(), iOff; + MidiEvent on, off = null, nextOff; + ShortMessage onMsg, nextOffMsg; + while(iOn.hasNext()) { + on = (MidiEvent)iOn.next(); + onMsg = (ShortMessage)on.getMessage(); + iOff = noteOffs.iterator(); + while(iOff.hasNext()) { + nextOff = (MidiEvent)iOff.next(); + nextOffMsg = (ShortMessage)nextOff.getMessage(); + if(onMsg.getChannel() == nextOffMsg.getChannel() && + onMsg.getData1() == nextOffMsg.getData1() && + c.compare(nextOff, on) > 0) { + off = nextOff; + iOff.remove(); + break; + } + + } + tracks[i].remove(on); + if (off != null) { + tracks[i].add(new MooNote(on, off)); + } else { + tracks[i].add(new MooNote(on)); + } + iOn.remove(); } } + /* + Collections.sort(track[i].events, new Comparator() { + public int compare(Object o1, Object o2) { + return ((MidiEvent)o2).getTick() - ((MidiEvent)o1).getTick(); + } + }); + // Searches the sequence for NoteOn events MidiEvent noteOn, noteOff = null, nextEvent; MidiMessage nextMsg; ShortMessage shortMsg; - ArrayList noteOns, noteOffs; + for (int i = 0; i < tracks.length; i++) { for (int j = 0; j < tracks[i].size(); j++) { noteOn = tracks[i].get(j); @@ -366,7 +428,7 @@ public class Moosique { } } } - +*/ // Sends sequence to GUI and sequencer, then returns if (gui != null) gui.setSequence(seq); try { @@ -402,4 +464,4 @@ public class Moosique { if (synthesizer.isOpen()) synthesizer.close(); System.exit(0); } -} +} \ No newline at end of file