commit 8cfa34a06a98fe3b3c2f2dbd1297bf42d25009da
parent e0260d9171386436f3c2aab2d041ba89e95cfdb3
Author: minerva-jupiter <ryouturn@gmail.com>
Date: Sat, 23 May 2026 21:27:17 +0900
feat(dsp): update oscillator modulation mapping
Implement cubic non-linear scaling for FM depths to provide a more dynamic response (quiet at low acceleration, aggressive at high acceleration) and adjust phase modulation calculations for improved signal handling.
Diffstat:
2 files changed, 5 insertions(+), 6 deletions(-)
diff --git a/geedback-dsp/pkg/geedback_dsp_bg.wasm b/geedback-dsp/pkg/geedback_dsp_bg.wasm
Binary files differ.
diff --git a/geedback-dsp/src/lib.rs b/geedback-dsp/src/lib.rs
@@ -180,17 +180,16 @@ impl GeedbackProcessor {
let morphs = [self.s_g_cos, self.s_a_cos, self.s_b_cos];
let fm_depths = [
- self.s_la_y.abs() * 4.0, // Osc 1: Y (Significantly increased)
- self.s_la_z.abs() * 4.0, // Osc 2: Z
- self.s_la_x.abs() * 4.0, // Osc 3: X
+ self.s_la_y.abs().powi(3) * 1.0, // Non-linear: quiet when slow, aggressive when shaken
+ self.s_la_z.abs().powi(3) * 1.0,
+ self.s_la_x.abs().powi(3) * 1.0,
];
let mut mixed_output = 0.0;
for i in 0..3 {
- self.phases_mod[i] = (self.phases_mod[i] + (freqs[i] * 1.5) / self.sample_rate) % 1.0;
- let modulation =
- (self.phases_mod[i] * 2.0 * std::f64::consts::PI).sin() * (fm_depths[i] * 2.0);
+ self.phases_mod[i] = (self.phases_mod[i] + freqs[i] / self.sample_rate) % 1.0;
+ let modulation = (self.phases_mod[i] * 2.0 * std::f64::consts::PI).sin() * fm_depths[i];
let osc_out =
self.calculate_wave(self.phases[i] + modulation, self.waveforms[i], morphs[i]);
mixed_output += osc_out * self.mixes[i];