1 package camidion.chordhelper.music;
3 import java.nio.charset.Charset;
5 import javax.sound.midi.Sequence;
6 import javax.sound.midi.Track;
10 public class FirstTrackSpec extends AbstractTrackSpec {
11 private static final byte DEFAULT_TEMPO_DATA[] = { 0x07, (byte)0xA1, 0x20 }; // 120[QPM]
12 private static final byte DEFAULT_TIMESIG_DATA[] = { 0x04, 0x02, 0x18, 0x08 }; // 4/4
13 byte tempoData[] = DEFAULT_TEMPO_DATA;
14 byte timesigData[] = DEFAULT_TIMESIG_DATA;
17 public FirstTrackSpec() { }
18 public FirstTrackSpec(String name) { this.name = name; }
19 public FirstTrackSpec(String name, byte[] tempoData, byte[] timesigData) {
21 if( tempoData != null ) this.tempoData = tempoData;
22 if( timesigData != null ) this.timesigData = timesigData;
24 public Track createTrack(Sequence seq, Charset charset) {
25 return createTrack(seq, charset, 0, 0);
27 public Track createTrack(Sequence seq, Charset charset, int startMeasurePos, int endMeasurePos) {
28 preMeasures = startMeasurePos - 1;
29 Track track = super.createTrack(seq, this, charset);
30 if( tempoData == null ) tempoData = DEFAULT_TEMPO_DATA;
31 addTempo(tempoData, 0);
32 if( timesigData == null ) timesigData = DEFAULT_TIMESIG_DATA;
33 addTimeSignature(timesigData, 0);
34 if( key != null ) addKeySignature( key, 0 );
35 ticksPerMeasure = (long)(( 4 * seq.getResolution() * timesigData[0] ) >> timesigData[1]);
36 addEOT( endMeasurePos * ticksPerMeasure );
39 public boolean addKeySignature( Key key, long tickPos ) {
40 return addMetaEventTo( 0x59, key.getBytes(), tickPos );
42 public boolean addTempo( byte data[], long tickPos ) {
43 return addMetaEventTo( 0x51, data, tickPos );
45 public boolean addTimeSignature( byte data[], long tickPos ) {
46 return addMetaEventTo( 0x58, data, tickPos );