Example #1
0
 public Pitch(LnDegInversion aLdi, int aOctave)
 {
     ldi    = aLdi;
     octave = aOctave;
 }
Example #2
0
        /// <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);
        }
Example #3
0
 public Pitch(Pitch rhs)
 {
     ldi    = rhs.ldi;
     octave = rhs.octave;
 }