// Copyright (c) 2008-2023 the Urho3D project // License: MIT #pragma once #include "Sample.h" namespace Urho3D { class Node; class BufferedSoundStream; } /// Sound synthesis example. /// This sample demonstrates: /// - Playing back a sound stream produced on-the-fly by a simple CPU synthesis algorithm class SoundSynthesis : public Sample { URHO3D_OBJECT(SoundSynthesis, Sample); public: /// Construct. explicit SoundSynthesis(Context* context); /// Setup before engine initialization. Modifies the engine parameters. void Setup() override; /// Setup after engine initialization and before running the main loop. void Start() override; protected: /// Return XML patch instructions for screen joystick layout for a specific sample app, if any. String GetScreenJoystickPatchString() const override { return "" " " " " " " " " " " " " " " " Up" " " " " " " " " " " " " " " " Down" " " " " " " " " " " " " ""; } private: /// Construct the sound stream and start playback. void CreateSound(); /// Buffer more sound data. void UpdateSound(); /// Construct an instruction text to the UI. void CreateInstructions(); /// Subscribe to application-wide logic update events. void SubscribeToEvents(); /// Handle the logic update event. void HandleUpdate(StringHash eventType, VariantMap& eventData); /// Scene node for the sound component. SharedPtr node_; /// Sound stream that we update. SharedPtr soundStream_; /// Instruction text. SharedPtr instructionText_; /// Filter coefficient for the sound. float filter_; /// Synthesis accumulator. float accumulator_; /// First oscillator. float osc1_; /// Second oscillator. float osc2_; };