*/
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/";
* @return この調の文字列表現
*/
public String toStringIn(SymbolLanguage language) {
- return language.toStringIn(new NoteSymbol(co5), majorMinor);
+ return language.keyOf(new NoteSymbol(co5), majorMinor);
}
/**
* 調号を表す半角文字列を返します。
}
/**
* 指定した言語モードとメジャーマイナー種別における文字列表現を返します。
- * <p>マイナーが指定された場合、
- * 五度圏インデックス値を3つ進めた音階として返します。
+ * <p>マイナーが指定された場合、五度圏インデックス値を3つ進めた音階として返します。
* 例えば、{@link #toCo5()} の戻り値が0の場合、
* メジャーが指定されていれば C を返しますが、
* マイナーが指定されると A を返します。
* @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ノート番号が示す音名を返します。
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;