OSDN Git Service

リファクタリング(クラスの整理)
[midichordhelper/MIDIChordHelper.git] / src / camidion / chordhelper / music / Key.java
index 22ef914..7240b3c 100644 (file)
@@ -18,6 +18,11 @@ public class Key {
         */
        public static final int MAX_SHARPS_OR_FLATS = 7;
        /**
+        * 調号が空(C/Am ハ長調またはイ短調)で、メジャー・マイナーの区別のない調
+        */
+       public static final Key C_MAJOR_OR_A_MINOR = new Key();
+       private Key() { }
+       /**
         * キー指定(メジャー/マイナー/両方)
         */
        public enum MajorMinor {
@@ -60,10 +65,6 @@ public class Key {
         */
        private MajorMinor majorMinor = MajorMinor.MAJOR_OR_MINOR;
        /**
-        * 調号が空(C/Am ハ長調またはイ短調)で、メジャー・マイナーの区別のない調を構築します。
-        */
-       public Key() { }
-       /**
         * 指定の五度圏インデックス値を持つ、メジャー・マイナーの区別のない調を構築します。
         *
         * @param co5 五度圏インデックス値
@@ -108,7 +109,7 @@ public class Key {
         * @throw IllegalArgumentException 引数が空文字列の場合、または音名で始まっていない場合
         */
        public Key(String keySymbol) throws IllegalArgumentException {
-               co5 = NoteSymbol.co5OfSymbol(keySymbol);
+               co5 = Note.toCo5Of(keySymbol);
                if( keySymbol.matches(".*m") ) { majorMinor = MajorMinor.MINOR; co5 -= 3; }
                else majorMinor = MajorMinor.MAJOR;
                normalize();
@@ -117,7 +118,7 @@ public class Key {
         * 指定されたコードと同名、または最も近い調を構築します。
         * <ul>
         * <li>コード構成音に短3度があればマイナー、なければメジャーとなります(区別なしになることはありません)。</li>
-        * <li>調として存在しないコード(例:A)が来た場合、存在する異名同音の調(例:B♭)に置き換えられます。</li>
+        * <li>調として存在しないコード(例:A)が来た場合、存在する異名同音の調(例:B♭)に置き換えられます。</li>
         * </ul>
         * @param chord コード(和音)
         */
@@ -134,7 +135,7 @@ public class Key {
         */
        private void normalize() {
                if( co5 >= -MAX_SHARPS_OR_FLATS && co5 <= MAX_SHARPS_OR_FLATS ) return;
-               if( (co5 = Music.mod12(co5)) > 6 ) co5 -= Music.SEMITONES_PER_OCTAVE;
+               if( (co5 = Note.mod12(co5)) > 6 ) co5 -= Note.SEMITONES_PER_OCTAVE;
        }
        /**
         * 五度圏インデックス値を返します。
@@ -164,15 +165,16 @@ public class Key {
         */
        @Override
        public String toString() {
-               String s = toStringIn(NoteSymbol.Language.SYMBOL);
-               if(majorMinor == MajorMinor.MAJOR_OR_MINOR) s = signature() + " : " + s;
+               String s = toStringIn(Note.Language.SYMBOL);
+               if( majorMinor == MajorMinor.MAJOR_OR_MINOR ) s = signature() + " : " + s;
                return s;
        }
        /**
-        * この調の文字列表現を、指定された形式で返します。
+        * この調の文字列表現を、指定された言語モードで返します。
+        * @param language 言語モード
         * @return この調の文字列表現
         */
-       public String toStringIn(NoteSymbol.Language language) {
+       public String toStringIn(Note.Language language) {
                return language.stringOf(this);
        }
        /**
@@ -214,30 +216,31 @@ public class Key {
                return new byte[] {(byte) co5, (byte) ((majorMinor == MajorMinor.MINOR) ? 1 : 0)};
        }
        /**
-        * 相対ドの音階を返します。
+        * この調の相対ドの音階を返します。
         * @return 相対ドの音階(0~11)
         */
-       public int relativeDo() { return NoteSymbol.majorCo5ToNoteNumber(co5); }
+       public int relativeDo() { return Note.mod12(Note.toggleCo5(co5)); }
        /**
         * この調のルート音を表すノート番号(オクターブ抜き)を返します。
-        * メジャーキーの場合は相対ド、
-        * マイナーキーの場合は相対ラの音階です。
+        * メジャーキーの場合は相対ド、マイナーキーの場合は相対ラの音階です。
         *
         * @return キーのルート音(0~11)
         */
        public int rootNoteNumber() {
-               int n = relativeDo();
-               return majorMinor==MajorMinor.MINOR ? Music.mod12(n-3) : n;
+               return majorMinor==MajorMinor.MINOR ? Note.mod12(Note.toggleCo5(co5) - 3) : relativeDo();
        }
        /**
-        * 指定されたノート番号の音が、この調のスケールの構成音か調べます。
-        * メジャーキーの場合はメジャースケール、
-        * マイナーキーの場合はナチュラルマイナースケールとして判断されます。
+        * 指定されたMIDIノート番号の示す音階が、この調のメジャースケールまたは
+        * ナチュラルマイナースケールの構成音に該当するか調べます。
+        *
+        * キーがハ長調またはイ短調の場合、白鍵のときにtrue、黒鍵のときにfalseを返します。
         *
         * @param noteNumber ノート番号
         * @return 指定されたノート番号がこのキーのスケールの構成音ならtrue
         */
-       public boolean isOnScale(int noteNumber) { return Music.isOnScale(noteNumber, co5); }
+       public boolean isOnScale(int noteNumber) {
+               return Note.mod12(Note.toggleCo5(noteNumber) - co5 + 1) < 7 ;
+       }
        /**
         * この調に対する平行調を返します。
         * これは元の調と同じ調号を持つ、メジャーとマイナーが異なる調です。
@@ -260,8 +263,8 @@ public class Key {
                return mmo.equals(majorMinor) ? this : new Key(co5 - 3 * majorMinor.index(), mmo);
        }
        /**
-        * この調に異名同音の調があればそれを返します。
-        * <p>ä¾\8bã\81\88ã\81°ã\80\81â\99­ï¼\95å\80\8bï¼\88\99­ã\83¡ã\82¸ã\83£ã\83¼ï¼\89ã\81®å ´å\90\88ã\81¯â\99¯ï¼\97å\80\8bï¼\88\99¯ã\83¡ã\82¸ã\83£ã\83¼ï¼\89ã\81«ç½®æ\8f\9bã\81\95ã\82\8cます。
+        * ã\81\93ã\81®èª¿ã\81«ç\95°å\90\8då\90\8cé\9f³ã\81®èª¿ã\81\8cã\81\82ã\82\8cã\81°ã\80\81ã\81\9dã\82\8cã\82\92è¿\94ã\81\97ã\81¾ã\81\99ã\80\82
+        * <p>ä¾\8bã\81\88ã\81°ã\80\81â\99­ï¼\95å\80\8bï¼\88\99­ã\83¡ã\82¸ã\83£ã\83¼ï¼\89ã\81®å ´å\90\88ã\80\81ç\95°å\90\8då\90\8cé\9f³ã\81®èª¿ã\81¯â\99¯ï¼\97å\80\8bï¼\88\99¯ã\83¡ã\82¸ã\83£ã\83¼ï¼\89ã\81¨ã\81ªã\82\8aます。
         * 異名同音の調が存在しない調(4♯~4♭)に対してこのメソッドを呼び出した場合、
         * この調自身を返します。
         * </p>
@@ -280,13 +283,13 @@ public class Key {
         * @return 移調した調
         */
        public Key transposedKey(int chromaticOffset) {
-               return chromaticOffset == 0 ? this : new Key(Music.transposeCo5(co5, chromaticOffset), majorMinor);
+               return chromaticOffset == 0 ? this : new Key(Note.transposeCo5(co5, chromaticOffset), majorMinor);
        }
        /**
         * 五度圏で真裏にあたる調を返します。
         * @return 五度圏で真裏にあたる調
         */
        public Key createOppositeKey() {
-               return new Key(Music.oppositeCo5(co5), majorMinor);
+               return new Key(Note.oppositeCo5(co5), majorMinor);
        }
 }