Skip to content

Commit 80700ae

Browse files
author
kumatan
committed
TAG715 2024/01/13
コア:GWI:lコマンド、音符コマンドに発音音長を`(バッククォート)で指定できるようにしました。 パート別アルペジオ中のみ機能します。 またq/Qコマンドの設定も考慮されます。
1 parent 177c53b commit 80700ae

File tree

7 files changed

+145
-30
lines changed

7 files changed

+145
-30
lines changed

mml2vgm/CHANGE.txt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
11
�X�V����
2+
TAG715 2024/01/13
3+
�R�A:GWI:l�R�}���h�A�����R�}���h�ɔ���������`(�o�b�N�N�H�[�g)�Ŏw��ł���悤�ɂ��܂����B
4+
�p�[�g�ʃA���y�W�I���̂݋@�\���܂��B
5+
�܂�q/Q�R�}���h�̐ݒ���l������܂��B
6+
27
TAG714 2024/01/11
38
OPNA/OPNB:ADPCM/ADPCM-B�Ńx���h���ł��Ȃ������o�O���C��
49

mml2vgm/Core/MMLAnalyze.cs

Lines changed: 84 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,10 +1019,51 @@ private void CmdLength(partWork pw, partPage page, MML mml)
10191019
n += futen;
10201020

10211021
}
1022+
pw.skipTabSpace(page);
1023+
int an = -1;
1024+
if (pw.getChar(page) == '`')
1025+
{
1026+
pw.incPos(page);
1027+
if (pw.getNumNoteLength(page, out an, out bool adirectFlg))
1028+
{
1029+
if (!adirectFlg)
1030+
{
1031+
if ((int)info.clockCount % an != 0)
1032+
{
1033+
msgBox.setWrnMsg(string.Format(msg.get("E05008"), an), mml.line.Lp);
1034+
}
1035+
an = (int)info.clockCount / an;
1036+
}
1037+
else
1038+
{
1039+
an = Common.CheckRange(an, 1, 65535);
1040+
}
1041+
1042+
//.の解析
1043+
int futen = 0;
1044+
int fn = an;
1045+
while (pw.getChar(page) == '.')
1046+
{
1047+
if (fn % 2 != 0)
1048+
{
1049+
msgBox.setWrnMsg(msg.get("E05036")
1050+
, mml.line.Lp);
1051+
}
1052+
fn = fn / 2;
1053+
futen += fn;
1054+
pw.incPos(page);
1055+
}
1056+
an += futen;
1057+
}
1058+
}
1059+
1060+
10221061
mml.type = enmMMLType.Length;
10231062
mml.args = new List<object>();
10241063
mml.args.Add(n);
1064+
mml.args.Add(an);
10251065
page.length = n;
1066+
page.arpPartLength = an;
10261067
}
10271068

10281069
private void CmdClockLength(partWork pw, partPage page, MML mml)
@@ -1608,8 +1649,10 @@ private void CmdReplaceByParts(partWork pw, partPage page, MML mml)
16081649
num = Math.Max(num, 1);
16091650

16101651
mml.type = enmMMLType.ReplaceByParts;
1611-
mml.args = new List<object>();
1612-
mml.args.Add(num);
1652+
mml.args = new List<object>
1653+
{
1654+
num
1655+
};
16131656
}
16141657

16151658
private void CmdReplaceByParts_End(partWork pw, partPage page, MML mml)
@@ -1652,11 +1695,15 @@ private void CmdPartArpeggio_Start(partWork pw, partPage page, MML mml)
16521695
}
16531696

16541697
page.replacePartOrPartArpeggio = true;
1698+
page.arpPartLength = page.length;
1699+
16551700
mml.type = enmMMLType.PartArpeggio_Start;
1656-
mml.args = new List<object>();
1657-
mml.args.Add(mode);
1658-
mml.args.Add(mml.line.Index);
1659-
mml.args.Add(mml.line.Count);
1701+
mml.args = new List<object>
1702+
{
1703+
mode,
1704+
mml.line.Index,
1705+
mml.line.Count
1706+
};
16601707
}
16611708

16621709
private void CmdPartArpeggio_End(partWork pw, partPage page, MML mml)
@@ -3386,8 +3433,8 @@ private void CmdCommandArpeggio(partWork pw, partPage page, MML mml)
33863433
//}
33873434

33883435
//
3389-
// c + 0 99 .. ^99 &99 ~99 ,99 :
3390-
// 1 2 3 4 5 6 7 8 9 10
3436+
// c + 0 99 .. ^99 &99 ~99 `99 ,99 :
3437+
// 1 2 3 4 5 6 7 8 9 10 11
33913438
//
33923439
// 1... c d e f g a b x 音符
33933440
// 2... + - 半音上げる/下げる(複数可能)
@@ -3397,10 +3444,11 @@ private void CmdCommandArpeggio(partWork pw, partPage page, MML mml)
33973444
// 6... ^n.. 音長を加算($は16進 #はクロック表記 #$は16進のクロック表記)符点も可能
33983445
// 7... &n.. 音長を加算($は16進 #はクロック表記 #$は16進のクロック表記)符点も可能
33993446
// 8... ~n.. 音長を減算($は16進 #はクロック表記 #$は16進のクロック表記)符点も可能
3400-
// 6,7,8 は複数繰り返し指定可能。順番も自由
3401-
// 9... ,c コンマの後が音符ならばToneDoubler
3447+
// 9... `n.. 発音音長を設定2個目以降は加算($は16進 #はクロック表記 #$は16進のクロック表記)符点も可能
3448+
// 6,7,8,9 は複数繰り返し指定可能。順番も自由
3449+
//10... ,c コンマの後が音符ならばToneDoubler
34023450
// 数値の場合はベロシティ
3403-
//10... : 和音指定(ウエイトキャンセル)
3451+
//11... : 和音指定(ウエイトキャンセル)
34043452
private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
34053453
{
34063454
pw.incPos(page);
@@ -3507,7 +3555,8 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
35073555

35083556
//& ^ ~ コマンドの解析
35093557
int leng = 0;
3510-
while (pw.getChar(page) == '&' || pw.getChar(page) == '^' || pw.getChar(page) == '~')
3558+
int apLeng = 0;
3559+
while (pw.getChar(page) == '&' || pw.getChar(page) == '^' || pw.getChar(page) == '~' || pw.getChar(page) == '`')
35113560
{
35123561
char ch = pw.getChar(page);
35133562
int oldPos = pw.getPos(page);
@@ -3516,7 +3565,7 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
35163565
{
35173566
len++;
35183567
mml.line.Lp.length = len;
3519-
if (pw.getNumNoteLength(page, out n, out directFlg,out col,out kcol))
3568+
if (pw.getNumNoteLength(page, out n, out directFlg, out col, out kcol))
35203569
{
35213570
if (!directFlg)
35223571
{
@@ -3541,8 +3590,8 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
35413590
pw.decPos(page, nowPos - oldPos);
35423591
break;
35433592
}
3544-
int dmy=0;
3545-
n += CountFuten(pw, page, mml, n,ref dmy);
3593+
int dmy = 0;
3594+
n += CountFuten(pw, page, mml, n, ref dmy);
35463595

35473596
}
35483597
else if (ch == '^')
@@ -3562,12 +3611,30 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
35623611
mml.line.Lp.length = len + kcol;
35633612
len += col;
35643613
}
3614+
else if (ch == '`')
3615+
{
3616+
n = 0;
3617+
if (pw.getChar(page) == ']')
3618+
{
3619+
pw.decPos(page);
3620+
break;
3621+
}
3622+
int an;
3623+
len++;
3624+
mml.line.Lp.length = len;
3625+
GetLength(pw, page, mml, out an, out col, out kcol, true);
3626+
3627+
mml.line.Lp.length = len + kcol;
3628+
len += col;
3629+
apLeng += an;
35653630

3631+
}
35663632
leng += n;
35673633
}
35683634

35693635
note.length += leng;
35703636
note.addLength = leng;
3637+
note.arpPartLength = (apLeng == 0) ? (int)page.arpPartLength : apLeng;
35713638
len+=pw.skipTabSpace(page);
35723639
//
35733640

@@ -3645,7 +3712,7 @@ private void GetLength(partWork pw, partPage page, MML mml, out int n)
36453712
n += CountFuten(pw, page, mml, n,ref dmy);
36463713
}
36473714

3648-
private void GetLength(partWork pw, partPage page, MML mml, out int n,out int col,out int kcol)
3715+
private void GetLength(partWork pw, partPage page, MML mml, out int n,out int col,out int kcol, bool sw = false)
36493716
{
36503717
if (pw.getNumNoteLength(page, out n, out bool directFlg,out col,out kcol))
36513718
{
@@ -3666,7 +3733,7 @@ private void GetLength(partWork pw, partPage page, MML mml, out int n,out int co
36663733
else
36673734
{
36683735
//数値未指定の場合はlコマンドでの設定値を使用する
3669-
n = (int)page.length;
3736+
n = sw ? (int)page.arpPartLength : (int)page.length;
36703737
}
36713738
int dmy = 0;
36723739
n += CountFuten(pw, page, mml, n, ref dmy);

mml2vgm/Core/Note.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ public class Rest
88

99
public char cmd = 'r';
1010
public int length = 0;
11+
public int arpPartLength = 0;
1112

1213
/// <summary>
1314
/// 次が音符かどうか(RR15処理用)
@@ -20,6 +21,7 @@ public Rest Copy()
2021
n.cmd = this.cmd;
2122
n.length = this.length;
2223
n.nextIsNote = this.nextIsNote;
24+
n.arpPartLength=this.arpPartLength;
2325

2426
return n;
2527
}
@@ -58,6 +60,7 @@ public Note Copy()
5860
n.tieSw = this.tieSw;
5961
n.cmd = this.cmd;
6062
n.length = this.length;
63+
n.arpPartLength = this.arpPartLength;
6164

6265
n.bendSw = this.bendSw;
6366
n.bendCmd = this.bendCmd;

mml2vgm/Core/chips/clsChip.cs

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2014,19 +2014,39 @@ public virtual void CmdNote(partWork pw, partPage page, MML mml)
20142014
}
20152015

20162016
//gateTimeの決定
2017-
if (page.gatetimePmode)
2017+
if (!page.PASwitch)
20182018
{
2019-
if (!page.gatetimeReverse)
2020-
page.waitKeyOnCounter = page.waitCounter * page.gatetime / 8L;
2019+
if (page.gatetimePmode)
2020+
{
2021+
if (!page.gatetimeReverse)
2022+
page.waitKeyOnCounter = page.waitCounter * page.gatetime / 8L;
2023+
else
2024+
page.waitKeyOnCounter = page.waitCounter - page.waitCounter * (page.gatetime % 8L) / 8L;//リバース時は剰余数で計算
2025+
}
20212026
else
2022-
page.waitKeyOnCounter = page.waitCounter - page.waitCounter * (page.gatetime % 8L) / 8L;//リバース時は剰余数で計算
2027+
{
2028+
if (!page.gatetimeReverse)
2029+
page.waitKeyOnCounter = page.waitCounter - page.gatetime;
2030+
else
2031+
page.waitKeyOnCounter = Math.Abs(page.gatetime);//リバース時は負の数でも同じ動作
2032+
}
20232033
}
20242034
else
20252035
{
2026-
if (!page.gatetimeReverse)
2027-
page.waitKeyOnCounter = page.waitCounter - page.gatetime;
2036+
if (page.gatetimePmode)
2037+
{
2038+
if (!page.gatetimeReverse)
2039+
page.waitKeyOnCounter = note.arpPartLength * page.gatetime / 8L;
2040+
else
2041+
page.waitKeyOnCounter = note.arpPartLength - page.waitCounter * (page.gatetime % 8L) / 8L;//リバース時は剰余数で計算
2042+
}
20282043
else
2029-
page.waitKeyOnCounter = Math.Abs(page.gatetime);//リバース時は負の数でも同じ動作
2044+
{
2045+
if (!page.gatetimeReverse)
2046+
page.waitKeyOnCounter = note.arpPartLength - page.gatetime;
2047+
else
2048+
page.waitKeyOnCounter = Math.Abs(page.gatetime);//リバース時は負の数でも同じ動作
2049+
}
20302050
}
20312051
//if (page.waitKeyOnCounter > page.waitCounter) page.waitKeyOnCounter = page.waitCounter;
20322052
if (page.waitKeyOnCounter < 1) page.waitKeyOnCounter = 1;

mml2vgm/Core/partPage.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public class partPage
115115
/// lコマンドで設定されている音符の長さ(clock)
116116
/// </summary>
117117
public long length = 24;
118-
118+
public long arpPartLength = 24;
119119
/// <summary>
120120
/// oコマンドで設定されているオクターブ数
121121
/// </summary>

mml2vgm_MMLCommandMemo.txt

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,6 +756,8 @@
756756
@Wn,n,n,n -----------------oo----------------------------------- 基本波形番号指定(0 - 255) 基本波形4種を指定した波形に変更できる
757757
ln oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト音長指定
758758
l#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト音長指定(クロック値指定)
759+
`n oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト発音音長指定
760+
`#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト発音音長指定(クロック値指定)
759761
on -ooo-ooooo-oooo-oooo-oooooo-o-ooo-o-o-oo-o---ooooooooo オクターブ絶対指定(1 - 8)(実際に発音される音は可能な音域のみ)
760762
on -ooo---oo---oo---oo----oo----------------------------- オクターブ絶対指定(-1 - 9)(実際に発音される音は可能な音域のみ)
761763
on ---o-------------------------------------------------- オクターブ絶対指定(3 - 5)(実際に発音される音は可能な音域のみ)
@@ -922,7 +924,7 @@ rn oooooooooooooooooooooooooooooooooooooooooooooooooooooo 休符
922924
[|n oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別リプレース開始位置(n:有効パート数)
923925
|n oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別リプレース区切り位置(n:有効パート数)
924926
|] oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別リプレース終了位置
925-
[` oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別アルペジオ開始位置
927+
[` oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別アルペジオ開始位置 (デフォルト発音音長はデフォルト音長がセットされます。)
926928
`] oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別アルペジオ終了位置
927929
EON -----oo--ooo--ooo--oooo--o-ooooo-o-o-oo-o-o--ooooooooo エンベロープの開始
928930
EOF -----oo--ooo--ooo--oooo--o-ooooo-o-o-oo-o-o--ooooooooo エンベロープの停止
@@ -1059,6 +1061,8 @@ x -ooooooooooooooooooooooooooooooooooooooooooooooooooooo 音符x(
10591061
^#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo タイ(#n: クロック指定音長 音長分だけ発音を延長。)
10601062
~n oooooooooooooooooooooooooooooooooooooooooooooooooooooo タイの逆(n: 音長 音長分だけ発音を削る。)
10611063
~#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo タイの逆(#n: クロック指定音長 音長分だけ発音を削る。)
1064+
`n oooooooooooooooooooooooooooooooooooooooooooooooooooooo 発音音長(パート別アルペジオ中のみ)(n: 発音音長 音長分だけ発音。)
1065+
`#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo 発音音長(パート別アルペジオ中のみ)(#n: クロック指定発音音長 音長分だけ発音。)
10621066
,n oooooooooooooooooooooooooooooooooooooooooooooooooooooo ベロシティ(n:0-)
10631067
, -oo----oo---oo---oo----oo-o--------------------------- Tone Doublerモード
10641068
音符指定の後に0或いは,を指定するとTone Doublerモードになる。

mmlCommandTable.md

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -484,9 +484,10 @@
484484
- Command
485485
l
486486
- Format
487-
ln
487+
ln1[`n2]
488488
- 設定可能範囲
489-
n : 未チェック
489+
n1 : 未チェック
490+
n2 : 未チェック
490491
- Support chips
491492
- Conductor
492493
- YM2612
@@ -551,14 +552,14 @@
551552
例えば分解能が192のとき5連符20は割ると余り12が発生します。
552553
必要な音長に合わせて分解能を調整する場合があったり、
553554
余りの分を周辺の音符に振り分けて調整したりするなど工夫が必要になります。
554-
555+
`を指定するとデフォルト発音音長指定が可能です。
555556

556557
### 音長指定
557558
-----------
558559
- Command
559560
l#
560561
- Format
561-
l#n
562+
l#n[`#n]
562563
- 設定可能範囲
563564
n : 未チェック
564565
- Support chips
@@ -619,6 +620,7 @@
619620
つまり、l#48 を指定すると4分音符の長さを指定したことになります。
620621
前述のlコマンドでは表現できない微妙な長さを指定したい時や
621622
効果音など細かい音長、音程指定が必要な場合に使用します。
623+
`を指定するとデフォルト発音音長指定が可能です。
622624

623625

624626
### オクターブ絶対指定
@@ -2209,6 +2211,7 @@
22092211
ネスト不可能です。
22102212
パート別リプレースと併用不可能です。
22112213
パートの記述欄を参照して、自分が何番目になるかきまります。
2214+
[`のとき、デフォルト発音音長はデフォルト音長がセットされます。
22122215

22132216

22142217
### エンベロープ
@@ -4677,6 +4680,19 @@
46774680
c~4 lコマンドで設定された音長から4分音符分の長さを減らして発音します。
46784681

46794682

4683+
10. 発音音長
4684+
- 装飾コマンド
4685+
`n
4686+
`#n
4687+
4688+
- Description
4689+
パート別アルペジオ中のみ発音音長を指定します。
4690+
クロック数で指定することも可能です。
4691+
4692+
- Example
4693+
c8`4 音長は8分音符ですが、発音音長を4分音符分の長さで発音します。q/Qコマンドの値も考慮されます。
4694+
4695+
46804696
10. Tone Doubler
46814697
- 装飾コマンド
46824698
,

0 commit comments

Comments
 (0)