1 package camidion.chordhelper.midieditor;
3 import javax.sound.midi.MetaMessage;
4 import javax.swing.JComboBox;
5 import javax.swing.JLabel;
6 import javax.swing.JPanel;
7 import javax.swing.JSpinner;
8 import javax.swing.SpinnerNumberModel;
13 public class TimeSignatureSelecter extends JPanel {
14 protected SpinnerNumberModel upperTimesigModel = new SpinnerNumberModel(4, 1, 32, 1);
15 private JSpinner upperTimesigView = new JSpinner(upperTimesigModel) {
16 { setToolTipText("Time signature (upper digit) - 拍子の分子"); }
18 protected JComboBox<String> lowerTimesigView = new JComboBox<String>() {
20 setToolTipText("Time signature (lower digit) - 拍子の分母");
21 for(int i=0; i<6; i++) addItem("/"+(1<<i)); setSelectedIndex(2);
24 private static class TimeSignatureLabel extends JLabel {
25 { setToolTipText("Time signature - 拍子"); }
26 private byte upper = -1;
27 private byte lowerIndex = -1;
28 public void setTimeSignature(byte upper, byte lowerIndex) {
29 if( this.upper == upper && this.lowerIndex == lowerIndex ) return;
30 setText("<html><font size=\"+1\">"+upper+"/"+(1<<lowerIndex)+"</font></html>");
32 this.lowerIndex = lowerIndex;
35 private TimeSignatureLabel timesigValueLabel = new TimeSignatureLabel();
36 public TimeSignatureSelecter() {
37 add(upperTimesigView);
38 add(lowerTimesigView);
39 add(timesigValueLabel);
42 public byte[] getByteArray() {
43 byte upper = upperTimesigModel.getNumber().byteValue();
44 byte lowerIndex = (byte)lowerTimesigView.getSelectedIndex();
45 return new byte[] { upper, lowerIndex, (byte)(96 >> lowerIndex), 8 };
47 protected void updateTimesigValueLabel() {
48 timesigValueLabel.setTimeSignature(
49 upperTimesigModel.getNumber().byteValue(),
50 (byte)lowerTimesigView.getSelectedIndex()
53 public void setValue(byte upper, byte lowerIndex) {
54 upperTimesigModel.setValue(upper);
55 lowerTimesigView.setSelectedIndex(lowerIndex);
56 timesigValueLabel.setTimeSignature(upper, lowerIndex);
58 public void setValue(byte[] data) {
59 if(data == null) clear(); else setValue(data[0], data[1]);
61 public void setValueAt(SequenceTickIndex tickIndex, long tickPosition) {
62 MetaMessage msg = tickIndex.lastMetaMessageAt(
63 SequenceTickIndex.MetaMessageType.TIME_SIGNATURE,
66 setValue(msg==null ? null : msg.getData());
68 private boolean editable;
69 public boolean isEditable() { return editable; }
70 public void setEditable(boolean editable) {
71 this.editable = editable;
72 upperTimesigView.setVisible(editable);
73 lowerTimesigView.setVisible(editable);
74 timesigValueLabel.setVisible(!editable);
75 if(!editable) updateTimesigValueLabel();
78 upperTimesigModel.setValue(4);
79 lowerTimesigView.setSelectedIndex(2);
80 updateTimesigValueLabel();