OSDN Git Service

読込直後の再生時初期選択を復活
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Fri, 28 Apr 2017 15:02:27 +0000 (00:02 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Fri, 28 Apr 2017 15:02:27 +0000 (00:02 +0900)
src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/midieditor/Base64Dialog.java
src/camidion/chordhelper/midieditor/MidiSequenceEditorDialog.java
src/camidion/chordhelper/midieditor/NewSequenceDialog.java
src/camidion/chordhelper/midieditor/PlaylistTable.java

index 1c683a3..b214f1f 100644 (file)
@@ -95,7 +95,9 @@ public class ChordHelperApplet extends JApplet {
        public int addRandomSongToPlaylist(int measureLength) throws InvalidMidiDataException {
                NewSequenceDialog d = midiEditor.newSequenceDialog;
                d.setRandomChordProgression(measureLength);
-               return playlistModel.play(d.getMidiSequence());
+               int index = playlistModel.play(d.getMidiSequence());
+               midiEditor.playlistTable.getSelectionModel().setSelectionInterval(index, index);
+               return index;
        }
        /**
         * URLで指定されたMIDIファイルをプレイリストへ追加します。
@@ -111,7 +113,9 @@ public class ChordHelperApplet extends JApplet {
                        URL url = (new URI(midiFileUrl)).toURL();
                        String filename = url.getFile().replaceFirst("^.*/","");
                        Sequence sequence = MidiSystem.getSequence(url);
-                       return playlistModel.add(sequence, filename);
+                       int index = playlistModel.add(sequence, filename);
+                       midiEditor.playlistTable.getSelectionModel().setSelectionInterval(index, index);
+                       return index;
                } catch( URISyntaxException|IOException|InvalidMidiDataException e ) {
                        JOptionPane.showMessageDialog(null, e, VersionInfo.NAME, JOptionPane.WARNING_MESSAGE);
                } catch( Exception e ) {
@@ -138,7 +142,9 @@ public class ChordHelperApplet extends JApplet {
        public int addToPlaylistBase64(String base64EncodedText, String filename) {
                Base64Dialog d = midiEditor.playlistTable.base64Dialog;
                d.setBase64Data(base64EncodedText, filename);
-               return d.addToPlaylist();
+               int index = d.addToPlaylist();
+               midiEditor.playlistTable.getSelectionModel().setSelectionInterval(index, index);
+               return index;
        }
        /**
         * プレイリスト上で現在選択されているMIDIシーケンスをシーケンサへロードして再生します。
@@ -264,7 +270,7 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String NAME = "MIDI Chord Helper";
-               public static final String VERSION = "Ver.20170427.1";
+               public static final String VERSION = "Ver.20170428.1";
                public static final String COPYRIGHT = "Copyright (C) 2004-2017";
                public static final String AUTHER = "@きよし - Akiyoshi Kamide";
                public static final String URL = "http://www.yk.rim.or.jp/~kamide/music/chordhelper/";
index 9d8c92a..2e17dc0 100644 (file)
@@ -40,7 +40,7 @@ public class Base64Dialog extends JDialog implements DocumentListener {
                return "Content-Type: audio/midi; name=\"" + filename + "\"\n"
                                + "Content-Transfer-Encoding: base64\n\n";
        }
-       public PlaylistTableModel playlistModel;
+       public PlaylistTable playlistTable;
        /**
         * 入力されたBase64テキストをデコードし、MIDIシーケンスとしてプレイリストに追加します。
         * @return プレイリストに追加されたMIDIシーケンスのインデックス(先頭が0)、追加に失敗した場合は -1
@@ -54,7 +54,9 @@ public class Base64Dialog extends JDialog implements DocumentListener {
                        return -1;
                }
                try (InputStream in = new ByteArrayInputStream(midiData)) {
-                       return playlistModel.add(MidiSystem.getSequence(in), null);
+                       int index = playlistTable.getModel().add(MidiSystem.getSequence(in), null);
+                       playlistTable.getSelectionModel().setSelectionInterval(index, index);
+                       return index;
                } catch( IOException|InvalidMidiDataException e ) {
                        error("Base64デコードした結果をMIDIシーケンスとして読み込めませんでした。\n"+e);
                        return -1;
@@ -80,10 +82,10 @@ public class Base64Dialog extends JDialog implements DocumentListener {
        };
        /**
         * Base64テキスト入力ダイアログを構築します。
-        * @param playlistModel Base64デコードされたMIDIシーケンスの追加先プレイリスト
+        * @param playlistTable Base64デコードされたMIDIシーケンスの追加先プレイリストビュー
         */
-       public Base64Dialog(PlaylistTableModel playlistModel) {
-               this.playlistModel = playlistModel;
+       public Base64Dialog(PlaylistTable playlistTable) {
+               this.playlistTable = playlistTable;
                setTitle("Base64-encoded MIDI sequence - " + ChordHelperApplet.VersionInfo.NAME);
                add(new JPanel() {{
                        setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
index 234045c..a8b08f6 100644 (file)
@@ -107,7 +107,10 @@ public class MidiSequenceEditorDialog extends JDialog {
                        PlaylistTableModel playlist = getPlaylistModel();
                        MidiSequencerModel sequencerModel = playlist.getSequencerModel();
                        if( sequencerModel.getSequencer().isRunning() ) { open(); return; }
-                       if( index >= 0 ) playlist.play(index);
+                       if( index >= 0 ) {
+                               playlist.play(index);
+                               playlistTable.getSelectionModel().setSelectionInterval(index, index);
+                       }
                } catch (Exception e) {
                        JOptionPane.showMessageDialog(this, e, ChordHelperApplet.VersionInfo.NAME, JOptionPane.ERROR_MESSAGE);
                }
@@ -136,7 +139,7 @@ public class MidiSequenceEditorDialog extends JDialog {
                MidiEventTable eventListTable = new MidiEventTable(playlistTableModel.emptyEventListTableModel, eventDialog, outputMidiDevice);
                SequenceTrackListTable trackListTable = new SequenceTrackListTable(playlistTableModel.emptyTrackListTableModel, eventListTable);
                playlistTable = new PlaylistTable(playlistTableModel, midiDeviceDialogOpenAction, trackListTable);
-               newSequenceDialog = new NewSequenceDialog(playlistTableModel, outputMidiDevice);
+               newSequenceDialog = new NewSequenceDialog(playlistTable, outputMidiDevice);
                setTitle("MIDI Editor/Playlist - "+ChordHelperApplet.VersionInfo.NAME);
                setBounds( 150, 200, 900, 500 );
                setLayout(new FlowLayout());
index 8eef34e..fb28bd5 100644 (file)
@@ -93,7 +93,7 @@ public class NewSequenceDialog extends JDialog {
                @Override
                public void actionPerformed(ActionEvent e) { setVisible(true); }
        };
-       private PlaylistTableModel playlist;
+       private PlaylistTable playlistTable;
        /**
         * MIDIシーケンス生成アクション
         */
@@ -103,8 +103,8 @@ public class NewSequenceDialog extends JDialog {
                @Override
                public void actionPerformed(ActionEvent event) {
                        try {
-                               int index = playlist.play(getMidiSequence());
-                               playlist.getSequenceModelList().get(index).setModified(true);
+                               int index = playlistTable.play(getMidiSequence());
+                               playlistTable.getModel().getSequenceModelList().get(index).setModified(true);
                        } catch (Exception ex) {
                                JOptionPane.showMessageDialog(
                                        NewSequenceDialog.this, ex,
@@ -118,8 +118,8 @@ public class NewSequenceDialog extends JDialog {
         * @param playlist シーケンス追加先プレイリスト
         * @param midiOutDevice 操作音を出力するMIDI出力デバイス
         */
-       public NewSequenceDialog(PlaylistTableModel playlist, VirtualMidiDevice midiOutDevice) {
-               this.playlist = playlist;
+       public NewSequenceDialog(PlaylistTable playlistTable, VirtualMidiDevice midiOutDevice) {
+               this.playlistTable = playlistTable;
                trackSpecPanel.setChannels(midiOutDevice.getChannels());
                setTitle("Generate new sequence - " + ChordHelperApplet.VersionInfo.NAME);
                add(new JTabbedPane() {{
index 276e58c..0e38400 100644 (file)
@@ -17,6 +17,8 @@ import java.util.List;
 
 import javax.sound.midi.InvalidMidiDataException;
 import javax.sound.midi.MidiSystem;
+import javax.sound.midi.Sequence;
+import javax.sound.midi.Sequencer;
 import javax.swing.AbstractAction;
 import javax.swing.AbstractCellEditor;
 import javax.swing.Action;
@@ -121,7 +123,7 @@ public class PlaylistTable extends JTable {
                setAutoCreateColumnsFromModel(false);
                //
                // Base64画面を開くアクションの生成
-               base64Dialog = new Base64Dialog(model);
+               base64Dialog = new Base64Dialog(this);
                base64EncodeAction = new AbstractAction("Base64") {
                        {
                                String tooltip = "Base64 text conversion - Base64テキスト変換";
@@ -354,6 +356,18 @@ public class PlaylistTable extends JTable {
                return firstIndex;
        }
        /**
+        * 指定されたシーケンスを追加して再生します。
+        * @param sequence 再生するシーケンス
+        * @return 追加されたシーケンスのインデックス(先頭が 0)
+        * @throws InvalidMidiDataException {@link Sequencer#setSequence(Sequence)} を参照
+        * @throws IllegalStateException MIDIシーケンサデバイスが閉じている場合
+        */
+       public int play(Sequence sequence) throws InvalidMidiDataException {
+               int index = getModel().play(sequence);
+               selectionModel.setSelectionInterval(index, index);
+               return index;
+       }
+       /**
         * シーケンスを削除するアクション
         */
        Action deleteSequenceAction = new SelectedSequenceAction(
@@ -444,10 +458,13 @@ public class PlaylistTable extends JTable {
                                }
                                int firstIndex = PlaylistTable.this.add(Arrays.asList(getSelectedFile()));
                                try {
-                                       PlaylistTableModel playlist = getModel();
-                                       MidiSequencerModel sequencerModel = playlist.getSequencerModel();
+                                       PlaylistTableModel model = getModel();
+                                       MidiSequencerModel sequencerModel = model.getSequencerModel();
                                        if( sequencerModel.getSequencer().isRunning() ) return;
-                                       if( firstIndex >= 0 ) playlist.play(firstIndex);
+                                       if( firstIndex >= 0 ) {
+                                               model.play(firstIndex);
+                                               selectionModel.setSelectionInterval(firstIndex, firstIndex);
+                                       }
                                } catch (Exception ex) {
                                        JOptionPane.showMessageDialog(
                                                        rootPane, ex, ChordHelperApplet.VersionInfo.NAME,