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.

141 lines
3.3KB

  1. #pragma once
  2. #include "bogaudio.hpp"
  3. #include "dsp/oscillator.hpp"
  4. #include "dsp/signal.hpp"
  5. using namespace bogaudio::dsp;
  6. extern Model* modelEightFO;
  7. namespace bogaudio {
  8. struct EightFO : Module {
  9. enum ParamsIds {
  10. FREQUENCY_PARAM,
  11. WAVE_PARAM,
  12. SAMPLE_PWM_PARAM,
  13. PHASE7_PARAM,
  14. PHASE6_PARAM,
  15. PHASE5_PARAM,
  16. PHASE4_PARAM,
  17. PHASE3_PARAM,
  18. PHASE2_PARAM,
  19. PHASE1_PARAM,
  20. PHASE0_PARAM,
  21. SLOW_PARAM,
  22. OFFSET_PARAM,
  23. SCALE_PARAM,
  24. NUM_PARAMS
  25. };
  26. enum InputsIds {
  27. SAMPLE_PWM_INPUT,
  28. PHASE7_INPUT,
  29. PHASE6_INPUT,
  30. PHASE5_INPUT,
  31. PHASE4_INPUT,
  32. PHASE3_INPUT,
  33. PHASE2_INPUT,
  34. PHASE1_INPUT,
  35. PHASE0_INPUT,
  36. PITCH_INPUT,
  37. RESET_INPUT,
  38. OFFSET_INPUT,
  39. SCALE_INPUT,
  40. NUM_INPUTS
  41. };
  42. enum OutputsIds {
  43. PHASE7_OUTPUT,
  44. PHASE6_OUTPUT,
  45. PHASE5_OUTPUT,
  46. PHASE4_OUTPUT,
  47. PHASE3_OUTPUT,
  48. PHASE2_OUTPUT,
  49. PHASE1_OUTPUT,
  50. PHASE0_OUTPUT,
  51. NUM_OUTPUTS
  52. };
  53. enum LightsIds {
  54. SLOW_LIGHT,
  55. NUM_LIGHTS
  56. };
  57. enum Wave {
  58. NO_WAVE,
  59. RAMP_UP_WAVE,
  60. RAMP_DOWN_WAVE,
  61. SINE_WAVE,
  62. TRIANGLE_WAVE,
  63. SQUARE_WAVE
  64. };
  65. const int modulationSteps = 100;
  66. const float amplitude = 5.0f;
  67. const Phasor::phase_delta_t basePhase7Offset = Phasor::radiansToPhase(1.75f * M_PI);
  68. const Phasor::phase_delta_t basePhase6Offset = Phasor::radiansToPhase(1.5f * M_PI);
  69. const Phasor::phase_delta_t basePhase5Offset = Phasor::radiansToPhase(1.25f * M_PI);
  70. const Phasor::phase_delta_t basePhase4Offset = Phasor::radiansToPhase(M_PI);
  71. const Phasor::phase_delta_t basePhase3Offset = Phasor::radiansToPhase(0.75f * M_PI);
  72. const Phasor::phase_delta_t basePhase2Offset = Phasor::radiansToPhase(0.5f * M_PI);
  73. const Phasor::phase_delta_t basePhase1Offset = Phasor::radiansToPhase(0.25f * M_PI);
  74. const Phasor::phase_delta_t basePhase0Offset = Phasor::radiansToPhase(0.0f);
  75. int _modulationStep = 0;
  76. Wave _wave = NO_WAVE;
  77. bool _slowMode = false;
  78. int _sampleSteps = 1;
  79. int _sampleStep = 0;
  80. float _offset = 0.0f;
  81. float _scale = 0.0f;
  82. PositiveZeroCrossing _resetTrigger;
  83. Phasor _phasor;
  84. SineTableOscillator _sine;
  85. TriangleOscillator _triangle;
  86. SawOscillator _ramp;
  87. SquareOscillator _square;
  88. Phasor::phase_delta_t _phase7Offset = 0.0f;
  89. Phasor::phase_delta_t _phase6Offset = 0.0f;
  90. Phasor::phase_delta_t _phase5Offset = 0.0f;
  91. Phasor::phase_delta_t _phase4Offset = 0.0f;
  92. Phasor::phase_delta_t _phase3Offset = 0.0f;
  93. Phasor::phase_delta_t _phase2Offset = 0.0f;
  94. Phasor::phase_delta_t _phase1Offset = 0.0f;
  95. Phasor::phase_delta_t _phase0Offset = 0.0f;
  96. float _phase7Sample = 0.0f;
  97. float _phase6Sample = 0.0f;
  98. float _phase5Sample = 0.0f;
  99. float _phase4Sample = 0.0f;
  100. float _phase3Sample = 0.0f;
  101. float _phase2Sample = 0.0f;
  102. float _phase1Sample = 0.0f;
  103. float _phase0Sample = 0.0f;
  104. bool _phase7Active = false;
  105. bool _phase6Active = false;
  106. bool _phase5Active = false;
  107. bool _phase4Active = false;
  108. bool _phase3Active = false;
  109. bool _phase2Active = false;
  110. bool _phase1Active = false;
  111. bool _phase0Active = false;
  112. EightFO() : Module(NUM_PARAMS, NUM_INPUTS, NUM_OUTPUTS, NUM_LIGHTS) {
  113. onReset();
  114. onSampleRateChange();
  115. }
  116. void onReset() override;
  117. void onSampleRateChange() override;
  118. void step() override;
  119. Phasor::phase_delta_t phaseOffset(Param& p, Input& i, Phasor::phase_delta_t baseOffset);
  120. void updateOutput(bool useSample, Output& output, Phasor::phase_delta_t& offset, float& sample, bool& active);
  121. };
  122. } // namespace bogaudio