OSDN Git Service

コードボタン下のテキスト欄に入力するコードの音名が小文字でも受け付けるようにした
authorAkiyoshi Kamide <kamide@yk.rim.or.jp>
Mon, 21 Nov 2016 16:59:09 +0000 (01:59 +0900)
committerAkiyoshi Kamide <kamide@yk.rim.or.jp>
Mon, 21 Nov 2016 16:59:09 +0000 (01:59 +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 233a63f..b1da598 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.20161106.1";
+               public static final String      VERSION = "Ver.20161121.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 fca48b6..a5ad766 100644 (file)
@@ -258,16 +258,7 @@ public class Key implements Cloneable {
         * @return この調の文字列表現
         */
        public String toStringIn(SymbolLanguage language) {
-               NoteSymbol note = new NoteSymbol(co5);
-               String major = note.toStringIn(language, false) + language.major;
-               if( majorMinor > 0 ) {
-                       return major;
-               }
-               else {
-                       String minor = note.toStringIn(language, true) + language.minor;
-                       return majorMinor < 0 ?
-                               minor : major + language.majorMinorDelimiter + minor ;
-               }
+               return language.toStringIn(new NoteSymbol(co5), majorMinor);
        }
        /**
         * 調号を表す半角文字列を返します。
index 9347649..43ddea2 100644 (file)
@@ -164,10 +164,7 @@ public class NoteSymbol implements Cloneable {
                        }
                }
                int sharpFlatIndex = co5_s771 / 7;
-               int note_index = co5_s771 - sharpFlatIndex * 7;
-               String note = language.notes.substring( note_index, note_index+1 );
-               String sharp_flat = language.sharpFlatList.get(sharpFlatIndex);
-               return language.preSharpFlat ? sharp_flat + note : note + sharp_flat;
+               return language.toNoteSymbol(co5_s771 - sharpFlatIndex * 7, sharpFlatIndex);
        }
        /**
         * 指定の最大文字数の範囲で、MIDIノート番号が示す音名を返します。
index 376c081..40016c1 100644 (file)
@@ -11,55 +11,46 @@ public enum SymbolLanguage {
        /**
         * シンボル表記(Bb, F#)
         */
-       SYMBOL(
-               Arrays.asList("bb","b","","#","x"),
-               "FCGDAEB",false,"","m"," / "
-       ),
+       SYMBOL(Arrays.asList("bb","b","","#","x"),"FCGDAEB",false,"","m"," / "),
        /**
         * 英名表記(B flat, F sharp)
         */
-       NAME(
-               Arrays.asList(" double flat"," flat",""," sharp"," double sharp"),
-               "FCGDAEB",false," major"," minor"," / "
-       ),
+       NAME(Arrays.asList(" double flat"," flat",""," sharp"," double sharp"),
+                       "FCGDAEB",false," major"," minor"," / "),
        /**
         * 日本名表記(変ロ, 嬰ヘ)
         */
-       IN_JAPANESE(
-               Arrays.asList("重変","変","","嬰","重嬰"),
-               "ヘハトニイホロ",true,"長調","短調","/"
-       );
+       IN_JAPANESE(Arrays.asList("重変","変","","嬰","重嬰"),
+                       "ヘハトニイホロ",true,"長調","短調","/");
        /**
         * ♭や♯の表記を、半音下がる数が多いほうから順に並べたリスト
         */
-       List<String> sharpFlatList;
+       private List<String> sharpFlatList;
        /**
         * 音名を五度圏順で並べた文字列(必ず7文字でなければならない)
         */
-       String notes;
+       private String notes;
        /**
         * 変化記号が音名の前につく(true)か後ろにつく(false)か
         * <p>英語の場合は B♭ のように♭が後ろ、
         * 日本語の場合は「変ロ」のように「変」が前につくことを表します。
         * </p>
         */
-       boolean preSharpFlat;
+       private boolean preSharpFlat;
        /**
         * メジャーを表す文字列
         */
-       String major;
+       private String major;
        /**
         * マイナーを表す文字列
         */
-       String minor;
+       private String minor;
        /**
         * メジャーとマイナーを併記する場合の区切り文字
         */
-       String majorMinorDelimiter;
-       private SymbolLanguage(
-               List<String> sharpFlatList,
-               String notes,
-               boolean preSharpFlat,
+       private String majorMinorDelimiter;
+
+       private SymbolLanguage(List<String> sharpFlatList, String notes, boolean preSharpFlat,
                String major, String minor, String majorMinorDelimiter
        ) {
                this.sharpFlatList = sharpFlatList;
@@ -70,28 +61,50 @@ public enum SymbolLanguage {
                this.majorMinorDelimiter = majorMinorDelimiter;
        }
        /**
+        * 音名を返します。
+        * @param noteIndex FCGDAEBの音名インデックス(0~6)
+        * @param sharpFlatIndex 0=ダブルフラット、1=フラット、2=ナチュラル、3=シャープ、4=ダブルシャープ
+        * @return 音名(例:Bb、B flat、変ロ)
+        */
+       public String toNoteSymbol(int noteIndex, int sharpFlatIndex) {
+               String note = notes.substring( noteIndex, noteIndex+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) {
+               String majorString = note.toStringIn(this, false) + major;
+               if( majorMinor > 0 ) {
+                       return majorString;
+               }
+               else {
+                       String minorString = note.toStringIn(this, true) + minor;
+                       return majorMinor < 0 ? minorString : majorString + majorMinorDelimiter + minorString ;
+               }
+       }
+       /**
         * 音名の文字列を、メジャーキー基準の五度圏インデックス値に変換します。
+        * 音名は通常大文字ですが、小文字も認識します。
         *
         * @param noteSymbol 音名の文字列
         * @return メジャーキー基準の五度圏インデックス値
-        * @throws IllegalArgumentException
-        *  指定の音名が空、またはA~Gの範囲を外れている場合
+        * @throws
+        * IllegalArgumentException 指定された音名が空、または[A~G、a~g]の範囲を外れている場合
+        * @throws
+        * NullPointerException 指定された音名がnullの場合
         */
        public int majorCo5Of(String noteSymbol) {
-               if( Objects.requireNonNull(
-                       noteSymbol,
-                       "Musical note symbol must not be null"
-               ).isEmpty() ) {
-                       throw new IllegalArgumentException(
-                               "Empty musical note symbol specified"
-                       );
+               if( Objects.requireNonNull(noteSymbol,"Musical note symbol must not be null").isEmpty() ) {
+                       throw new IllegalArgumentException("Empty musical note symbol");
                }
-               char topChar = noteSymbol.charAt(0);
-               int co5 = notes.indexOf(topChar);
+               int co5 = notes.indexOf(Character.toUpperCase(noteSymbol.charAt(0)));
                if( co5 < 0 ) {
-                       throw new IllegalArgumentException(
-                               "Invalid musical note symbol "+noteSymbol+", not in "+notes
-                       );
+                       throw new IllegalArgumentException("Unknown musical note symbol ["+noteSymbol+"] not in ["+notes+"]");
                }
                co5--;
                int offset = -14;