Skip to main content

CalibraEffects

Unified audio effects chain for real-time vocal processing. Applies noise gate, compressor, and reverb in sequence to audio samples.

Quick Start

Kotlin

// Create with preset
val effects = CalibraEffects.create(EffectsPreset.VOCAL_CHAIN)

// Process audio in-place
effects.process(samples)

// Cleanup when done
effects.release()

Swift

// Create with preset
let effects = CalibraEffects.create(preset: .vocalChain)

// Process audio in-place
effects.process(samples: &samples)

// Cleanup when done
effects.release()

Configuration

Effects Presets

Combo presets that configure the entire chain in one step.

PresetKotlinSwiftGateCompressorReverbUse Case
Vocal ChainEffectsPreset.VOCAL_CHAIN.vocalChain-45 dB3:1 auto-makeup0.25 mixKaraoke / singing apps
PracticeEffectsPreset.PRACTICE.practice-50 dB2:1NoneLearning / practice
RecordingEffectsPreset.RECORDING.recording-40 dB6:1 auto-makeup0.15 mixVoice recording
DryEffectsPreset.DRY.dryNone4:1NoneCompression only
WetEffectsPreset.WET.wetNoneNone0.5 mixReverb only
CleanEffectsPreset.CLEAN.clean-40 dBNoneNoneNoise reduction only

Config Presets

Static configurations on CalibraEffectsConfig for common scenarios.

PresetKotlinSwiftDescription
DefaultCalibraEffectsConfig.DEFAULT.defaultNo effects enabled
Vocal ChainCalibraEffectsConfig.VOCAL_CHAIN.vocalChainNoise gate + compression + reverb
PracticeCalibraEffectsConfig.PRACTICE.practiceNoise gate only
VoiceCalibraEffectsConfig.VOICE.voiceNoise gate + light compression

Builder

Kotlin

val config = CalibraEffectsConfig.Builder()
.addNoiseGate() // defaults
.addCompressor(CompressorPreset.VOCALS) // preset
.addReverb(mix = 0.3f, roomSize = 0.5f) // custom params
.build()
val effects = CalibraEffects.create(config)

Swift

let config = CalibraEffectsConfig.Builder()
.addNoiseGate()
.addCompressor(preset: .vocals)
.addReverb(mix: 0.3, roomSize: 0.5)
.build()
let effects = CalibraEffects.create(config: config)

Builder Methods

MethodDescription
preset(config)Start from an existing CalibraEffectsConfig
addNoiseGate()Add noise gate with default settings
addNoiseGate(preset)Add noise gate with a NoiseGatePreset
addNoiseGate(thresholdDb, holdTimeMs, timeConstMs)Add noise gate with custom parameters
addCompressor()Add compressor with default settings
addCompressor(preset)Add compressor with a CompressorPreset
addCompressor(thresholdDb, ratio, attackMs, releaseMs, autoMakeup, makeupDb)Add compressor with custom parameters
addReverb()Add reverb with default settings
addReverb(preset)Add reverb with a ReverbPreset
addReverb(mix, roomSize)Add reverb with custom parameters
sampleRate(rate)Set audio sample rate in Hz
build()Build the CalibraEffectsConfig

Config Properties

PropertyTypeDefaultDescription
noiseGateNoiseGateConfig?nullNoise gate configuration (null = disabled)
compressorCompressorConfig?nullCompressor configuration (null = disabled)
reverbReverbConfig?nullReverb configuration (null = disabled)
sampleRateFloat16000Audio sample rate in Hz

Effects Chain

Audio is processed in a fixed order:

Input Audio --> [Noise Gate] --> [Compressor] --> [Reverb] --> Output Audio
| | |
Removes noise Evens levels Adds space

Each effect is optional. Disabled effects (null config) are skipped.

Noise Gate

Mutes audio below a threshold to remove background noise.

NoiseGateConfig Parameters

ParameterTypeDefaultDescription
thresholdDbFloat-40Signal level below which gating occurs (dB)
holdTimeMsFloat100Time to hold gate open after signal drops (ms)
timeConstMsFloat10Envelope follower time constant (ms)

NoiseGatePreset

PresetKotlinSwiftThresholdHoldTime ConstDescription
LightNoiseGatePreset.LIGHT.light-50 dB150 ms15 msQuiet environments
StandardNoiseGatePreset.STANDARD.standard-40 dB100 ms10 msTypical background noise
AggressiveNoiseGatePreset.AGGRESSIVE.aggressive-35 dB50 ms5 msNoisy environments
TightNoiseGatePreset.TIGHT.tight-30 dB30 ms3 msMaximum noise reduction

Compressor

Reduces dynamic range by attenuating loud sounds and optionally boosting quiet sounds.

CompressorConfig Parameters

ParameterTypeDefaultDescription
thresholdDbFloat-20Level above which compression begins (dB)
ratioFloat4Compression ratio (e.g., 4.0 = 4:1)
attackMsFloat10Time to reach full compression (ms)
releaseMsFloat100Time to release compression (ms)
autoMakeupBooleanfalseAutomatically compensate for gain reduction
makeupDbFloat0Manual makeup gain when autoMakeup is false (dB)

CompressorPreset

PresetKotlinSwiftThresholdRatioAttackReleaseDescription
VocalsCompressorPreset.VOCALS.vocals-20 dB3:115 ms150 msNatural vocal dynamics
Voice LevelerCompressorPreset.VOICE_LEVELER.voiceLeveler-15 dB6:15 ms80 msConsistent voice volume
SpeechCompressorPreset.SPEECH.speech-25 dB2:120 ms200 msGentle spoken word
BroadcastCompressorPreset.BROADCAST.broadcast-10 dB10:11 ms50 msHeavy limiting
TransparentCompressorPreset.TRANSPARENT.transparent-30 dB1.5:130 ms300 msPreserves dynamics

Reverb

Simulates natural reflections of sound in a space, adding depth and ambiance.

ReverbConfig Parameters

ParameterTypeDefaultDescription
mixFloat0.3Wet/dry mix (0.0 = dry, 1.0 = fully wet)
roomSizeFloat0.5Simulated room size (0.0 = small, 1.0 = large)

ReverbPreset

PresetKotlinSwiftMixRoom SizeDescription
Small RoomReverbPreset.SMALL_ROOM.smallRoom0.20.3Small practice room
Medium RoomReverbPreset.MEDIUM_ROOM.mediumRoom0.350.5Medium rehearsal space
Large HallReverbPreset.LARGE_HALL.largeHall0.50.8Concert hall ambiance
DryReverbPreset.DRY.dry0.10.2Minimal reverb
CathedralReverbPreset.CATHEDRAL.cathedral0.60.95Cathedral-like spaciousness

Real-Time Parameter Adjustment

Update effect parameters at runtime without recreating the chain.

Kotlin

effects.setCompressorThreshold(-15f)
effects.setCompressorRatio(6f)
effects.setReverbMix(0.4f)
effects.setReverbRoomSize(0.6f)
effects.setNoiseGateThreshold(-45f)
effects.resetReverb()

Swift

effects.setCompressorThreshold(thresholdDb: -15)
effects.setCompressorRatio(ratio: 6)
effects.setReverbMix(mix: 0.4)
effects.setReverbRoomSize(roomSize: 0.6)
effects.setNoiseGateThreshold(thresholdDb: -45)
effects.resetReverb()

Runtime Methods

MethodParameterDescription
setCompressorThreshold(thresholdDb)FloatUpdate compressor threshold (dB)
setCompressorRatio(ratio)FloatUpdate compressor ratio
setReverbMix(mix)FloatUpdate reverb wet/dry mix
setReverbRoomSize(roomSize)FloatUpdate reverb room size
setNoiseGateThreshold(thresholdDb)FloatUpdate noise gate threshold (dB)
resetReverb()NoneReset reverb state (useful when starting new audio)

Properties

PropertyTypeDescription
hasNoiseGateBooleanWhether noise gate is active in this chain
hasCompressorBooleanWhether compressor is active in this chain
hasReverbBooleanWhether reverb is active in this chain

Factory Methods

MethodDescription
CalibraEffects.create()Create with default config (VOCAL_CHAIN)
CalibraEffects.create(config)Create with a CalibraEffectsConfig
CalibraEffects.create(preset)Create with an EffectsPreset

Constants

ConstantValueDescription
CalibraEffects.DEFAULT_SAMPLE_RATE16000fDefault sample rate for effects processing

Common Patterns

Karaoke Effects Processor

class KaraokeEffectsProcessor {
private val effects = CalibraEffects.create(EffectsPreset.VOCAL_CHAIN)

fun processAudioBuffer(samples: FloatArray) {
effects.process(samples)
}

fun setReverbLevel(level: Float) {
effects.setReverbMix(level)
}

fun destroy() {
effects.release()
}
}

Dynamic Effects with User Controls

class EffectsController {
private val effects: CalibraEffects

init {
val config = CalibraEffectsConfig.Builder()
.addNoiseGate(NoiseGatePreset.STANDARD)
.addCompressor(CompressorPreset.VOCALS)
.addReverb(ReverbPreset.SMALL_ROOM)
.build()
effects = CalibraEffects.create(config)
}

// Wire to UI sliders
fun onReverbMixChanged(value: Float) = effects.setReverbMix(value)
fun onReverbSizeChanged(value: Float) = effects.setReverbRoomSize(value)
fun onGateThresholdChanged(value: Float) = effects.setNoiseGateThreshold(value)
fun onCompThresholdChanged(value: Float) = effects.setCompressorThreshold(value)

fun release() = effects.release()
}

Swift Practice Session

class PracticeSession {
private let effects = CalibraEffects.create(preset: .practice)

func processBuffer(_ samples: inout [Float]) {
effects.process(samples: &samples)
}

func enableReverb() {
// Note: to add reverb at runtime, create a new chain
// Runtime methods only adjust existing effects
}

func cleanup() {
effects.release()
}
}

Conditional Chain with Introspection

val effects = CalibraEffects.create(EffectsPreset.VOCAL_CHAIN)

if (effects.hasReverb) {
println("Reverb is active")
effects.setReverbMix(0.2f)
}

if (effects.hasCompressor) {
effects.setCompressorThreshold(-18f)
}

Platform Notes

  • Audio must be 16kHz mono. Use SonixResampler to resample if your source audio is 44.1kHz or 48kHz.
  • The process() method modifies samples in-place for zero-allocation real-time use.

Next Steps