1 package camidion.chordhelper.music;
3 import java.nio.charset.Charset;
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;
15 public abstract class AbstractTrackSpec {
16 public String name = null;
18 FirstTrackSpec firstTrackSpec = null;
19 Sequence sequence = null;
20 long minNoteTicks = 0;
23 * トラック名なしでMIDIトラック仕様を構築します。
25 public AbstractTrackSpec() { }
27 * トラック名を指定してMIDIトラック仕様を構築します。
30 public AbstractTrackSpec(String name) {
34 * このオブジェクトの文字列表現としてトラック名を返します。
35 * トラック名がない場合はスーパークラスの toString() と同じです。
37 public String toString() {
38 return name==null ? super.toString() : name;
42 * @param seq MIDIシーケンス
43 * @param firstTrackSpec 最初のトラック仕様
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 );
55 * @param type メタイベントのタイプ
56 * @param data メタイベントのデータ
57 * @param tickPos tick位置
58 * @return {@link Track#add(MidiEvent)} と同じ
60 public boolean addMetaEventTo( int type, byte data[], long tickPos ) {
61 MetaMessage metaMessage = new MetaMessage();
63 metaMessage.setMessage( type, data, data.length );
64 } catch( InvalidMidiDataException ex ) {
68 return track.add(new MidiEvent(metaMessage, tickPos));
72 * @param type メタイベントのタイプ
74 * @param tickPos tick位置
75 * @return {@link #addMetaEventTo(int, byte[], long)} と同じ
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);
81 public boolean addStringTo( int type, ChordProgression.ChordStroke cs, Charset charset ) {
82 return addStringTo(type, cs.chord.toString(), charset, cs.tickRange.startTickPos);
84 public boolean addStringTo( int type, ChordProgression.Lyrics lyrics, Charset charset ) {
85 return addStringTo(type, lyrics.text, charset, lyrics.startTickPos);
87 public boolean addEOT( long tickPos ) {
88 return addMetaEventTo( 0x2F, new byte[0], tickPos );
90 public void setChordSymbolText(ChordProgression cp, Charset charset) {
91 cp.setChordSymbolTextTo(this, charset);
93 public boolean addSysEx(byte[] data, long tickPos) {
94 SysexMessage msg = new SysexMessage();
96 msg.setMessage( SysexMessage.SYSTEM_EXCLUSIVE, data, data.length );
97 } catch( InvalidMidiDataException ex ) {
101 return track.add(new MidiEvent( msg, tickPos ));