computePan method

void computePan({
  1. required double posX,
  2. required double outL,
  3. required double outR,
  4. required void apply(
    1. double l,
    2. double r
    ),
})

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;
  }
}