1 package camidion.chordhelper.midieditor;
3 import java.util.ArrayList;
4 import java.util.Hashtable;
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;
19 * シーケンサーの再生スピード調整スライダビュー
21 public class SequencerSpeedSlider extends JPanel {
22 public static float tempoFactorOf(int val) {
23 return (float) Math.pow( 2, ((double)val)/12.0 );
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<>();
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 )) ));
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){{
41 setMajorTickSpacing(12);
42 setMinorTickSpacing(1);
47 add(new JSpinner(new AbstractSpinnerModel() {
48 private int index = 0;
50 public Object getValue() { return Math.pow( 2, (double)index ); }
52 public void setValue(Object value) {
53 index = (int) Math.round( Math.log((Double)value) / Math.log(2) );
57 public Object getNextValue() {
58 return index >= 4 ? null : Math.pow( 2, (double)(++index) );
61 public Object getPreviousValue() {
62 return index <= 0 ? null : Math.pow( 2, (double)(--index) );
65 addChangeListener(new ChangeListener() {
67 public void stateChanged(ChangeEvent e) {
68 int index = (int) Math.round( Math.log((Double)getValue()) / Math.log(2) );
69 BoundedRangeModel model = slider.getModel();
72 slider.setVisible(false);
73 titleLabel.setVisible(true);
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);