use super::types::{ColorRGBA, DirectionZone, ShapeType, VisualEffect, VisualElementType};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::time::Duration;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AudioVisualMapping {
pub low_freq_mapping: FrequencyVisualMapping,
pub mid_freq_mapping: FrequencyVisualMapping,
pub high_freq_mapping: FrequencyVisualMapping,
pub amplitude_scaling: AmplitudeVisualMapping,
pub directional_cues: DirectionalCueMapping,
pub event_triggers: EventTriggerMapping,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FrequencyVisualMapping {
pub frequency_range: (f32, f32),
pub element_type: VisualElementType,
pub base_color: ColorRGBA,
pub intensity_scale: f32,
pub size_scale: f32,
pub animation_responsiveness: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AmplitudeVisualMapping {
pub threshold: f32,
pub intensity_curve: ScalingCurve,
pub size_curve: ScalingCurve,
pub compression_ratio: f32,
}
#[derive(Debug, Clone, Copy, PartialEq, Serialize, Deserialize)]
pub enum ScalingCurve {
Linear,
Logarithmic,
Exponential,
Power(f32),
Custom,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DirectionalCueMapping {
pub enabled: bool,
pub directional_element: VisualElementType,
pub direction_colors: HashMap<DirectionZone, ColorRGBA>,
pub distance_scaling: bool,
pub peripheral_enhancement: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct EventTriggerMapping {
pub onset_triggers: Vec<OnsetTrigger>,
pub rhythm_triggers: Vec<RhythmTrigger>,
pub spectral_triggers: Vec<SpectralTrigger>,
pub silence_triggers: Vec<SilenceTrigger>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct OnsetTrigger {
pub sensitivity: f32,
pub effect: VisualEffect,
pub cooldown: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RhythmTrigger {
pub tempo_range: (f32, f32),
pub beat_effect: VisualEffect,
pub downbeat_effect: Option<VisualEffect>,
pub confidence_threshold: f32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpectralTrigger {
pub frequency_range: (f32, f32),
pub energy_threshold: f32,
pub effect: VisualEffect,
pub duration: Duration,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SilenceTrigger {
pub threshold_db: f32,
pub min_duration: Duration,
pub silence_effect: VisualEffect,
pub end_effect: Option<VisualEffect>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct VisualDistanceAttenuation {
pub min_distance: f32,
pub max_distance: f32,
pub curve_type: ScalingCurve,
pub size_scaling: bool,
pub perspective_correction: bool,
}
impl Default for AudioVisualMapping {
fn default() -> Self {
Self {
low_freq_mapping: FrequencyVisualMapping {
frequency_range: (20.0, 250.0),
element_type: VisualElementType::PointLight,
base_color: ColorRGBA {
r: 1.0,
g: 0.2,
b: 0.2,
a: 0.8,
},
intensity_scale: 1.5,
size_scale: 1.2,
animation_responsiveness: 0.8,
},
mid_freq_mapping: FrequencyVisualMapping {
frequency_range: (250.0, 4000.0),
element_type: VisualElementType::Shape(ShapeType::Sphere),
base_color: ColorRGBA {
r: 0.2,
g: 1.0,
b: 0.2,
a: 0.8,
},
intensity_scale: 1.0,
size_scale: 1.0,
animation_responsiveness: 1.0,
},
high_freq_mapping: FrequencyVisualMapping {
frequency_range: (4000.0, 20000.0),
element_type: VisualElementType::ParticleEffect,
base_color: ColorRGBA {
r: 0.2,
g: 0.2,
b: 1.0,
a: 0.8,
},
intensity_scale: 0.8,
size_scale: 0.6,
animation_responsiveness: 1.5,
},
amplitude_scaling: AmplitudeVisualMapping {
threshold: 0.1,
intensity_curve: ScalingCurve::Logarithmic,
size_curve: ScalingCurve::Linear,
compression_ratio: 3.0,
},
directional_cues: DirectionalCueMapping::default(),
event_triggers: EventTriggerMapping::default(),
}
}
}
impl Default for DirectionalCueMapping {
fn default() -> Self {
let mut direction_colors = HashMap::new();
direction_colors.insert(
DirectionZone::Front,
ColorRGBA {
r: 0.0,
g: 1.0,
b: 0.0,
a: 1.0,
},
);
direction_colors.insert(
DirectionZone::Left,
ColorRGBA {
r: 1.0,
g: 1.0,
b: 0.0,
a: 1.0,
},
);
direction_colors.insert(
DirectionZone::Back,
ColorRGBA {
r: 1.0,
g: 0.0,
b: 0.0,
a: 1.0,
},
);
direction_colors.insert(
DirectionZone::Right,
ColorRGBA {
r: 0.0,
g: 0.0,
b: 1.0,
a: 1.0,
},
);
direction_colors.insert(
DirectionZone::Above,
ColorRGBA {
r: 1.0,
g: 0.0,
b: 1.0,
a: 1.0,
},
);
direction_colors.insert(
DirectionZone::Below,
ColorRGBA {
r: 0.0,
g: 1.0,
b: 1.0,
a: 1.0,
},
);
Self {
enabled: true,
directional_element: VisualElementType::Shape(ShapeType::Arrow),
direction_colors,
distance_scaling: true,
peripheral_enhancement: true,
}
}
}
impl Default for EventTriggerMapping {
fn default() -> Self {
Self {
onset_triggers: vec![],
rhythm_triggers: vec![],
spectral_triggers: vec![],
silence_triggers: vec![],
}
}
}
impl Default for VisualDistanceAttenuation {
fn default() -> Self {
Self {
min_distance: 0.5,
max_distance: 20.0,
curve_type: ScalingCurve::Linear,
size_scaling: true,
perspective_correction: true,
}
}
}