}
public void clear() { setKey(new Key("C")); }
public void setKey( Key key ) {
- if( key == null ) {
- clear();
- return;
- }
+ if( key == null ) { clear(); return; }
keysigCombobox.setSelectedIndex( key.toCo5() + 7 );
- if( minorCheckbox == null )
- return;
- switch( key.majorMinor() ) {
- case Key.MINOR : minorCheckbox.setSelected(true); break;
- case Key.MAJOR : minorCheckbox.setSelected(false); break;
- }
+ if( minorCheckbox == null ) return;
+ minorCheckbox.setSelected(key.majorMinor() == Key.MajorMinor.MINOR);
}
public Key getKey() {
- int minor = (
- minorCheckbox == null ? Key.MAJOR_OR_MINOR :
- isMinor() ? Key.MINOR :
- Key.MAJOR
+ Key.MajorMinor majorMinor = (
+ minorCheckbox == null ? Key.MajorMinor.MAJOR_OR_MINOR :
+ isMinor() ? Key.MajorMinor.MINOR :
+ Key.MajorMinor.MAJOR
);
- return new Key(getKeyCo5(),minor);
+ return new Key(getKeyCo5(),majorMinor);
}
public int getKeyCo5() {
return keysigCombobox.getSelectedIndex() - 7;
*/
public class Key implements Cloneable {
/**
- * ã\83¡ã\82¸ã\83£ã\83¼ã\81\8bã\83\9eã\82¤ã\83\8aã\83¼ã\81\8bã\81\8cç\89¹å®\9aã\81§ã\81\8dã\81¦ã\81\84ã\81ªã\81\84ã\81\93ã\81¨ã\82\92示ã\81\99å\80¤
+ * ã\83¡ã\82¸ã\83£ã\83¼ã\81¨ã\83\9eã\82¤ã\83\8aã\83¼ã\81®ã\81©ã\81¡ã\82\89ã\81\8bã\81\82ã\82\8bã\81\84ã\81¯ä¸¡æ\96¹ã\81§ã\81\82ã\82\8bã\81\93ã\81¨ã\82\92示ã\81\99å\9e\8b
*/
- public static final int MAJOR_OR_MINOR = 0;
- /**
- * メジャーキー(長調)
- */
- public static final int MAJOR = 1;
- /**
- * マイナーキー(短調)
- */
- public static final int MINOR = -1;
+ public enum MajorMinor {
+ /** メジャーキー(長調) */
+ MAJOR {
+ @Override
+ public MajorMinor opposite() { return MINOR; }
+ },
+ /** マイナーキー(短調) */
+ MINOR {
+ @Override
+ public MajorMinor opposite() { return MAJOR; }
+ },
+ /** メジャーまたはマイナー */
+ MAJOR_OR_MINOR;
+
+ /** 反対の調を返します。 */
+ public MajorMinor opposite() { return this; }
+ }
/**
* この調の五度圏インデックス値
*/
/**
* メジャー・マイナーの種別
*/
- private int majorMinor;
+ private MajorMinor majorMinor;
/**
* 調号が空のキー(ハ長調またはイ短調)を構築します。
*/
*
* @param co5 五度圏インデックス値
*/
- public Key(int co5) { setKey(co5, MAJOR_OR_MINOR); }
+ public Key(int co5) { setKey(co5, MajorMinor.MAJOR_OR_MINOR); }
/**
* 指定の五度圏インデックス値を持つ、
* メジャー/マイナーを指定した調を構築します。
* @param co5 五度圏インデックス値
* @param majorMinor {@link #MAJOR}、{@link #MINOR}、{@link #MAJOR_OR_MINOR} のいずれか
*/
- public Key(int co5, int majorMinor) { setKey(co5, majorMinor); }
+ public Key(int co5, MajorMinor majorMinor) { setKey(co5, majorMinor); }
/**
* 指定の五度圏インデックス値を持つ、
* メジャー/マイナーの明確な調を構築します。
return false;
}
@Override
- public int hashCode() { return majorMinor * 256 + co5 ; }
+ public int hashCode() { return majorMinor.ordinal() * 256 + co5 ; }
private void setKey(int co5, boolean isMinor) {
- setKey( co5, isMinor ? MINOR : MAJOR );
+ setKey( co5, isMinor ? MajorMinor.MINOR : MajorMinor.MAJOR );
}
- private void setKey(int co5, int majorMinor) {
+ private void setKey(int co5, MajorMinor majorMinor) {
this.co5 = co5;
this.majorMinor = majorMinor;
normalize();
public byte[] getBytes() {
byte data[] = new byte[2];
data[0] = (byte)(co5 & 0xFF);
- data[1] = (byte)(majorMinor == MINOR ? 1 : 0);
+ data[1] = (byte)(majorMinor == MajorMinor.MINOR ? 1 : 0);
return data;
}
/**
public int toCo5() { return co5; }
/**
* メジャー/マイナーの区別を返します。
- * @return {@link #MAJOR}、{@link #MINOR}、{@link #MAJOR_OR_MINOR} のいずれか
+ * @return メジャー/マイナーの区別
*/
- public int majorMinor() { return majorMinor; }
+ public MajorMinor majorMinor() { return majorMinor; }
/**
* 相対ドの音階を返します。
* @return 相対ドの音階(0~11)
*/
public int rootNoteNumber() {
int n = relativeDo();
- return majorMinor==MINOR ? Music.mod12(n-3) : n;
+ return majorMinor==MajorMinor.MINOR ? Music.mod12(n-3) : n;
}
/**
* 指定されたノート番号の音が、この調のスケールの構成音か調べます。
*
* @return 平行調
*/
- public Key relativeKey() { return new Key(co5, -majorMinor); }
+ public Key relativeKey() { return new Key(co5, majorMinor.opposite()); }
/**
* 同主調を生成して返します。
* これは元の調とルート音が同じで、メジャーとマイナーが異なる調です。
*/
public Key parallelKey() {
switch( majorMinor ) {
- case MAJOR: return new Key( co5-3, MINOR );
- case MINOR: return new Key( co5+3, MAJOR );
+ case MAJOR: return new Key( co5-3, MajorMinor.MINOR );
+ case MINOR: return new Key( co5+3, MajorMinor.MAJOR );
default: return new Key(co5);
}
}