groovebox: display input meters!

This commit is contained in:
🪞👃🪞 2025-05-11 00:25:04 +03:00
parent e5752ea4b0
commit 7690549bdc
12 changed files with 239 additions and 117 deletions

View file

@ -1,16 +1,36 @@
use crate::*;
#[derive(Debug, Default, Clone)]
pub struct RMSMeter(f32);
impl RMSMeter {
pub fn set (&mut self, samples: &[u32]) {
let sum: usize = samples.iter().map(|s|*s as usize).reduce(|sum, sample|sum + sample)
.unwrap_or(0);
self.0 = (sum as f32 / samples.len() as f32).sqrt();
}
#[derive(Debug, Default)]
pub enum MeteringMode {
#[default]
Rms,
Log10,
}
render!(TuiOut: |self: RMSMeter, to| {
#[derive(Debug, Default, Clone)]
pub struct Meter(pub f32);
render!(TuiOut: |self: Meter, to| {
let [x, y, w, h] = to.area();
let signal = 100.0 - f32::max(0.0, f32::min(100.0, self.0.abs()));
let v = (signal * h as f32 / 100.0).ceil() as u16;
let y2 = y + h;
//to.blit(&format!("\r{v} {} {signal}", self.0), x * 20, y, None);
for y in y..(y + v) {
for x in x..(x + w) {
to.blit(&"", x, y2 - y, Some(Style::default().green()));
}
}
});
pub fn to_rms (samples: &[u32]) -> f32 {
let sum: usize = samples.iter()
.map(|s|*s as usize)
.reduce(|sum, sample|sum + sample)
.unwrap_or(0);
(sum as f32 / samples.len() as f32).sqrt()
}
pub fn to_log10 (samples: &[u32]) -> f32 {
0.0
}