package org.deeplearning4j.examples.recurrent.character.melodl4j;
import javax.sound.midi.InvalidMidiDataException;
import javax.sound.midi.MidiEvent;
import javax.sound.midi.MidiMessage;
import javax.sound.midi.ShortMessage;
import javax.sound.midi.Track;
public class Note extends NoteOrInstrumentChange {
private final int rawNote; // midi note value
private final int velocity;
private final int channel;
int indexInNoteSequence;
private long durationInTicks; // set later
public Note(long startTick,int rawNote, int velocity, int channel) {
this.startTick=startTick;
this.rawNote=rawNote;
this.velocity=velocity;
this.channel=channel;
}
public int getRawNote() {
return rawNote;
}
public int getKey() {
return rawNote%12;
}
public void setDuration(long durationInTicks) {
this.durationInTicks=durationInTicks;
}
public int getOctave() {
return rawNote/12 -1;
}
public int getChannel() {
return channel;
}
public int getVelocity() {
return velocity;
}
public int interval(Note other) {
return getRawNote()-other.getRawNote();
}
public long endTick() {
return startTick+durationInTicks;
}
@Override
public String toString() {
long endTick = startTick + durationInTicks;
return "Note[startTick: " + startTick + ", endTick = " + endTick + ", duration: " + durationInTicks
+ ", rawNote:" + rawNote
+ ", note: " + getKey() + ", octave: " + getOctave() + ", channel: " + channel + ", velocity: " + velocity + "] ";
}
public long getDuration() {
return durationInTicks;
}
@Override
public void addMidiEvents(Track track) throws InvalidMidiDataException {
MidiMessage midiMessageStart=new ShortMessage(ShortMessage.NOTE_ON,channel,rawNote,velocity);
track.add(new MidiEvent(midiMessageStart,startTick));
MidiMessage midiMessageEnd=new ShortMessage(ShortMessage.NOTE_OFF,channel,rawNote,0);
track.add(new MidiEvent(midiMessageEnd,startTick+durationInTicks));
}
public long getEndTick() {
return startTick+durationInTicks;
}
}