OSDN Git Service

・再生スピード調整をよりわかりやすくした
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / ChordHelperApplet.java
index 6ac2ca6..0b7c3b6 100644 (file)
@@ -26,6 +26,7 @@ import java.util.Arrays;
 import javax.sound.midi.InvalidMidiDataException;
 import javax.sound.midi.MetaEventListener;
 import javax.sound.midi.MetaMessage;
+import javax.sound.midi.Sequence;
 import javax.sound.midi.Sequencer;
 import javax.swing.AbstractAction;
 import javax.swing.Action;
@@ -51,6 +52,7 @@ import javax.swing.event.HyperlinkEvent;
 import javax.swing.event.HyperlinkListener;
 
 import camidion.chordhelper.anogakki.AnoGakkiPane;
+import camidion.chordhelper.chorddiagram.CapoComboBoxModel;
 import camidion.chordhelper.chorddiagram.ChordDiagram;
 import camidion.chordhelper.chordmatrix.ChordButtonLabel;
 import camidion.chordhelper.chordmatrix.ChordMatrix;
@@ -99,8 +101,9 @@ public class ChordHelperApplet extends JApplet {
         * 指定された小節数の曲を、乱数で自動作曲してプレイリストへ追加します。
         * @param measureLength 小節数
         * @return 追加先のインデックス値(0から始まる)。追加できなかったときは -1
+        * @throws InvalidMidiDataException {@link Sequencer#setSequence(Sequence)} を参照
         */
-       public int addRandomSongToPlaylist(int measureLength) {
+       public int addRandomSongToPlaylist(int measureLength) throws InvalidMidiDataException {
                NewSequenceDialog d = midiEditor.newSequenceDialog;
                d.setRandomChordProgression(measureLength);
                return playlistModel.addSequenceAndPlay(d.getMidiSequence());
@@ -156,14 +159,18 @@ public class ChordHelperApplet extends JApplet {
        /**
         * プレイリスト上で現在選択されているMIDIシーケンスを、
         * シーケンサへロードして再生します。
+        * @throws InvalidMidiDataException {@link Sequencer#setSequence(Sequence)} を参照
         */
-       public void play() { play(playlistModel.sequenceListSelectionModel.getMinSelectionIndex()); }
+       public void play() throws InvalidMidiDataException { play(playlistModel.sequenceListSelectionModel.getMinSelectionIndex()); }
        /**
         * 指定されたインデックス値が示すプレイリスト上のMIDIシーケンスを、
         * シーケンサへロードして再生します。
         * @param index インデックス値(0から始まる)
+        * @throws InvalidMidiDataException {@link Sequencer#setSequence(Sequence)} を参照
         */
-       public void play(int index) { playlistModel.loadToSequencer(index); sequencerModel.start(); }
+       public void play(int index) throws InvalidMidiDataException {
+               playlistModel.loadToSequencer(index); sequencerModel.start();
+       }
        /**
         * シーケンサが実行中かどうかを返します。
         * {@link Sequencer#isRunning()} の戻り値をそのまま返します。
@@ -278,7 +285,7 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String      NAME = "MIDI Chord Helper";
-               public static final String      VERSION = "Ver.20160526.1";
+               public static final String      VERSION = "Ver.20160605.1";
                public static final String      COPYRIGHT = "Copyright (C) 2004-2016";
                public static final String      AUTHER = "@きよし - Akiyoshi Kamide";
                public static final String      URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/";
@@ -393,9 +400,10 @@ public class ChordHelperApplet extends JApplet {
        private TempoSelecter tempoSelecter;
        private TimeSignatureSelecter timesigSelecter;
        private KeySignatureLabel keysigLabel;
-       private JLabel songTitleLabel;
+       private JLabel songTitleLabel = new JLabel();
        private AnoGakkiPane anoGakkiPane;
        private JToggleButton anoGakkiToggleButton;
+       private MidiTransceiverListModelList deviceModelList;
 
        public void init() {
                //
@@ -410,8 +418,10 @@ public class ChordHelperApplet extends JApplet {
                // 背景色の取得
                rootPaneDefaultBgcolor = getContentPane().getBackground();
                //
-               // コードボタンとピアノ鍵盤のセットアップ
-               chordMatrix = new ChordMatrix() {{
+               // コードダイアグラム、コードボタン、ピアノ鍵盤のセットアップ
+               CapoComboBoxModel capoValueModel = new CapoComboBoxModel();
+               chordDiagram = new ChordDiagram(capoValueModel);
+               chordMatrix = new ChordMatrix(capoValueModel) {{
                        addChordMatrixListener(new ChordMatrixListener(){
                                public void keySignatureChanged() {
                                        Key capoKey = getKeySignatureCapo();
@@ -420,21 +430,26 @@ public class ChordHelperApplet extends JApplet {
                                }
                                public void chordChanged() { chordOn(); }
                        });
+                       capoSelecter.checkbox.addItemListener(new ItemListener() {
+                               public void itemStateChanged(ItemEvent e) {
+                                       chordOn();
+                                       keyboardPanel.keyboardCenterPanel.keyboard.chordDisplay.clear();
+                                       chordDiagram.clear();
+                               }
+                       });
+                       capoSelecter.valueSelecter.addActionListener(new ActionListener() {
+                               public void actionPerformed(ActionEvent e) {
+                                       chordOn();
+                                       keyboardPanel.keyboardCenterPanel.keyboard.chordDisplay.clear();
+                                       chordDiagram.clear();
+                               }
+                       });
+               }};
+               keysigLabel = new KeySignatureLabel() {{
+                       addMouseListener(new MouseAdapter() {
+                               public void mousePressed(MouseEvent e) { chordMatrix.setKeySignature(getKey()); }
+                       });
                }};
-               chordMatrix.capoSelecter.checkbox.addItemListener(new ItemListener() {
-                       public void itemStateChanged(ItemEvent e) {
-                               chordOn();
-                               keyboardPanel.keyboardCenterPanel.keyboard.chordDisplay.clear();
-                               chordDiagram.clear();
-                       }
-               });
-               chordMatrix.capoSelecter.valueSelecter.addActionListener(new ActionListener() {
-                       public void actionPerformed(ActionEvent e) {
-                               chordOn();
-                               keyboardPanel.keyboardCenterPanel.keyboard.chordDisplay.clear();
-                               chordDiagram.clear();
-                       }
-               });
                keyboardPanel = new MidiKeyboardPanel(chordMatrix) {{
                        keyboardCenterPanel.keyboard.addPianoKeyboardListener(new PianoKeyboardAdapter() {
                                @Override
@@ -450,9 +465,10 @@ public class ChordHelperApplet extends JApplet {
                        });
                        keyboardCenterPanel.keyboard.setPreferredSize(new Dimension(571, 80));
                }};
-               // MIDIデバイス一覧を構築
                VirtualMidiDevice guiMidiDevice = keyboardPanel.keyboardCenterPanel.keyboard.midiDevice;
-               MidiTransceiverListModelList deviceModelList = new MidiTransceiverListModelList(Arrays.asList(guiMidiDevice));
+               //
+               // MIDIデバイス一覧を構築
+               deviceModelList = new MidiTransceiverListModelList(Arrays.asList(guiMidiDevice));
                (midiDeviceDialog = new MidiDeviceDialog(deviceModelList)).setIconImage(iconImage);
                //
                // MIDIデバイス一覧のシーケンサと連携するプレイリストを構築
@@ -467,6 +483,7 @@ public class ChordHelperApplet extends JApplet {
                // MIDIエディタのイベントダイアログを、ピアノ鍵盤のイベント送出ダイアログと共用
                keyboardPanel.setEventDialog(midiEditor.eventDialog);
                //
+               // 歌詞表示
                lyricDisplay = new ChordTextField(sequencerModel) {{
                        addActionListener(new ActionListener() {
                                @Override
@@ -478,43 +495,36 @@ public class ChordHelperApplet extends JApplet {
                }};
                lyricDisplayDefaultBorder = lyricDisplay.getBorder();
                lyricDisplayDefaultBgcolor = lyricDisplay.getBackground();
-               chordDiagram = new ChordDiagram(this);
+               //
+               // メタイベント(テンポ・拍子・調号)を受信して表示するリスナーを登録
                Sequencer sequencer = sequencerModel.getSequencer();
                sequencer.addMetaEventListener(tempoSelecter = new TempoSelecter() {{ setEditable(false); }});
                sequencer.addMetaEventListener(timesigSelecter = new TimeSignatureSelecter() {{ setEditable(false); }});
-               keysigLabel = new KeySignatureLabel() {{
-                       addMouseListener(new MouseAdapter() {
-                               public void mousePressed(MouseEvent e) { chordMatrix.setKeySignature(getKey()); }
-                       });
-               }};
-               sequencer.addMetaEventListener(
-                       new MetaEventListener() {
-                               private Key key;
-                               @Override
-                               public void meta(MetaMessage msg) {
-                                       switch(msg.getType()) {
-                                       case 0x59: // Key signature (2 bytes) : 調号
-                                               key = new Key(msg.getData());
-                                               if( SwingUtilities.isEventDispatchThread() ) {
-                                                       keysigLabel.setKeySignature(key);
-                                                       chordMatrix.setKeySignature(key);
-                                               } else {
-                                                       // MIDIシーケンサのスレッドから呼ばれた場合、GUI更新は自分で行わず、
-                                                       // AWTイベントディスパッチスレッドに依頼する。
-                                                       SwingUtilities.invokeLater(new Runnable() {
-                                                               @Override
-                                                               public void run() {
-                                                                       keysigLabel.setKeySignature(key);
-                                                                       chordMatrix.setKeySignature(key);
-                                                               }
-                                                       });
-                                               }
-                                               break;
+               sequencer.addMetaEventListener(new MetaEventListener() {
+                       private Key key;
+                       @Override
+                       public void meta(MetaMessage msg) {
+                               switch(msg.getType()) {
+                               case 0x59: // Key signature (2 bytes) : 調号
+                                       key = new Key(msg.getData());
+                                       if( SwingUtilities.isEventDispatchThread() ) {
+                                               keysigLabel.setKeySignature(key);
+                                               chordMatrix.setKeySignature(key);
+                                       } else {
+                                               // MIDIシーケンサのスレッドから呼ばれた場合、GUI更新は自分で行わず、
+                                               // AWTイベントディスパッチスレッドに依頼する。
+                                               SwingUtilities.invokeLater(new Runnable() {
+                                                       @Override
+                                                       public void run() {
+                                                               keysigLabel.setKeySignature(key);
+                                                               chordMatrix.setKeySignature(key);
+                                                       }
+                                               });
                                        }
+                                       break;
                                }
                        }
-               );
-               songTitleLabel = new JLabel();
+               });
                //シーケンサーの時間スライダーの値が変わったときのリスナーを登録
                sequencerModel.addChangeListener(new ChangeListener() {
                        @Override
@@ -689,6 +699,11 @@ public class ChordHelperApplet extends JApplet {
                setPreferredSize(new Dimension(750,470));
        }
        @Override
+       public void destroy() {
+               deviceModelList.closeAllDevices();
+               super.destroy();
+       }
+       @Override
        public void start() {
                //
                // コードボタンで設定されている現在の調を
@@ -701,7 +716,11 @@ public class ChordHelperApplet extends JApplet {
                System.gc();
                if( midi_url != null ) {
                        addToPlaylist(midi_url);
-                       play();
+                       try {
+                               play();
+                       } catch (InvalidMidiDataException ex) {
+                               ex.printStackTrace();
+                       }
                }
        }
        @Override