X-Git-Url: https://ruin.nu/git/?p=moosique.git;a=blobdiff_plain;f=MooNote.java;h=fbc0668a4381b2b64d24bec2ac2d7ea9a499f793;hp=826b4c3c16ba00326eb9e0ebe5c6e8ed908280d9;hb=aae2d0b4428236b4147f466b3858a34bb7ed174f;hpb=4e7d6f8b7dd7fbcef2282674b5442d78cf220489 diff --git a/MooNote.java b/MooNote.java index 826b4c3..fbc0668 100644 --- a/MooNote.java +++ b/MooNote.java @@ -1,94 +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 noteOnEvent, noteOffEvent; - private ShortMessage noteOnMsg, noteOffMsg; - private long noteOnTime, noteOffTime; + 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) { - // MidiEvent(MidiMessage message, long tick) - noteOnMsg = new ShortMessage(); - noteOffMsg = new ShortMessage(); - noteOnMsg.setMessage(ShortMessage.NOTE_ON, top.getChannel(), pitch, velocity); - noteOffMsg.setMessage(ShortMessage.NOTE_OFF, top.getChannel(), pitch, velocity); -// noteOnTime = ???; - noteOffTime = noteOnTime + length; - noteOnEvent = new MidiEvent(noteOnMsg, noteOnTime) - noteOffEvent = new MidiEvent(noteOffMsg, noteOffTime) + 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) {System.out.println("Invalid data!");} + } + + /** + * 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 length of the current note. - * @return the length of the note + /** + * Returns the duration of the current note. + * @return the duration of the note (in ticks) */ - public int getLength() { + 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){ + 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); } -} \ No newline at end of file +}