1 package camidion.chordhelper.mididevice;
5 import javax.sound.midi.Sequencer;
6 import javax.swing.BoxLayout;
7 import javax.swing.JLabel;
8 import javax.swing.JPanel;
9 import javax.swing.event.ChangeEvent;
10 import javax.swing.event.ChangeListener;
12 import camidion.chordhelper.midieditor.SequenceTickIndex;
13 import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
18 public class SequencerMeasureView extends JPanel {
19 private MeasurePositionLabel measurePositionLabel;
20 private MeasureLengthLabel measureLengthLabel;
22 * シーケンサの現在の小節位置を表示するビューを構築します。
23 * @param model スライダー用の時間範囲データモデル
25 public SequencerMeasureView(MidiSequencerModel model) {
26 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
27 add(measurePositionLabel = new MeasurePositionLabel());
28 add(measureLengthLabel = new MeasureLengthLabel());
29 model.addChangeListener(new ChangeListener() {
31 public void stateChanged(ChangeEvent e) {
32 Object source = e.getSource();
33 if( ! (source instanceof MidiSequencerModel) ) return;
34 MidiSequencerModel model = (MidiSequencerModel)source;
35 Sequencer sequencer = model.getSequencer();
36 SequenceTrackListTableModel sequenceTableModel = model.getSequenceTrackListTableModel();
37 SequenceTickIndex tickIndex = (
38 sequenceTableModel == null ? null : sequenceTableModel.getSequenceTickIndex()
40 if( ! sequencer.isRunning() || sequencer.isRecording() ) {
41 // 停止中または録音中の場合、長さが変わることがあるので表示を更新
42 if( tickIndex == null ) {
43 measureLengthLabel.setMeasure(0);
46 long tickLength = sequencer.getTickLength();
47 int measureLength = tickIndex.tickToMeasure(tickLength);
48 measureLengthLabel.setMeasure(measureLength);
52 if( tickIndex == null ) {
53 measurePositionLabel.setMeasure(0, 0);
56 long tickPosition = sequencer.getTickPosition();
57 int measurePosition = tickIndex.tickToMeasure(tickPosition);
58 measurePositionLabel.setMeasure(measurePosition, tickIndex.lastBeat);
63 private static abstract class MeasureLabel extends JLabel {
64 protected int measure = -1;
65 public boolean setMeasure(int measure) {
66 if( this.measure == measure ) return false;
67 this.measure = measure;
71 private static class MeasurePositionLabel extends MeasureLabel {
72 protected int beat = 0;
73 public MeasurePositionLabel() {
74 setFont( getFont().deriveFont(getFont().getSize2D() + 4) );
75 setForeground( new Color(0x80,0x00,0x00) );
77 setToolTipText("Measure:beat position - 何小節目:何拍目");
79 public boolean setMeasure(int measure, int beat) {
80 if( ! super.setMeasure(measure) && this.beat == beat )
82 setText(String.format("%04d:%02d", measure+1, beat+1));
86 private static class MeasureLengthLabel extends MeasureLabel {
87 public MeasureLengthLabel() {
89 setToolTipText("Measure length - 小節の数");
91 public boolean setMeasure(int measure) {
92 if( ! super.setMeasure(measure) )
94 setText(String.format("/%04d", measure));