public Pitch(LnDegInversion aLdi, int aOctave) { ldi = aLdi; octave = aOctave; }
/// <summary> /// 上3声ten、alt、sopの構成音列を戻す。 /// </summary> /// <param name="bas"></param> /// <param name="variation">-1を渡すと、構成音列のバリエーションの数を戻すだけ</param> /// <param name="standard"></param> /// <returns>構成音列の構成音列のバリエーションの数</returns> private int ObtainUpper3LnDeg(LnDegInversion bas, int variation, out List <LnDegInversion> upper3, out bool standard) { int count = 0; //< 構成音列のバリエーションの数 standard = false; if (variation < 0) { upper3 = null; } else { upper3 = new List <LnDegInversion>(); } // bas, ten, alt, sopの音を取得。 // 付加6の和音、付加4-6の和音の上3声 switch (ct.addedTone) { case AddedToneType.Six: if (bas.Inversion != Inversion.根音) { // [基]のみである(II巻p90,39) return(0); } count = 1; // 1通り switch (variation) { case -1: return(count); case 0: // ミソラ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第6音)); standard = true; return(count); default: System.Diagnostics.Debug.Assert(false); break; } break; case AddedToneType.SixFour: if (bas.Inversion != Inversion.根音) { // [基]のみである(II巻p92,42) return(0); } count = 1; // 1通り switch (variation) { case -1: return(count); case 0: // ミファラ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第4音)); upper3.Add(GetChordLnDegInversion(Inversion.第6音)); standard = true; return(count); default: System.Diagnostics.Debug.Assert(false); break; } break; default: break; } switch (ct.numberOfNotes) { case NumberOfNotes.Triad: if (Omission.First == ct.omission) { // 3和音に根音省略形体はない。 return(0); } switch (bas.Inversion) { case Inversion.根音: count = 5; // 5通り if (CompleteDeg) { // 第5音省略不可なので3通り。 count = 3; } switch (variation) { case -1: return(count); case 0: // ドミソ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); standard = true; break; case 1: // ミソソ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); break; case 2: // ミミソ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); break; case 3: // ドドミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; case 4: // ドミミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; default: System.Diagnostics.Debug.Assert(false); break; } break; case Inversion.第3音: count = 5; // 5通り if (CompleteDeg) { // 第5音省略不可なので3通り。 count = 3; } switch (variation) { case -1: return(count); case 0: // ドドソ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); if (ct.chordDegree != CD.II) { standard = true; } break; case 1: // ドソソ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); if (ct.chordDegree != CD.II) { standard = true; } break; case 2: // ドミソ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); if (ct.chordDegree == CD.II) { standard = true; } break; case 3: // ドドミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; case 4: // ドドド upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); break; default: System.Diagnostics.Debug.Assert(false); break; } break; case Inversion.第5音: count = 3; // 3通り switch (variation) { case -1: return(count); case 0: // ドミソ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); standard = true; break; case 1: // ドドミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; case 2: // ドミミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; default: System.Diagnostics.Debug.Assert(false); break; } break; } break; case NumberOfNotes.Seventh: switch (bas.Inversion) { case Inversion.根音: if (Omission.First == ct.omission) { return(0); // ない } else { count = 3; // 3通り if (CompleteDeg) { count = 1; } switch (variation) { case -1: return(count); case 0: // ミソシ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; case 1: // ドミシ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; case 2: // ミミシ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); break; default: System.Diagnostics.Debug.Assert(false); break; } } break; case Inversion.第3音: if (Omission.First == ct.omission) { count = 1; // 1通り Ip126 switch (variation) { case -1: return(count); case 0: // ソソシ upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; default: System.Diagnostics.Debug.Assert(false); break; } } else { count = 3; // 3通り if (CompleteDeg) { count = 1; } switch (variation) { case -1: return(count); case 0: // ドソシ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; case 1: // ドドシ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); break; case 2: // ドミシ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); break; default: System.Diagnostics.Debug.Assert(false); break; } } break; case Inversion.第5音: if (Omission.First == ct.omission) { count = 2; // 2通り if (CompleteDeg) { count = 1; } switch (variation) { case -1: return(count); case 0: // ミソシ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; case 1: // シミシ upper3.Add(GetChordLnDegInversion(Inversion.第7音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; default: System.Diagnostics.Debug.Assert(false); break; } } else { count = 1; // 1通り switch (variation) { case -1: return(count); case 0: // ドミシ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); standard = true; break; default: System.Diagnostics.Debug.Assert(false); break; } } break; case Inversion.第7音: if (Omission.First == ct.omission) { count = 1; // 1通り Ip126 switch (variation) { case -1: return(count); case 0: // ミソソ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); standard = true; break; default: System.Diagnostics.Debug.Assert(false); break; } } else { count = 3; // 3通り if (CompleteDeg) { count = 1; } switch (variation) { case -1: return(count); case 0: // ドミソ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); standard = true; break; case 1: // ドドミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; case 2: // ドミミ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); break; default: System.Diagnostics.Debug.Assert(false); break; } } break; } break; case NumberOfNotes.Ninth: count = 1; // 1通り if (-1 == variation) { return(count); } switch (bas.Inversion) { case Inversion.根音: if (Omission.First == ct.omission) { return(0); } // ミシレ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); upper3.Add(GetChordLnDegInversion(Inversion.第9音)); standard = true; break; case Inversion.第3音: if (Omission.First == ct.omission) { // ソシレ upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); upper3.Add(GetChordLnDegInversion(Inversion.第9音)); standard = true; } else { // ドシレ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); upper3.Add(GetChordLnDegInversion(Inversion.第9音)); standard = true; } break; case Inversion.第5音: if (Omission.First == ct.omission) { // ミシレ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第7音)); upper3.Add(GetChordLnDegInversion(Inversion.第9音)); standard = true; } else { return(0); } break; case Inversion.第7音: if (Omission.First == ct.omission) { // ミソレ upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第5音)); upper3.Add(GetChordLnDegInversion(Inversion.第9音)); standard = true; } else { // ドミレ upper3.Add(GetChordLnDegInversion(Inversion.根音)); upper3.Add(GetChordLnDegInversion(Inversion.第3音)); upper3.Add(GetChordLnDegInversion(Inversion.第9音)); standard = true; } break; } break; default: System.Diagnostics.Debug.Assert(false); break; } if (-1 == variation) { // この組み合わせの和音はない。 return(0); } /* * // 第5音省略の場合、Inversion.Secondの音を除外する。 * switch (ct.omission) { * case Omission.Fifth: * while (upper3.Remove(GetChordLnDegInversion(Inversion.第5音))) { } * break; * } */ return(count); }
public Pitch(Pitch rhs) { ldi = rhs.ldi; octave = rhs.octave; }