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:
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user