diff --git a/Sources/XPadAudio/AudioEngine.swift b/Sources/XPadAudio/AudioEngine.swift index 820642a..e2b6b41 100644 --- a/Sources/XPadAudio/AudioEngine.swift +++ b/Sources/XPadAudio/AudioEngine.swift @@ -1168,6 +1168,21 @@ public final class SynthVoice: @unchecked Sendable { var reachedReleaseEnd = false + // Precalculate unison and string increments outside the frame loop + let unisonDetunes: [Double] = [-0.35, -0.22, -0.10, 0.0, 0.10, 0.22, 0.35] + var unisonIncrements = [Double](repeating: 0.0, count: 7) + for vi in 0..<7 { + let df = frequency * (pow(2.0, unisonDetunes[vi] / 12.0) - 1.0) + unisonIncrements[vi] = min((frequency + df) / sampleRate, 0.49) + } + + let stringDetunes: [Double] = [-0.08, -0.025, 0.025, 0.08] + var stringIncrements = [Double](repeating: 0.0, count: 4) + for vi in 0..<4 { + let df = frequency * (pow(2.0, stringDetunes[vi] / 12.0) - 1.0) + stringIncrements[vi] = min((frequency + df) / sampleRate, 0.49) + } + for frame in 0..