Add per-channel independent limit controls

- Separate Lim A / Lim B trackbars (0-200, default 30 each)
- Separate Scale A / Scale B checkboxes (clamp vs scale per channel)
- State.SetLimitA/SetLimitB with independent LimitModeA/LimitModeB
- ConsumeTick applies per-channel limit and mode
This commit is contained in:
2026-08-08 11:26:44 +00:00
parent 325022d27c
commit 33e289d596
3 changed files with 211 additions and 54 deletions
+28 -13
View File
@@ -18,17 +18,30 @@ public class State
public int ActualA, ActualB;
public int LastSentA, LastSentB;
public int LastIntensityA, LastIntensityB;
public byte[]? LastFreqA, LastIntA, LastFreqB, LastIntB;
public bool LastActiveA, LastActiveB;
public int MaxStrength = 200;
public LimitMode LimitMode = LimitMode.Clamp;
public int MaxA = 200;
public int MaxB = 200;
public LimitMode LimitModeA = LimitMode.Clamp;
public LimitMode LimitModeB = LimitMode.Clamp;
public void SetLimit(int max, LimitMode mode)
public void SetLimitA(int max, LimitMode mode)
{
lock (Lock)
{
MaxStrength = Math.Clamp(max, 0, 200);
LimitMode = mode;
MaxA = Math.Clamp(max, 0, 200);
LimitModeA = mode;
DirtyA = true;
}
}
public void SetLimitB(int max, LimitMode mode)
{
lock (Lock)
{
MaxB = Math.Clamp(max, 0, 200);
LimitModeB = mode;
DirtyB = true;
}
}
@@ -93,14 +106,12 @@ public class State
var modeA = DirtyA ? StrengthMode.Abs : StrengthMode.None;
var modeB = DirtyB ? StrengthMode.Abs : StrengthMode.None;
var limit = MaxStrength;
var limMode = LimitMode;
byte ApplyLimit(int desired) =>
limMode == LimitMode.Scale
? (byte)(desired * limit / 200)
: (byte)Math.Clamp(desired, 0, limit);
var valA = ApplyLimit(DesiredA);
var valB = ApplyLimit(DesiredB);
byte ApplyLimit(int desired, int max, LimitMode mode) =>
mode == LimitMode.Scale
? (byte)(desired * max / 200)
: (byte)Math.Clamp(desired, 0, max);
var valA = ApplyLimit(DesiredA, MaxA, LimitModeA);
var valB = ApplyLimit(DesiredB, MaxB, LimitModeB);
LastSentA = valA;
LastSentB = valB;
DirtyA = false;
@@ -111,6 +122,10 @@ public class State
var (freqA, intA) = PopWave(StreamA, LoopFreqA, LoopIntA);
var (freqB, intB) = PopWave(StreamB, LoopFreqB, LoopIntB);
LastActiveA = hasA;
LastActiveB = hasB;
LastFreqA = freqA; LastIntA = intA;
LastFreqB = freqB; LastIntB = intB;
LastIntensityA = hasA ? (intA[0] + intA[1] + intA[2] + intA[3]) / 4 : 0;
LastIntensityB = hasB ? (intB[0] + intB[1] + intB[2] + intB[3]) / 4 : 0;