square.rs 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. use super::{
  2. mem, FactoryParameters, GenBox, GenFactoryError, Generator, GeneratorFactory, ParamValue,
  3. Parameters, Rate, SampleBuffer,
  4. };
  5. #[derive(Debug)]
  6. pub struct Square {
  7. pub freq: GenBox,
  8. pub phase: f32,
  9. pub buf: SampleBuffer,
  10. }
  11. impl Generator for Square {
  12. fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer {
  13. self.buf.rate = Rate::Sample;
  14. let pvel = self.freq.eval(params).first() / params.env.sample_rate;
  15. for i in 0..self.buf.len() {
  16. self.buf[i] = if ((self.phase + pvel * (i as f32)) % 1.0) < 0.5 {
  17. -1.0
  18. } else {
  19. 1.0
  20. };
  21. }
  22. self.phase = (self.phase + pvel * (self.buf.len() as f32)) % 1.0;
  23. &self.buf
  24. }
  25. fn buffer(&self) -> &SampleBuffer {
  26. &self.buf
  27. }
  28. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  29. mem::replace(&mut self.buf, buf)
  30. }
  31. }
  32. pub struct SquareFactory;
  33. impl GeneratorFactory for SquareFactory {
  34. fn new(&self, params: &mut FactoryParameters) -> Result<GenBox, GenFactoryError> {
  35. Ok(Box::new(Square {
  36. freq: params.remove_param("freq", 0)?.into_gen()?,
  37. phase: params
  38. .get_param("phase", 1, &mut ParamValue::Float(0.0))
  39. .as_f32()?,
  40. buf: SampleBuffer::new(params.env.default_buffer_size),
  41. }))
  42. }
  43. }
  44. pub static Factory: SquareFactory = SquareFactory;