1 package camidion.chordhelper;
\r
3 import java.awt.Color;
\r
4 import java.awt.Dimension;
\r
5 import java.awt.Graphics;
\r
6 import java.awt.event.InputEvent;
\r
7 import java.awt.event.MouseEvent;
\r
8 import java.awt.event.MouseListener;
\r
10 import javax.swing.JLabel;
\r
12 import camidion.chordhelper.chordmatrix.ChordMatrix;
\r
13 import camidion.chordhelper.music.Chord;
\r
14 import camidion.chordhelper.music.MIDISpec;
\r
15 import camidion.chordhelper.music.Music;
\r
16 import camidion.chordhelper.music.NoteSymbol;
\r
17 import camidion.chordhelper.pianokeyboard.PianoKeyboard;
\r
22 public class ChordDisplayLabel extends JLabel implements MouseListener {
\r
23 private String defaultString = null;
\r
24 private Chord chord = null;
\r
25 private int noteNumber = -1;
\r
26 private boolean isDark = false;
\r
27 private boolean isMouseEntered = false;
\r
30 * @param defaultString 初期表示する文字列
\r
31 * @param chordMatrix このラベルをクリックしたときに鳴らす和音ボタンマトリクス
\r
32 * @param keyboard このラベルをクリックしたときに鳴らす鍵盤
\r
34 public ChordDisplayLabel(String defaultString, ChordMatrix chordMatrix, PianoKeyboard keyboard) {
\r
35 super(defaultString, JLabel.CENTER);
\r
36 this.defaultString = defaultString;
\r
37 this.keyboard = keyboard;
\r
38 if( (this.chordMatrix = chordMatrix) != null ) {
\r
39 addMouseListener(this);
\r
40 addMouseWheelListener(chordMatrix);
\r
44 public void paint(Graphics g) {
\r
46 Dimension d = getSize();
\r
47 if( isMouseEntered && (noteNumber >= 0 || chord != null) ) {
\r
48 g.setColor(Color.gray);
\r
49 g.drawRect( 0, 0, d.width-1, d.height-1 );
\r
52 private PianoKeyboard keyboard = null;
\r
53 private ChordMatrix chordMatrix = null;
\r
55 public void mousePressed(MouseEvent e) {
\r
56 if( chord != null ) { // コードが表示されている場合
\r
57 if( (e.getModifiersEx() & InputEvent.BUTTON3_DOWN_MASK) != 0 ) {
\r
59 chordMatrix.setSelectedChord((Chord)null);
\r
63 // キーボードが指定されている場合、オリジナルキー(カポ反映済)のコードを使う。
\r
64 if( keyboard == null )
\r
65 chordMatrix.setSelectedChord(chord);
\r
67 chordMatrix.setSelectedChordCapo(chord);
\r
70 else if( noteNumber >= 0 ) { // 音階が表示されている場合
\r
71 keyboard.noteOn(noteNumber);
\r
75 public void mouseReleased(MouseEvent e) {
\r
76 if( noteNumber >= 0 ) keyboard.noteOff(noteNumber);
\r
79 public void mouseEntered(MouseEvent e) { mouseEntered(true); }
\r
81 public void mouseExited(MouseEvent e) { mouseEntered(false); }
\r
83 public void mouseClicked(MouseEvent e) {
\r
85 private void mouseEntered(boolean isMouseEntered) {
\r
86 this.isMouseEntered = isMouseEntered;
\r
87 if( noteNumber >= 0 || chord != null ) repaint();
\r
91 * @param noteNumber MIDIノート番号
\r
92 * @param isRhythmPart リズムパートのときtrue
\r
94 public void setNote(int noteNumber, boolean isRhythmPart) {
\r
95 setToolTipText(null);
\r
97 if( (this.noteNumber = noteNumber) < 0 ) {
\r
98 setText(defaultString);
\r
101 if( isRhythmPart ) {
\r
102 String pn = MIDISpec.getPercussionName(noteNumber);
\r
103 setText("MIDI note No." + noteNumber + " : " + pn);
\r
106 String ns = NoteSymbol.noteNoToSymbol(noteNumber);
\r
107 double f = Music.noteNoToFrequency(noteNumber);
\r
108 setText("Note: "+ns+" - MIDI note No."+noteNumber+" : "+Math.round(f)+"Hz");
\r
115 public void setChord(Chord chord) {
\r
116 this.noteNumber = -1;
\r
117 if( (this.chord = chord) == null ) {
\r
118 setText(defaultString);
\r
119 setToolTipText(null);
\r
123 setToolTipText("Chord: "+chord.toName());
\r
129 public void clear() { setNote(-1, false); }
\r
131 * ダークモードのON/OFFを切り替えます。
\r
132 * @param isDark ダークモードONのときtrue
\r
134 public void setDarkMode(boolean isDark) {
\r
135 this.isDark = isDark;
\r
136 if( chord != null ) setChordText();
\r
138 private void setChordText() {
\r
139 setText(chord.toHtmlString(isDark ? "#FFCC33" : "maroon"));
\r