]> ruin.nu Git - moosique.git/commitdiff
Fixed the file loading. Now the program finds ALL the notes.
authorEinar Pehrson <einarp@itstud.chalmers.se>
Thu, 15 May 2003 19:48:04 +0000 (19:48 +0000)
committerEinar Pehrson <einarp@itstud.chalmers.se>
Thu, 15 May 2003 19:48:04 +0000 (19:48 +0000)
MooViewCounter.java
Moosique.java

index dcbd00cc16ff3dc4ca5ede73cf2c8b455823c912..d5f8d6b49c088fac7b63c72564c4c3828f773616 100644 (file)
@@ -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
index c9ed3ae003931b43f74d9c7ad3e7609dd0ca5d0e..795772f46e9b04742b81fb4dffc72d65b3f43769 100644 (file)
@@ -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