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.

87 lines
1.7KB

  1. #pragma once
  2. #include "ui/Quantity.hpp"
  3. #include "engine/Module.hpp"
  4. namespace rack {
  5. /** A Quantity that wraps an engine Param */
  6. struct ParamQuantity : Quantity {
  7. Module *module = NULL;
  8. int paramId = 0;
  9. /** Use engine smoothing of Param values */
  10. bool smooth = false;
  11. /** Snap to the nearest integer */
  12. bool snap = false;
  13. float snapValue = 0.f;
  14. Param *getParam() {
  15. assert(module);
  16. return &module->params[paramId];
  17. }
  18. void commitSnap() {
  19. // TODO
  20. }
  21. void setValue(float value) override {
  22. // TODO Smooth
  23. // TODO Snap
  24. getParam()->value = value;
  25. }
  26. float getValue() override {
  27. return getParam()->value;
  28. }
  29. float getMinValue() override {
  30. return getParam()->minValue;
  31. }
  32. float getMaxValue() override {
  33. return getParam()->maxValue;
  34. }
  35. float getDefaultValue() override {
  36. return getParam()->defaultValue;
  37. }
  38. float getDisplayValue() override {
  39. if (getParam()->displayBase == 0.f) {
  40. // Linear
  41. return getParam()->value * getParam()->displayMultiplier;
  42. }
  43. else {
  44. // Exponential
  45. return std::pow(getParam()->displayBase, getParam()->value) * getParam()->displayMultiplier;
  46. }
  47. }
  48. void setDisplayValue(float displayValue) override {
  49. if (getParam()->displayBase == 0.f) {
  50. // Linear
  51. getParam()->value = displayValue / getParam()->displayMultiplier;
  52. }
  53. else {
  54. // Exponential
  55. getParam()->value = std::log(displayValue / getParam()->displayMultiplier) / std::log(getParam()->displayBase);
  56. }
  57. }
  58. int getDisplayPrecision() override {
  59. return getParam()->displayPrecision;
  60. }
  61. std::string getLabel() override {
  62. return getParam()->label;
  63. }
  64. std::string getUnit() override {
  65. return getParam()->unit;
  66. }
  67. };
  68. } // namespace rack