computePan method
void
computePan({})
Implementation
void computePan({
required double posX,
required double outL,
required double outR,
required void Function(double l, double r) apply,
}) {
final double pan = posX.clamp(-1.0, 1.0);
switch (spatialMode) {
/// 🔹 1. SOFT PAN (equal-power, default)
case NeomSpatialMode.softPan:
final l = cos((pan + 1) * pi / 4);
final r = sin((pan + 1) * pi / 4);
apply(l, r);
break;
/// 🔹 2. HARD PAN
case NeomSpatialMode.hardPan:
apply(
pan <= 0 ? 1.0 : 0.0,
pan >= 0 ? 1.0 : 0.0,
);
break;
/// 🔹 3. CROSSFade PROGRESIVO
case NeomSpatialMode.crossfade:
final l = ((1 - pan) / 2).clamp(0.0, 1.0);
final r = ((1 + pan) / 2).clamp(0.0, 1.0);
apply(l, r);
break;
/// 🔹 4. ORBITA AUTOMÁTICA
case NeomSpatialMode.orbit:
orbitPhase += orbitSpeed / NeomGeneratorConstants.sampleRate;
if (orbitPhase > 1) orbitPhase -= 1;
final angle = orbitPhase * 2 * pi;
final l = cos(angle).abs();
final r = sin(angle).abs();
apply(l, r);
break;
case NeomSpatialMode.centered:
break;
}
}