OSDN Git Service

2c63dc8c5abb25780af25d2d7233701398b14ebb
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / SequencerSpeedSlider.java
1 package camidion.chordhelper.midieditor;
2
3 import java.util.ArrayList;
4 import java.util.Hashtable;
5 import java.util.List;
6
7 import javax.swing.AbstractSpinnerModel;
8 import javax.swing.BoundedRangeModel;
9 import javax.swing.BoxLayout;
10 import javax.swing.JComponent;
11 import javax.swing.JLabel;
12 import javax.swing.JPanel;
13 import javax.swing.JSlider;
14 import javax.swing.JSpinner;
15 import javax.swing.event.ChangeEvent;
16 import javax.swing.event.ChangeListener;
17
18 /**
19  * シーケンサーの再生スピード調整スライダビュー
20  */
21 public class SequencerSpeedSlider extends JPanel {
22         public static float tempoFactorOf(int val) {
23                 return (float) Math.pow( 2, ((double)val)/12.0 );
24         }
25         private static final List<Hashtable<Integer,JComponent>> labeltables = new ArrayList<Hashtable<Integer,JComponent>>() {{
26                 for( int i = 0; i < 5; i++ ) {
27                         Hashtable<Integer,JComponent> e = new Hashtable<>();
28                         add(e);
29                         e.put(-i * 12, new JLabel( "x" + Double.toString(Math.pow( 2, (double)(-i) )) ));
30                         e.put(0, new JLabel( "x1.0" ));
31                         e.put(i * 12, new JLabel( "x" + Double.toString(Math.pow( 2, (double)i )) ));
32                 }
33         }};
34         private JLabel titleLabel;
35         private JSlider slider;
36         public SequencerSpeedSlider(BoundedRangeModel model) {
37                 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
38                 add(titleLabel = new JLabel("Speed: "));
39                 add(slider = new JSlider(model){{
40                         setPaintTicks(true);
41                         setMajorTickSpacing(12);
42                         setMinorTickSpacing(1);
43                         setPaintLabels(true);
44                         setVisible(false);
45                 }});
46                 add(new JLabel("x"));
47                 add(new JSpinner(new AbstractSpinnerModel() {
48                         private int index = 0;
49                         @Override
50                         public Object getValue() { return Math.pow( 2, (double)index ); }
51                         @Override
52                         public void setValue(Object value) {
53                                 index =  (int) Math.round( Math.log((Double)value) / Math.log(2) );
54                                 fireStateChanged();
55                         }
56                         @Override
57                         public Object getNextValue() {
58                                 return index >= 4 ? null : Math.pow( 2, (double)(++index) );
59                         }
60                         @Override
61                         public Object getPreviousValue() {
62                                 return index <= 0 ? null : Math.pow( 2, (double)(--index) );
63                         }
64                 }) {{
65                         addChangeListener(new ChangeListener() {
66                                 @Override
67                                 public void stateChanged(ChangeEvent e) {
68                                         int index = (int) Math.round( Math.log((Double)getValue()) / Math.log(2) );
69                                         BoundedRangeModel model = slider.getModel();
70                                         if( index == 0 ) {
71                                                 model.setValue(0);
72                                                 slider.setVisible(false);
73                                                 titleLabel.setVisible(true);
74                                                 return;
75                                         }
76                                         int maxValue = index * 12;
77                                         model.setMinimum(-maxValue);
78                                         model.setMaximum(maxValue);
79                                         slider.setMajorTickSpacing(12);
80                                         slider.setMinorTickSpacing(index > 2 ? 12 : 1);
81                                         slider.setLabelTable(labeltables.get(index));
82                                         slider.setVisible(true);
83                                         titleLabel.setVisible(false);
84                                 }
85                         });
86                 }});
87         }
88 }