import camidion.chordhelper.mididevice.MidiTransceiverListModelList;
import camidion.chordhelper.mididevice.SequencerMeasureView;
import camidion.chordhelper.mididevice.SequencerTimeView;
+import camidion.chordhelper.mididevice.VirtualMidiDevice;
import camidion.chordhelper.midieditor.Base64Dialog;
import camidion.chordhelper.midieditor.KeySignatureLabel;
import camidion.chordhelper.midieditor.MidiSequenceEditor;
import camidion.chordhelper.midieditor.NewSequenceDialog;
+import camidion.chordhelper.midieditor.PlaylistTableModel;
import camidion.chordhelper.midieditor.SequenceTickIndex;
import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
import camidion.chordhelper.midieditor.TempoSelecter;
* @return 未保存の修正済み MIDI ファイルがあれば true
*/
public boolean isModified() {
- return deviceModelList.getEditorDialog().sequenceListTable.getModel().isModified();
+ return midiEditor.sequenceListTable.getModel().isModified();
}
/**
* 指定された小節数の曲を、乱数で自動作曲してプレイリストへ追加します。
* @return 追加先のインデックス値(0から始まる)。追加できなかったときは -1
*/
public int addRandomSongToPlaylist(int measureLength) {
- MidiSequenceEditor editor = deviceModelList.getEditorDialog();
- NewSequenceDialog d = editor.newSequenceDialog;
+ NewSequenceDialog d = midiEditor.newSequenceDialog;
d.setRandomChordProgression(measureLength);
- return editor.sequenceListTable.getModel().addSequenceAndPlay(d.getMidiSequence());
+ return midiEditor.sequenceListTable.getModel().addSequenceAndPlay(d.getMidiSequence());
}
/**
* URLで指定されたMIDIファイルをプレイリストへ追加します。
* @return 追加先のインデックス値(0から始まる)。追加できなかったときは -1
*/
public int addToPlaylist(String midiFileUrl) {
- MidiSequenceEditor editor = deviceModelList.getEditorDialog();
try {
- return editor.sequenceListTable.getModel().addSequenceFromURL(midiFileUrl);
+ return midiEditor.sequenceListTable.getModel().addSequenceFromURL(midiFileUrl);
} catch( URISyntaxException|IOException|InvalidMidiDataException e ) {
- editor.showWarning(e.getMessage());
+ midiEditor.showWarning(e.getMessage());
} catch( AccessControlException e ) {
e.printStackTrace();
- editor.showError(e.getMessage());
+ midiEditor.showError(e.getMessage());
}
return -1;
}
* @return 追加先のインデックス値(0から始まる)。追加できなかったときは -1
*/
public int addToPlaylistBase64(String base64EncodedText, String filename) {
- MidiSequenceEditor editor = deviceModelList.getEditorDialog();
- Base64Dialog d = editor.base64Dialog;
+ Base64Dialog d = midiEditor.base64Dialog;
d.setBase64Data(base64EncodedText);
try {
- return editor.sequenceListTable.getModel().addSequence(d.getMIDIData(), filename);
+ return midiEditor.sequenceListTable.getModel().addSequence(d.getMIDIData(), filename);
} catch (IOException | InvalidMidiDataException e) {
e.printStackTrace();
- editor.showWarning(e.getMessage());
+ midiEditor.showWarning(e.getMessage());
return -1;
}
}
* シーケンサへロードして再生します。
*/
public void play() {
- play(deviceModelList.getEditorDialog().sequenceListTable.getModel().sequenceListSelectionModel.getMinSelectionIndex());
+ play(midiEditor.sequenceListTable.getModel().sequenceListSelectionModel.getMinSelectionIndex());
}
/**
* 指定されたインデックス値が示すプレイリスト上のMIDIシーケンスを、
* @param index インデックス値(0から始まる)
*/
public void play(int index) {
- deviceModelList.getEditorDialog().sequenceListTable.getModel().loadToSequencer(index);
+ midiEditor.sequenceListTable.getModel().loadToSequencer(index);
deviceModelList.getSequencerModel().start();
}
/**
* @return MIDIデータをBase64テキストに変換した結果
*/
public String getMidiDataBase64() {
- MidiSequenceEditor editor = deviceModelList.getEditorDialog();
SequenceTrackListTableModel sequenceModel =
- editor.sequenceListTable.getModel().sequencerModel.getSequenceTrackListTableModel();
- editor.base64Dialog.setMIDIData(sequenceModel.getMIDIdata());
- return editor.base64Dialog.getBase64Data();
+ midiEditor.sequenceListTable.getModel().sequencerModel.getSequenceTrackListTableModel();
+ midiEditor.base64Dialog.setMIDIData(sequenceModel.getMIDIdata());
+ return midiEditor.base64Dialog.getBase64Data();
}
/**
* 現在シーケンサにロードされているMIDIファイルのファイル名を返します。
private static final String IMAGE_ICON_PATH = "midichordhelper.png";
//
public ChordMatrix chordMatrix;
- MidiTransceiverListModelList deviceModelList;
- //
+ MidiSequenceEditor midiEditor;
+ private MidiTransceiverListModelList deviceModelList;
private JPanel keyboardSequencerPanel;
private JPanel chordGuide;
private Color rootPaneDefaultBgcolor;
);
keyboardCenterPanel.keyboard.setPreferredSize(new Dimension(571, 80));
}};
+ //
// MIDIデバイスのセットアップ
- deviceModelList = new MidiTransceiverListModelList(
- Arrays.asList(keyboardPanel.keyboardCenterPanel.keyboard.midiDevice)
- );
- MidiSequenceEditor midiEditor = deviceModelList.getEditorDialog();
- midiEditor.setIconImage(iconImage);
+ VirtualMidiDevice guiMidiDevice = keyboardPanel.keyboardCenterPanel.keyboard.midiDevice;
+ deviceModelList = new MidiTransceiverListModelList(Arrays.asList(guiMidiDevice));
+ //
+ // MIDIデバイスダイアログの構築
+ (midiDeviceDialog = new MidiDeviceDialog(deviceModelList)).setIconImage(iconImage);
+ //
+ // MIDIデバイス一覧で取得したシーケンサと連携するプレイリストを構築
+ PlaylistTableModel playlist = new PlaylistTableModel(deviceModelList.getSequencerModel());
+ //
+ // MIDIエディタダイアログの構築
+ (midiEditor = new MidiSequenceEditor(playlist, guiMidiDevice)).setIconImage(iconImage);
+ //
+ // メイン画面へのMIDIファイルのドラッグ&ドロップ受付開始
new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, midiEditor.dropTargetListener, true);
+ //
+ // MIDIエディタのイベントダイアログを、ピアノ鍵盤のイベント送出ダイアログと共用
keyboardPanel.setEventDialog(midiEditor.eventDialog);
- (midiDeviceDialog = new MidiDeviceDialog(deviceModelList)).setIconImage(iconImage);
+ //
lyricDisplay = new ChordTextField(deviceModelList.getSequencerModel()) {{
addActionListener(new ActionListener() {
@Override
@Override
public void stateChanged(ChangeEvent e) {
SequenceTrackListTableModel sequenceTableModel = deviceModelList.getSequencerModel().getSequenceTrackListTableModel();
- int loadedSequenceIndex = deviceModelList.getEditorDialog().sequenceListTable.getModel().indexOfSequenceOnSequencer();
+ int loadedSequenceIndex = midiEditor.sequenceListTable.getModel().indexOfSequenceOnSequencer();
songTitleLabel.setText(
"<html>"+(
loadedSequenceIndex < 0 ? "[No MIDI file loaded]" :
add( Box.createHorizontalStrut(12) );
add( songTitleLabel );
add( Box.createHorizontalStrut(12) );
- add( new JButton(deviceModelList.getEditorDialog().openAction) {{ setMargin(ZERO_INSETS); }});
+ add( new JButton(midiEditor.openAction) {{ setMargin(ZERO_INSETS); }});
}});
add(new JPanel() {{
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add( new JSlider(deviceModelList.getSequencerModel()) );
add( new SequencerTimeView(deviceModelList.getSequencerModel()) );
add( Box.createHorizontalStrut(5) );
- add( new JButton(deviceModelList.getEditorDialog().sequenceListTable.getModel().moveToTopAction) {{
+ add( new JButton(midiEditor.sequenceListTable.getModel().moveToTopAction) {{
setMargin(ZERO_INSETS);
}});
add(new JButton(deviceModelList.getSequencerModel().moveBackwardAction) {{
add(new JButton(deviceModelList.getSequencerModel().moveForwardAction) {{
setMargin(ZERO_INSETS);
}});
- add(new JButton(deviceModelList.getEditorDialog().sequenceListTable.getModel().moveToBottomAction) {{
+ add(new JButton(midiEditor.sequenceListTable.getModel().moveToBottomAction) {{
setMargin(ZERO_INSETS);
}});
- add(new JToggleButton(deviceModelList.getEditorDialog().sequenceListTable.getModel().toggleRepeatAction) {{
+ add(new JToggleButton(midiEditor.sequenceListTable.getModel().toggleRepeatAction) {{
setMargin(ZERO_INSETS);
}});
add( Box.createHorizontalStrut(10) );
import javax.swing.event.TableModelListener;
import camidion.chordhelper.mididevice.MidiSequencerModel;
-import camidion.chordhelper.mididevice.MidiTransceiverListModelList;
import camidion.chordhelper.midieditor.MidiSequenceEditor;
import camidion.chordhelper.midieditor.PlaylistTableModel;
import camidion.chordhelper.midieditor.SequenceTrackListTableModel;
setTitle(title);
}
private MidiSequenceEditor editor;
+ private PlaylistTableModel playlist;
public AppletFrame(ChordHelperApplet applet, List<File> fileList) {
setTitle(ChordHelperApplet.VersionInfo.NAME);
add( applet, BorderLayout.CENTER );
setLocationRelativeTo(null);
setVisible(true);
applet.start();
- MidiTransceiverListModelList deviceModelList = applet.deviceModelList;
- deviceModelList.getSequencerModel().addChangeListener(new ChangeListener() {
+ playlist = (editor = applet.midiEditor).sequenceListTable.getModel();
+ addWindowListener(new WindowAdapter() {
+ @Override
+ public void windowClosing(WindowEvent event) {
+ if( ! playlist.isModified() || editor.confirm(
+ "MIDI file not saved, exit anyway ?\n"+
+ "保存されていないMIDIファイルがありますが、終了してよろしいですか?"
+ )) System.exit(0);
+ }
+ });
+ playlist.sequencerModel.addChangeListener(new ChangeListener() {
/**
* シーケンサで切り替わった再生対象ファイル名をタイトルバーに反映
*/
setFilenameToTitle(sequencerModel.getSequenceTrackListTableModel());
}
});
- editor = deviceModelList.getEditorDialog();
- addWindowListener(new WindowAdapter() {
- @Override
- public void windowClosing(WindowEvent event) {
- if( ! editor.sequenceListTable.getModel().isModified() || editor.confirm(
- "MIDI file not saved, exit anyway ?\n"+
- "保存されていないMIDIファイルがありますが、終了してよろしいですか?"
- )) System.exit(0);
- }
- });
- editor.sequenceListTable.getModel().addTableModelListener(new TableModelListener() {
+ playlist.addTableModelListener(new TableModelListener() {
/**
* プレイリスト上で変更された再生対象ファイル名をタイトルバーに反映
*/
import javax.sound.midi.Synthesizer;
import camidion.chordhelper.ChordHelperApplet;
-import camidion.chordhelper.midieditor.MidiSequenceEditor;
-import camidion.chordhelper.midieditor.PlaylistTableModel;
/**
* 仮想MIDIデバイスを含めたすべてのMIDIデバイスモデル {@link MidiTransceiverListModel} を収容するリスト
public String toString() { return "MIDI devices"; }
- private MidiSequenceEditor editorDialog;
- public MidiSequenceEditor getEditorDialog() { return editorDialog; }
-
private MidiSequencerModel sequencerModel;
public MidiSequencerModel getSequencerModel() { return sequencerModel; }
public MidiTransceiverListModelList(List<VirtualMidiDevice> guiVirtualDeviceList) {
//
- // GUI仮想MIDIデバイスリストの構築
+ // GUI仮想MIDIデバイス
MidiTransceiverListModel guiModels[] = new MidiTransceiverListModel[guiVirtualDeviceList.size()];
for( int i=0; i<guiVirtualDeviceList.size(); i++ ) {
addElement(guiModels[i] = new MidiTransceiverListModel(guiVirtualDeviceList.get(i), this));
System.out.println(ChordHelperApplet.VersionInfo.NAME +" : MIDI sequencer unavailable");
e.printStackTrace();
}
- // MIDIエディタの生成
- editorDialog = new MidiSequenceEditor(new PlaylistTableModel(sequencerModel));
- MidiTransceiverListModel eventTableDeviceModel;
- addElement(eventTableDeviceModel = new MidiTransceiverListModel(editorDialog.getEventTableMidiDevice(), this));
+ // その他のリアルMIDIデバイスの取得
MidiTransceiverListModel synthModel = null;
MidiTransceiverListModel firstMidiInModel = null;
MidiTransceiverListModel firstMidiOutModel = null;
MidiDevice.Info[] deviceInfos = MidiSystem.getMidiDeviceInfo();
for( MidiDevice.Info info : deviceInfos ) {
- // MIDIデバイスの取得
MidiDevice device;
try {
device = MidiSystem.getMidiDevice(info);
firstMidiOutModel,
sequencerModel,
firstMidiInModel,
- eventTableDeviceModel,
};
for( MidiTransceiverListModel m : openModels ) if( m != null ) {
m.getMidiDevice().open();
sequencerModel.connectToReceiverOf(synthModel);
sequencerModel.connectToReceiverOf(firstMidiOutModel);
}
- if( eventTableDeviceModel != null ) {
- eventTableDeviceModel.connectToReceiverOf(synthModel);
- eventTableDeviceModel.connectToReceiverOf(firstMidiOutModel);
- }
}
}
\ No newline at end of file
import camidion.chordhelper.ButtonIcon;
import camidion.chordhelper.ChordHelperApplet;
-import camidion.chordhelper.mididevice.AbstractVirtualMidiDevice;
import camidion.chordhelper.mididevice.MidiSequencerModel;
import camidion.chordhelper.mididevice.VirtualMidiDevice;
import camidion.chordhelper.music.MIDISpec;
}
};
+ private VirtualMidiDevice outputMidiDevice;
/**
* イベントリスト操作音出力先MIDIデバイスを返します。
*/
- public VirtualMidiDevice getEventTableMidiDevice() { return eventListTable.outputMidiDevice; }
+ //public VirtualMidiDevice getEventTableMidiDevice() { return eventListTable.outputMidiDevice; }
/**
* エラーメッセージダイアログを表示します。
* MIDIイベントリストテーブルビュー(選択中のトラックの中身)
*/
public class EventListTable extends JTable {
- private VirtualMidiDevice outputMidiDevice = new AbstractVirtualMidiDevice() {
- {
- info = new MyInfo();
- setMaxReceivers(0); // 送信専用とする(MIDI IN はサポートしない)
- }
- /**
- * MIDIデバイス情報
- */
- protected MyInfo info;
- @Override
- public Info getDeviceInfo() { return info; }
- class MyInfo extends Info {
- protected MyInfo() { super("MIDI Event Table Editor","Unknown vendor","MIDI event table editor",""); }
- }
- };
/**
* 新しいイベントリストテーブルを構築します。
* <p>データモデルとして一つのトラックのイベントリストを指定できます。
/**
* 新しい {@link MidiSequenceEditor} を構築します。
* @param playlistTableModel このエディタが参照するプレイリストモデル
+ * @param outputMidiDevice イベントテーブルの操作音出力先MIDIデバイス
*/
- public MidiSequenceEditor(PlaylistTableModel playlistTableModel) {
+ public MidiSequenceEditor(PlaylistTableModel playlistTableModel, VirtualMidiDevice outputMidiDevice) {
+ this.outputMidiDevice = outputMidiDevice;
sequenceListTable = new SequenceListTable(playlistTableModel);
trackListTable = new TrackListTable(
new SequenceTrackListTableModel(sequenceListTable.getModel(), null, null)
);
eventListTable = new EventListTable(new TrackEventListTableModel(trackListTable.getModel(), null));
- newSequenceDialog = new NewSequenceDialog(playlistTableModel, eventListTable.outputMidiDevice);
+ newSequenceDialog = new NewSequenceDialog(playlistTableModel, outputMidiDevice);
setTitle("MIDI Editor/Playlist - MIDI Chord Helper");
setBounds( 150, 200, 900, 500 );
setLayout(new FlowLayout());