// 音色を読み出す private int[] ReadToneParameter(MmlFileReader m) { List <int> Parameter = new List <int>(); bool SkipSeparator = false; while (true) { m.SkipSkipable(); var ct = m.FetchType(); // EOF if (ct == MmlCharactorType.Eof) { Error.Add(ErrorData.Type.BlockEndNotFound); return(null); } // Separator if (ct == MmlCharactorType.Separator) { VerboseWriteLine($"{m.GetPosition()} {ct}"); if (!SkipSeparator) { SkipSeparator = false; Parameter.Add(0); } m.SkipType(); continue; } if (m.IsLineEnd(ct) || m.IsComment(ct)) { m.SkipType(); continue; } if (ct == MmlCharactorType.GeneralChanacter) { SkipSeparator = true; VerboseWriteLine($"{m.GetPosition()} {ct}"); Parameter.Add(ReadParameter(m)); continue; } if (ct == MmlCharactorType.BlockEnd) { m.SkipType(); m.StepNextLine(); return(Parameter.ToArray()); } Error.Add(ErrorData.Type.UnknownCharacterUsed); return(null); } }
// ブロック終了まで進める private void SkipUntilBlockEnd(MmlFileReader m) { while (true) { m.SkipSkipable(); var ct = m.FetchType(); if (ct == MmlCharactorType.GeneralChanacter || ct == MmlCharactorType.Separator) { VerboseWriteLine($"{m.GetPosition()} {ct}"); m.SkipType(); continue; } if (ct == MmlCharactorType.Eof) { Error.Add(ErrorData.Type.BlockEndNotFound); return; } if (ct == MmlCharactorType.BlockEnd) { m.SkipType(); m.StepNextLine(); return; } Error.Add(ErrorData.Type.UnknownCharacterUsed); return; } }
// トラック private void ReadTrack(MmlFileReader m) { List <string> TrackName = new List <string>(); while (true) { var Name = m.ReadName(); TrackName.Add(Name); m.SkipIfSpace(); var ct = m.FetchType(); if (ct == MmlCharactorType.Separator) { m.SkipType(); continue; } break; } var TrackPos = m.GetPosition(); for (var i = 0; i < TrackName.Count; i++) { if (i > 0) { m.SetPosition(TrackPos); } var Name = TrackName[i]; VerboseWriteLine($"--- Track: {Name} ---"); ReadTrackText(Name, m); } }
// ヘッダ 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 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); }