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ファイルをプレイリストへ追加します。
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 ) {
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シーケンスをシーケンサへロードして再生します。
*/
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/";
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
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;
};
/**
* 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));
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);
}
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());
@Override
public void actionPerformed(ActionEvent e) { setVisible(true); }
};
- private PlaylistTableModel playlist;
+ private PlaylistTable playlistTable;
/**
* MIDIシーケンス生成アクション
*/
@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,
* @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() {{
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;
setAutoCreateColumnsFromModel(false);
//
// Base64画面を開くアクションの生成
- base64Dialog = new Base64Dialog(model);
+ base64Dialog = new Base64Dialog(this);
base64EncodeAction = new AbstractAction("Base64") {
{
String tooltip = "Base64 text conversion - Base64テキスト変換";
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(
}
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,