CalibraEffects

Unified audio effects chain for real-time vocal processing.

What Are Audio Effects?

Audio effects transform audio in real-time to improve sound quality or add character:

  • Noise Gate: Mutes audio below a threshold (removes background noise)

  • Compressor: Reduces dynamic range (makes quiet parts louder, loud parts quieter)

  • Reverb: Adds room ambiance (makes vocals sound less "dry")

The effects chain processes audio in order: NoiseGate → Compressor → Reverb

When to Use

ScenarioPresetWhy
Karaoke/singing appVOCAL_CHAINFull processing for professional sound
Practice/learningPRACTICEMinimal processing, hear your raw voice
Voice recordingVOICENoise gate + light compression
Add reverb onlyBuilder with .addReverb()Custom chain

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()

Usage Tiers

Tier 1: Presets (80% of users)

Kotlin

// Default vocal chain
val effects = CalibraEffects.create()

// Specific preset
val effects = CalibraEffects.create(EffectsPreset.PRACTICE)

Swift

// Default vocal chain
let effects = CalibraEffects.create()

// Specific preset
let effects = CalibraEffects.create(preset: .practice)

Tier 2: Config Builder (15% of users)

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)

Tier 3: Runtime Adjustment (5% of users)

Kotlin

// Update parameters at runtime
effects.setCompressorThreshold(-15f)
effects.setReverbMix(0.4f)
effects.setNoiseGateThreshold(-45f)

Signal Flow

Input Audio → [Noise Gate] → [Compressor] → [Reverb] → Output Audio
↓ ↓ ↓
Removes noise Evens levels Adds space

Platform Notes

iOS

  • Expects 16kHz mono audio (use SonixResampler if needed)

  • Effects use Accelerate framework for optimal performance

  • Process on audio thread for lowest latency

Android

  • Expects 16kHz mono audio (use SonixResampler if needed)

  • Effects use native C++ for performance

  • Works with AudioTrack and Oboe

Common Pitfalls

  1. Forgetting to release: Call effects.release() to free native resources

  2. Wrong sample rate: Effects expect 16kHz; resample first if needed

  3. Processing stereo as mono: Convert to mono first or process channels separately

  4. Too much reverb: Start with low mix values (0.1-0.2) and increase gradually

  5. Compressor pumping: Lower ratio (2:1) for natural sound, higher (8:1) for limiting

See also

Pre-configured effect combinations

Noise gate sensitivity options

Compressor behavior options

Room size and character options

Types

Link copied to clipboard
object Companion

Properties

Link copied to clipboard

Check if compressor is active in this chain

Link copied to clipboard

Check if noise gate is active in this chain

Link copied to clipboard

Check if reverb is active in this chain

Functions

Link copied to clipboard

Process audio samples in-place through the effects chain. Effects are applied in order: NoiseGate → Compressor → Reverb

Link copied to clipboard
fun release()

Release all native resources. Must be called when done.

Link copied to clipboard

Reset reverb state (useful when starting new audio)

Link copied to clipboard

Update compressor ratio at runtime

Link copied to clipboard
fun setCompressorThreshold(thresholdDb: Float)

Update compressor threshold at runtime

Link copied to clipboard
fun setNoiseGateThreshold(thresholdDb: Float)

Update noise gate threshold at runtime

Link copied to clipboard

Update reverb wet/dry mix at runtime

Link copied to clipboard
fun setReverbRoomSize(roomSize: Float)

Update reverb room size at runtime