From 6cbf837041165cd19d50448f2459c841bf01afcc Mon Sep 17 00:00:00 2001 From: Akiyoshi Kamide Date: Sun, 29 May 2016 01:28:39 +0900 Subject: [PATCH] =?utf8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?utf8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/camidion/chordhelper/ChordHelperApplet.java | 75 +++++++++++----------- .../chorddiagram/CapoComboBoxModel.java | 23 +++++++ .../chordhelper/chorddiagram/CapoSelecterView.java | 32 ++++----- .../chordhelper/chorddiagram/ChordDiagram.java | 8 +-- .../chorddiagram/ChordDiagramDisplay.java | 38 ++++------- .../chordhelper/chordmatrix/ChordMatrix.java | 45 ++++--------- .../chordhelper/midieditor/MidiSequenceEditor.java | 14 ++-- .../chordhelper/midieditor/PlaylistTableModel.java | 12 ++-- .../chordhelper/pianokeyboard/PianoKeyboard.java | 2 +- 9 files changed, 117 insertions(+), 132 deletions(-) create mode 100644 src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java diff --git a/src/camidion/chordhelper/ChordHelperApplet.java b/src/camidion/chordhelper/ChordHelperApplet.java index 6ac2ca6..9982074 100644 --- a/src/camidion/chordhelper/ChordHelperApplet.java +++ b/src/camidion/chordhelper/ChordHelperApplet.java @@ -51,6 +51,7 @@ import javax.swing.event.HyperlinkEvent; 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; @@ -278,7 +279,7 @@ public class ChordHelperApplet extends JApplet { */ 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/"; @@ -393,7 +394,7 @@ public class ChordHelperApplet extends JApplet { private TempoSelecter tempoSelecter; private TimeSignatureSelecter timesigSelecter; private KeySignatureLabel keysigLabel; - private JLabel songTitleLabel; + private JLabel songTitleLabel = new JLabel(); private AnoGakkiPane anoGakkiPane; private JToggleButton anoGakkiToggleButton; @@ -410,8 +411,10 @@ public class ChordHelperApplet extends JApplet { // 背景色の取得 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(); @@ -421,6 +424,11 @@ public class ChordHelperApplet extends JApplet { 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(); @@ -450,8 +458,9 @@ public class ChordHelperApplet extends JApplet { }); 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); // @@ -467,6 +476,7 @@ public class ChordHelperApplet extends JApplet { // MIDIエディタのイベントダイアログを、ピアノ鍵盤のイベント送出ダイアログと共用 keyboardPanel.setEventDialog(midiEditor.eventDialog); // + // 歌詞表示 lyricDisplay = new ChordTextField(sequencerModel) {{ addActionListener(new ActionListener() { @Override @@ -478,43 +488,36 @@ public class ChordHelperApplet extends JApplet { }}; 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 diff --git a/src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java b/src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java new file mode 100644 index 0000000..cfb0aef --- /dev/null +++ b/src/camidion/chordhelper/chorddiagram/CapoComboBoxModel.java @@ -0,0 +1,23 @@ +package camidion.chordhelper.chorddiagram; + +import javax.swing.ComboBoxModel; +import javax.swing.event.ListDataListener; + +/** + * カポ選択コンボボックスモデル(選択範囲:1~11) + */ +public class CapoComboBoxModel implements ComboBoxModel { + 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; } +} diff --git a/src/camidion/chordhelper/chorddiagram/CapoSelecterView.java b/src/camidion/chordhelper/chorddiagram/CapoSelecterView.java index 040de9e..204c2a7 100644 --- a/src/camidion/chordhelper/chorddiagram/CapoSelecterView.java +++ b/src/camidion/chordhelper/chorddiagram/CapoSelecterView.java @@ -4,7 +4,6 @@ import java.awt.event.ItemEvent; 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; @@ -12,29 +11,28 @@ 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 valueSelecter = new JComboBox() { - { - setMaximumRowCount(12); - setVisible(false); - } - }; + public JComboBox valueSelecter = new JComboBox() {{ + 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); @@ -43,14 +41,10 @@ public class CapoSelecterView extends JPanel implements ItemListener { * 指定されたデータモデルを操作するカポ選択ビューを構築します。 * @param model データモデル */ - public CapoSelecterView(ComboBoxModel model) { + public CapoSelecterView(CapoComboBoxModel model) { this(); valueSelecter.setModel(model); } - @Override - public void itemStateChanged(ItemEvent e) { - valueSelecter.setVisible(checkbox.isSelected()); - } /** * カポ位置を返します。 * @return カポ位置 diff --git a/src/camidion/chordhelper/chorddiagram/ChordDiagram.java b/src/camidion/chordhelper/chorddiagram/ChordDiagram.java index 9b39fa0..d2e7589 100644 --- a/src/camidion/chordhelper/chorddiagram/ChordDiagram.java +++ b/src/camidion/chordhelper/chorddiagram/ChordDiagram.java @@ -18,6 +18,7 @@ import java.util.Objects; 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; @@ -26,7 +27,6 @@ import javax.swing.SwingConstants; import camidion.chordhelper.ButtonIcon; import camidion.chordhelper.ChordDisplayLabel; -import camidion.chordhelper.ChordHelperApplet; import camidion.chordhelper.music.Chord; /** @@ -71,10 +71,10 @@ public class ChordDiagram extends JPanel { } /** * コードダイアグラムを構築します。 - * @param applet 親となるアプレット + * @param capoValueModel カポ値選択コンボボックスのデータモデル */ - public ChordDiagram(ChordHelperApplet applet) { - capoSelecterView.valueSelecter.setModel(applet.chordMatrix.capoValueModel); + public ChordDiagram(ComboBoxModel capoValueModel) { + capoSelecterView.valueSelecter.setModel(capoValueModel); setLayout(new BoxLayout(this, BoxLayout.Y_AXIS)); add(new JPanel() { { diff --git a/src/camidion/chordhelper/chorddiagram/ChordDiagramDisplay.java b/src/camidion/chordhelper/chorddiagram/ChordDiagramDisplay.java index b02d58e..a751ba9 100644 --- a/src/camidion/chordhelper/chorddiagram/ChordDiagramDisplay.java +++ b/src/camidion/chordhelper/chorddiagram/ChordDiagramDisplay.java @@ -27,8 +27,7 @@ import camidion.chordhelper.music.NoteSymbol; /** * コードダイアグラム表示部 */ -class ChordDiagramDisplay extends JComponent - implements MouseListener, MouseMotionListener { +class ChordDiagramDisplay extends JComponent implements MouseListener, MouseMotionListener { /** * 可視フレット数 */ @@ -60,8 +59,7 @@ class ChordDiagramDisplay extends JComponent /** * フレット方向の横スクロールバーで使用する境界つき値範囲 */ - DefaultBoundedRangeModel fretViewIndexModel - = new DefaultBoundedRangeModel( 0, VISIBLE_FRETS, 0, MAX_FRETS ); + DefaultBoundedRangeModel fretViewIndexModel = new DefaultBoundedRangeModel( 0, VISIBLE_FRETS, 0, MAX_FRETS ); /** * チューニング対象楽器 */ @@ -122,9 +120,7 @@ class ChordDiagramDisplay extends JComponent * 指定した弦を弾かないことを表す {@link PressingPoint} を構築します。 * @param stringIndex 弦インデックス */ - public PressingPoint(int stringIndex) { - this(-1,-1,stringIndex); - } + public PressingPoint(int stringIndex) { this(-1,-1,stringIndex); } /** * 指定した弦、フレットを押さえると * 指定されたコード構成音が鳴ることを表す {@link PressingPoint} を構築します。 @@ -151,7 +147,7 @@ class ChordDiagramDisplay extends JComponent /** * 押さえる場所リスト(配列要素として使えるようにするための空の継承クラス) */ - private class PressingPointList extends LinkedList { + private static class PressingPointList extends LinkedList { } /** * コードの押さえ方のバリエーション @@ -261,9 +257,7 @@ class ChordDiagramDisplay extends JComponent scanFret( stringIndex + 1 ); continue; } - if( hasValidNewVariation() ) { - add(validatingPoints.clone()); - } + if( hasValidNewVariation() ) add(validatingPoints.clone()); } } /** @@ -531,18 +525,13 @@ class ChordDiagramDisplay extends JComponent @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(); @@ -633,15 +622,10 @@ class ChordDiagramDisplay extends JComponent /** * コード(和音)を再設定します。 */ - 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(); } +} diff --git a/src/camidion/chordhelper/chordmatrix/ChordMatrix.java b/src/camidion/chordhelper/chordmatrix/ChordMatrix.java index b0c3b63..de63731 100644 --- a/src/camidion/chordhelper/chordmatrix/ChordMatrix.java +++ b/src/camidion/chordhelper/chordmatrix/ChordMatrix.java @@ -23,8 +23,6 @@ import java.awt.event.MouseWheelEvent; 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; @@ -32,6 +30,7 @@ import javax.swing.JPanel; 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; @@ -44,7 +43,7 @@ import camidion.chordhelper.music.SymbolLanguage; * 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 @@ -538,41 +537,23 @@ public class ChordMatrix extends JPanel private ColorSet currentColorset = normalModeColorset; /** - * カポ値選択コンボボックスのデータモデル - * (コードボタン側とコードダイアグラム側の両方から参照される) - */ - public ComboBoxModel capoValueModel = - new DefaultComboBoxModel() { - { - 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); // diff --git a/src/camidion/chordhelper/midieditor/MidiSequenceEditor.java b/src/camidion/chordhelper/midieditor/MidiSequenceEditor.java index 64e75a8..98b8cd5 100644 --- a/src/camidion/chordhelper/midieditor/MidiSequenceEditor.java +++ b/src/camidion/chordhelper/midieditor/MidiSequenceEditor.java @@ -96,12 +96,6 @@ public class MidiSequenceEditor extends JDialog { } }; - private VirtualMidiDevice outputMidiDevice; - /** - * イベントリスト操作音出力先MIDIデバイスを返します。 - */ - //public VirtualMidiDevice getEventTableMidiDevice() { return eventListTable.outputMidiDevice; } - /** * エラーメッセージダイアログを表示します。 * @param message エラーメッセージ @@ -221,6 +215,7 @@ public class MidiSequenceEditor extends JDialog { * MIDIイベント入力ダイアログ(イベント入力とイベント送出で共用) */ public MidiEventDialog eventDialog = new MidiEventDialog(); + private VirtualMidiDevice outputMidiDevice; /** * プレイリストビュー(シーケンスリスト) */ @@ -389,7 +384,7 @@ public class MidiSequenceEditor extends JDialog { // // セル内にプレイボタンがあれば、シングルクリックを受け付ける。 // プレイボタンのないセルは、ダブルクリックのみ受け付ける。 - return model.sequenceList.get(row).isOnSequencer() || me.getClickCount() == 2; + return model.getSequenceList().get(row).isOnSequencer() || me.getClickCount() == 2; } @Override public Object getCellEditorValue() { return null; } @@ -408,7 +403,7 @@ public class MidiSequenceEditor extends JDialog { ) { 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; } @@ -418,7 +413,7 @@ public class MidiSequenceEditor extends JDialog { 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( @@ -722,6 +717,7 @@ public class MidiSequenceEditor extends JDialog { newTrackModel.eventSelectionModel.addListSelectionListener(eventSelectionListener); } } + /** * イベント選択リスナー */ diff --git a/src/camidion/chordhelper/midieditor/PlaylistTableModel.java b/src/camidion/chordhelper/midieditor/PlaylistTableModel.java index 6bd4e12..f0fc9ad 100644 --- a/src/camidion/chordhelper/midieditor/PlaylistTableModel.java +++ b/src/camidion/chordhelper/midieditor/PlaylistTableModel.java @@ -60,7 +60,7 @@ public class PlaylistTableModel extends AbstractTableModel { }; /** * 新しいプレイリストのテーブルモデルを構築します。 - * @param sequencerModel MIDIシーケンサーモデル + * @param sequencerModel 連携するMIDIシーケンサーモデル */ public PlaylistTableModel(MidiSequencerModel sequencerModel) { this.sequencerModel = sequencerModel; @@ -74,7 +74,7 @@ public class PlaylistTableModel extends AbstractTableModel { /** * {@inheritDoc} * - *

EOT (End Of Track、type==0x2F) を受信したときの処理です。 + *

EOT (End Of Track、type==0x2F) を受信したとき、次の曲へ進みます。 *

*

これは MetaEventListener のための実装なので、多くの場合 * Swing EDT ではなく MIDI シーケンサの EDT から起動されます。 @@ -107,7 +107,7 @@ public class PlaylistTableModel extends AbstractTableModel { *

リピートモードの場合は同じ曲をもう一度再生、 * そうでない場合は次の曲へ進んで再生します。 * 次の曲がなければ、そこで停止します。 - * いずれの場合も局の先頭へ戻ります。 + * いずれの場合も曲の先頭へ戻ります。 *

*/ private void goNext() { @@ -134,7 +134,11 @@ public class PlaylistTableModel extends AbstractTableModel { /** * シーケンスリスト */ - List sequenceList = new Vector<>(); + private List sequenceList = new Vector<>(); + /** + * このプレイリストが保持している {@link SequenceTrackListTableModel} のリストを返します。 + */ + public List getSequenceList() { return sequenceList; } /** * 行が選択されているときだけイネーブルになるアクション */ diff --git a/src/camidion/chordhelper/pianokeyboard/PianoKeyboard.java b/src/camidion/chordhelper/pianokeyboard/PianoKeyboard.java index 9fe5fc4..e00e5f6 100644 --- a/src/camidion/chordhelper/pianokeyboard/PianoKeyboard.java +++ b/src/camidion/chordhelper/pianokeyboard/PianoKeyboard.java @@ -101,7 +101,7 @@ public class PianoKeyboard extends JComponent { /** * ノートのリスト。配列の要素として使えるようクラス名を割り当てます。 */ - private class NoteList extends LinkedList { + private static class NoteList extends LinkedList { // 何もすることはない } /** -- 2.11.0