Effects.cpp 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <malu.bertsch@gmail.com>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #include "Effects.h"
  7. #include <math.h>
  8. namespace LibDSP::Effects {
  9. Delay::Delay(NonnullRefPtr<Transport> transport)
  10. : EffectProcessor(move(transport))
  11. , m_delay_decay("Decay"sv, 0.01, 0.99, 0.33)
  12. , m_delay_time("Delay Time"sv, 3, 2000, 900)
  13. , m_dry_gain("Dry"sv, 0, 1, 0.9)
  14. {
  15. m_parameters.append(m_delay_decay);
  16. m_parameters.append(m_delay_time);
  17. m_parameters.append(m_dry_gain);
  18. }
  19. void Delay::handle_delay_time_change()
  20. {
  21. // We want a delay buffer that can hold samples filling the specified number of milliseconds.
  22. double seconds = static_cast<double>(m_delay_time) / 1000.0;
  23. size_t sample_count = ceil(seconds * m_transport->sample_rate());
  24. if (sample_count != m_delay_buffer.size()) {
  25. m_delay_buffer.resize(sample_count, true);
  26. m_delay_index %= max(m_delay_buffer.size(), 1);
  27. }
  28. }
  29. Signal Delay::process_impl(Signal const& input_signal)
  30. {
  31. handle_delay_time_change();
  32. Sample const& in = input_signal.get<Sample>();
  33. Sample out;
  34. out += in.log_multiplied(static_cast<double>(m_dry_gain));
  35. out += m_delay_buffer[m_delay_index].log_multiplied(m_delay_decay);
  36. // This is also convenient for disabling the delay effect by setting the buffer size to 0
  37. if (m_delay_buffer.size() >= 1)
  38. m_delay_buffer[m_delay_index++] = out;
  39. if (m_delay_index >= m_delay_buffer.size())
  40. m_delay_index = 0;
  41. return Signal(out);
  42. }
  43. Mastering::Mastering(NonnullRefPtr<Transport> transport)
  44. : EffectProcessor(move(transport))
  45. {
  46. }
  47. Signal Mastering::process_impl([[maybe_unused]] Signal const& input_signal)
  48. {
  49. TODO();
  50. }
  51. }