OSDN Git Service

・再生スピード調整をよりわかりやすくした
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / midieditor / SequencerSpeedSlider.java
1 package camidion.chordhelper.midieditor;
2
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;
11
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;
20
21 import camidion.chordhelper.ChordHelperApplet;
22
23 /**
24  * シーケンサーの再生スピード調整スライダビュー
25  */
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 );
33         }
34         private static final List<Hashtable<Integer,JComponent>>
35                 tickLabeltables = new ArrayList<Hashtable<Integer,JComponent>>()
36         {
37                 {
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));
42                                 add(e);
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)"));
46                                 } else {
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));
50                                 }
51                         }
52                 }
53         };
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));
62                 if( index > 0 ) {
63                         sliderModel.setMinimum(-maxValue);
64                         sliderModel.setMaximum(maxValue);
65                         slider.setEnabled(true);
66                 } else {
67                         sliderModel.setMinimum(-1);
68                         sliderModel.setValue(0);
69                         sliderModel.setMaximum(1);
70                         slider.setEnabled(false);
71                 }
72         }
73         public SequencerSpeedSlider(BoundedRangeModel model) {
74                 setBorder(new EtchedBorder());
75                 setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
76                 add(slider = new JSlider(model){
77                         {
78                                 setPaintTicks(true);
79                                 setMajorTickSpacing(RESOLUTION/2);
80                                 setPaintLabels(true);
81                                 setLabelTable(tickLabeltables.get(0));
82                                 setEnabled(false);
83                         }
84                 });
85                 add(new JPanel() {
86                         private int index = 0;
87                         private JButton push, pull;
88                         {
89                                 setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
90                                 add(pull = new JButton("=>|") {
91                                         {
92                                                 setSize(new Dimension(20,20));
93                                                 setMargin(ChordHelperApplet.ZERO_INSETS);
94                                                 addActionListener(new ActionListener() {
95                                                         @Override
96                                                         public void actionPerformed(ActionEvent e) {
97                                                                 int max = maxFactors.size() - 1;
98                                                                 if( index >= max ) return;
99                                                                 changeSliderScale(maxFactors.get(++index));
100                                                                 if( index >= max ) {
101                                                                         setEnabled(false);
102                                                                         push.requestFocusInWindow();
103                                                                         return;
104                                                                 }
105                                                                 push.setEnabled(true);
106                                                         }
107                                                 });
108                                         }
109                                 });
110                                 add(push = new JButton("<=|") {
111                                         {
112                                                 setSize(new Dimension(20,20));
113                                                 setMargin(ChordHelperApplet.ZERO_INSETS);
114                                                 setEnabled(false);
115                                                 addActionListener(new ActionListener() {
116                                                         @Override
117                                                         public void actionPerformed(ActionEvent e) {
118                                                                 if( index <= 0 ) return;
119                                                                 changeSliderScale(maxFactors.get(--index));
120                                                                 if( index <= 0 ) {
121                                                                         setEnabled(false);
122                                                                         pull.requestFocusInWindow();
123                                                                         return;
124                                                                 }
125                                                                 pull.setEnabled(true);
126                                                         }
127                                                 });
128                                         }
129                                 });
130                         }
131                 });
132         }
133 }