X-Git-Url: https://ruin.nu/git/?p=moosique.git;a=blobdiff_plain;f=MooNote.java;h=d49495fcaafb3693144612b97c9d8e05c5fdb8cb;hp=edd815900705e538aafb1c68dcceb887ed4ac332;hb=c3a31c2aa833e2197f0929655c69a2090e8bbecc;hpb=1e06fcb34d222ef2017d4adf888568184dd63ab9 diff --git a/MooNote.java b/MooNote.java index edd8159..d49495f 100644 --- a/MooNote.java +++ b/MooNote.java @@ -1,84 +1,164 @@ import javax.sound.midi.*; /** - * Functional representation of a MIDI note, which contains two MIDI events, note on and note off. + * Functional representation of a MIDI note, which adds functionality to the existent MidiEvent class. + * Also provides a reference to the corresponding NoteOff event. * - * @author Andersson, Andreen, Lanneskog, Pehrson - * @version 1 + * @author Einar Pehrson */ -public class MooNote { +public class MooNote extends MidiEvent { - private MidiEvent noteOn, noteOff; + protected MidiEvent noteOffEvent; + protected ShortMessage noteOnMsg, noteOffMsg; /** - * Creates a MooNote of the given pitch, velocity and length in the current track. + * Creates a MooNote from the given NoteOn event in the current track. + * @param noteOnEvent the NoteOn event of the note */ - public MooNote (int pitch, int velocity, int length) { + public MooNote (MidiEvent noteOnEvent) { + super(noteOnEvent.getMessage(), noteOnEvent.getTick()); + noteOnMsg = (ShortMessage)getMessage(); + } + + /** + * Creates a MooNote from the given NoteOn event in the current track and creates a reference to + * the corresponding NoteOff event. + * @param noteOnEvent the NoteOn event of the note + * @param noteOffEvent the NoteOff event of the note + */ + public MooNote (MidiEvent noteOnEvent, MidiEvent noteOffEvent) { + super(noteOnEvent.getMessage(), noteOnEvent.getTick()); + this.noteOffEvent = noteOffEvent; + noteOnMsg = (ShortMessage)getMessage(); + noteOffMsg = (ShortMessage)noteOffEvent.getMessage(); + } + /** + * Creates a MooNote of the given pitch, velocity and duration in the current track. + * @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 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) {} + } + + /** + * Sets the channel of the current note. + * @param channel the channel of the note (1-16) + */ + 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()); + } catch (InvalidMidiDataException e) {} } /** * Sets the pitch of the current note. - + @param pitch the pitch of the note (0-127) + * @param pitch the pitch of the note (0-127) */ 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()); + } catch (InvalidMidiDataException e) {} } /** * Sets the velocity of the current note. - + @param vel the velocity of the note (0-127) + * @param vel the velocity of the note (0-127) */ 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()); + } catch (InvalidMidiDataException e) {} } /** - * Sets the length of the current note (or rather moves the note off event). - + @param n the length of the note in ticks (100 per beat) + * Sets the duration of the current note (or rather moves the note off event). + * @param n the duration of the note in ticks (96 per beat) */ - public void setLength(int ticks) { - + public void setDuration(int ticks) { + if (hasNoteOffEvent()) noteOffEvent.setTick(getTick() + ticks); } /** - * Returns the note on event of the current note. - * @return the note on MidiEvent + * Sets the timestamp of the current note. + * @param tick the timestamp of the note in ticks (96 per beat) */ - public MidiEvent getNoteOnEvent() { - + public void setTick(long tick) { + if (hasNoteOffEvent()) noteOffEvent.setTick(tick + getDuration()); + super.setTick(tick); } /** - * Returns the note off event of the current note. - * @return the note off MidiEvent + * Returns the channel of the current note. + * @return the channel of the note (1-16) */ - public MidiEvent getNoteOffEvent() { - + public int getChannel() { + return noteOnMsg.getChannel(); } /** * Returns the pitch of the current note. - * @return the pitch of the 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 + * @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() { + if (!hasNoteOffEvent()) return 0; + return (int)(noteOffEvent.getTick() - getTick()); } /** - * Returns the length of the current note. - * @return the length of the note + * Returns whether the NoteOff event was found. + * @return the note off MidiEvent */ - public int getLength() { + 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){ + track.add(this); + if (hasNoteOffEvent()) 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){ + track.remove(this); + if (hasNoteOffEvent()) track.remove(noteOffEvent); } }