]> ruin.nu Git - moosique.git/blobdiff - Moosique.java
Fixed recording!!!
[moosique.git] / Moosique.java
index 8de399fc3f2f11c884a4cffd4a5facd4144a756c..9089a2fc7c722234f3f29fedf7f57b73f217297d 100644 (file)
@@ -22,7 +22,7 @@ public class Moosique {
        private static MidiChannel activeChannel;
        private static MidiEvent[] timeSignatures, tempoChanges;
 
-       private static ArrayList emptyTracks;
+       private static ArrayList copyBuffer, emptyTracks;
        private static Map trackMute = new HashMap();
        private static Map trackSolo = new HashMap();
        private static Thread player;
@@ -141,6 +141,14 @@ public class Moosique {
                return channels;
        }
 
+       /** 
+        * Returns the current copy buffer.
+        * @return the current copy buffer
+        */
+       public static ArrayList getCopyBuffer() {
+               return copyBuffer;
+       }
+
        /** 
         * Returns the current editing position of the sequencer.
         * @return the tick position
@@ -290,6 +298,14 @@ public class Moosique {
                activeChannel = channels[channel];
        }
 
+       /** 
+        * Sets the current copy buffer.
+        * @param the copy buffer
+        */
+       public static void setCopyBuffer(ArrayList buffer) {
+               copyBuffer = buffer;
+       }
+
        /** 
         * Sets whether empty tracks should be drawn
         * @param state         true if empty tracks should be drawn
@@ -466,10 +482,65 @@ public class Moosique {
                        emptyTracks = new ArrayList();
                        trackSolo = new HashMap();
                        trackMute = new HashMap();
+                       copyBuffer = new ArrayList();
                } catch (InvalidMidiDataException e) {}
                // Sends sequence to GUI.
                if (gui != null) gui.setSequence(seq);
        }
+       
+       /** 
+        * Wraps each NoteOn event in the track with its NoteOff event in a MooNote.
+        */
+       public static void convertTrack(Track track) {
+               // Searches the track for NoteOn and NoteOff events
+               ArrayList noteOns = new ArrayList(track.size() / 2);
+               ArrayList noteOffs = new ArrayList(track.size() / 2);
+               MidiEvent event;
+               for (int j = 0; j < track.size(); j++) {
+                       event = track.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();
+               if (noteOns.size() == 0) emptyTracks.add(track);
+               
+               // Sorts the note lists by tick position.
+               Comparator c = new MidiEventComparator();
+               Collections.sort(noteOns, c);
+               Collections.sort(noteOffs, c);
+
+               // Replaces each NoteOn event it with a MooNote containing a reference to the NoteOff event.
+               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;
+                               }
+                                       
+                       }
+                       track.remove(on);
+                       if (off != null) {
+                               track.add(new MooNote(on, off));
+                       } else {
+                               track.add(new MooNote(on, new MidiEvent((ShortMessage)on.getMessage().clone(), on.getTick() + 48)));
+                       }
+                       iOn.remove();
+               }
+       }
 
        /** 
         * Loads a MIDI sequence from the given file.
@@ -491,6 +562,7 @@ public class Moosique {
                emptyTracks = new ArrayList();
                trackMute = new HashMap();
                trackSolo = new HashMap();
+               copyBuffer = new ArrayList();
 
                // Searches track 0 for changes in tempo and time signature.
                MidiEvent event;
@@ -509,56 +581,9 @@ public class Moosique {
                // timeSignatures = ts.toArray(timeSignatures);
                // tempoChanges = tc.toArray(tempoChanges);
 
-               // Wraps each NoteOn event with its NoteOff event in a MooNote
-               ArrayList noteOns, noteOffs;
+               // Converts tracks.
                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();
-                       if (noteOns.size() == 0) emptyTracks.add(tracks[i]);
-                       
-                       // Sorts the note lists by tick position.
-                       Comparator c = new MidiEventComparator();
-                       Collections.sort(noteOns, c);
-                       Collections.sort(noteOffs, c);
-
-                       // Replaces each NoteOn event it with a MooNote containing a reference to the NoteOff event.
-                       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, new MidiEvent((ShortMessage)on.getMessage().clone(), on.getTick() + 48)));
-                               }
-                               iOn.remove();
-                       }
+                       convertTrack(tracks[i]);
                }
                // Sends sequence to GUI and sequencer, then returns
                if (gui != null) gui.setSequence(seq);