OSDN Git Service

リファクタリング
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / music / AbstractTrackSpec.java
1 package camidion.chordhelper.music;
2
3 import java.nio.charset.Charset;
4
5 import javax.sound.midi.InvalidMidiDataException;
6 import javax.sound.midi.MetaMessage;
7 import javax.sound.midi.MidiEvent;
8 import javax.sound.midi.Sequence;
9 import javax.sound.midi.SysexMessage;
10 import javax.sound.midi.Track;
11
12 /**
13  * MIDIトラックの仕様を表すクラス
14  */
15 public abstract class AbstractTrackSpec {
16         public String name = null;
17         Track track = null;
18         FirstTrackSpec firstTrackSpec = null;
19         Sequence sequence = null;
20         long minNoteTicks = 0;
21         int preMeasures = 2;
22         /**
23          * トラック名なしでMIDIトラック仕様を構築します。
24          */
25         public AbstractTrackSpec() { }
26         /**
27          * トラック名を指定してMIDIトラック仕様を構築します。
28          * @param name
29          */
30         public AbstractTrackSpec(String name) {
31                 this.name = name;
32         }
33         /**
34          * このオブジェクトの文字列表現としてトラック名を返します。
35          * トラック名がない場合はスーパークラスの toString() と同じです。
36          */
37         public String toString() {
38                 return name==null ? super.toString() : name;
39         }
40         /**
41          * トラックを生成して返します。
42          * @param seq MIDIシーケンス
43          * @param firstTrackSpec 最初のトラック仕様
44          * @return 生成したトラック
45          */
46         public Track createTrack( Sequence seq, FirstTrackSpec firstTrackSpec, Charset charset ) {
47                 this.firstTrackSpec = firstTrackSpec;
48                 track = (sequence = seq).createTrack();
49                 if( name != null ) addStringTo( 0x03, name, charset, 0 );
50                 minNoteTicks = (long)( seq.getResolution() >> 2 );
51                 return track;
52         }
53         /**
54          * メタイベントを追加します。
55          * @param type メタイベントのタイプ
56          * @param data メタイベントのデータ
57          * @param tickPos tick位置
58          * @return {@link Track#add(MidiEvent)} と同じ
59          */
60         public boolean addMetaEventTo( int type, byte data[], long tickPos  ) {
61                 MetaMessage metaMessage = new MetaMessage();
62                 try {
63                         metaMessage.setMessage( type, data, data.length );
64                 } catch( InvalidMidiDataException ex ) {
65                         ex.printStackTrace();
66                         return false;
67                 }
68                 return track.add(new MidiEvent(metaMessage, tickPos));
69         }
70         /**
71          * 文字列をメタイベントとして追加します。
72          * @param type メタイベントのタイプ
73          * @param str 追加する文字列
74          * @param tickPos tick位置
75          * @return {@link #addMetaEventTo(int, byte[], long)} と同じ
76          */
77         public boolean addStringTo( int type, String str, Charset charset, long tickPos ) {
78                 if( str == null ) str = "";
79                 return addMetaEventTo(type, str.getBytes(charset), tickPos);
80         }
81         public boolean addStringTo( int type, ChordProgression.ChordStroke cs, Charset charset ) {
82                 return addStringTo(type, cs.chord.toString(), charset, cs.tickRange.startTickPos);
83         }
84         public boolean addStringTo( int type, ChordProgression.Lyrics lyrics, Charset charset ) {
85                 return addStringTo(type, lyrics.text, charset, lyrics.startTickPos);
86         }
87         public boolean addEOT( long tickPos ) {
88                 return addMetaEventTo( 0x2F, new byte[0], tickPos );
89         }
90         public void setChordSymbolText(ChordProgression cp, Charset charset) {
91                 cp.setChordSymbolTextTo(this, charset);
92         }
93         public boolean addSysEx(byte[] data, long tickPos) {
94                 SysexMessage msg = new SysexMessage();
95                 try {
96                         msg.setMessage( SysexMessage.SYSTEM_EXCLUSIVE, data, data.length );
97                 } catch( InvalidMidiDataException ex ) {
98                         ex.printStackTrace();
99                         return false;
100                 }
101                 return track.add(new MidiEvent( msg, tickPos ));
102         }
103 }