]> ruin.nu Git - moosique.git/blobdiff - MooNote.java
no message
[moosique.git] / MooNote.java
index d942de93a6e1e7c6dd455f153833bfbe73fa5e26..2a82b6d21b5ac48489aa1a5548f49f96152bb21e 100644 (file)
@@ -1,25 +1,16 @@
 import javax.sound.midi.*;
 
 /**
- * Functional representation of a MIDI note, which adds functionality to the existent MidiEvent class.
+ * Functional representation of a MIDI note, which adds functionality to the existing MidiEvent class.
  * Also provides a reference to the corresponding NoteOff event.
  * 
  * @author  Einar Pehrson
  */
  
-public class MooNote extends MidiEvent {
+public class MooNote extends MidiEvent implements Cloneable, Comparable {
 
-       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
@@ -36,22 +27,61 @@ public class MooNote extends MidiEvent {
 
        /** 
         * Creates a MooNote of the given pitch, velocity and duration in the current track.
-        * @param track         the track to which the MooNote was added
         * @param channel       the channel of the note (1-16)
         * @param pitch         the pitch of the note (0-127)
         * @param velocity      the velocity of the note (0-127)
         * @param timestamp     the timestamp of the note in ticks (96 per beat)
         * @param duration      the duration of the note in ticks (96 per beat)
         */
-       public MooNote (int track, int channel, int pitch, int velocity, long timestamp, int duration) {
+       public MooNote (int channel, int pitch, int velocity, long timestamp, int duration) {
                super(new ShortMessage(), timestamp);
                noteOffEvent = new MidiEvent(new ShortMessage(), timestamp + duration);
                noteOnMsg = (ShortMessage)getMessage();
                noteOffMsg = (ShortMessage)noteOffEvent.getMessage();
                try {
                        noteOnMsg.setMessage(ShortMessage.NOTE_ON, channel, pitch, velocity);
-                       noteOffMsg.setMessage(ShortMessage.NOTE_OFF, channel, pitch, 0);
-               } catch (InvalidMidiDataException e) {}
+                       noteOffMsg.setMessage(ShortMessage.NOTE_OFF, channel, pitch, 64);
+               } catch (InvalidMidiDataException e) {System.out.println("Invalid data!");}
+       }
+
+       /** 
+        * Returns the note off event of this note.
+        * @return the note off event
+        */
+       public MidiEvent getNoteOffEvent() {
+               return noteOffEvent;
+       }
+
+       /** 
+        * Returns the channel of the current note.
+        * @return the channel of the note (1-16)
+        */
+       public int getChannel() {
+               return noteOnMsg.getChannel();
+       }
+
+       /** 
+        * Returns the pitch of the current note.
+        * @return the pitch of the note (0-127)
+        */
+       public int getPitch() {
+               return noteOnMsg.getData1();
+       }
+
+       /** 
+        * Returns the velocity of the current note.
+        * @return the velocity of the note (0-127)
+        */
+       public int getVelocity() {
+               return noteOnMsg.getData2();
+       }
+
+       /** 
+        * Returns the duration of the current note.
+        * @return the duration of the note (in ticks)
+        */
+       public int getDuration() {
+               return (int)(noteOffEvent.getTick() - getTick());
        }
 
        /** 
@@ -62,8 +92,7 @@ public class MooNote extends MidiEvent {
                try {
                        noteOnMsg.setMessage(noteOnMsg.getCommand(), (byte)channel, noteOnMsg.getData1(), noteOnMsg.getData2());
                        noteOffMsg.setMessage(noteOffMsg.getCommand(), (byte)channel, noteOffMsg.getData1(), noteOffMsg.getData2());
-               } catch (Exception e) {}
-               //} catch (InvalidMidiDataException e) {}
+               } catch (InvalidMidiDataException e) {}
        }
 
        /** 
@@ -93,7 +122,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);
        }
 
        /** 
@@ -101,48 +130,53 @@ 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);
        }
 
        /** 
-        * Returns the channel of the current note.
-        * @return the channel of the note (1-16)
+        * Transposes the current note the given number of halftones.
+        * @param halftones     the number of halftones to transpose - positive for up, negative for down
         */
-       public int getChannel() {
-               return noteOnMsg.getChannel();
+       public void transpose(int halftones) {
+               setPitch(getPitch() + halftones);
        }
 
-       /** 
-        * Returns the pitch of the current note.
-        * @return the pitch of the note (0-127)
+       /**
+        * Adds this note (both noteOn and noteOffEvents) to a track.
+        * @param track the track it'll be added to.
         */
-       public int getPitch() {
-               return noteOnMsg.getData1();
+       public void addTo(Track track) {
+               track.add(this);
+               track.add(noteOffEvent);
        }
-
-       /** 
-        * Returns the velocity of the current note.
-        * @return the velocity of the note (0-127)
+       
+       /**
+        * Removes this note (both noteOn and noteOffEvents) from a track.
+        * @param track the track it'll be removed from.
         */
-       public int getVelocity() {
-               return noteOnMsg.getData2();
+       public void removeFrom(Track track) {
+               track.remove(this);
+               track.remove(noteOffEvent);
        }
 
-       /** 
-        * Returns the duration of the current note.
-        * @return the duration of the note (in ticks)
+       /**
+        * Returns a clone of this note.
         */
-       public int getDuration() {
-               if (!hasNoteOffEvent()) return 0;
-               return (int)(noteOffEvent.getTick() - getTick());
+       public Object clone() {
+               return new MooNote(
+                       new MidiEvent((ShortMessage)getMessage().clone(), getTick()), 
+                       new MidiEvent((ShortMessage)noteOffEvent.getMessage().clone(), noteOffEvent.getTick())
+               );
        }
 
        /** 
-        * Returns whether the NoteOff event was found.
-        * @return      the note off MidiEvent
+        * Compares this note to another note.
+        * @return a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object
         */
-       public boolean hasNoteOffEvent() {
-               return noteOffEvent != null;
+       public int compareTo(Object o) {
+               int diff = (int)(getTick() - ((MidiEvent)o).getTick());
+               if (diff != 0) return diff;
+               return (noteOnMsg.getData1() - ((ShortMessage)((MidiEvent)o).getMessage()).getData1());
        }
 }