// ヘッダ private void ReadHeader(MmlFileReader m) { var Pos = m.GetPosition(); m.StepNextCharacter(); var Name = m.ReadName(); VerboseWriteLine($"--- Header: {Name} {Pos} ---"); List <string> Parameter = new List <string>(); bool SkipSeparator = false; while (!m.IsEof()) { var ct = SkipSpaceAndFetch(m); if (m.IsLineEnd(ct)) { break; // 改行は終了 } if (SkipSeparator && m.IsSeparator(ct)) { ct = m.ReadNextType(); } if (m.IsSpace(ct)) { ct = m.ReadNextType(); } if (m.IsLineEnd(ct)) { break; // 改行は終了 } if (ct != MmlCharactorType.GeneralChanacter) { Error.Add(ErrorData.Type.UnknownCharacterUsed); return; } string t; if (m.IsQuote()) { t = m.ReadQuote(); if (t == null) { Error.Add(ErrorData.Type.QuoteEndNotFound); return; } } else { t = m.ReadUntilNext(); } SkipSeparator = true; Parameter.Add(t); } Header.Set(Song, Name, Parameter); }
// マクロ private void ReadMacro(MmlFileReader m) { // 位置を固定 var Pos = m.GetPosition(); m.StepNextCharacter(); var Name = m.ReadName(); VerboseWriteLine($"--- Macro: {Name} {Pos} ---"); ReadTrackText(Name, m); }
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 ReadEffect(MmlFileReader m) { // 位置を固定 var Pos = m.GetPosition(); m.StepNextCharacter(); var Name = m.ReadName(); VerboseWriteLine($"--- Effect: {Name} {Pos} ---"); if (!SkipUntilBlockStart(m)) { return; } SkipUntilBlockEnd(m); }
// 音色 private void ReadTone(MmlFileReader m) { // 位置を固定 var Pos = m.GetPosition(); m.StepNextCharacter(); var Name = m.ReadName(); VerboseWriteLine($"--- Tone: {Name} {Pos} ---"); if (!SkipUntilBlockStart(m)) { return; } var Parameter = ReadToneParameter(m); Song.SetToneParameter(Name, Parameter); }
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; }