Zum Inhalt

apple/PhysarumApp/Sources/Audio/AudioBands.swift

import Foundation
import PhysarumEngine

/// Three normalized (0..1) band energies (smoothed absolute `level`) plus a
/// per-band `transient` signal (change/onset, idles at 0, spikes on hits) and
/// `loudness` — the RAW overall level (max of the un-smoothed bands), which drives
/// the loudness-response (leise=sanft / laut=voll / Stille=ruhig).
struct AudioBands: Equatable {
    var bass: Float
    var mid: Float
    var high: Float
    var loudness: Float = 0
    var transientBass: Float = 0
    var transientMid: Float = 0
    var transientHigh: Float = 0
    init(bass: Float, mid: Float, high: Float, loudness: Float = 0,
         transientBass: Float = 0, transientMid: Float = 0, transientHigh: Float = 0) {
        self.bass = bass; self.mid = mid; self.high = high; self.loudness = loudness
        self.transientBass = transientBass; self.transientMid = transientMid; self.transientHigh = transientHigh
    }
    static let zero = AudioBands(bass: 0, mid: 0, high: 0)
    var peak: Float { max(bass, max(mid, high)) }
    func level(_ band: AudioBand) -> Float { band == .bass ? bass : band == .mid ? mid : high }
    func transient(_ band: AudioBand) -> Float { band == .bass ? transientBass : band == .mid ? transientMid : transientHigh }
}