From 85bca4ac126919fea0df7d6a0f8b83542d4676ae Mon Sep 17 00:00:00 2001 From: Akiyoshi Kamide Date: Thu, 24 Nov 2016 01:43:17 +0900 Subject: [PATCH] =?utf8?q?=E3=83=AA=E3=83=95=E3=82=A1=E3=82=AF=E3=82=BF?= =?utf8?q?=E3=83=AA=E3=83=B3=E3=82=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- src/camidion/chordhelper/ChordHelperApplet.java | 2 +- src/camidion/chordhelper/music/Key.java | 2 +- src/camidion/chordhelper/music/NoteSymbol.java | 35 ++++++++++------------ src/camidion/chordhelper/music/SymbolLanguage.java | 19 +++++++----- 4 files changed, 29 insertions(+), 29 deletions(-) diff --git a/src/camidion/chordhelper/ChordHelperApplet.java b/src/camidion/chordhelper/ChordHelperApplet.java index b1da598..808ca65 100644 --- a/src/camidion/chordhelper/ChordHelperApplet.java +++ b/src/camidion/chordhelper/ChordHelperApplet.java @@ -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/"; diff --git a/src/camidion/chordhelper/music/Key.java b/src/camidion/chordhelper/music/Key.java index a5ad766..0caac4b 100644 --- a/src/camidion/chordhelper/music/Key.java +++ b/src/camidion/chordhelper/music/Key.java @@ -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); } /** * 調号を表す半角文字列を返します。 diff --git a/src/camidion/chordhelper/music/NoteSymbol.java b/src/camidion/chordhelper/music/NoteSymbol.java index 43ddea2..cca5fec 100644 --- a/src/camidion/chordhelper/music/NoteSymbol.java +++ b/src/camidion/chordhelper/music/NoteSymbol.java @@ -129,8 +129,7 @@ public class NoteSymbol implements Cloneable { } /** * 指定した言語モードとメジャーマイナー種別における文字列表現を返します。 - *

マイナーが指定された場合、 - * 五度圏インデックス値を3つ進めた音階として返します。 + *

マイナーが指定された場合、五度圏インデックス値を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ノート番号が示す音名を返します。 diff --git a/src/camidion/chordhelper/music/SymbolLanguage.java b/src/camidion/chordhelper/music/SymbolLanguage.java index 40016c1..91e733e 100644 --- a/src/camidion/chordhelper/music/SymbolLanguage.java +++ b/src/camidion/chordhelper/music/SymbolLanguage.java @@ -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; -- 2.11.0