From 9d02a2faafcdfcab611177384308f65dcd3b1bad Mon Sep 17 00:00:00 2001 From: brevalferrari Date: Wed, 28 May 2025 20:56:48 +0200 Subject: [PATCH] fix precise note length, add test --- src/compiler.rs | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/src/compiler.rs b/src/compiler.rs index a209f8b..b615785 100644 --- a/src/compiler.rs +++ b/src/compiler.rs @@ -5,13 +5,20 @@ use std::{ str::FromStr, }; +use cfg_if::cfg_if; use derive_new::new; use derive_wrapper::{AsRef, From}; use fasteval::{Compiler as _, EvalNamespace, Evaler, Instruction, Slab}; use lazy_static::lazy_static; use thiserror::Error; -const SAMPLE_RATE: u16 = 48000; +cfg_if! { + if #[cfg(test)] { + const SAMPLE_RATE: u16 = 10; + } else { + const SAMPLE_RATE: u16 = 48000; + } +} #[derive(From, AsRef, Default)] #[cfg_attr(test, derive(Debug))] @@ -383,19 +390,15 @@ impl Context { let curr_t = *self.get('t')?; if let Some(note) = n { let mut result = Vec::new(); - while (self.current_length()? * SAMPLE_RATE as f64) > *self.get('t')? - curr_t { - { - result.push(self.eval_with(&self.instrument, &mut { - let mut map = self.namespace_generator(); - map.insert('n'.to_string(), note as f64); - map - })?); - } + let mut map = self.namespace_generator(); + map.insert('n'.to_string(), note as f64); + while self.current_length()? > *self.get('t')? - curr_t + (1f64 / SAMPLE_RATE as f64) { + result.push(self.eval_with(&self.instrument, &mut map)?); self.tick()?; } Ok(result) } else { - while (self.current_length()?) > *self.get('t')? - curr_t { + while self.current_length()? > *self.get('t')? - curr_t { self.tick()?; } Ok(vec![ @@ -452,7 +455,6 @@ mod tests { [ ('a', 5.0), ('t', 0.0), - ('n', 0.0), ('N', 12.0), ('L', 0.0), ('l', 4.0), @@ -501,4 +503,21 @@ mod tests { ); Ok(()) } + + #[test] + fn reproducible_note() -> Result<(), CompilerError> { + let note = Note(3); + let mut compiler = Compiler::from(context_generator()); + + compiler = compiler.step(note)?; + let first = compiler.0.result.clone(); + + *compiler.0.get_mut('t')? = 0.0; + compiler.0.result.clear(); + compiler = compiler.step(note)?; + let second = compiler.0.result.clone(); + + assert_eq!(first, second); + Ok(()) + } }