public static int CalculateFifths(int midiPitch, MajorAndMinorScaleFlags flags)
        {
            var fifths = 0;
            var neutralScaleTonicMidiPitch = flags.IsMinor ? Pitch.A3.MidiPitch : Pitch.C4.MidiPitch;
            var currentPitch = neutralScaleTonicMidiPitch;

            while (currentPitch != midiPitch)
            {
                if (!flags.IsFlat)
                {
                    if (currentPitch - midiPitch > Interval.PerfectFifth.Halftones)
                    {
                        currentPitch -= Interval.PerfectOctave.Halftones;
                    }
                    else
                    {
                        currentPitch += Interval.PerfectFifth.Halftones;
                        fifths++;
                    }
                }
                else
                {
                    if (currentPitch - midiPitch < Interval.PerfectFifth.MakeDescending().Halftones)
                    {
                        currentPitch += Interval.PerfectOctave.Halftones;
                    }
                    else
                    {
                        currentPitch -= Interval.PerfectFifth.Halftones;
                        fifths--;
                    }
                }
            }
            return(fifths % 12);
        }
        /// <summary>
        /// Creates a score with just one staff (other staves can be added later).
        /// </summary>
        /// <returns>A new score</returns>
        public static Score CreateOneStaffScore(Clef clef, Step tonic, MajorAndMinorScaleFlags flags)
        {
            var score = CreateOneStaffScore();

            score.FirstStaff.Elements.Add(clef);
            score.FirstStaff.Elements.Add(Key.FromTonic(tonic, flags));
            return(score);
        }
        /// <summary>
        /// Adds a new staff to the score.
        /// </summary>
        /// <param name="clef">Clef</param>
        /// <param name="timeSignature">Time signature</param>
        /// <param name="tonic">Tonic of key</param>
        /// <param name="flags">Scale flags</param>
        /// <returns>This score</returns>
        public Score AddStaff(Clef clef, TimeSignature timeSignature, Step tonic, MajorAndMinorScaleFlags flags)
        {
            var staff = new Staff();

            staff.Elements.Add(clef);
            staff.Elements.Add(Key.FromTonic(tonic, flags));
            Staves.Add(staff);
            return(this);
        }
 public static int CalculateFifths(Step step, MajorAndMinorScaleFlags flags)
 {
     return(CalculateFifths(step.ToPitch(4).MidiPitch, flags));
 }
Beispiel #5
0
 /// <summary>
 /// Creates a new instance of Key from given step.
 /// </summary>
 /// <param name="step"></param>
 /// <param name="flags"></param>
 /// <returns></returns>
 public static Key FromTonic(Step step, MajorAndMinorScaleFlags flags)
 {
     return(new Key(CircleOfFifths.CalculateFifths(step, flags)));
 }
Beispiel #6
0
 /// <summary>
 /// Creates a new instance of Key from given midi pitch.
 /// </summary>
 /// <param name="midiPitch">Midi pitch</param>
 /// <param name="flags">Flags</param>
 /// <returns>Key</returns>
 public static Key FromMidiPitch(int midiPitch, MajorAndMinorScaleFlags flags)
 {
     return(new Key(CircleOfFifths.CalculateFifths(midiPitch, flags)));
 }