public Token Convert(LilypondTokenEnumerator enumerator) { var input = enumerator.Current; var match = regex.Match(input.TokenText); if (match.Success) { SymbolBuilder builder = new SymbolBuilder(); if (int.TryParse(match.Groups[1].Value, out int denominator)) { int dots = match.Groups[2].Length; builder.WithLength(denominator, dots); return(builder.Build()); } else { throw new InvalidOperationException("Not a rest that can be converted"); } } else { throw new InvalidOperationException("Not a rest that can be converted"); } }
public Token Convert(LilypondTokenEnumerator enumerator) { var input = enumerator.Current; var match = noteRegex.Match(input.TokenText); if (match.Success) { SymbolBuilder builder = new SymbolBuilder(); var tone = GetToneFromLetter(match.Groups[1].Value); Accidental accidental = Accidental.None; if (match.Groups[2].Success) { accidental = match.Groups[2].Value == "is" ? Accidental.Sharp : Accidental.Flat; } // determine octave MoveToClosestOctaveOffset(tone); previousNoteTone = tone; if (match.Groups[3].Success) { UpdateOctaveOffset(match.Groups[3].Value); } // set pitch builder.WithPitch(tone, accidental, octaveOffset); // determine length if (int.TryParse(match.Groups[4].Value, out int denominator)) { int dots = match.Groups[5].Length; builder.WithLength(denominator, dots); } return(builder.Build()); } else { throw new InvalidOperationException("Not a note that can be read"); } }