a22c238dc4
A complete audio-reactive visualizer for psytrance music featuring: Audio Analysis (DSPEngine): - FFT spectrum analysis via Accelerate/vDSP - 64-band Mel spectrogram - Sub-bass energy extraction (<100Hz) - Automatic sidechain pump detection - Harmonic-to-Noise ratio (HNR) calculation - Peak/transient detection 8 Visualization Modes (Metal Shaders): 1. FFT Classic - Frequency spectrum bars with glow 2. Mel Spectrogram - Waterfall display 3. Sub-Bass - Pulsating rings 4. Sidechain Pump - Breathing zoom effect 5. Harmonic/Noise - Geometric vs chaotic particles 6. Mandelbrot - Audio-reactive fractal zoom 7. Tunnel Warp - Infinite tunnel with distortion 8. DMT Geometry - Sacred geometry patterns Features: - Selectable audio input device (BlackHole support) - Configurable buffer size (512/1024) - Reactivity slider for visual intensity - Auto-hiding control panel - Fullscreen support with keyboard shortcuts (1-8, F, ESC) - Persistent settings via UserDefaults - Psytrance-inspired neon/UV color palette
112 lines
2.7 KiB
Swift
112 lines
2.7 KiB
Swift
//
|
|
// AudioAnalysisData.swift
|
|
// PsytranceVisualizer
|
|
//
|
|
// Audio analysis data structure containing all DSP results
|
|
//
|
|
|
|
import Foundation
|
|
|
|
/// Contains all audio analysis data computed by DSPEngine
|
|
struct AudioAnalysisData {
|
|
// MARK: - FFT Data
|
|
|
|
/// Raw FFT magnitude spectrum
|
|
var fftMagnitudes: [Float]
|
|
|
|
// MARK: - Mel Spectrogram
|
|
|
|
/// 64 Mel frequency bands
|
|
var melBands: [Float]
|
|
|
|
// MARK: - Sub-Bass Analysis
|
|
|
|
/// RMS energy below 100Hz (0.0 - 1.0)
|
|
var subBassEnergy: Float
|
|
|
|
/// History buffer for time-based visualization
|
|
var subBassHistory: [Float]
|
|
|
|
// MARK: - Sidechain Detection
|
|
|
|
/// Current envelope follower value (0.0 - 1.0)
|
|
var sidechainEnvelope: Float
|
|
|
|
/// Detected pumping amount (0.0 - 1.0)
|
|
var sidechainPumpAmount: Float
|
|
|
|
/// Whether pump is currently active
|
|
var isPumping: Bool
|
|
|
|
// MARK: - Harmonic-to-Noise Ratio
|
|
|
|
/// HNR ratio (0.0 = noise, 1.0 = pure harmonic)
|
|
var hnrRatio: Float
|
|
|
|
// MARK: - Transient Detection
|
|
|
|
/// Whether a transient peak was detected
|
|
var isPeak: Bool
|
|
|
|
/// Intensity of the detected peak (0.0 - 1.0)
|
|
var peakIntensity: Float
|
|
|
|
// MARK: - Stereo Channels
|
|
|
|
/// Left channel samples
|
|
var leftChannel: [Float]
|
|
|
|
/// Right channel samples
|
|
var rightChannel: [Float]
|
|
|
|
// MARK: - Additional Analysis
|
|
|
|
/// Spectral centroid (brightness) normalized 0.0 - 1.0
|
|
var spectralCentroid: Float
|
|
|
|
/// Overall RMS level
|
|
var rmsLevel: Float
|
|
|
|
// MARK: - Initialization
|
|
|
|
/// Creates an empty AudioAnalysisData with default values
|
|
static var empty: AudioAnalysisData {
|
|
AudioAnalysisData(
|
|
fftMagnitudes: [],
|
|
melBands: Array(repeating: 0, count: 64),
|
|
subBassEnergy: 0,
|
|
subBassHistory: [],
|
|
sidechainEnvelope: 0,
|
|
sidechainPumpAmount: 0,
|
|
isPumping: false,
|
|
hnrRatio: 0.5,
|
|
isPeak: false,
|
|
peakIntensity: 0,
|
|
leftChannel: [],
|
|
rightChannel: [],
|
|
spectralCentroid: 0.5,
|
|
rmsLevel: 0
|
|
)
|
|
}
|
|
|
|
/// Creates AudioAnalysisData with specified FFT size
|
|
static func create(fftSize: Int) -> AudioAnalysisData {
|
|
AudioAnalysisData(
|
|
fftMagnitudes: Array(repeating: 0, count: fftSize / 2),
|
|
melBands: Array(repeating: 0, count: 64),
|
|
subBassEnergy: 0,
|
|
subBassHistory: Array(repeating: 0, count: 128),
|
|
sidechainEnvelope: 0,
|
|
sidechainPumpAmount: 0,
|
|
isPumping: false,
|
|
hnrRatio: 0.5,
|
|
isPeak: false,
|
|
peakIntensity: 0,
|
|
leftChannel: [],
|
|
rightChannel: [],
|
|
spectralCentroid: 0.5,
|
|
rmsLevel: 0
|
|
)
|
|
}
|
|
}
|