math.rs 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. use super::{
  2. FactoryParameters, GenBox, GenFactoryError, Generator, GeneratorFactory, Parameters, Rate,
  3. SampleBuffer,
  4. };
  5. use std::mem;
  6. #[derive(Debug)]
  7. pub struct Add {
  8. pub terms: Vec<GenBox>,
  9. pub buf: SampleBuffer,
  10. }
  11. impl Generator for Add {
  12. fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer {
  13. if self.terms.is_empty() {
  14. self.buf.zero();
  15. } else {
  16. let (first, next) = self.terms.split_at_mut(1);
  17. self.buf.update_from(first[0].eval(params));
  18. for term in next {
  19. self.buf.sum_into(term.eval(params));
  20. }
  21. }
  22. &self.buf
  23. }
  24. fn buffer(&self) -> &SampleBuffer {
  25. &self.buf
  26. }
  27. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  28. mem::replace(&mut self.buf, buf)
  29. }
  30. }
  31. pub struct AddFactory;
  32. impl GeneratorFactory for AddFactory {
  33. fn new(&self, params: &mut FactoryParameters) -> Result<GenBox, GenFactoryError> {
  34. Ok(Box::new(Add {
  35. terms: params
  36. .get_pos_params()
  37. .into_iter()
  38. .map(|x| x.into_gen())
  39. .collect::<Result<Vec<_>, _>>()?,
  40. buf: SampleBuffer::new(params.env.default_buffer_size),
  41. }))
  42. }
  43. }
  44. pub static FactoryAdd: AddFactory = AddFactory;
  45. #[derive(Debug)]
  46. pub struct Mul {
  47. pub factors: Vec<GenBox>,
  48. pub buf: SampleBuffer,
  49. }
  50. impl Generator for Mul {
  51. fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer {
  52. if self.factors.is_empty() {
  53. self.buf.zero();
  54. } else {
  55. let (first, next) = self.factors.split_at_mut(1);
  56. self.buf.update_from(first[0].eval(params));
  57. for factor in next {
  58. self.buf.mul_into(factor.eval(params));
  59. }
  60. }
  61. &self.buf
  62. }
  63. fn buffer(&self) -> &SampleBuffer {
  64. &self.buf
  65. }
  66. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  67. mem::replace(&mut self.buf, buf)
  68. }
  69. }
  70. pub struct MulFactory;
  71. impl GeneratorFactory for MulFactory {
  72. fn new(&self, params: &mut FactoryParameters) -> Result<GenBox, GenFactoryError> {
  73. Ok(Box::new(Mul {
  74. factors: params
  75. .get_pos_params()
  76. .into_iter()
  77. .map(|x| x.into_gen())
  78. .collect::<Result<Vec<_>, _>>()?,
  79. buf: SampleBuffer::new(params.env.default_buffer_size),
  80. }))
  81. }
  82. }
  83. pub static FactoryMul: MulFactory = MulFactory;
  84. #[derive(Debug)]
  85. pub struct Negate {
  86. pub value: GenBox,
  87. pub buf: SampleBuffer,
  88. }
  89. impl Generator for Negate {
  90. fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer {
  91. self.buf.update_from(self.value.eval(params));
  92. match self.buf.rate {
  93. Rate::Sample => {
  94. for v in self.buf.iter_mut() {
  95. *v *= -1.0;
  96. }
  97. }
  98. Rate::Control => {
  99. self.buf[0] *= -1.0;
  100. }
  101. }
  102. &self.buf
  103. }
  104. fn buffer(&self) -> &SampleBuffer {
  105. &self.buf
  106. }
  107. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  108. mem::replace(&mut self.buf, buf)
  109. }
  110. }
  111. pub struct NegateFactory;
  112. impl GeneratorFactory for NegateFactory {
  113. fn new(&self, params: &mut FactoryParameters) -> Result<GenBox, GenFactoryError> {
  114. let gen = params.remove_param("value", 0)?.into_gen()?;
  115. let len = gen.buffer().len();
  116. Ok(Box::new(Negate {
  117. value: gen,
  118. buf: SampleBuffer::new(len),
  119. }))
  120. }
  121. }
  122. pub static FactoryNegate: NegateFactory = NegateFactory;
  123. #[derive(Debug)]
  124. pub struct Reciprocate {
  125. pub value: GenBox,
  126. pub buf: SampleBuffer,
  127. }
  128. impl Generator for Reciprocate {
  129. fn eval<'a>(&'a mut self, params: &Parameters) -> &'a SampleBuffer {
  130. self.buf.update_from(self.value.eval(params));
  131. match self.buf.rate {
  132. Rate::Sample => {
  133. for v in self.buf.iter_mut() {
  134. *v = v.powf(-1.0);
  135. }
  136. }
  137. Rate::Control => {
  138. self.buf[0] = self.buf[0].powf(-1.0);
  139. }
  140. }
  141. &self.buf
  142. }
  143. fn buffer(&self) -> &SampleBuffer {
  144. &self.buf
  145. }
  146. fn set_buffer(&mut self, buf: SampleBuffer) -> SampleBuffer {
  147. mem::replace(&mut self.buf, buf)
  148. }
  149. }
  150. pub struct ReciprocateFactory;
  151. impl GeneratorFactory for ReciprocateFactory {
  152. fn new(&self, params: &mut FactoryParameters) -> Result<GenBox, GenFactoryError> {
  153. let gen = params.remove_param("value", 0)?.into_gen()?;
  154. let len = gen.buffer().len();
  155. Ok(Box::new(Reciprocate {
  156. value: gen,
  157. buf: SampleBuffer::new(len),
  158. }))
  159. }
  160. }
  161. pub static FactoryReciprocate: ReciprocateFactory = ReciprocateFactory;