square.rs 756 B

1234567891011121314151617181920212223242526272829
  1. use super::*;
  2. #[derive(Debug)]
  3. pub struct Square {
  4. pub freq: GenBox,
  5. pub phase: f32,
  6. pub buf: SampleBuffer,
  7. }
  8. impl Generator for Square {
  9. fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer {
  10. self.buf.rate = Rate::Sample;
  11. let pvel = self.freq.eval(params).first() / params.env.sample_rate;
  12. for i in 0..self.buf.len() {
  13. self.buf[i] = if ((self.phase + pvel * (i as f32)) % 1.0) < 0.5 {
  14. -1.0
  15. } else {
  16. 1.0
  17. };
  18. }
  19. self.phase = (self.phase + pvel * (self.buf.len() as f32)) % 1.0;
  20. &self.buf
  21. }
  22. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  23. mem::replace(&mut self.buf, buf)
  24. }
  25. }