1 package camidion.chordhelper.midieditor;
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;
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
21 setToolTipText("Time signature (upper digit) - 拍子の分子");
24 JComboBox<String> lowerTimesigCombobox = new JComboBox<String>() {
26 setToolTipText("Time signature (lower digit) - 拍子の分母");
27 for( int i=0; i<6; i++ ) addItem( "/" + (1<<i) );
31 private class SetValueRunnable implements Runnable {
33 public SetValueRunnable(byte[] qpm) { this.qpm = qpm; }
35 public void run() { setValue(qpm);}
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()));
45 setValue(msg.getData());
49 private class TimeSignatureLabel extends JLabel {
50 private byte upper = -1;
51 private byte lower_index = -1;
53 setToolTipText("Time signature - 拍子");
55 public void setTimeSignature(byte upper, byte lower_index) {
56 if( this.upper == upper && this.lower_index == lower_index ) {
59 setText("<html><font size=\"+1\">" + upper + "/" + (1 << lower_index) + "</font></html>");
62 private TimeSignatureLabel timesigValueLabel = new TimeSignatureLabel();
63 private boolean editable;
64 public TimeSignatureSelecter() {
65 add(upperTimesigSpinner);
66 add(lowerTimesigCombobox);
67 add(timesigValueLabel);
71 upperTimesigSpinnerModel.setValue(4);
72 lowerTimesigCombobox.setSelectedIndex(2);
74 public int getUpperValue() {
75 return upperTimesigSpinnerModel.getNumber().intValue();
77 public byte getUpperByte() {
78 return upperTimesigSpinnerModel.getNumber().byteValue();
80 public int getLowerValueIndex() {
81 return lowerTimesigCombobox.getSelectedIndex();
83 public byte getLowerByte() {
84 return (byte)getLowerValueIndex();
86 public byte[] getByteArray() {
87 byte[] data = new byte[4];
88 data[0] = getUpperByte();
89 data[1] = getLowerByte();
90 data[2] = (byte)( 96 >> getLowerValueIndex() );
94 public void setValue(byte upper, byte lowerIndex) {
95 upperTimesigSpinnerModel.setValue( upper );
96 lowerTimesigCombobox.setSelectedIndex( lowerIndex );
97 timesigValueLabel.setTimeSignature( upper, lowerIndex );
99 public void setValue(byte[] data) {
103 setValue(data[0], data[1]);
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);
112 timesigValueLabel.setTimeSignature(getUpperByte(), getLowerByte());