/// <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)); }
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); }