コード例 #1
0
        // 音色を読み出す
        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);
            }
        }
コード例 #2
0
        // ブロック終了まで進める
        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;
            }
        }
コード例 #3
0
        // トラック
        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);
            }
        }
コード例 #4
0
        // ヘッダ
        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);
        }
コード例 #5
0
        // マクロ
        private void ReadMacro(MmlFileReader m)
        {
            // 位置を固定
            var Pos = m.GetPosition();

            m.StepNextCharacter();
            var Name = m.ReadName();

            VerboseWriteLine($"--- Macro: {Name} {Pos} ---");
            ReadTrackText(Name, m);
        }
コード例 #6
0
        // エフェクト
        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);
        }
コード例 #7
0
        // 音色
        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);
        }