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;
*/
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.20160528.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;
// 背景色の取得
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(); }
});
}};
+ 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();
});
keyboardCenterPanel.keyboard.setPreferredSize(new Dimension(571, 80));
}};
- // MIDIデバイス一覧を構築
VirtualMidiDevice guiMidiDevice = keyboardPanel.keyboardCenterPanel.keyboard.midiDevice;
+ //
+ // MIDIデバイス一覧を構築
MidiTransceiverListModelList deviceModelList = new MidiTransceiverListModelList(Arrays.asList(guiMidiDevice));
(midiDeviceDialog = new MidiDeviceDialog(deviceModelList)).setIconImage(iconImage);
//
// 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
--- /dev/null
+package camidion.chordhelper.chorddiagram;
+
+import javax.swing.ComboBoxModel;
+import javax.swing.event.ListDataListener;
+
+/**
+ * カポ選択コンボボックスモデル(選択範囲:1~11)
+ */
+public class CapoComboBoxModel implements ComboBoxModel<Integer> {
+ private Integer selectedValue = Integer.valueOf(1);
+ @Override
+ public int getSize() { return 11; }
+ @Override
+ public Integer getElementAt(int index) { return Integer.valueOf(index + 1); }
+ @Override
+ public void addListDataListener(ListDataListener l) { }
+ @Override
+ public void removeListDataListener(ListDataListener l) { }
+ @Override
+ public void setSelectedItem(Object item) { selectedValue = (Integer)item; }
+ @Override
+ public Object getSelectedItem() { return selectedValue; }
+}
import java.awt.event.ItemListener;
import javax.swing.BoxLayout;
-import javax.swing.ComboBoxModel;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JPanel;
/**
* カポ選択ビュー
*/
-public class CapoSelecterView extends JPanel implements ItemListener {
+public class CapoSelecterView extends JPanel {
/**
* カポON/OFFチェックボックス
*/
- public JCheckBox checkbox = new JCheckBox("Capo") {
- {
- setOpaque(false);
- }
- };
+ public JCheckBox checkbox = new JCheckBox("Capo") {{ setOpaque(false); }};
/**
* カポ位置選択コンボボックス
*/
- public JComboBox<Integer> valueSelecter = new JComboBox<Integer>() {
- {
- setMaximumRowCount(12);
- setVisible(false);
- }
- };
+ public JComboBox<Integer> valueSelecter = new JComboBox<Integer>() {{
+ setMaximumRowCount(12);
+ setVisible(false);
+ }};
/**
* カポ選択ビューを構築します。
*/
public CapoSelecterView() {
- checkbox.addItemListener(this);
+ checkbox.addItemListener(new ItemListener() {
+ @Override
+ public void itemStateChanged(ItemEvent e) {
+ valueSelecter.setVisible(checkbox.isSelected());
+ }
+ });
setLayout(new BoxLayout(this, BoxLayout.X_AXIS));
add(checkbox);
add(valueSelecter);
* 指定されたデータモデルを操作するカポ選択ビューを構築します。
* @param model データモデル
*/
- public CapoSelecterView(ComboBoxModel<Integer> model) {
+ public CapoSelecterView(CapoComboBoxModel model) {
this();
valueSelecter.setModel(model);
}
- @Override
- public void itemStateChanged(ItemEvent e) {
- valueSelecter.setVisible(checkbox.isSelected());
- }
/**
* カポ位置を返します。
* @return カポ位置
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.ButtonGroup;
+import javax.swing.ComboBoxModel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JScrollBar;
import camidion.chordhelper.ButtonIcon;
import camidion.chordhelper.ChordDisplayLabel;
-import camidion.chordhelper.ChordHelperApplet;
import camidion.chordhelper.music.Chord;
/**
}
/**
* コードダイアグラムを構築します。
- * @param applet 親となるアプレット
+ * @param capoValueModel カポ値選択コンボボックスのデータモデル
*/
- public ChordDiagram(ChordHelperApplet applet) {
- capoSelecterView.valueSelecter.setModel(applet.chordMatrix.capoValueModel);
+ public ChordDiagram(ComboBoxModel<Integer> capoValueModel) {
+ capoSelecterView.valueSelecter.setModel(capoValueModel);
setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
add(new JPanel() {
{
/**
* コードダイアグラム表示部
*/
-class ChordDiagramDisplay extends JComponent
- implements MouseListener, MouseMotionListener {
+class ChordDiagramDisplay extends JComponent implements MouseListener, MouseMotionListener {
/**
* 可視フレット数
*/
/**
* フレット方向の横スクロールバーで使用する境界つき値範囲
*/
- DefaultBoundedRangeModel fretViewIndexModel
- = new DefaultBoundedRangeModel( 0, VISIBLE_FRETS, 0, MAX_FRETS );
+ DefaultBoundedRangeModel fretViewIndexModel = new DefaultBoundedRangeModel( 0, VISIBLE_FRETS, 0, MAX_FRETS );
/**
* チューニング対象楽器
*/
* 指定した弦を弾かないことを表す {@link PressingPoint} を構築します。
* @param stringIndex 弦インデックス
*/
- public PressingPoint(int stringIndex) {
- this(-1,-1,stringIndex);
- }
+ public PressingPoint(int stringIndex) { this(-1,-1,stringIndex); }
/**
* 指定した弦、フレットを押さえると
* 指定されたコード構成音が鳴ることを表す {@link PressingPoint} を構築します。
/**
* 押さえる場所リスト(配列要素として使えるようにするための空の継承クラス)
*/
- private class PressingPointList extends LinkedList<PressingPoint> {
+ private static class PressingPointList extends LinkedList<PressingPoint> {
}
/**
* コードの押さえ方のバリエーション
scanFret( stringIndex + 1 );
continue;
}
- if( hasValidNewVariation() ) {
- add(validatingPoints.clone());
- }
+ if( hasValidNewVariation() ) add(validatingPoints.clone());
}
}
/**
@Override
public void mouseReleased(MouseEvent e) { }
@Override
- public void mouseEntered(MouseEvent e) {
- mouseMoved(e);
- }
+ public void mouseEntered(MouseEvent e) { mouseMoved(e); }
@Override
- public void mouseExited(MouseEvent e) {
- mouseMoved(e);
- }
+ public void mouseExited(MouseEvent e) { mouseMoved(e); }
@Override
public void mouseClicked(MouseEvent e) { }
@Override
- public void mouseDragged(MouseEvent e) {
- }
+ public void mouseDragged(MouseEvent e) { }
@Override
public void mouseMoved(MouseEvent e) {
Point point = e.getPoint();
/**
* コード(和音)を再設定します。
*/
- public void setChord() {
- setChord(chordVariations.chord);
- }
+ public void setChord() { setChord(chordVariations.chord); }
/**
* コード(和音)を設定します。
* @param chord コード
*/
- public void setChord(Chord chord) {
- chordVariations.setChord(chord);
- repaint();
- }
-}
\ No newline at end of file
+ public void setChord(Chord chord) { chordVariations.setChord(chord); repaint(); }
+}
import java.awt.event.MouseWheelListener;
import java.util.ArrayList;
-import javax.swing.ComboBoxModel;
-import javax.swing.DefaultComboBoxModel;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import camidion.chordhelper.ButtonIcon;
import camidion.chordhelper.ChordDisplayLabel;
+import camidion.chordhelper.chorddiagram.CapoComboBoxModel;
import camidion.chordhelper.chorddiagram.CapoSelecterView;
import camidion.chordhelper.midieditor.SequenceTickIndex;
import camidion.chordhelper.music.Chord;
* MIDI Chord Helper 用のコードボタンマトリクス
*
* @author
- * Copyright (C) 2004-2013 Akiyoshi Kamide
+ * Copyright (C) 2004-2016 Akiyoshi Kamide
* http://www.yk.rim.or.jp/~kamide/music/chordhelper/
*/
public class ChordMatrix extends JPanel
private ColorSet currentColorset = normalModeColorset;
/**
- * カポ値選択コンボボックスのデータモデル
- * (コードボタン側とコードダイアグラム側の両方から参照される)
- */
- public ComboBoxModel<Integer> capoValueModel =
- new DefaultComboBoxModel<Integer>() {
- {
- for( int i=1; i<=Music.SEMITONES_PER_OCTAVE-1; i++ )
- addElement(i);
- }
- };
- /**
* カポ値選択コンボボックス(コードボタン側ビュー)
*/
- public CapoSelecterView capoSelecter = new CapoSelecterView(capoValueModel) {
- private void capoChanged() {
- ChordMatrix.this.capoChanged(getCapo());
- }
- {
- checkbox.addItemListener(
- new ItemListener() {
- public void itemStateChanged(ItemEvent e) {capoChanged();}
- }
- );
- valueSelecter.addActionListener(
- new ActionListener() {
- public void actionPerformed(ActionEvent e) {capoChanged();}
- }
- );
- }
- };
+ public CapoSelecterView capoSelecter;
/**
* コードボタンマトリクスの構築
+ * @param capoValueModel カポ選択値モデル
*/
- public ChordMatrix() {
+ public ChordMatrix(CapoComboBoxModel capoValueModel) {
+ capoSelecter = new CapoSelecterView(capoValueModel) {{
+ checkbox.addItemListener(new ItemListener() {
+ public void itemStateChanged(ItemEvent e) {capoChanged(getCapo());}
+ });
+ valueSelecter.addActionListener(new ActionListener() {
+ public void actionPerformed(ActionEvent e) {capoChanged(getCapo());}
+ });
+ }};
int i, v;
Dimension buttonSize = new Dimension(28,26);
//
}
};
- private VirtualMidiDevice outputMidiDevice;
- /**
- * イベントリスト操作音出力先MIDIデバイスを返します。
- */
- //public VirtualMidiDevice getEventTableMidiDevice() { return eventListTable.outputMidiDevice; }
-
/**
* エラーメッセージダイアログを表示します。
* @param message エラーメッセージ
* MIDIイベント入力ダイアログ(イベント入力とイベント送出で共用)
*/
public MidiEventDialog eventDialog = new MidiEventDialog();
+ private VirtualMidiDevice outputMidiDevice;
/**
* プレイリストビュー(シーケンスリスト)
*/
//
// セル内にプレイボタンがあれば、シングルクリックを受け付ける。
// プレイボタンのないセルは、ダブルクリックのみ受け付ける。
- return model.sequenceList.get(row).isOnSequencer() || me.getClickCount() == 2;
+ return model.getSequenceList().get(row).isOnSequencer() || me.getClickCount() == 2;
}
@Override
public Object getCellEditorValue() { return null; }
) {
fireEditingStopped();
PlaylistTableModel model = getModel();
- if( model.sequenceList.get(row).isOnSequencer() ) return playButton;
+ if( model.getSequenceList().get(row).isOnSequencer() ) return playButton;
model.loadToSequencer(row);
return null;
}
boolean hasFocus, int row, int column
) {
PlaylistTableModel model = getModel();
- if(model.sequenceList.get(row).isOnSequencer()) return playButton;
+ if(model.getSequenceList().get(row).isOnSequencer()) return playButton;
Class<?> cc = model.getColumnClass(column);
TableCellRenderer defaultRenderer = table.getDefaultRenderer(cc);
return defaultRenderer.getTableCellRendererComponent(
newTrackModel.eventSelectionModel.addListSelectionListener(eventSelectionListener);
}
}
+
/**
* イベント選択リスナー
*/
};
/**
* 新しいプレイリストのテーブルモデルを構築します。
- * @param sequencerModel MIDIシーケンサーモデル
+ * @param sequencerModel 連携するMIDIシーケンサーモデル
*/
public PlaylistTableModel(MidiSequencerModel sequencerModel) {
this.sequencerModel = sequencerModel;
/**
* {@inheritDoc}
*
- * <p>EOT (End Of Trackã\80\81type==0x2F) ã\82\92å\8f\97ä¿¡ã\81\97ã\81\9fã\81¨ã\81\8dã\81®å\87¦ç\90\86ã\81§す。
+ * <p>EOT (End Of Trackã\80\81type==0x2F) ã\82\92å\8f\97ä¿¡ã\81\97ã\81\9fã\81¨ã\81\8dã\80\81次ã\81®æ\9b²ã\81¸é\80²ã\81¿ã\81¾す。
* </p>
* <p>これは MetaEventListener のための実装なので、多くの場合
* Swing EDT ではなく MIDI シーケンサの EDT から起動されます。
* <p>リピートモードの場合は同じ曲をもう一度再生、
* そうでない場合は次の曲へ進んで再生します。
* 次の曲がなければ、そこで停止します。
- * いずれの場合も局の先頭へ戻ります。
+ * いずれの場合も曲の先頭へ戻ります。
* </p>
*/
private void goNext() {
/**
* シーケンスリスト
*/
- List<SequenceTrackListTableModel> sequenceList = new Vector<>();
+ private List<SequenceTrackListTableModel> sequenceList = new Vector<>();
+ /**
+ * このプレイリストが保持している {@link SequenceTrackListTableModel} のリストを返します。
+ */
+ public List<SequenceTrackListTableModel> getSequenceList() { return sequenceList; }
/**
* 行が選択されているときだけイネーブルになるアクション
*/
/**
* ノートのリスト。配列の要素として使えるようクラス名を割り当てます。
*/
- private class NoteList extends LinkedList<Integer> {
+ private static class NoteList extends LinkedList<Integer> {
// 何もすることはない
}
/**