/* * Copyright (c) 2021, kleines Filmröllchen . * * SPDX-License-Identifier: BSD-2-Clause */ #pragma once #include "LibDSP/Music.h" #include #include #include #include namespace LibDSP::Synthesizers { enum Waveform : u8 { Sine, Triangle, Square, Saw, Noise, }; struct PitchedEnvelope : Envelope { constexpr PitchedEnvelope() = default; constexpr PitchedEnvelope(double envelope, u8 note) : Envelope(envelope) , note(note) { } constexpr PitchedEnvelope(Envelope envelope, u8 note) : Envelope(envelope) , note(note) { } u8 note; }; class Classic : public SynthesizerProcessor { public: Classic(NonnullRefPtr); static Envelope compute_envelope(RollNote&); Waveform wave() const { return m_waveform.value(); } private: virtual Signal process_impl(Signal const&) override; double volume_from_envelope(Envelope const&); double wave_position(u8 note); double samples_per_cycle(u8 note); double sin_position(u8 note); double triangle_position(u8 note); double square_position(u8 note); double saw_position(u8 note); double noise_position(u8 note); double get_random_from_seed(u64 note); ProcessorEnumParameter m_waveform; ProcessorRangeParameter m_attack; ProcessorRangeParameter m_decay; ProcessorRangeParameter m_sustain; ProcessorRangeParameter m_release; RollNotes m_playing_notes; Array last_random; }; }