示例#1
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Octave"/> with the
        /// specified octave number.
        /// </summary>
        /// <param name="octave">The number of an octave.</param>
        /// <exception cref="ArgumentOutOfRangeException"><paramref name="octave"/> is out of valid range.</exception>
        private Octave(int octave)
        {
            Debug.Assert(octave >= MinOctaveNumber && octave <= MaxOctaveNumber,
                         "An octave's number is out of range.");

            Number = octave;

            _notes = Enum.GetValues(typeof(NoteName))
                     .Cast <NoteName>()
                     .Where(n => NoteUtilities.IsNoteValid(n, octave))
                     .ToDictionary(n => n,
                                   n => Note.Get(n, octave));
        }
示例#2
0
        internal static ParsingResult TryParse(string input, out Note note)
        {
            note = null;

            if (string.IsNullOrWhiteSpace(input))
            {
                return(ParsingResult.EmptyInputString);
            }

            var match = ParsingUtilities.Match(input, Patterns);

            if (match == null)
            {
                return(ParsingResult.NotMatched);
            }

            var noteNameGroup = match.Groups[NoteNameGroupName];

            NoteName noteName;
            var      noteNameParsingResult = NoteNameParser.TryParse(noteNameGroup.Value, out noteName);

            if (noteNameParsingResult.Status != ParsingStatus.Parsed)
            {
                return(noteNameParsingResult);
            }

            int octaveNumber;

            if (!ParsingUtilities.ParseInt(match, OctaveGroupName, Octave.Middle.Number, out octaveNumber))
            {
                return(ParsingResult.Error(OctaveIsOutOfRange));
            }

            if (!NoteUtilities.IsNoteValid(noteName, octaveNumber))
            {
                return(ParsingResult.Error(NoteIsOutOfRange));
            }

            note = Note.Get(noteName, octaveNumber);
            return(ParsingResult.Parsed);
        }