You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

34 lines
599B

  1. #pragma once
  2. #include <engine.hpp>
  3. namespace DHE {
  4. class PhaseAccumulator {
  5. public:
  6. void start() {
  7. accumulated = 0.f;
  8. on_start();
  9. }
  10. void step() {
  11. accumulated += rack::engineGetSampleTime() / duration();
  12. if (accumulated >= 1.0f) {
  13. accumulated = 1.f;
  14. };
  15. if (accumulated >= 1.0f) {
  16. on_finish();
  17. };
  18. }
  19. auto phase() const -> float { return this->accumulated; }
  20. protected:
  21. virtual void on_start() const {};
  22. virtual auto duration() const -> float = 0;
  23. virtual void on_finish() const {};
  24. private:
  25. float accumulated = 0.f;
  26. };
  27. } // namespace DHE