diff --git "a/mml2vgm MML\343\202\263\343\203\236\343\203\263\343\203\210\343\202\231\343\203\241\343\203\242.txt" "b/mml2vgm MML\343\202\263\343\203\236\343\203\263\343\203\210\343\202\231\343\203\241\343\203\242.txt" index caf93519..41db0630 100644 --- "a/mml2vgm MML\343\202\263\343\203\236\343\203\263\343\203\210\343\202\231\343\203\241\343\203\242.txt" +++ "b/mml2vgm MML\343\202\263\343\203\236\343\203\263\343\203\210\343\202\231\343\203\241\343\203\242.txt" @@ -568,7 +568,7 @@ mn ---------------------o HuC6280PCMモード指定(0: 停止 1: Tn oooooooooooooooooooooo テンポ(1 - 1200) ! oooooooooooooooooooooo このパートのこれ以降をコンパイルしない(発音しない) Kn ooo-ooooo-oooo-ooooooo 移調絶対指定 ( -12 - +12 ) -#n oooooooooooooooooooooo 音長をクロック値で指定 +#n(廃止) oooooooooooooooooooooo 音長をクロック値で指定(lコマンドの後に#でクロック指定してください) pn o-oo--o--ooo--ooo--o-- パン (0: 発音しない 1: 右 2: 左 3: 中央) pn1,n2 -----o---------------o パン (n1: 左 0 - 15 n2: 右 0 - 15 ) pn1,n2 --------------------o- パン (n1: 左 0 - 127 n2: 右 0 - 127) diff --git a/mml2vgm/Core/clsVgm.cs b/mml2vgm/Core/clsVgm.cs index c958f91e..b7c06880 100644 --- a/mml2vgm/Core/clsVgm.cs +++ b/mml2vgm/Core/clsVgm.cs @@ -868,11 +868,14 @@ private int SetInstrument(string vals, string srcFn, int lineNumber) if (instrumentCounter == instrumentBufCache.Length) { + //すでに定義済みの場合はいったん削除する(後に定義されたものが優先) if (instFM.ContainsKey(instrumentBufCache[0])) { instFM.Remove(instrumentBufCache[0]); } - else if(instrumentBufCache.Length == Const.INSTRUMENT_SIZE) + + + if(instrumentBufCache.Length == Const.INSTRUMENT_SIZE) { //M instFM.Add(instrumentBufCache[0], instrumentBufCache); @@ -1204,9 +1207,15 @@ public byte[] GetByteData() while (pw.waitCounter == 0 && !pw.dataEnd) { char cmd = pw.getChar(); - lineNumber = pw.getLineNumber(); - - Commander(pw, cmd); + if (cmd == 0) + { + pw.dataEnd = true; + } + else + { + lineNumber = pw.getLineNumber(); + Commander(pw, cmd); + } } } @@ -1485,9 +1494,15 @@ private void Xgm_procChip(ClsChip chip) while (pw.waitCounter == 0 && !pw.dataEnd) { char cmd = pw.getChar(); - lineNumber = pw.getLineNumber(); - - Commander(pw, cmd); + if (cmd == 0) + { + pw.dataEnd = true; + } + else + { + lineNumber = pw.getLineNumber(); + Commander(pw, cmd); + } } } } diff --git a/mml2vgm/Core/partWork.cs b/mml2vgm/Core/partWork.cs index feba17d3..c7d0f201 100644 --- a/mml2vgm/Core/partWork.cs +++ b/mml2vgm/Core/partWork.cs @@ -403,13 +403,22 @@ public string getSrcFn() /// public char getChar() { + //if (dataEnd) return (char)0; + char ch; if (pos.alies == "") { + if (pData[pos.row].Txt.Length <= pos.col) { + return (char)0; + } ch = pData[pos.row].Txt[pos.col]; } else { + if (aData[pos.alies].Txt.Length <= pos.col) + { + return (char)0; + } ch = aData[pos.alies].Txt[pos.col]; } //Console.Write(ch); @@ -460,6 +469,24 @@ public void setPos(int tCol) return; } + if (LstPos == null) MakeLstPos(); + + int i = 0; + while (i != LstPos.Count && tCol >= LstPos[i].tCol) + { + i++; + } + + pos.tCol = tCol; + pos.alies = LstPos[i - 1].alies; + pos.col = LstPos[i - 1].col + tCol - LstPos[i - 1].tCol; + pos.row = LstPos[i - 1].row; + //if (pos.alies == "" && pos.col >= pData[pos.row].Txt.Length - 1 && pos.row >= pData.Count - 1) + //{ + // dataEnd = true; + //} + return; + dataEnd = false; int row = 0; @@ -600,6 +627,177 @@ public void setPos(int tCol) } + private List LstPos = null; + + public void MakeLstPos() + { + if (pData == null) + { + return; + } + + int tCol = 0; + int row = 0; + int col = 0; + string aliesName = ""; + + LstPos = new List(); + LstPos.Add(new clsPos()); + resetPos(); + + while (true) + { + string data; + char ch; + + //読みだすデータの頭出し + if (aliesName == "") + { + if (pData.Count == row) + { + return; + } + data = pData[row].Txt; + } + else + { + data = aData[aliesName].Txt; + } + + //解析行の解析位置が終端に達したときの処理 + while (data.Length == col) + { + if (aliesName == "") + { + row++; + if (pData.Count == row) + { + break; + } + else + { + data = pData[row].Txt; + col = 0; + + clsPos p = new clsPos(); + p.tCol = tCol; + p.alies = ""; + p.col = 0; + p.row = row; + LstPos.Add(p); + + break; + } + } + else + { + clsPos p = stackPos.Pop(); + aliesName = p.alies; + col = p.col; + row = p.row; + if (aliesName == "") + { + data = pData[row].Txt; + } + else + { + data = aData[aliesName].Txt; + } + + p.tCol = tCol; + LstPos.Add(p); + } + } + + ch = data[col]; + + //解析位置でエイリアス指定されている場合 + while (ch == '%') + { + string a = getAliesName(data, col); + if (a != "") + { + clsPos p = new clsPos(); + p.alies = aliesName; + p.col = col + a.Length + 1; + p.row = row; + stackPos.Push(p); + + data = aData[a].Txt; + col = 0; + aliesName = a; + row = 0; + + p = new clsPos(); + p.tCol = tCol; + p.alies = a; + p.col = 0; + p.row = 0; + LstPos.Add(p); + } + else + { + msgBox.setWrnMsg("指定されたエイリアス名は定義されていません。" + , (aliesName == "") ? pData[row].Fn : aData[aliesName].Fn + , (aliesName == "") ? pData[row].Num : aData[aliesName].Num + ); + col++; + } + + ch = data[col]; + } + + tCol++; + col++; + //解析行の解析位置が終端に達したときの処理 + while (data.Length == col) + { + if (aliesName == "") + { + row++; + if (pData.Count == row) + { + break; + } + else + { + data = pData[row].Txt; + col = 0; + + clsPos p = new clsPos(); + p.tCol = tCol; + p.alies = ""; + p.col = 0; + p.row = row; + LstPos.Add(p); + + break; + } + } + else + { + clsPos p = stackPos.Pop(); + aliesName = p.alies; + col = p.col; + row = p.row; + if (aliesName == "") + { + data = pData[row].Txt; + } + else + { + data = aData[aliesName].Txt; + } + + p.tCol = tCol; + LstPos.Add(p); + } + } + + } + + } + /// /// 解析位置から数値を取得する。 /// diff --git a/mml2vgm/mml2vgm/sample/test.gwi b/mml2vgm/mml2vgm/sample/test.gwi index 30d5ced1..4561e6a5 100644 --- a/mml2vgm/mml2vgm/sample/test.gwi +++ b/mml2vgm/mml2vgm/sample/test.gwi @@ -1,30 +1,342 @@ '{ - TitleName =OPLL Test - TitleNameJ =OPLL テスト - GameName = - GameNameJ = - SystemName = - SystemNameJ = - Composer = - ComposerJ = - ReleaseDate =2018/01/23 - Converted = - Notes = - - Format =VGM - ClockCount =192 + TitleName = + TitleNameJ =だって、ギュってして。 + GameName = + GameNameJ =anime「くまみこ」OP TV Size + SystemName = + SystemNameJ =Sega MegaDrive + Composer = + ComposerJ =ボンジュール鈴木 + ReleaseDate =2016/05/21 + Converted =Kuma + Notes = + + ClockCount =192 + } -(frame/clock) = 60Hz * (60 * 4) / ClockCount / tempo + +base (from Ordyne) +'@ M 003 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 027,014,000,007,003,062,000,012,000,000,000 +'@ 031,019,000,007,006,017,000,000,000,000,000 +'@ 031,030,007,005,003,015,000,000,000,000,000 +'@ 031,006,000,008,014,000,000,000,000,000,000 +'@ 003,007 + +xylophone (from DragonSpirit) +'@ M 004 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 027,024,021,015,005,023,000,001,000,000,000 +'@ 031,013,000,008,015,000,000,001,000,000,000 +'@ 031,031,000,015,003,022,000,001,000,000,000 +'@ 031,016,000,006,015,000,001,001,000,000,000 +'@ 004,007 + +bell (from DragonSpirit) +'@ M 005 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 027,004,000,006,015,025,002,003,003,000,000 +'@ 031,007,000,007,015,000,001,001,000,000,000 +'@ 031,007,000,004,014,039,000,014,007,000,000 +'@ 031,008,000,007,015,011,000,004,007,000,000 +'@ 004,006 + +bell (from Sonic The Hedgehog) +'@ M 007 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 027,004,000,015,015,035,001,003,003,000,000 +'@ 031,007,000,015,015,000,002,001,004,000,000 +'@ 031,007,000,015,014,041,001,014,007,000,000 +'@ 031,008,000,015,015,007,000,004,007,000,000 + ALG FB +'@ 004,006 + +Brass2op (from Gauntlet IV + Arrange) +'@ M 008 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 031,016,001,005,003,016,000,004,007,000,000 +'@ 031,000,003,007,000,000,000,008,007,000,000 +'@ 031,016,001,006,002,014,000,004,003,000,000 +'@ 031,011,003,007,000,006,000,008,003,000,000 + ALG FB +'@ 004,007 + +Chord2op (from SCHEME + Arrange) +'@ M 009 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 027,005,006,000,001,036,000,004,000,000,000 +'@ 018,006,001,007,003,000,000,004,003,000,000 +'@ 027,005,006,000,001,036,000,004,000,000,000 +'@ 018,006,001,007,003,000,000,004,003,000,000 + ALG FB +'@ 004,005 + +BD (from Gauntlet IV) +'@ M 010 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 031,028,004,001,015,000,000,007,000,000,000 +'@ 028,023,017,008,000,000,000,001,006,000,000 +'@ 028,024,019,008,007,014,000,003,007,000,000 +'@ 031,005,013,008,001,000,000,000,002,000,000 + ALG FB +'@ 000,002 + +CHORD (from 魔導物語I) +'@ M 011 + AR DR SR RR SL TL KS ML DT AM SSG-EG +'@ 031,000,000,000,000,020,000,002,000,000,000 +'@ 015,010,000,006,015,005,000,002,001,000,000 +'@ 031,000,000,000,000,035,000,001,007,000,000 +'@ 020,000,000,006,000,000,000,001,000,000,000 + ALG FB +'@ 004,006 + + + No, SV, AR, DR, SL, SR, RR, ST +'@ E 0, 13, 1, 5, 11, 34, 24, 1 +'@ E 1, 13, 1, 5, 11, 10, 8, 1 +'@ E 2, 13, 3, 5, 11, 40, 48, 1 +'@ E 3, 14, 2, 5, 11, 80, 2, 1 +'@ E 4, 14, 1, 5, 11, 80, 0, 1 + +'@ E 10, 15, 0, 1, 10, 4, 1, 3 +'@ E 11, 15, 0, 5, 13, 3, 1, 3 +'@ E 12, 15, 0, 1, 10, 2, 1, 4 +'@ E 13, 15, 0, 12, 9, 6, 1, 1 + + +'%HC @12 c +'%CL @11 c + + + +'F1 T138 + + + +F1-6 ! +S1-4 ! + + + +'F12 @7o6l8v113p1q0D0 +'F2 v103p3D4 +'F1 beaeg+eab4rr2.(3 +'F2 beaeg+eab4&br2.(3 +'F2 r16p2 +'F12 [beaeg+eab& bed+ebed+e +'F12 beaeg+e/ag+&g+af+4>c4d+4c+4< +'F12 g+2rg+4f+& f+2g4f+4 +'F12 g+2rr4g+& g+4.g+4.>d+4c+2de4 g.f+.d<)1b.)1f+.)2d +'F12 @4p1l8<(3 +'F2 p3 +'F12 gb>df+ r2 rc+ea r2 rc+ r2 e.e.d+ r2 +'F12 c+rrc+ drrf+&f+df+ err2. r1 +'F12 @7o6l8v107p1q0D0 +'F2 v97p2D4r16 +'F12 [beaeg+eaebed+ebed+e beaeg+eae/beaef+eae]beaeg+ef+e +'F12 [beaeg+eaebed+ebed+e beaeg+eae beaef+eae] +'F12 [beaeg+eab& bed+ebed+e +'F12 beaeg+e/ag+&g+af+4>c4d+4. +'F3 c+2 c1&[c4&)3]3c4(6 +'F3 q0@9MSV24,4,6,12,0SS1 +'F3 f+1 a2a4g4 f+2a2 b.b.b4 rf+4 +'F3 grrg arra b4.g4.b4 a4a4a4a4 aaaa )3bbbb(3 +'F3 [ g+2.a4 g+1 g+2.a4 f+2a2 g+1 / g+2f+2 e2.f+4 a2g+ab4 ] g+2.g+a& a1 g+2f+2 +'F3 @8EONEX12 l8v110p3Q6o4SS0 +'F3 [d+e(6e)6d+e(6e)6d+e (6e)6d+e(6e)6 r2 d+e(6e)6d+e(6e)6d+e / (6e)6d+e(6e)6 r2 ]r1r1 + + +'F7 EONEX34 l8v107 Q6o3SS0 +'F7 r1r1 +'F7 [bb(6b)6bb(6b)6bb (6b)6bb(6b)6b4b4 bb(6b)6bb(6b)6bb / (6b)6bb(6b)6b4b4]r1)3 +'F7 g+rr4rg+rg+ r1 +'F7 g+rr4rg+rb r1 +'F7 g+rr4rg+rg+ r4.g+4b4. +'F7 f+2g+2 a1&[a4&)3]3a4(9 +'F7 q0>MSV24,4,6,12,0SS1 +'F7 a1 >c+2c+4c+2 e.e.d+4 rdf+ e1 e2)3f+2(9(3 +'F7 [ e2.f+4 e1 e2.f+4 d+2f+2 e1 / e2d+2 c+2.d+4 f+2ef+g+4 ] e2.ee& e1 e2d+2 +'F7 EONEX34 l8v110 Q6o3SS0 +'F7 [bb(6b)6bb(6b)6bb (6b)6bb(6b)6 r2 bb(6b)6bb(6b)6bb / (6b)6bb(6b)6 r2 ]r1r1 + + +'F4 @7o6l8v100p2q0D-2SS0 +'F4 beaeg+eab4rr2. +'F4 @11v115l8p2q0D0o6SS0 +'F4 [d+e(6e)6d+e(6e)6d+e (6e)6d+e(6e)6f+4e4 d+e(6e)6d+e(6e)6d+e / (6e)6d+e(6e)6g4f+4] r1 +'F4 (15 +'F4 d+rr4rd+rc+ r4.p3)3e16g+16>d+4c+4<(3p2 +'F4 d+rr4rd+rd+ r2p3)3g4f+4(3p2 +'F4 d+rr4rd+rc+ r4.d+4. +'F4 c+2 c1&[c4&)3]3c4 +'F4 q0MSV48,2,5,20,0SS1p3(15< +'F4 f+1 a2a4g4 f+2a2 b.b.b4 rf+4 +'F4 grrg arra b4.g4.b4 a4a4a4a4 p2>)15e4d+4f+4d+4 +'F4 g+1c+2.d+4e2.a4g+2f+2e1c+2.f+4e2.f+4a2g+ab4 +'F4 g+2g+arb&b2.r>e& ed+e4d+4c4Q3e<]4q0c+>Q3c+Q3eQ3f+Q3g+< +'F5 [q0a>Q3a<]4[q0b>Q3b<]> q0c>Q3c< < q0b>Q3b< +'F5 [q0e>Q3e<]4[q0c+>Q3c+<]4[q0a>Q3a<][q0b>Q3b<]r1 +'F5 q0err4rerc+ r1 arr4rarb r4.r16.a64a+64b4b4 +'F5 errq0c+16d+16 d+16_e&e16Q3d+dq0c+ r4r4>c+4e.g32a4~32eea.>e.dq0a16b16f+16g16< +'F5 Q6erre f+rrf+ q0g.>d.g4d>b4_<d+16Q5e c16 Q5c+r16f+16g+16Q5ar16e.ccc +'F5 c+.c+< q0a+.>f+.a32a+.~32f+. +'F5 / f+4f+4g+4rg+ a.>e.>b&b4_<c+ f+.c+.>b4_<Q3e<]4q0c+>Q3c+Q3eQ3f+Q3g+< +'F5 [q0a>Q3a<]4[q0b>Q3b<]> q0c>Q3c< < q0b>Q3b< +'F5 [q0e>Q3e<]4[q0c+>Q3c+<]4[q0a>Q3a<][q0b>Q3b<] +'F5 rv100 D0p2o6Q6@7ba+ag+1r1 + + + delay speed step max type(3 = one shot) +MSV 4, 1, -94, 1600, 3 + +'F6 m0l8@10v118MSV4,1,-94,1600, 3SS1MRT4,2,-1,127,3SR1q1 +'F6 r1r2)2c8.c8.c8(2 +'F6 [c4c4]13c4cc4.rccc4. +'F6 l8 +'F6 c4r4rc4c4r2c4c +'F6 c4r4rc4c4r4.c4c4 +'F6 c4r4rc4c4r4c4c4r +'F6 c4rcc4rc c.c.c4crrc.c.cc.c.c +'F6 [c4]12c.c.c.c.cc c4rc c4rc c.c.c4c4c c4c4c4c4cccccccc +'F6 [[c4]28/c.c.c4cc4][c4]4 +'F6 [c4c4]13c4cc4.r2. + + +'S12 D0v14o4l8q0MSV24,8, 1, 1,0SS1EON@0 +'S2 D-1v13r +'S12 r1r1 +'S12 @0r4e4e4f+4g+re4d+4e&e @1br rb rr bbr1 +'S12 @0r4e4e4f+4g+re4d+4e&e @1br rb rr b>er<(3b>er<(2b>er4< +'S12 r1r1r1r1@2f+2e2 c+2d+2.d+e&e1<)1@3 +'S12 q0 a&g+Q4(2e)2q0a&g+Q4(2e)2q1(1d+ e)1r1 +'S12 q0 a&g+Q4 e q0a&g+Q2(2e)2q1(1d+ e)1r1 +'S12 q0 a4 Q4 e q0a&g+Q4 e q1(1d+q0e)1r1 +'S12 q0(1a&g+Q4(2e)2q0a&g+Q4(2e)2q1(1d+ e)2r1 + + +'S3 D0v14o4l8q0MSV24,8, 1, 1,0SS1EON@0 +'S3 r1r1 +'S3 @0r4g+4g+4a4brg+4f+4g+&g+ @1g+r rg+ rr g+g+r1 +'S3 @0r4g+4g+4a4brg+4f+4g+&g+ @1g+r rg+ rr g+g+r1 +'S3 v14EONSS0@4l8 +今日も私、ちょっとPanic! +'S3 q0g+(1g+16)1g16 d_c+r Q7g+16r16r16(3g+16 q0)3b16(1b_a+16)1r16 +Ah~寝過ごしちゃった。 +'S3 q0e_d+&d+ e16>c16d16d16 Q4c q0a16Q6a16_gq0b16>c16c16cd Q4c+c+16c+16c&c16c&c.&c +'S3 r1 +'S3 D0v14o4l8q1MSV24,4, 1, 1,0SS1EON@3 +'S3 D1(3g_a&agf+4gg_a&aagf+ga.(3a16)3d4 +'S3 rc+c+d e.a.e e.e.d+ rf+gg_a& a2 rf+ga&a2 rf+gg_a&a1&a1D0)3 +'S3 [g+rg+4.g+rg+4.r2.] +'S3 D1(3b4a.a16g+abe4ee32f+~32er c+d+erc+d+e4c+d+e g32_a&a.~32g+.e4ef+4D0)3 +'S3 [g+rg+4.g+rg+4./r2.]rf+4ef+4 +'S3 e2.(1@0g+>c+