private int ReadNoteLength(int DefaultTick, int MasterTick, MmlFileReader m) { int Tick = DefaultTick; if (m.IsNextLine()) { return(Tick); } var ch = m.FetchCharacter(); if (ch == '%') { m.StepNextCharacter(); Tick = ReadNumber(m); } else { if (char.IsDigit(ch)) { int Len = ReadNumber(m, Default: -1); if (Len <= 0) { Error.Add(ErrorData.Type.NoteLengthIsWrong); } else { Tick = MasterTick / Len; } } ch = m.FetchCharacter(); int AddTick = Tick; while (ch == '.') { AddTick /= 2; Tick += AddTick; m.StepNextCharacter(); ch = m.FetchCharacter(); } } return(Tick); }
private void Note(SongData Song, TrackData Track, Command Command, MmlFileReader m) { var NoteNumber = NoteToNumber[Command.Name]; var cmd = Track.AddCommand(CommandType.Note); Track.SetLastNote(cmd); var ct = m.FetchType(); if (m.IsNextLine()) { cmd.Value = NoteNumber; cmd.Tick = Track.DefaultTick; return; } var ch = m.FetchCharacter(); bool Shift = false; if (ch == '-') { Shift = true; NoteNumber++; } if (ch == '+') { Shift = true; NoteNumber++; } if (Shift) { m.StepNextCharacter(); } cmd.Value = NoteNumber; var Tick = ReadNoteLength(Track.DefaultTick, Song.MasterTick, m); cmd.Tick = Tick; }