1 package camidion.chordhelper.music;
6 * Circle-Of-Fifth based music theory functions
8 * @author Copyright (C) 2004-2014 @きよし - Akiyoshi Kamide
14 public static final int SEMITONES_PER_OCTAVE = 12;
17 * メジャーキー基準の五度圏インデックス値との間の変換を行います。
20 * 内部的には、元の値が奇数のときに6(半オクターブ)を足し、
21 * 偶数のときにそのまま返しているだけです。
22 * 値は0~11であるとは限りません。その範囲に補正したい場合は
23 * {@link #mod12(int)} を併用します。
29 public static int reverseCo5(int n) {
30 return (n & 1) == 0 ? n : n+6 ;
33 * ノート番号からオクターブ成分を抜きます。
34 * <p>n % 12 と似ていますが、Java の % 演算子では、
35 * 左辺に負数を与えると答えも負数になってしまうため、n % 12 で計算しても
36 * 0~11 の範囲を外れてしまうことがあります。そこで、
37 * 負数の場合に12を足すことにより 0~11 の範囲に入るよう補正します。
40 * @return オクターブ成分を抜いたノート番号(0~11)
42 public static int mod12(int n) {
43 int qn = n % SEMITONES_PER_OCTAVE;
44 return qn < 0 ? qn + 12 : qn ;
47 * 指定されたMIDIノート番号の音の周波数を返します。
48 * チューニングは A=440Hz とします。
50 * @param noteNumber MIDIノート番号
53 public static double noteNumberToFrequency(int noteNumber) {
54 return 55 * Math.pow( 2, (double)(noteNumber - 33)/12 );
58 * 指定された調(五度圏インデックス値)におけるメジャースケールまたは
59 * ナチュラルマイナースケールの構成音に該当するか調べます。
61 * <p>調の五度圏インデックス値に0(ハ長調またはイ短調)を指定すると、
62 * 白鍵のときにtrue、黒鍵のときにfalseを返します。
65 * @param noteNumber 調べたい音階のノート番号
66 * @param keyCo5 調の五度圏インデックス値
67 * @return スケール構成音のときtrue、スケールを外れている場合false
69 public static boolean isOnScale(int noteNumber, int keyCo5) {
70 return mod12(reverseCo5(noteNumber) - keyCo5 + 1) < 7 ;
74 * 指定された半音数だけ移調した結果を返します。
76 * <p>移調する半音数が0の場合、指定の五度圏インデックス値をそのまま返します。
77 * それ以外の場合、移調結果を -5 ~ 6 の範囲で返します。
80 * @param co5 五度圏インデックス値
81 * @param chromaticOffset 移調する半音数
84 public static int transposeCo5(int co5, int chromaticOffset) {
85 if( chromaticOffset == 0 ) return co5;
86 int transposedCo5 = mod12( co5 + reverseCo5(chromaticOffset) );
87 if( transposedCo5 > 6 ) transposedCo5 -= Music.SEMITONES_PER_OCTAVE;
91 * 指定の五度圏インデックス値の真裏にあたる値を返します。
92 * @param co5 五度圏インデックス値
93 * @return 真裏の五度圏インデックス値
95 public static int oppositeCo5(int co5) {
96 return co5 > 0 ? co5 - 6 : co5 + 6;