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.

110 lines
1.8KB

  1. #pragma once
  2. #include "GateTrigger.h"
  3. #include "MidiPlayer.h"
  4. #include "MidiSong.h"
  5. template <class TBase>
  6. class Seq : public TBase
  7. {
  8. public:
  9. template <class Tx>
  10. friend class SeqHost;
  11. Seq(struct Module * module) : TBase(module), gateTrigger(true)
  12. {
  13. init();
  14. }
  15. Seq() : TBase(), gateTrigger(true)
  16. {
  17. init();
  18. }
  19. enum ParamIds
  20. {
  21. NUM_PARAMS
  22. };
  23. enum InputIds
  24. {
  25. CLOCK_INPUT,
  26. NUM_INPUTS
  27. };
  28. enum OutputIds
  29. {
  30. CV_OUTPUT,
  31. GATE_OUTPUT,
  32. NUM_OUTPUTS
  33. };
  34. enum LightIds
  35. {
  36. GATE_LIGHT,
  37. NUM_LIGHTS
  38. };
  39. void step() override;
  40. MidiSongPtr getSong()
  41. {
  42. return player->getSong();
  43. }
  44. void stop()
  45. {
  46. player->stop();
  47. }
  48. private:
  49. GateTrigger gateTrigger;
  50. void init();
  51. std::shared_ptr<MidiPlayer> player;
  52. };
  53. #if 1
  54. template <class TBase>
  55. class SeqHost : public IPlayerHost
  56. {
  57. public:
  58. SeqHost(Seq<TBase>* s) : seq(s)
  59. {
  60. }
  61. void setGate(bool gate) override
  62. {
  63. //fprintf(stderr, "setGate %d\n", gate); fflush(stderr);
  64. seq->outputs[Seq<TBase>::GATE_OUTPUT].value = gate ? 10.f : 0.f;
  65. }
  66. void setCV(float cv) override
  67. {
  68. // fprintf(stderr, "setCV %f\n", cv); fflush(stderr);
  69. seq->outputs[Seq<TBase>::CV_OUTPUT].value = cv;
  70. }
  71. void onLockFailed() override
  72. {
  73. }
  74. private:
  75. Seq<TBase>* const seq;
  76. };
  77. #endif
  78. template <class TBase>
  79. void Seq<TBase>::init()
  80. {
  81. std::shared_ptr<IPlayerHost> host = std::make_shared<SeqHost<TBase>>(this);
  82. std::shared_ptr<MidiSong> song = MidiSong::makeTest(MidiTrack::TestContent::eightQNotes, 0);
  83. player = std::make_shared<MidiPlayer>(host, song);
  84. }
  85. template <class TBase>
  86. void Seq<TBase>::step()
  87. {
  88. player->timeElapsed(TBase::engineGetSampleTime());
  89. }