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;
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;
* 指定された小節数の曲を、乱数で自動作曲してプレイリストへ追加します。
* @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());
/**
* プレイリスト上で現在選択されている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()} の戻り値をそのまま返します。
*/
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/";
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() {
//
// 背景色の取得
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();
}
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
});
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デバイス一覧のシーケンサと連携するプレイリストを構築
// MIDIエディタのイベントダイアログを、ピアノ鍵盤のイベント送出ダイアログと共用
keyboardPanel.setEventDialog(midiEditor.eventDialog);
//
+ // 歌詞表示
lyricDisplay = new ChordTextField(sequencerModel) {{
addActionListener(new ActionListener() {
@Override
}};
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
setPreferredSize(new Dimension(750,470));
}
@Override
+ public void destroy() {
+ deviceModelList.closeAllDevices();
+ super.destroy();
+ }
+ @Override
public void start() {
//
// コードボタンで設定されている現在の調を
System.gc();
if( midi_url != null ) {
addToPlaylist(midi_url);
- play();
+ try {
+ play();
+ } catch (InvalidMidiDataException ex) {
+ ex.printStackTrace();
+ }
}
}
@Override