commit 33611b156035801e0c93d1abf4f82e2bdcd51d90
parent 503422f5b12bae3661f2d47120f20942fcb34554
Author: minerva-jupiter <ryouturn@gmail.com>
Date: Sat, 2 May 2026 13:45:05 +0900
"feat(dsp): Expose latest processed output"
success to copy to clip
Diffstat:
6 files changed, 20 insertions(+), 5 deletions(-)
diff --git a/geedback-dsp/pkg/geedback_dsp.d.ts b/geedback-dsp/pkg/geedback_dsp.d.ts
@@ -4,6 +4,7 @@
export class GeedbackProcessor {
free(): void;
[Symbol.dispose](): void;
+ get_latest_output(): number;
constructor();
process(): number;
set_accel(x: number, y: number, z: number): void;
@@ -17,6 +18,7 @@ export type InitInput = RequestInfo | URL | Response | BufferSource | WebAssembl
export interface InitOutput {
readonly memory: WebAssembly.Memory;
readonly __wbg_geedbackprocessor_free: (a: number, b: number) => void;
+ readonly geedbackprocessor_get_latest_output: (a: number) => number;
readonly geedbackprocessor_new: () => number;
readonly geedbackprocessor_process: (a: number) => number;
readonly geedbackprocessor_set_accel: (a: number, b: number, c: number, d: number) => void;
diff --git a/geedback-dsp/pkg/geedback_dsp.js b/geedback-dsp/pkg/geedback_dsp.js
@@ -11,6 +11,13 @@ export class GeedbackProcessor {
const ptr = this.__destroy_into_raw();
wasm.__wbg_geedbackprocessor_free(ptr, 0);
}
+ /**
+ * @returns {number}
+ */
+ get_latest_output() {
+ const ret = wasm.geedbackprocessor_get_latest_output(this.__wbg_ptr);
+ return ret;
+ }
constructor() {
const ret = wasm.geedbackprocessor_new();
this.__wbg_ptr = ret;
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/pkg/geedback_dsp_bg.wasm.d.ts b/geedback-dsp/pkg/geedback_dsp_bg.wasm.d.ts
@@ -2,6 +2,7 @@
/* eslint-disable */
export const memory: WebAssembly.Memory;
export const __wbg_geedbackprocessor_free: (a: number, b: number) => void;
+export const geedbackprocessor_get_latest_output: (a: number) => number;
export const geedbackprocessor_new: () => number;
export const geedbackprocessor_process: (a: number) => number;
export const geedbackprocessor_set_accel: (a: number, b: number, c: number, d: number) => void;
diff --git a/geedback-dsp/src/lib.rs b/geedback-dsp/src/lib.rs
@@ -18,6 +18,7 @@ pub struct GeedbackProcessor {
phase_z: f64,
sample_rate: f64,
+ latest_output: f64,
}
#[wasm_bindgen]
@@ -38,9 +39,14 @@ impl GeedbackProcessor {
phase_y: 0.0,
phase_z: 0.0,
sample_rate: 44100.0,
+ latest_output: 0.0,
}
}
+ pub fn get_latest_output(&self) -> f64 {
+ self.latest_output
+ }
+
pub fn set_sample_rate(&mut self, sample_rate: f64) {
self.sample_rate = sample_rate;
}
@@ -80,6 +86,8 @@ impl GeedbackProcessor {
let out_z = (self.phase_z * 2.0 * std::f64::consts::PI).sin();
// Mix output (sum of 3 oscillators)
- (out_x + out_y + out_z) / 3.0
+ let out = (out_x + out_y + out_z) / 3.0;
+ self.latest_output = out;
+ out
}
}
diff --git a/src/main.ts b/src/main.ts
@@ -100,13 +100,10 @@ const startAudio = async () => {
// UI Update Loop
const updateUI = () => {
if (processor) {
- // Just a snapshot for UI
- // In a real DSP, we wouldn't call process() again here,
- // but for visualization of "current" state it's fine for this test.
+ wasmOutput.textContent = processor.get_latest_output().toFixed(6);
}
requestAnimationFrame(updateUI);
};
updateUI();
};
-
startBtn.addEventListener("click", startAudio);