From 8183d3bd4989dc30165b8f3a4656819ce086fbef Mon Sep 17 00:00:00 2001 From: Einar Pehrson Date: Thu, 15 May 2003 19:48:04 +0000 Subject: [PATCH] Fixed the file loading. Now the program finds ALL the notes. --- MooViewCounter.java | 11 +++--- Moosique.java | 90 ++++++++++++++++++++++++++++++++++++++------- 2 files changed, 81 insertions(+), 20 deletions(-) diff --git a/MooViewCounter.java b/MooViewCounter.java index dcbd00c..d5f8d6b 100644 --- a/MooViewCounter.java +++ b/MooViewCounter.java @@ -10,18 +10,17 @@ import java.awt.*; public class MooViewCounter extends JPanel { - private int timeSig1, timeSig2, measure, halfBeat, beat, halfNote; + private int measure, halfBeat, beat, halfNote; private static final int CELL_HEIGHT = 10; /** * Creates an musical ruler depending on the timesignature */ - public MooViewCounter (int ts1, int ts2) { - timeSig1 = ts1; - timeSig2 = ts2; - setBackground(Color.black); + public MooViewCounter (int timeSig1, int timeSig2) { + setBackground(Moosique.getGUI().bgColor); setPreferredSize(new Dimension(35, 200 * CELL_HEIGHT)); + switch (timeSig2) { case 16: measure = timeSig1; // 1/16 break; @@ -51,7 +50,7 @@ public class MooViewCounter extends JPanel { if (!(g instanceof Graphics2D)) return; Graphics2D g2 = (Graphics2D)g; - g2.setColor(Color.white); + g2.setColor(Color.black); for (int c = 0; c < 200; c++) { g2.drawLine(0, c * CELL_HEIGHT, 5, c * CELL_HEIGHT); // 1/16 g2.drawLine(0, c * CELL_HEIGHT * halfBeat, 10, c * CELL_HEIGHT * halfBeat); // 1/8 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 -- 2.39.2