liminal-sessions / src /types /visualization.ts
Severian's picture
Upload 32 files
6a03d7f verified
// Enhanced visualization types for advanced particle system
export interface ParticleSystemParams {
enabled: boolean
sphereRadius: number
innerSphereRadius: number
rotationSpeed: number
rotationSpeedMin: number
rotationSpeedMax: number
rotationSmoothness: number
particleCount: number
particleSize: number
particleLifetime: number
minFrequency: number
maxFrequency: number
minFrequencyBeat: number
maxFrequencyBeat: number
noiseScale: number
dynamicNoiseScale: boolean
minNoiseScale: number
maxNoiseScale: number
noiseStep: number
noiseSpeed: number
turbulenceStrength: number
colorStart: string
colorEnd: string
volumeChangeThreshold: number
peakSensitivity: number
beatThreshold: number
baseWaveStrength: number
beatStrength: number
gainMultiplier: number
}
export interface PeakDetection {
energyHistory: number[]
historyLength: number
lastPeakTime: number
minTimeBetweenPeaks: number
}
export interface ParticleSphere {
index: number
params: ParticleSystemParams
positions: Float32Array
velocities: Float32Array
basePositions: Float32Array
lifetimes: Float32Array
maxLifetimes: Float32Array
beatEffects: Float32Array
colors: Float32Array
lastNoiseScale: number
lastValidVolume: number
lastRotationSpeed: number
peakDetection: PeakDetection
}
export interface AudioAnalysisData {
average: number
frequencies: Uint8Array
peakDetected: boolean
rangeEnergy: number
rangeEnergyBeat: number
}
export interface FogParams {
enabled: boolean
color: string
near: number
far: number
}
export interface VisualizationPreset {
name: string
spheres: ParticleSystemParams[]
fog?: FogParams
}
export interface VisualizationState {
// Enhanced particle system state
spheres: ParticleSphere[]
beatManager?: {
currentWaveRadius: number
waveStrength: number
isWaveActive: boolean
}
// Legacy tree visualization state (for backward compatibility)
deepPulseIntensity: number
midGlowIntensity: number
highShimmerIntensity: number
worldBreathRate: number
// Animation state
lastTime: number
isAnimating: boolean
}
// Default frequency ranges for different spheres
export const DEFAULT_FREQUENCY_RANGES = [
{ minFrequency: 20, maxFrequency: 80 }, // Sub-bass
{ minFrequency: 120, maxFrequency: 250 }, // Bass
{ minFrequency: 250, maxFrequency: 800 }, // Mid
{ minFrequency: 1000, maxFrequency: 4000 }, // High mid
{ minFrequency: 5000, maxFrequency: 10000 } // High
] as const
export const DEFAULT_SPHERE_PARAMS: ParticleSystemParams = {
enabled: false,
sphereRadius: 1.0,
innerSphereRadius: 0.25,
rotationSpeed: 0.001,
rotationSpeedMin: 0,
rotationSpeedMax: 0.065,
rotationSmoothness: 0.3,
particleCount: 20000,
particleSize: 0.003,
particleLifetime: 3.0,
minFrequency: 20,
maxFrequency: 80,
minFrequencyBeat: 20,
maxFrequencyBeat: 80,
noiseScale: 4.0,
dynamicNoiseScale: true,
minNoiseScale: 0.5,
maxNoiseScale: 5.0,
noiseStep: 0.2,
noiseSpeed: 0.1,
turbulenceStrength: 0.005,
colorStart: '#ff3366',
colorEnd: '#3366ff',
volumeChangeThreshold: 0.1,
peakSensitivity: 1.1,
beatThreshold: 200,
baseWaveStrength: 20.0,
beatStrength: 0.01,
gainMultiplier: 1
}
// Legacy types for backward compatibility
export interface WorldTreeNode {
id: string;
x: number;
y: number;
size: number;
glyphType: 'root' | 'trunk' | 'branch' | 'leaf';
intensity: number; // 0-1, driven by audio
connections: string[]; // IDs of connected nodes
}
export interface TreeBranch {
id: string;
startNode: string;
endNode: string;
strokeWidth: number;
pathData: string; // SVG path
energy: number; // Current energy flowing through
pulsePhase: number; // Animation phase
}
export interface GlyphSystem {
coreGlyphs: WorldTreeNode[];
arterialPathways: TreeBranch[];
fractalBranches: TreeBranch[];
emberParticles: Particle[];
}
export interface Particle {
id: string;
x: number;
y: number;
vx: number;
vy: number;
life: number;
maxLife: number;
size: number;
opacity: number;
}
export interface VisualizationParams {
worldBreathRate: number; // Base breathing animation speed
deepPulseIntensity: number; // Trunk/root pulse strength
midGlowIntensity: number; // Core glyph glow
highShimmerCount: number; // Number of fractal branches/particles
noiseScale: number; // Perlin noise scale for organic movement
colorPalette: {
primary: string; // Deep earth tones
secondary: string; // Burnished metal
accent: string; // Mystical glow
ember: string; // Particle color
};
}
export interface InteractionState {
isDormant: boolean;
isAwakening: boolean;
isAlive: boolean;
lastInteraction: number;
}