use super::noise;
pub(super) fn sub_kick_sample(sample_index: usize, sample_rate: f32) -> f32 {
let t = sample_index as f32 / sample_rate;
let duration = 0.4;
if t > duration {
return 0.0;
}
let start_freq = 80.0;
let end_freq = 25.0;
let freq = start_freq + (end_freq - start_freq) * (t / duration);
let envelope = (-t * 10.0).exp();
let value = (2.0 * std::f32::consts::PI * freq * t).sin();
value * envelope * 0.95
}
pub(super) fn bass_drop_sample(sample_index: usize, sample_rate: f32) -> f32 {
let t = sample_index as f32 / sample_rate;
let duration = 0.8;
if t > duration {
return 0.0;
}
let start_freq = 300.0;
let end_freq = 20.0;
let freq = start_freq + (end_freq - start_freq) * (t / duration).powf(2.0);
let envelope = (-t * 4.0).exp();
let fundamental = (2.0 * std::f32::consts::PI * freq * t).sin();
let harmonic = (2.0 * std::f32::consts::PI * freq * 1.5 * t).sin() * 0.2;
(fundamental + harmonic) * envelope * 0.95
}
pub(super) fn boom_sample(sample_index: usize, sample_rate: f32) -> f32 {
let t = sample_index as f32 / sample_rate;
let duration = 1.0;
if t > duration {
return 0.0;
}
let noise_val = noise(sample_index as f32);
let bass_freq = 40.0 - (30.0 * t); let bass = (2.0 * std::f32::consts::PI * bass_freq * t).sin();
let low_noise = noise_val * 0.3;
let envelope = (-t * 3.0).exp() * (1.0 + 0.1 * (-t * 8.0).exp());
(bass * 0.8 + low_noise * 0.2) * envelope * 0.85
}
pub(super) fn laser_zap_sample(sample_index: usize, sample_rate: f32) -> f32 {
let t = sample_index as f32 / sample_rate;
let duration = 0.3;
if t > duration {
return 0.0;
}
let start_freq = 2000.0_f32;
let end_freq = 80.0_f32;
let freq = start_freq * (end_freq / start_freq).powf(t / duration);
let envelope = (-t * 8.0).exp();
let phase = 2.0 * std::f32::consts::PI * freq * t;
let square = if phase.sin() > 0.0 { 1.0 } else { -1.0 };
square * envelope * 0.4
}
pub(super) fn white_noise_hit_sample(sample_index: usize, sample_rate: f32) -> f32 {
let t = sample_index as f32 / sample_rate;
let duration = 0.12;
if t > duration {
return 0.0;
}
let envelope = (-t * 25.0).exp() * (1.0 - (-t * 100.0).exp());
noise(t * 20000.0) * envelope * 0.5
}