OSDN Git Service

ローカルリポジトリ作成→初コミット
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / TimeSignatureSelecter.java
1 package camidion.chordhelper.midieditor;
2
3 import javax.sound.midi.MetaEventListener;
4 import javax.sound.midi.MetaMessage;
5 import javax.swing.JComboBox;
6 import javax.swing.JLabel;
7 import javax.swing.JPanel;
8 import javax.swing.JSpinner;
9 import javax.swing.SpinnerNumberModel;
10 import javax.swing.SwingUtilities;
11
12 /**
13  * 拍子選択ビュー
14  */
15 public class TimeSignatureSelecter extends JPanel implements MetaEventListener {
16         SpinnerNumberModel upperTimesigSpinnerModel = new SpinnerNumberModel(4, 1, 32, 1);
17         private JSpinner upperTimesigSpinner = new JSpinner(
18                 upperTimesigSpinnerModel
19         ) {
20                 {
21                         setToolTipText("Time signature (upper digit) - 拍子の分子");
22                 }
23         };
24         JComboBox<String> lowerTimesigCombobox = new JComboBox<String>() {
25                 {
26                         setToolTipText("Time signature (lower digit) - 拍子の分母");
27                         for( int i=0; i<6; i++ ) addItem( "/" + (1<<i) );
28                         setSelectedIndex(2);
29                 }
30         };
31         private class SetValueRunnable implements Runnable {
32                 byte[] qpm;
33                 public SetValueRunnable(byte[] qpm) { this.qpm = qpm; }
34                 @Override
35                 public void run() { setValue(qpm);}
36         }
37         @Override
38         public void meta(MetaMessage msg) {
39                 switch(msg.getType()) {
40                 case 0x58: // Time signature (4 bytes) - 拍子
41                         if( ! SwingUtilities.isEventDispatchThread() ) {
42                                 SwingUtilities.invokeLater(new SetValueRunnable(msg.getData()));
43                                 break;
44                         }
45                         setValue(msg.getData());
46                         break;
47                 }
48         }
49         private class TimeSignatureLabel extends JLabel {
50                 private byte upper = -1;
51                 private byte lower_index = -1;
52                 {
53                         setToolTipText("Time signature - 拍子");
54                 }
55                 public void setTimeSignature(byte upper, byte lower_index) {
56                         if( this.upper == upper && this.lower_index == lower_index ) {
57                                 return;
58                         }
59                         setText("<html><font size=\"+1\">" + upper + "/" + (1 << lower_index) + "</font></html>");
60                 }
61         }
62         private TimeSignatureLabel timesigValueLabel = new TimeSignatureLabel();
63         private boolean editable;
64         public TimeSignatureSelecter() {
65                 add(upperTimesigSpinner);
66                 add(lowerTimesigCombobox);
67                 add(timesigValueLabel);
68                 setEditable(true);
69         }
70         public void clear() {
71                 upperTimesigSpinnerModel.setValue(4);
72                 lowerTimesigCombobox.setSelectedIndex(2);
73         }
74         public int getUpperValue() {
75                 return upperTimesigSpinnerModel.getNumber().intValue();
76         }
77         public byte getUpperByte() {
78                 return upperTimesigSpinnerModel.getNumber().byteValue();
79         }
80         public int getLowerValueIndex() {
81                 return lowerTimesigCombobox.getSelectedIndex();
82         }
83         public byte getLowerByte() {
84                 return (byte)getLowerValueIndex();
85         }
86         public byte[] getByteArray() {
87                 byte[] data = new byte[4];
88                 data[0] = getUpperByte();
89                 data[1] = getLowerByte();
90                 data[2] = (byte)( 96 >> getLowerValueIndex() );
91                 data[3] = 8;
92                 return data;
93         }
94         public void setValue(byte upper, byte lowerIndex) {
95                 upperTimesigSpinnerModel.setValue( upper );
96                 lowerTimesigCombobox.setSelectedIndex( lowerIndex );
97                 timesigValueLabel.setTimeSignature( upper, lowerIndex );
98         }
99         public void setValue(byte[] data) {
100                 if(data == null)
101                         clear();
102                 else
103                         setValue(data[0], data[1]);
104         }
105         public boolean isEditable() { return editable; }
106         public void setEditable( boolean editable ) {
107                 this.editable = editable;
108                 upperTimesigSpinner.setVisible(editable);
109                 lowerTimesigCombobox.setVisible(editable);
110                 timesigValueLabel.setVisible(!editable);
111                 if( !editable ) {
112                         timesigValueLabel.setTimeSignature(getUpperByte(), getLowerByte());
113                 }
114         }
115 }