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 implements ChangeListener {
19 private SequencerMeasureView.MeasurePositionLabel measurePositionLabel;
20 private SequencerMeasureView.MeasureLengthLabel measureLengthLabel;
21 private MidiSequencerModel model;
23 * シーケンサの現在の小節位置を表示するビューを構築します。
24 * @param model スライダー用の時間範囲データモデル
26 public SequencerMeasureView(MidiSequencerModel model) {
27 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
28 add(measurePositionLabel = new MeasurePositionLabel());
29 add(measureLengthLabel = new MeasureLengthLabel());
30 (this.model = model).addChangeListener(this);
33 public void stateChanged(ChangeEvent e) {
34 Sequencer sequencer = model.getSequencer();
35 SequenceTrackListTableModel sequenceTableModel = model.getSequenceTrackListTableModel();
36 SequenceTickIndex tickIndex = (
37 sequenceTableModel == null ? null : sequenceTableModel.getSequenceTickIndex()
39 if( ! sequencer.isRunning() || sequencer.isRecording() ) {
40 // 停止中または録音中の場合、長さが変わることがあるので表示を更新
41 if( tickIndex == null ) {
42 measureLengthLabel.setMeasure(0);
45 long tickLength = sequencer.getTickLength();
46 int measureLength = tickIndex.tickToMeasure(tickLength);
47 measureLengthLabel.setMeasure(measureLength);
51 if( tickIndex == null ) {
52 measurePositionLabel.setMeasure(0, 0);
55 long tickPosition = sequencer.getTickPosition();
56 int measurePosition = tickIndex.tickToMeasure(tickPosition);
57 measurePositionLabel.setMeasure(measurePosition, tickIndex.lastBeat);
60 private static abstract class MeasureLabel extends JLabel {
61 protected int measure = -1;
62 public boolean setMeasure(int measure) {
63 if( this.measure == measure ) return false;
64 this.measure = measure;
68 private static class MeasurePositionLabel extends SequencerMeasureView.MeasureLabel {
69 protected int beat = 0;
70 public MeasurePositionLabel() {
71 setFont( getFont().deriveFont(getFont().getSize2D() + 4) );
72 setForeground( new Color(0x80,0x00,0x00) );
74 setToolTipText("Measure:beat position - 何小節目:何拍目");
76 public boolean setMeasure(int measure, int beat) {
77 if( ! super.setMeasure(measure) && this.beat == beat )
79 setText(String.format("%04d:%02d", measure+1, beat+1));
83 private static class MeasureLengthLabel extends SequencerMeasureView.MeasureLabel {
84 public MeasureLengthLabel() {
86 setToolTipText("Measure length - 小節の数");
88 public boolean setMeasure(int measure) {
89 if( ! super.setMeasure(measure) )
91 setText(String.format("/%04d", measure));