Ejemplo n.º 1
0
        public static int GetSemitonesBetween(NaturalNote naturalNote1, NaturalNote naturalNote2)
        {
            var number1 = s_naturalNoteToNumber[naturalNote1 - NaturalNote.C];
            var number2 = s_naturalNoteToNumber[naturalNote2 - NaturalNote.C];

            if (number1 > number2)
            {
                number1 -= Interval.SemitonesPerOctave;
            }
            return(number2 - number1);
        }
Ejemplo n.º 2
0
        public Note(NaturalNote naturalNote, Accidental accidental = Accidental.Natural)
        {
            if (naturalNote < NaturalNote.C || naturalNote > NaturalNote.B)
            {
                throw new ArgumentOutOfRangeException(nameof(naturalNote));
            }

            if (accidental < Accidental.DoubleFlat || accidental > Accidental.DoubleSharp)
            {
                throw new ArgumentOutOfRangeException(nameof(naturalNote));
            }

            _naturalNote = naturalNote;
            _accidental  = accidental;
        }
Ejemplo n.º 3
0
 public override string ToString()
 {
     return(NaturalNote.ToString() + Accidental.GetSign());
 }
Ejemplo n.º 4
0
        public Note Invert()
        {
            if (Accidental == Accidental.Natural)
            {
                return(this);
            }

            NaturalNote newNaturalNote;
            Accidental  invertedAccidental;
            NaturalNote naturalNote = _naturalNote;

            if (Accidental > Accidental.Natural)
            {
                int semitonesDifference = Accidental - Accidental.Natural;
                for (; ;)
                {
                    newNaturalNote = naturalNote + 1;
                    if (newNaturalNote - NaturalNote.C >= NumberOfNaturalNotes)
                    {
                        newNaturalNote -= NumberOfNaturalNotes;
                    }

                    semitonesDifference -= GetSemitonesBetween(naturalNote, newNaturalNote);

                    if (semitonesDifference < Accidental.DoubleFlat - Accidental.Natural)
                    {
                        throw new InvalidOperationException();
                    }
                    else if (semitonesDifference < Accidental.Natural - Accidental.Natural)
                    {
                        invertedAccidental = (Accidental)semitonesDifference;
                        break;
                    }

                    naturalNote = newNaturalNote;
                }
            }
            else
            {
                int semitonesDifference = Accidental - Accidental.Natural;
                for (; ;)
                {
                    newNaturalNote = naturalNote - 1;
                    if (newNaturalNote - NaturalNote.C < 0)
                    {
                        newNaturalNote += NumberOfNaturalNotes;
                    }

                    semitonesDifference += Interval.SemitonesPerOctave - GetSemitonesBetween(naturalNote, newNaturalNote);

                    if (semitonesDifference > Accidental.DoubleSharp - Accidental.Natural)
                    {
                        throw new InvalidOperationException();
                    }
                    else if (semitonesDifference > Accidental.Natural - Accidental.Natural)
                    {
                        invertedAccidental = (Accidental)semitonesDifference;
                        break;
                    }

                    naturalNote = newNaturalNote;
                }
            }

            return(new Note(newNaturalNote, invertedAccidental));
        }