Skip to content

Commit

Permalink
LFOの処理修正
Browse files Browse the repository at this point in the history
OPM:panの修正
  • Loading branch information
kuma committed Aug 26, 2018
1 parent c4f3c9e commit 2c548db
Show file tree
Hide file tree
Showing 7 changed files with 281 additions and 337 deletions.
1 change: 1 addition & 0 deletions mml2vgm/Core/Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
<Compile Include="EncAdpcmA.cs" />
<Compile Include="Enums.cs" />
<Compile Include="Line.cs" />
<Compile Include="log.cs" />
<Compile Include="mml2vgm.cs" />
<Compile Include="msgBox.cs" />
<Compile Include="partWork.cs" />
Expand Down
111 changes: 81 additions & 30 deletions mml2vgm/Core/clsVgm.cs
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,7 @@ public ClsVgm(string stPath)

public int Analyze(List<Line> src)
{
log.Write("テキスト解析開始");
lineNumber = 0;

bool multiLine = false;
Expand Down Expand Up @@ -232,6 +233,7 @@ public int Analyze(List<Line> src)
}
}

log.Write("テキスト解析完了");
return 0;

}
Expand Down Expand Up @@ -1144,66 +1146,72 @@ public byte[] GetByteData()
{
if (userClockCount != 0) clockCount = userClockCount;

log.Write("パート情報の初期化");
PartInit();

dat = new List<byte>();

log.Write("ヘッダー情報作成");
MakeHeader();

int endChannel = 0;
newStreamID = -1;
int totalChannel = 0;
foreach (ClsChip chip in chips) totalChannel += chip.ChMax;

log.Write("MML解析開始");
do
{

foreach (ClsChip chip in chips)
{

log.Write(string.Format("Chip [{0}]", chip.Name));

foreach (partWork pw in chip.lstPartWork)
{
//未使用のパートの場合は処理を行わない
if (!pw.chip.use) continue;

log.Write("pcm sound off");

//pcm sound off
if (pw.pcmWaitKeyOnCounter == 0)
{
pw.pcmWaitKeyOnCounter = -1;
}

//KeyOff
log.Write("KeyOff");
ProcKeyOff(pw);

//Bend
log.Write("Bend");
ProcBend(pw);

//Lfo
log.Write("Lfo");
ProcLfo(pw);

//Envelope
log.Write("Envelope");
ProcEnvelope(pw);

//wait消化待ち
log.Write("wait消化待ち");
if (pw.waitCounter > 0)
{
continue;
}

//データは最後まで実施されたか
log.Write("データは最後まで実施されたか");
if (pw.dataEnd)
{
continue;
}

//パートのデータがない場合は何もしないで次へ
log.Write("パートのデータがない場合は何もしないで次へ");
if (!partData.ContainsKey(pw.PartName) || partData[pw.PartName] == null || partData[pw.PartName].Count < 1)
{
pw.dataEnd = true;
continue;
}

//コマンド毎の処理を実施
log.Write("コマンド毎の処理を実施");
while (pw.waitCounter == 0 && !pw.dataEnd)
{
char cmd = pw.getChar();
Expand All @@ -1220,8 +1228,7 @@ public byte[] GetByteData()

}

//channelを跨ぐコマンド向け処理

log.Write("channelを跨ぐコマンド向け処理");
if (chip is YM2608 && chip.use)
{
((YM2608)chip).MultiChannelCommand();
Expand All @@ -1240,7 +1247,7 @@ public byte[] GetByteData()
}


// 全パートのうち次のコマンドまで一番近い値を求める
log.Write("全パートのうち次のコマンドまで一番近い値を求める");
long cnt = long.MaxValue;
foreach (ClsChip chip in chips)
{
Expand Down Expand Up @@ -1307,6 +1314,7 @@ public byte[] GetByteData()

}

log.Write("全パートのwaitcounterを減らす");
if (cnt != long.MaxValue)
{

Expand Down Expand Up @@ -1374,6 +1382,7 @@ public byte[] GetByteData()

}

log.Write("終了パートのカウント");
endChannel = 0;
foreach (ClsChip chip in chips)
{
Expand All @@ -1388,6 +1397,7 @@ public byte[] GetByteData()
} while (endChannel < totalChannel);


log.Write("フッター情報の作成");
MakeFooter();


Expand Down Expand Up @@ -2293,94 +2303,124 @@ private void Commander(partWork pw, char cmd)
pw.incPos();
break;
case '!': // CompileSkip
log.Write("CompileSkip");
pw.dataEnd = true;
pw.waitCounter = -1;
break;
case 'T': // tempo
log.Write(" tempo");
CmdTempo(pw);
break;
case '@': // instrument
log.Write("instrument");
CmdInstrument(pw);
break;
case 'v': // volume
log.Write("volume");
CmdVolume(pw);
break;
case 'V': // totalVolume(Adpcm-A / Rhythm)
log.Write("totalVolume(Adpcm-A / Rhythm)");
CmdTotalVolume(pw);
break;
case 'o': // octave
log.Write("octave");
CmdOctave(pw);
break;
case '>': // octave Up
log.Write("octave Up");
CmdOctaveUp(pw);
break;
case '<': // octave Down
log.Write("octave Down");
CmdOctaveDown(pw);
break;
case ')': // volume Up
log.Write(" volume Up");
CmdVolumeUp(pw);
break;
case '(': // volume Down
log.Write("volume Down");
CmdVolumeDown(pw);
break;
case 'l': // length
log.Write("length");
CmdLength(pw);
break;
case '#': // length(clock)
log.Write("length(clock)");
CmdClockLength(pw);
break;
case 'p': // pan
log.Write(" pan");
CmdPan(pw);
break;
case 'D': // Detune
log.Write("Detune");
CmdDetune(pw);
break;
case 'm': // pcm mode
log.Write("pcm mode");
CmdMode(pw);
break;
case 'q': // gatetime
log.Write(" gatetime q");
CmdGatetime(pw);
break;
case 'Q': // gatetime
log.Write("gatetime Q");
CmdGatetime2(pw);
break;
case 'E': // envelope
log.Write("envelope");
CmdEnvelope(pw);
break;
case 'L': // loop point
log.Write(" loop point");
CmdLoop(pw);
break;
case '[': // repeat
log.Write("repeat [");
CmdRepeatStart(pw);
break;
case ']': // repeat
log.Write("repeat ]");
CmdRepeatEnd(pw);
break;
case '{': // renpu
log.Write("renpu {");
CmdRenpuStart(pw);
break;
case '}': // renpu
log.Write("renpu }");
CmdRenpuEnd(pw);
break;
case '/': // repeat
log.Write("repeat /");
CmdRepeatExit(pw);
break;
case 'M': // lfo
log.Write("lfo");
CmdLfo(pw);
break;
case 'S': // lfo switch
log.Write(" lfo switch");
CmdLfoSwitch(pw);
break;
case 'y': // y
log.Write(" y");
CmdY(pw);
break;
case 'w': // noise
log.Write("noise");
CmdNoise(pw);
break;
case 'P': // noise or tone mixer
log.Write("noise or tone mixer");
CmdMixer(pw);
break;
case 'K': // key shift
log.Write("key shift");
CmdKeyShift(pw);
break;
case 'c':
Expand All @@ -2391,6 +2431,7 @@ private void Commander(partWork pw, char cmd)
case 'a':
case 'b':
case 'r':
log.Write(string.Format("note {0}", cmd));
CmdNote(pw, cmd);
break;
default:
Expand Down Expand Up @@ -4280,14 +4321,16 @@ private void CmdPan(partWork pw)
msgBox.setErrMsg("不正なパン'p'が指定されています。", pw.getSrcFn(), pw.getLineNumber());
n = 3;
}
//強制的にモノラルにする
if (monoPart != null && monoPart.Contains(ym2612[0].Ch[5].Name))
{
n = 3;
}
n = Common.CheckRange(n, 1, 3);
pw.pan.val = (n == 1) ? 2 : (n == 2 ? 1 : n);
((YM2151)pw.chip).OutSetPanFeedbackAlgorithm(pw, (int)pw.pan.val, instFM[pw.instrument][46], instFM[pw.instrument][45]);
if (pw.instrument < 0)
{
msgBox.setErrMsg("音色指定前にパンは指定できません。", pw.getSrcFn(), pw.getLineNumber());
}
else
{
((YM2151)pw.chip).OutSetPanFeedbackAlgorithm(pw, (int)pw.pan.val, instFM[pw.instrument][46], instFM[pw.instrument][45]);
}
}
else if (pw.chip is YM2203)
{
Expand All @@ -4308,11 +4351,6 @@ private void CmdPan(partWork pw)
msgBox.setErrMsg("不正なパン'p'が指定されています。", pw.getSrcFn(), pw.getLineNumber());
n = 3;
}
//強制的にモノラルにする
if (monoPart != null && monoPart.Contains(ym2612[0].Ch[5].Name))
{
n = 3;
}
n = Common.CheckRange(n, 1, 3);
pw.pan.val = n;
OutOPNSetPanAMSPMS(pw, n, pw.ams, pw.fms);
Expand Down Expand Up @@ -4353,11 +4391,6 @@ private void CmdPan(partWork pw)
msgBox.setErrMsg("不正なパン'p'が指定されています。", pw.getSrcFn(), pw.getLineNumber());
n = 3;
}
//強制的にモノラルにする
if (monoPart != null && monoPart.Contains(ym2612[0].Ch[5].Name))
{
n = 3;
}
n = Common.CheckRange(n, 1, 3);
pw.pan.val = n;
OutOPNSetPanAMSPMS(pw, n, pw.ams, pw.fms);
Expand Down Expand Up @@ -5261,7 +5294,7 @@ private void CmdLfo(partWork pw)
pw.lfo[c].param[0] = Common.CheckRange(pw.lfo[c].param[0], 0, (int)clockCount);
pw.lfo[c].param[1] = Common.CheckRange(pw.lfo[c].param[1], 1, 255);
pw.lfo[c].param[2] = Common.CheckRange(pw.lfo[c].param[2], -32768, 32787);
pw.lfo[c].param[3] = Math.Abs(Common.CheckRange(pw.lfo[c].param[3], -32768, 32787));
pw.lfo[c].param[3] = Math.Abs(Common.CheckRange(pw.lfo[c].param[3], 0, 32787));
if (pw.lfo[c].param.Count > 4)
{
pw.lfo[c].param[4] = Common.CheckRange(pw.lfo[c].param[4], 0, 4);
Expand All @@ -5281,10 +5314,11 @@ private void CmdLfo(partWork pw)
if (pw.lfo[c].param.Count > 6)
{
pw.lfo[c].param[6] = Common.CheckRange(pw.lfo[c].param[6], -32768, 32787);
if (pw.lfo[c].param[6] == 0) pw.lfo[c].param[6] = 1;
}
else
{
pw.lfo[c].param.Add(0);
pw.lfo[c].param.Add(1);
}

}
Expand Down Expand Up @@ -5407,6 +5441,12 @@ private void CmdLfoSwitch(partWork pw)

//解析 ここまで

//LFOの設定値をチェック
if (n != 0 && !CheckLFOParam(pw, (int)c))
{
return;
}

pw.lfo[c].sw = (n == 0) ? false : true;

//即時有効になるタイプのHardLFOの処理
Expand Down Expand Up @@ -5448,6 +5488,17 @@ private void CmdLfoSwitch(partWork pw)

}

private bool CheckLFOParam(partWork pw, int c)
{
if (pw.lfo[c].param == null)
{
msgBox.setErrMsg("指定されたLFOのパラメータが未指定です。", pw.getSrcFn(), pw.getLineNumber());
return false;
}

return false;
}

private void CmdMAMS(partWork pw)
{
if (!( (pw.chip is YM2151) || (pw.chip is YM2608) || (pw.chip is YM2610B) || (pw.chip is YM2612) || (pw.chip is YM2612X)))
Expand Down
Loading

0 comments on commit 2c548db

Please sign in to comment.