1 package camidion.chordhelper.music;
3 import javax.sound.midi.InvalidMidiDataException;
4 import javax.sound.midi.MidiEvent;
5 import javax.sound.midi.MidiMessage;
6 import javax.sound.midi.Sequence;
7 import javax.sound.midi.ShortMessage;
8 import javax.sound.midi.Track;
10 // 一般のトラック(メロディ、ドラム共通)
12 public abstract class AbstractNoteTrackSpec extends AbstractTrackSpec {
13 public int midiChannel = -1;
14 public int programNumber = -1;
15 public int velocity = 64;
17 public AbstractNoteTrackSpec() {}
18 public AbstractNoteTrackSpec(int ch) {
21 public AbstractNoteTrackSpec(int ch, String name) {
25 public AbstractNoteTrackSpec(int ch, String name, int programNumber) {
27 this.programNumber = programNumber;
29 public AbstractNoteTrackSpec(int ch, String name, int programNumber, int velocity) {
30 this(ch,name,programNumber);
31 this.velocity = velocity;
33 public Track createTrack( Sequence seq, FirstTrackSpec firstTrackSpec ) {
34 Track track = super.createTrack( seq, firstTrackSpec );
35 if( programNumber >= 0 ) addProgram( programNumber, 0 );
38 public boolean addProgram( int program_no, long tickPos ) {
39 ShortMessage shortMsg;
41 (shortMsg = new ShortMessage()).setMessage(ShortMessage.PROGRAM_CHANGE, midiChannel, program_no, 0);
42 } catch( InvalidMidiDataException ex ) {
46 return track.add(new MidiEvent( (MidiMessage)shortMsg, tickPos ));
48 public boolean addNote(long startTickPos, long endTickPos, int noteNumber) {
49 return addNote(startTickPos, endTickPos, noteNumber, velocity);
51 public boolean addNote(long startTickPos, long endTickPos, int noteNumber, int velocity) {
52 ShortMessage short_msg;
54 (short_msg = new ShortMessage()).setMessage(ShortMessage.NOTE_ON, midiChannel, noteNumber, velocity);
55 } catch( InvalidMidiDataException ex ) {
59 if( ! track.add(new MidiEvent( (MidiMessage)short_msg, startTickPos )) ) return false;
61 (short_msg = new ShortMessage()).setMessage(ShortMessage.NOTE_OFF, midiChannel, noteNumber, velocity);
62 } catch( InvalidMidiDataException ex ) {
66 return track.add( new MidiEvent( (MidiMessage)short_msg, endTickPos ) );