Skip to content

Commit

Permalink
TAG715 2024/01/13
Browse files Browse the repository at this point in the history
  コア:GWI:lコマンド、音符コマンドに発音音長を`(バッククォート)で指定できるようにしました。
  パート別アルペジオ中のみ機能します。
  またq/Qコマンドの設定も考慮されます。
  • Loading branch information
kumatan committed Jan 13, 2024
1 parent 177c53b commit 80700ae
Show file tree
Hide file tree
Showing 7 changed files with 145 additions and 30 deletions.
5 changes: 5 additions & 0 deletions mml2vgm/CHANGE.txt
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
�X�V����
TAG715 2024/01/13
�R�A:GWI:l�R�}���h�A�����R�}���h�ɔ���������`(�o�b�N�N�H�[�g)�Ŏw��ł���悤�ɂ��܂����B
�p�[�g�ʃA���y�W�I���̂݋@�\���܂��B
�܂�q/Q�R�}���h�̐ݒ���l������܂��B

TAG714 2024/01/11
OPNA/OPNB:ADPCM/ADPCM-B�Ńx���h���ł��Ȃ������o�O���C��

Expand Down
101 changes: 84 additions & 17 deletions mml2vgm/Core/MMLAnalyze.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1019,10 +1019,51 @@ private void CmdLength(partWork pw, partPage page, MML mml)
n += futen;

}
pw.skipTabSpace(page);
int an = -1;
if (pw.getChar(page) == '`')
{
pw.incPos(page);
if (pw.getNumNoteLength(page, out an, out bool adirectFlg))
{
if (!adirectFlg)
{
if ((int)info.clockCount % an != 0)
{
msgBox.setWrnMsg(string.Format(msg.get("E05008"), an), mml.line.Lp);
}
an = (int)info.clockCount / an;
}
else
{
an = Common.CheckRange(an, 1, 65535);
}

//.の解析
int futen = 0;
int fn = an;
while (pw.getChar(page) == '.')
{
if (fn % 2 != 0)
{
msgBox.setWrnMsg(msg.get("E05036")
, mml.line.Lp);
}
fn = fn / 2;
futen += fn;
pw.incPos(page);
}
an += futen;
}
}


mml.type = enmMMLType.Length;
mml.args = new List<object>();
mml.args.Add(n);
mml.args.Add(an);
page.length = n;
page.arpPartLength = an;
}

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

mml.type = enmMMLType.ReplaceByParts;
mml.args = new List<object>();
mml.args.Add(num);
mml.args = new List<object>
{
num
};
}

private void CmdReplaceByParts_End(partWork pw, partPage page, MML mml)
Expand Down Expand Up @@ -1652,11 +1695,15 @@ private void CmdPartArpeggio_Start(partWork pw, partPage page, MML mml)
}

page.replacePartOrPartArpeggio = true;
page.arpPartLength = page.length;

mml.type = enmMMLType.PartArpeggio_Start;
mml.args = new List<object>();
mml.args.Add(mode);
mml.args.Add(mml.line.Index);
mml.args.Add(mml.line.Count);
mml.args = new List<object>
{
mode,
mml.line.Index,
mml.line.Count
};
}

private void CmdPartArpeggio_End(partWork pw, partPage page, MML mml)
Expand Down Expand Up @@ -3386,8 +3433,8 @@ private void CmdCommandArpeggio(partWork pw, partPage page, MML mml)
//}

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

//& ^ ~ コマンドの解析
int leng = 0;
while (pw.getChar(page) == '&' || pw.getChar(page) == '^' || pw.getChar(page) == '~')
int apLeng = 0;
while (pw.getChar(page) == '&' || pw.getChar(page) == '^' || pw.getChar(page) == '~' || pw.getChar(page) == '`')
{
char ch = pw.getChar(page);
int oldPos = pw.getPos(page);
Expand All @@ -3516,7 +3565,7 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
{
len++;
mml.line.Lp.length = len;
if (pw.getNumNoteLength(page, out n, out directFlg,out col,out kcol))
if (pw.getNumNoteLength(page, out n, out directFlg, out col, out kcol))
{
if (!directFlg)
{
Expand All @@ -3541,8 +3590,8 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
pw.decPos(page, nowPos - oldPos);
break;
}
int dmy=0;
n += CountFuten(pw, page, mml, n,ref dmy);
int dmy = 0;
n += CountFuten(pw, page, mml, n, ref dmy);

}
else if (ch == '^')
Expand All @@ -3562,12 +3611,30 @@ private void CmdNote(partWork pw, partPage page, char cmd, MML mml)
mml.line.Lp.length = len + kcol;
len += col;
}
else if (ch == '`')
{
n = 0;
if (pw.getChar(page) == ']')
{
pw.decPos(page);
break;
}
int an;
len++;
mml.line.Lp.length = len;
GetLength(pw, page, mml, out an, out col, out kcol, true);

mml.line.Lp.length = len + kcol;
len += col;
apLeng += an;

}
leng += n;
}

note.length += leng;
note.addLength = leng;
note.arpPartLength = (apLeng == 0) ? (int)page.arpPartLength : apLeng;
len+=pw.skipTabSpace(page);
//

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

private void GetLength(partWork pw, partPage page, MML mml, out int n,out int col,out int kcol)
private void GetLength(partWork pw, partPage page, MML mml, out int n,out int col,out int kcol, bool sw = false)
{
if (pw.getNumNoteLength(page, out n, out bool directFlg,out col,out kcol))
{
Expand All @@ -3666,7 +3733,7 @@ private void GetLength(partWork pw, partPage page, MML mml, out int n,out int co
else
{
//数値未指定の場合はlコマンドでの設定値を使用する
n = (int)page.length;
n = sw ? (int)page.arpPartLength : (int)page.length;
}
int dmy = 0;
n += CountFuten(pw, page, mml, n, ref dmy);
Expand Down
3 changes: 3 additions & 0 deletions mml2vgm/Core/Note.cs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ public class Rest

public char cmd = 'r';
public int length = 0;
public int arpPartLength = 0;

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

return n;
}
Expand Down Expand Up @@ -58,6 +60,7 @@ public Note Copy()
n.tieSw = this.tieSw;
n.cmd = this.cmd;
n.length = this.length;
n.arpPartLength = this.arpPartLength;

n.bendSw = this.bendSw;
n.bendCmd = this.bendCmd;
Expand Down
34 changes: 27 additions & 7 deletions mml2vgm/Core/chips/clsChip.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2014,19 +2014,39 @@ public virtual void CmdNote(partWork pw, partPage page, MML mml)
}

//gateTimeの決定
if (page.gatetimePmode)
if (!page.PASwitch)
{
if (!page.gatetimeReverse)
page.waitKeyOnCounter = page.waitCounter * page.gatetime / 8L;
if (page.gatetimePmode)
{
if (!page.gatetimeReverse)
page.waitKeyOnCounter = page.waitCounter * page.gatetime / 8L;
else
page.waitKeyOnCounter = page.waitCounter - page.waitCounter * (page.gatetime % 8L) / 8L;//リバース時は剰余数で計算
}
else
page.waitKeyOnCounter = page.waitCounter - page.waitCounter * (page.gatetime % 8L) / 8L;//リバース時は剰余数で計算
{
if (!page.gatetimeReverse)
page.waitKeyOnCounter = page.waitCounter - page.gatetime;
else
page.waitKeyOnCounter = Math.Abs(page.gatetime);//リバース時は負の数でも同じ動作
}
}
else
{
if (!page.gatetimeReverse)
page.waitKeyOnCounter = page.waitCounter - page.gatetime;
if (page.gatetimePmode)
{
if (!page.gatetimeReverse)
page.waitKeyOnCounter = note.arpPartLength * page.gatetime / 8L;
else
page.waitKeyOnCounter = note.arpPartLength - page.waitCounter * (page.gatetime % 8L) / 8L;//リバース時は剰余数で計算
}
else
page.waitKeyOnCounter = Math.Abs(page.gatetime);//リバース時は負の数でも同じ動作
{
if (!page.gatetimeReverse)
page.waitKeyOnCounter = note.arpPartLength - page.gatetime;
else
page.waitKeyOnCounter = Math.Abs(page.gatetime);//リバース時は負の数でも同じ動作
}
}
//if (page.waitKeyOnCounter > page.waitCounter) page.waitKeyOnCounter = page.waitCounter;
if (page.waitKeyOnCounter < 1) page.waitKeyOnCounter = 1;
Expand Down
2 changes: 1 addition & 1 deletion mml2vgm/Core/partPage.cs
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ public class partPage
/// lコマンドで設定されている音符の長さ(clock)
/// </summary>
public long length = 24;

public long arpPartLength = 24;
/// <summary>
/// oコマンドで設定されているオクターブ数
/// </summary>
Expand Down
6 changes: 5 additions & 1 deletion mml2vgm_MMLCommandMemo.txt
Original file line number Diff line number Diff line change
Expand Up @@ -756,6 +756,8 @@
@Wn,n,n,n -----------------oo----------------------------------- 基本波形番号指定(0 - 255) 基本波形4種を指定した波形に変更できる
ln oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト音長指定
l#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト音長指定(クロック値指定)
`n oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト発音音長指定
`#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo デフォルト発音音長指定(クロック値指定)
on -ooo-ooooo-oooo-oooo-oooooo-o-ooo-o-o-oo-o---ooooooooo オクターブ絶対指定(1 - 8)(実際に発音される音は可能な音域のみ)
on -ooo---oo---oo---oo----oo----------------------------- オクターブ絶対指定(-1 - 9)(実際に発音される音は可能な音域のみ)
on ---o-------------------------------------------------- オクターブ絶対指定(3 - 5)(実際に発音される音は可能な音域のみ)
Expand Down Expand Up @@ -922,7 +924,7 @@ rn oooooooooooooooooooooooooooooooooooooooooooooooooooooo 休符
[|n oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別リプレース開始位置(n:有効パート数)
|n oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別リプレース区切り位置(n:有効パート数)
|] oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別リプレース終了位置
[` oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別アルペジオ開始位置
[` oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別アルペジオ開始位置 (デフォルト発音音長はデフォルト音長がセットされます。)
`] oooooooooooooooooooooooooooooooooooooooooooooooooooooo パート別アルペジオ終了位置
EON -----oo--ooo--ooo--oooo--o-ooooo-o-o-oo-o-o--ooooooooo エンベロープの開始
EOF -----oo--ooo--ooo--oooo--o-ooooo-o-o-oo-o-o--ooooooooo エンベロープの停止
Expand Down Expand Up @@ -1059,6 +1061,8 @@ x -ooooooooooooooooooooooooooooooooooooooooooooooooooooo 音符x(
^#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo タイ(#n: クロック指定音長 音長分だけ発音を延長。)
~n oooooooooooooooooooooooooooooooooooooooooooooooooooooo タイの逆(n: 音長 音長分だけ発音を削る。)
~#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo タイの逆(#n: クロック指定音長 音長分だけ発音を削る。)
`n oooooooooooooooooooooooooooooooooooooooooooooooooooooo 発音音長(パート別アルペジオ中のみ)(n: 発音音長 音長分だけ発音。)
`#n oooooooooooooooooooooooooooooooooooooooooooooooooooooo 発音音長(パート別アルペジオ中のみ)(#n: クロック指定発音音長 音長分だけ発音。)
,n oooooooooooooooooooooooooooooooooooooooooooooooooooooo ベロシティ(n:0-)
, -oo----oo---oo---oo----oo-o--------------------------- Tone Doublerモード
音符指定の後に0或いは,を指定するとTone Doublerモードになる。
Expand Down
24 changes: 20 additions & 4 deletions mmlCommandTable.md
Original file line number Diff line number Diff line change
Expand Up @@ -484,9 +484,10 @@
- Command
l
- Format
ln
ln1[`n2]
- 設定可能範囲
n : 未チェック
n1 : 未チェック
n2 : 未チェック
- Support chips
- Conductor
- YM2612
Expand Down Expand Up @@ -551,14 +552,14 @@
例えば分解能が192のとき5連符20は割ると余り12が発生します。
必要な音長に合わせて分解能を調整する場合があったり、
余りの分を周辺の音符に振り分けて調整したりするなど工夫が必要になります。

`を指定するとデフォルト発音音長指定が可能です。

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


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


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


10. 発音音長
- 装飾コマンド
`n
`#n

- Description
パート別アルペジオ中のみ発音音長を指定します。
クロック数で指定することも可能です。

- Example
c8`4 音長は8分音符ですが、発音音長を4分音符分の長さで発音します。q/Qコマンドの値も考慮されます。


10. Tone Doubler
- 装飾コマンド
,
Expand Down

0 comments on commit 80700ae

Please sign in to comment.