]> ruin.nu Git - moosique.git/blobdiff - MooNote.java
Implemented editing functions - biggie!
[moosique.git] / MooNote.java
index 78e1564064161aac20851980d249eb97771efaf5..023de207da3aa053ffafff81f2febabe076ea996 100644 (file)
@@ -7,19 +7,10 @@ import javax.sound.midi.*;
  * @author  Einar Pehrson
  */
  
-public class MooNote extends MidiEvent {
+public class MooNote extends MidiEvent implements Cloneable {
 
-       protected MidiEvent noteOffEvent;
-       protected ShortMessage noteOnMsg, noteOffMsg;
-
-       /** 
-        * Creates a MooNote from the given NoteOn event in the current track.
-        * @param noteOnEvent   the NoteOn event of the note
-        */
-       public MooNote (MidiEvent noteOnEvent) {
-               super(noteOnEvent.getMessage(), noteOnEvent.getTick());
-               noteOnMsg = (ShortMessage)getMessage();
-       }
+       private MidiEvent noteOffEvent;
+       private ShortMessage noteOnMsg, noteOffMsg;
 
        /** 
         * Creates a MooNote from the given NoteOn event in the current track and creates a reference to
@@ -60,7 +51,7 @@ public class MooNote extends MidiEvent {
        public void setChannel(int channel) {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), (byte)channel, noteOnMsg.getData1(), noteOnMsg.getData2());
-                       if(hasNoteOffEvent()) noteOffMsg.setMessage(noteOffMsg.getCommand(), (byte)channel, noteOffMsg.getData1(), noteOffMsg.getData2());
+                       noteOffMsg.setMessage(noteOffMsg.getCommand(), (byte)channel, noteOffMsg.getData1(), noteOffMsg.getData2());
                } catch (InvalidMidiDataException e) {}
        }
 
@@ -71,18 +62,10 @@ public class MooNote extends MidiEvent {
        public void setPitch(int pitch) {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), noteOnMsg.getChannel(), (byte)pitch, noteOnMsg.getData2());
-                       if(hasNoteOffEvent()) noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), (byte)pitch, noteOffMsg.getData2());
+                       noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), (byte)pitch, noteOffMsg.getData2());
                } catch (InvalidMidiDataException e) {}
        }
 
-       /** 
-        * Transposes the current note the given number of halftones.
-        * @param halftones             the number of halftones to transpose - positive for up, negative for down
-        */
-       public void transpose(int halftones) {
-               setPitch(getPitch() + halftones);
-       }
-
        /** 
         * Sets the velocity of the current note.
         * @param vel   the velocity of the note (0-127)
@@ -90,7 +73,7 @@ public class MooNote extends MidiEvent {
        public void setVelocity(int vel) {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), noteOnMsg.getChannel(), noteOnMsg.getData1(), (byte)vel);
-                       if(hasNoteOffEvent()) noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), noteOffMsg.getData1(), noteOffMsg.getData2());
+                       noteOffMsg.setMessage(noteOffMsg.getCommand(), noteOffMsg.getChannel(), noteOffMsg.getData1(), noteOffMsg.getData2());
                } catch (InvalidMidiDataException e) {}
        }
 
@@ -99,7 +82,7 @@ public class MooNote extends MidiEvent {
         * @param n     the duration of the note in ticks (96 per beat)
         */
        public void setDuration(int ticks) {
-               if (hasNoteOffEvent()) noteOffEvent.setTick(getTick() + ticks);
+               noteOffEvent.setTick(getTick() + ticks);
        }
 
        /** 
@@ -107,10 +90,18 @@ public class MooNote extends MidiEvent {
         * @param tick  the timestamp of the note in ticks (96 per beat)
         */
        public void setTick(long tick) {
-               if (hasNoteOffEvent()) noteOffEvent.setTick(tick + getDuration());
+               noteOffEvent.setTick(tick + getDuration());
                super.setTick(tick);
        }
 
+       /** 
+        * Transposes the current note the given number of halftones.
+        * @param halftones     the number of halftones to transpose - positive for up, negative for down
+        */
+       public void transpose(int halftones) {
+               setPitch(getPitch() + halftones);
+       }
+
        /** 
         * Returns the channel of the current note.
         * @return the channel of the note (1-16)
@@ -140,33 +131,34 @@ public class MooNote extends MidiEvent {
         * @return the duration of the note (in ticks)
         */
        public int getDuration() {
-               if (!hasNoteOffEvent()) return 0;
                return (int)(noteOffEvent.getTick() - getTick());
        }
 
-       /** 
-        * Returns whether the NoteOff event was found.
-        * @return      the note off MidiEvent
-        */
-       public boolean hasNoteOffEvent() {
-               return noteOffEvent != null;
-       }
-
        /**
         * Adds this note (both noteOn and noteOffEvents) to a track.
         * @param track the track it'll be added to.
         */
-       public void addTo(Track track){
+       public void addTo(Track track) {
                track.add(this);
-               if (hasNoteOffEvent()) track.add(noteOffEvent);
+               track.add(noteOffEvent);
        }
        
        /**
         * Removes this note (both noteOn and noteOffEvents) from a track.
         * @param track the track it'll be removed from.
         */
-       public void removeFrom(Track track){
+       public void removeFrom(Track track) {
                track.remove(this);
-               if (hasNoteOffEvent()) track.remove(noteOffEvent);
+               track.remove(noteOffEvent);
+       }
+
+       /**
+        * Returns a clone of this note.
+        */
+       public Object clone() {
+               return new MooNote(
+                       new MidiEvent((ShortMessage)getMessage().clone(), getTick()), 
+                       new MidiEvent((ShortMessage)noteOffEvent.getMessage().clone(), noteOffEvent.getTick())
+               );
        }
 }