OSDN Git Service

ba4b3b1690184afbf40c7c1a31ae13958d5c5d49
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / music / AbstractNoteTrackSpec.java
1 package camidion.chordhelper.music;
2
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;
9
10 // 一般のトラック(メロディ、ドラム共通)
11 //
12 public abstract class AbstractNoteTrackSpec extends AbstractTrackSpec {
13         public int midiChannel = -1;
14         public int programNumber = -1;
15         public int velocity = 64;
16
17         public AbstractNoteTrackSpec() {}
18         public AbstractNoteTrackSpec(int ch) {
19                 midiChannel = ch;
20         }
21         public AbstractNoteTrackSpec(int ch, String name) {
22                 midiChannel = ch;
23                 this.name = name;
24         }
25         public AbstractNoteTrackSpec(int ch, String name, int programNumber) {
26                 this(ch,name);
27                 this.programNumber = programNumber;
28         }
29         public AbstractNoteTrackSpec(int ch, String name, int programNumber, int velocity) {
30                 this(ch,name,programNumber);
31                 this.velocity = velocity;
32         }
33         public Track createTrack( Sequence seq, FirstTrackSpec firstTrackSpec ) {
34                 Track track = super.createTrack( seq, firstTrackSpec );
35                 if( programNumber >= 0 ) addProgram( programNumber, 0 );
36                 return track;
37         }
38         public boolean addProgram( int program_no, long tickPos ) {
39                 ShortMessage shortMsg;
40                 try {
41                         (shortMsg = new ShortMessage()).setMessage(ShortMessage.PROGRAM_CHANGE, midiChannel, program_no, 0);
42                 } catch( InvalidMidiDataException ex ) {
43                         ex.printStackTrace();
44                         return false;
45                 }
46                 return track.add(new MidiEvent( (MidiMessage)shortMsg, tickPos ));
47         }
48         public boolean addNote(long startTickPos, long endTickPos, int noteNumber) {
49                 return addNote(startTickPos, endTickPos, noteNumber, velocity);
50         }
51         public boolean addNote(long startTickPos, long endTickPos, int noteNumber, int velocity) {
52                 ShortMessage short_msg;
53                 try {
54                         (short_msg = new ShortMessage()).setMessage(ShortMessage.NOTE_ON, midiChannel, noteNumber, velocity);
55                 } catch( InvalidMidiDataException ex ) {
56                         ex.printStackTrace();
57                         return false;
58                 }
59                 if( ! track.add(new MidiEvent( (MidiMessage)short_msg, startTickPos )) ) return false;
60                 try {
61                         (short_msg = new ShortMessage()).setMessage(ShortMessage.NOTE_OFF, midiChannel, noteNumber, velocity);
62                 } catch( InvalidMidiDataException ex ) {
63                         ex.printStackTrace();
64                         return false;
65                 }
66                 return track.add( new MidiEvent( (MidiMessage)short_msg, endTickPos ) );
67         }
68 }