Processor.h 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /*
  2. * Copyright (c) 2021, kleines Filmröllchen <filmroellchen@serenityos.org>
  3. *
  4. * SPDX-License-Identifier: BSD-2-Clause
  5. */
  6. #pragma once
  7. #include <AK/Noncopyable.h>
  8. #include <AK/StdLibExtras.h>
  9. #include <AK/Types.h>
  10. #include <LibCore/Object.h>
  11. #include <LibDSP/Music.h>
  12. #include <LibDSP/ProcessorParameter.h>
  13. #include <LibDSP/Transport.h>
  14. namespace LibDSP {
  15. // A processor processes notes or audio into notes or audio. Processors are e.g. samplers, synthesizers, effects, arpeggiators etc.
  16. class Processor : public Core::Object {
  17. C_OBJECT_ABSTRACT(Processor);
  18. public:
  19. virtual ~Processor()
  20. {
  21. }
  22. Signal process(Signal const& input_signal)
  23. {
  24. VERIFY(input_signal.type() == m_input_type);
  25. auto processed = process_impl(input_signal);
  26. VERIFY(processed.type() == m_output_type);
  27. return processed;
  28. }
  29. SignalType input_type() const { return m_input_type; }
  30. SignalType output_type() const { return m_output_type; }
  31. Vector<ProcessorParameter&>& parameters() { return m_parameters; }
  32. private:
  33. SignalType const m_input_type;
  34. SignalType const m_output_type;
  35. protected:
  36. Processor(NonnullRefPtr<Transport> transport, SignalType input_type, SignalType output_type)
  37. : m_input_type(input_type)
  38. , m_output_type(output_type)
  39. , m_transport(move(transport))
  40. {
  41. }
  42. virtual Signal process_impl(Signal const& input_signal) = 0;
  43. NonnullRefPtr<Transport> m_transport;
  44. Vector<ProcessorParameter&> m_parameters;
  45. };
  46. // A common type of processor that changes audio data, i.e. applies an effect to it.
  47. class EffectProcessor : public Processor {
  48. protected:
  49. EffectProcessor(NonnullRefPtr<Transport> transport)
  50. : Processor(transport, SignalType::Sample, SignalType::Sample)
  51. {
  52. }
  53. };
  54. // A common type of processor that synthesizes audio from note data.
  55. class SynthesizerProcessor : public Processor {
  56. protected:
  57. SynthesizerProcessor(NonnullRefPtr<Transport> transport)
  58. : Processor(transport, SignalType::Note, SignalType::Sample)
  59. {
  60. }
  61. };
  62. }