/* * Copyright (c) 2021, kleines Filmröllchen * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include #include #include #include #include #include #include namespace LibDSP { // A processor processes notes or audio into notes or audio. Processors are e.g. samplers, synthesizers, effects, arpeggiators etc. class Processor : public Core::Object { C_OBJECT_ABSTRACT(Processor); public: virtual ~Processor() { } Signal process(Signal const& input_signal) { VERIFY(input_signal.type() == m_input_type); auto processed = process_impl(input_signal); VERIFY(processed.type() == m_output_type); return processed; } SignalType input_type() const { return m_input_type; } SignalType output_type() const { return m_output_type; } Vector& parameters() { return m_parameters; } private: SignalType const m_input_type; SignalType const m_output_type; protected: Processor(NonnullRefPtr transport, SignalType input_type, SignalType output_type) : m_input_type(input_type) , m_output_type(output_type) , m_transport(move(transport)) { } virtual Signal process_impl(Signal const& input_signal) = 0; NonnullRefPtr m_transport; Vector m_parameters; }; // A common type of processor that changes audio data, i.e. applies an effect to it. class EffectProcessor : public Processor { protected: EffectProcessor(NonnullRefPtr transport) : Processor(transport, SignalType::Sample, SignalType::Sample) { } }; // A common type of processor that synthesizes audio from note data. class SynthesizerProcessor : public Processor { protected: SynthesizerProcessor(NonnullRefPtr transport) : Processor(transport, SignalType::Note, SignalType::Sample) { } }; }