1 package camidion.chordhelper.midieditor;
3 import java.awt.Dimension;
4 import java.awt.event.ActionEvent;
5 import java.awt.event.ActionListener;
6 import java.text.NumberFormat;
7 import java.util.ArrayList;
8 import java.util.Arrays;
9 import java.util.Hashtable;
10 import java.util.List;
12 import javax.swing.BoundedRangeModel;
13 import javax.swing.BoxLayout;
14 import javax.swing.JButton;
15 import javax.swing.JComponent;
16 import javax.swing.JLabel;
17 import javax.swing.JPanel;
18 import javax.swing.JSlider;
19 import javax.swing.border.EtchedBorder;
21 import camidion.chordhelper.ChordHelperApplet;
24 * シーケンサーの再生スピード調整スライダビュー
26 public class SequencerSpeedSlider extends JPanel {
27 private static int RESOLUTION = 1200;
28 private static final List<String> maxFactors = Arrays.asList(
29 "x1", "x1.2", "x1.25", "x1.5", "x2", "x3", "x4", "x5", "x6",
30 "x8", "x12", "x16", "x24", "x32");
31 public static float tempoFactorOf(int val) {
32 return (float) Math.pow( 2, ((double)val)/RESOLUTION );
34 private static final List<Hashtable<Integer,JComponent>>
35 tickLabeltables = new ArrayList<Hashtable<Integer,JComponent>>()
38 NumberFormat formetter = NumberFormat.getInstance();
39 for( String maxFactorString : maxFactors ) {
40 Hashtable<Integer,JComponent> e = new Hashtable<>();
41 Double maxFactor = Double.parseDouble(maxFactorString.substring(1));
43 int maxValue = (int) Math.round(Math.log(maxFactor) / Math.log(2) * RESOLUTION);
44 if( maxFactorString.equals("x1") ) {
45 e.put(0, new JLabel("Play speed : x1 (Original)"));
47 e.put(-maxValue, new JLabel("x" + formetter.format(1/maxFactor)));
48 e.put(0, new JLabel("x1"));
49 e.put(maxValue, new JLabel(maxFactorString));
54 private JSlider slider;
55 private void changeSliderScale(String maxFactorString) {
56 int index = maxFactors.indexOf(maxFactorString);
57 slider.setLabelTable(tickLabeltables.get(index));
58 BoundedRangeModel sliderModel = slider.getModel();
59 Double maxFactor = Double.parseDouble(maxFactorString.substring(1));
60 int maxValue = (int) Math.round(Math.log(maxFactor) / Math.log(2) * RESOLUTION);
61 slider.setMajorTickSpacing((int) Math.round((double)maxValue / 2.0));
63 sliderModel.setMinimum(-maxValue);
64 sliderModel.setMaximum(maxValue);
65 slider.setEnabled(true);
67 sliderModel.setMinimum(-1);
68 sliderModel.setValue(0);
69 sliderModel.setMaximum(1);
70 slider.setEnabled(false);
73 public SequencerSpeedSlider(BoundedRangeModel model) {
74 setBorder(new EtchedBorder());
75 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
76 add(slider = new JSlider(model){
79 setMajorTickSpacing(RESOLUTION/2);
81 setLabelTable(tickLabeltables.get(0));
86 private int index = 0;
87 private JButton push, pull;
89 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
90 add(pull = new JButton("=>|") {
92 setSize(new Dimension(20,20));
93 setMargin(ChordHelperApplet.ZERO_INSETS);
94 addActionListener(new ActionListener() {
96 public void actionPerformed(ActionEvent e) {
97 int max = maxFactors.size() - 1;
98 if( index >= max ) return;
99 changeSliderScale(maxFactors.get(++index));
102 push.requestFocusInWindow();
105 push.setEnabled(true);
110 add(push = new JButton("<=|") {
112 setSize(new Dimension(20,20));
113 setMargin(ChordHelperApplet.ZERO_INSETS);
115 addActionListener(new ActionListener() {
117 public void actionPerformed(ActionEvent e) {
118 if( index <= 0 ) return;
119 changeSliderScale(maxFactors.get(--index));
122 pull.requestFocusInWindow();
125 pull.setEnabled(true);