OSDN Git Service

リファクタリング
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Wed, 23 Nov 2016 16:43:17 +0000 (01:43 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Wed, 23 Nov 2016 16:43:17 +0000 (01:43 +0900)
src/camidion/chordhelper/ChordHelperApplet.java
src/camidion/chordhelper/music/Key.java
src/camidion/chordhelper/music/NoteSymbol.java
src/camidion/chordhelper/music/SymbolLanguage.java

index b1da598..808ca65 100644 (file)
@@ -283,7 +283,7 @@ public class ChordHelperApplet extends JApplet {
         */
        public static class VersionInfo {
                public static final String      NAME = "MIDI Chord Helper";
-               public static final String      VERSION = "Ver.20161121.1";
+               public static final String      VERSION = "Ver.20161123.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/";
index a5ad766..0caac4b 100644 (file)
@@ -258,7 +258,7 @@ public class Key implements Cloneable {
         * @return この調の文字列表現
         */
        public String toStringIn(SymbolLanguage language) {
-               return language.toStringIn(new NoteSymbol(co5), majorMinor);
+               return language.keyOf(new NoteSymbol(co5), majorMinor);
        }
        /**
         * 調号を表す半角文字列を返します。
index 43ddea2..cca5fec 100644 (file)
@@ -129,8 +129,7 @@ public class NoteSymbol implements Cloneable {
        }
        /**
         * 指定した言語モードとメジャーマイナー種別における文字列表現を返します。
-        * <p>マイナーが指定された場合、
-        * 五度圏インデックス値を3つ進めた音階として返します。
+        * <p>マイナーが指定された場合、五度圏インデックス値を3つ進めた音階として返します。
         * 例えば、{@link #toCo5()} の戻り値が0の場合、
         * メジャーが指定されていれば C を返しますが、
         * マイナーが指定されると A を返します。
@@ -141,30 +140,26 @@ public class NoteSymbol implements Cloneable {
         * @return 文字列表現
         */
        public String toStringIn(SymbolLanguage language, boolean isMinor) {
-               int co5_s771 = majorCo5 + 15; // Shift 7 + 7 + 1 = 15 steps
-               if( isMinor ) {
-                       // When co5 is for minor (key or chord), shift 3 steps more
-                       co5_s771 += 3;
-               }
-               if( co5_s771 < 0 || co5_s771 >= 35 ) {
-                       //
-                       // 35種類の音名の範囲に入らないような値が来てしまった場合は、
-                       // それを調号として見たときに 5b ~ 6# の範囲に収まるような異名同音(enharmonic)に置き換える。
-                       //
-                       co5_s771 = Music.mod12(co5_s771);  // returns 0(Fbb) ... 7(Fb) 8(Cb) 9(Gb) 10(Db) 11(Ab)
+               int co5index771 = majorCo5 + 15; // 0(Fbb) -> 7(Fb) -> 14(F) -> 15(C)
+               if( isMinor ) co5index771 += 3; // 15(C) -> 18(Am)
+               if( co5index771 < 0 || co5index771 >= 35 ) {
+                       // インデックスOB発生の恐れがある場合
+                       // 調号 5b ~ 6# の範囲に収まるルート音となるような異名同音(enharmonic)に置き換える
+                       co5index771 = Music.mod12(co5index771);  // returns 0(Fbb) ... 7(Fb) 8(Cb) 9(Gb) 10(Db) 11(Ab)
                        if( isMinor ) {
-                               if( co5_s771 == 0 )
-                                       co5_s771 += Music.SEMITONES_PER_OCTAVE * 2; // 0(Fbbm)+24 = 24(D#m)
+                               // 18(Am)
+                               if( co5index771 == 0 )
+                                       co5index771 += Music.SEMITONES_PER_OCTAVE * 2; // 0(Fbbm) -> 24(D#m 5#)
                                else
-                                       co5_s771 += Music.SEMITONES_PER_OCTAVE;  // 1(Cbbm)+12 = 13(Bbm)
+                                       co5index771 += Music.SEMITONES_PER_OCTAVE;  // 1(Cbbm) -> 13(Bbm 5b)
                        }
                        else {
-                               if( co5_s771 < 10 )
-                                       co5_s771 += Music.SEMITONES_PER_OCTAVE;  // 0(Fbb)+12 = 12(Eb), 9(Gb)+12 = 21(F#)
+                               // 15(C)
+                               if( co5index771 < 10 )  // 0(Fbb) -> 12(Eb 3b), 9(Gb) -> 21(F# 6#)
+                                       co5index771 += Music.SEMITONES_PER_OCTAVE;
                        }
                }
-               int sharpFlatIndex = co5_s771 / 7;
-               return language.toNoteSymbol(co5_s771 - sharpFlatIndex * 7, sharpFlatIndex);
+               return language.noteSymbolOf(co5index771);
        }
        /**
         * 指定の最大文字数の範囲で、MIDIノート番号が示す音名を返します。
index 40016c1..91e733e 100644 (file)
@@ -61,23 +61,28 @@ public enum SymbolLanguage {
                this.majorMinorDelimiter = majorMinorDelimiter;
        }
        /**
-        * 音名を返します。
-        * @param noteIndex FCGDAEBの音名インデックス(0~6)
-        * @param sharpFlatIndex 0=ダブルフラット、1=フラット、2=ナチュラル、3=シャープ、4=ダブルシャープ
+        * 補正した五度圏インデックスに該当する音名を返します。
+        * 負数を避けるため、C=0ではなく、+15した値、
+        * すなわちFbb=0になるよう補正したインデックスを使います。
+        * @param co5index771 補正した五度圏インデックス(範囲:0~34)
+        * (Fbb=0, Cbb=1, .. F=14, C=15, .. F#=21, C#=22, .. B#=27, Fx=28, .. Bx=34)
         * @return 音名(例:Bb、B flat、変ロ)
+        * @throws IndexOutOfBoundsException 補正した五度圏インデックスが範囲を外れている場合
         */
-       public String toNoteSymbol(int noteIndex, int sharpFlatIndex) {
-               String note = notes.substring( noteIndex, noteIndex+1 );
+       public String noteSymbolOf(int co5index771) {
+               int sharpFlatIndex = co5index771 / 7; // 0 1 2 3 4
+               int noteSymbolIndex = co5index771 - sharpFlatIndex * 7; // 0 1 2 3 4 5 6
+               String note = notes.substring(noteSymbolIndex, noteSymbolIndex+1);
                String sharpFlat = sharpFlatList.get(sharpFlatIndex);
                return preSharpFlat ? sharpFlat + note : note + sharpFlat;
        }
        /**
-        * 調の文字列表現を返します。
+        * 調の文字列表現を返します。メジャー/マイナーの区別が不明な場合、両方の表現を返します。
         * @param note 音名
         * @param majorMinor -1:マイナー 0:不明 1:メジャー
         * @return 調の文字列表現
         */
-       public String toStringIn(NoteSymbol note, int majorMinor) {
+       public String keyOf(NoteSymbol note, int majorMinor) {
                String majorString = note.toStringIn(this, false) + major;
                if( majorMinor > 0 ) {
                        return majorString;