OSDN Git Service

MIDI Device Connection から MIDI Editor へ意図しないオブジェクトを
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / mididevice / SequencerMeasureView.java
1 package camidion.chordhelper.mididevice;
2
3 import java.awt.Color;
4
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;
11
12 import camidion.chordhelper.midieditor.SequenceTickIndex;
13 import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
14
15 /**
16  * 小節表示ビュー
17  */
18 public class SequencerMeasureView extends JPanel implements ChangeListener {
19         private SequencerMeasureView.MeasurePositionLabel measurePositionLabel;
20         private SequencerMeasureView.MeasureLengthLabel measureLengthLabel;
21         private MidiSequencerModel model;
22         /**
23          * シーケンサの現在の小節位置を表示するビューを構築します。
24          * @param model スライダー用の時間範囲データモデル
25          */
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);
31         }
32         @Override
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()
38                 );
39                 if( ! sequencer.isRunning() || sequencer.isRecording() ) {
40                         // 停止中または録音中の場合、長さが変わることがあるので表示を更新
41                         if( tickIndex == null ) {
42                                 measureLengthLabel.setMeasure(0);
43                         }
44                         else {
45                                 long tickLength = sequencer.getTickLength();
46                                 int measureLength = tickIndex.tickToMeasure(tickLength);
47                                 measureLengthLabel.setMeasure(measureLength);
48                         }
49                 }
50                 // 小節位置の表示を更新
51                 if( tickIndex == null ) {
52                         measurePositionLabel.setMeasure(0, 0);
53                 }
54                 else {
55                         long tickPosition = sequencer.getTickPosition();
56                         int measurePosition = tickIndex.tickToMeasure(tickPosition);
57                         measurePositionLabel.setMeasure(measurePosition, tickIndex.lastBeat);
58                 }
59         }
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;
65                         return true;
66                 }
67         }
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) );
73                         setText("0001:01");
74                         setToolTipText("Measure:beat position - 何小節目:何拍目");
75                 }
76                 public boolean setMeasure(int measure, int beat) {
77                         if( ! super.setMeasure(measure) && this.beat == beat )
78                                 return false;
79                         setText(String.format("%04d:%02d", measure+1, beat+1));
80                         return true;
81                 }
82         }
83         private static class MeasureLengthLabel extends SequencerMeasureView.MeasureLabel {
84                 public MeasureLengthLabel() {
85                         setText("/0000");
86                         setToolTipText("Measure length - 小節の数");
87                 }
88                 public boolean setMeasure(int measure) {
89                         if( ! super.setMeasure(measure) )
90                                 return false;
91                         setText(String.format("/%04d", measure));
92                         return true;
93                 }
94         }
95 }