24 QML_VALUE_TYPE (parameterRange)
27 enum class Type : std::uint8_t
71 enum class
Unit : std::uint8_t
93 : type_ (type),
minf_ (min), maxf_ (max),
94 zerof_ (std::clamp (zero, min, max)),
deff_ (std::clamp (def, min, max))
98 static ParameterRange make_toggle (
bool default_val)
100 return {
Type::Toggle, 0.f, 1.f, 0.f, default_val ? 1.f : 0.f };
102 static ParameterRange make_gain (
float max_val)
107 constexpr float clamp_to_range (
float val)
const
109 return std::clamp (val,
minf_, maxf_);
112 Q_INVOKABLE
float convertFrom0To1 (
float normalized_val)
const;
113 Q_INVOKABLE
float convertTo0To1 (
float real_val)
const;
115 bool is_toggled (
float normalized_val)
const
121 friend void to_json (nlohmann::json &j,
const ParameterRange &p);
122 friend void from_json (
const nlohmann::json &j, ParameterRange &p);
148 BOOST_DESCRIBE_CLASS (
163class ProcessorParameter
170 float baseValue READ baseValue WRITE setBaseValue NOTIFY baseValueChanged)
171 Q_PROPERTY (QString label READ label CONSTANT)
172 Q_PROPERTY (QString description READ description CONSTANT)
174 Q_PROPERTY (
bool automatable READ automatable CONSTANT)
179 struct UniqueId final
180 : type_safe::strong_typedef<UniqueId,
utils::Utf8String>,
181 type_safe::strong_typedef_op::equality_comparison<UniqueId>,
182 type_safe::strong_typedef_op::relational_comparison<UniqueId>
186 explicit UniqueId () =
default;
190 std::size_t hash ()
const {
return qHash (type_safe::get (*this).view ()); }
192 static_assert (std::regular<UniqueId>);
195 std::function<QPointer<ProcessorParameter> (
const UniqueId &unique_id)>;
198 PortRegistry &port_registry,
202 QObject * parent =
nullptr);
218 std::function<std::optional<float> (units::sample_t sample_position)>;
224 QString label ()
const {
return label_.to_qstring (); }
225 QString description ()
const {
return description_->to_qstring (); }
226 bool automatable ()
const {
return automatable_; }
228 ParameterRange range ()
const {
return range_; }
230 float baseValue ()
const {
return base_value_.load (); }
231 void setBaseValue (
float newValue) [[clang::blocking]]
233 newValue = std::clamp (newValue, 0.f, 1.f);
234 if (qFuzzyCompare (base_value_, newValue))
236 base_value_ = newValue;
237 Q_EMIT baseValueChanged (newValue);
239 Q_INVOKABLE
void resetBaseValueToDefault ()
241 setBaseValue (range_.convertTo0To1 (range_.deff_));
243 Q_SIGNAL
void baseValueChanged (
float value);
249 Q_INVOKABLE
float currentValue ()
const {
return last_modulated_value_; }
259 return last_automated_value_.load ();
262 Q_INVOKABLE
void beginUserGesture ()
264 during_gesture_.store (
true);
265 Q_EMIT userGestureStarted ();
267 Q_INVOKABLE
void endUserGesture ()
269 during_gesture_.store (
false);
270 Q_EMIT userGestureFinished ();
272 Q_SIGNAL
void userGestureStarted ();
273 Q_SIGNAL
void userGestureFinished ();
292 const dsp::TempoMap &tempo_map)
noexcept override;
296 units::sample_rate_t sample_rate,
297 units::sample_u32_t max_block_length)
override;
304 automation_value_provider_ = provider;
306 void unset_automation_provider () { automation_value_provider_.reset (); }
308 PortUuidReference get_modulation_input_port_ref ()
const
310 return modulation_input_uuid_;
313 void set_description (utils::Utf8String descr)
315 description_ = std::move (descr);
318 void set_automatable (
bool automatable) { automatable_ = automatable; }
320 bool hidden ()
const {
return hidden_; }
322 const auto &get_unique_id ()
const {
return unique_id_; }
326 static constexpr auto kUniqueIdKey =
"uniqueId"sv;
327 static constexpr auto kRangeKey =
"range"sv;
328 static constexpr auto kLabelKey =
"label"sv;
329 static constexpr auto kSymbolKey =
"symbol"sv;
330 static constexpr auto kDescriptionKey =
"description"sv;
331 static constexpr auto kAutomatableKey =
"automatable"sv;
332 static constexpr auto kHiddenKey =
"hidden"sv;
333 static constexpr auto kBaseValueKey =
"baseValue"sv;
334 static constexpr auto kModulationSourcePortIdKey =
"modulationSourcePortId"sv;
335 friend void to_json (nlohmann::json &j,
const ProcessorParameter &p);
336 friend void from_json (
const nlohmann::json &j, ProcessorParameter &p);
344 ParameterRange range_;
347 utils::Utf8String label_;
352 std::atomic<float> base_value_;
359 std::atomic_bool during_gesture_;
368 std::atomic<float> last_automated_value_;
379 std::atomic<float> last_modulated_value_;
387 PortUuidReference modulation_input_uuid_;
390 dsp::CVPort * modulation_input_{};
397 std::optional<AutomationValueProvider> automation_value_provider_;
400 std::optional<utils::Utf8String> symbol_;
403 std::optional<utils::Utf8String> description_;
406 bool automatable_{
true };
411 BOOST_DESCRIBE_CLASS (
413 (utils::UuidIdentifiableObject<ProcessorParameter>),
420 modulation_input_uuid_,
446class ProcessorParameterRegistry
448 OwningObjectRegistry<ProcessorParameterPtrVariant, ProcessorParameter>
451 ProcessorParameterRegistry (
452 dsp::PortRegistry &port_registry,
453 QObject * parent =
nullptr)
455 ProcessorParameterPtrVariant,
457 port_registry_ (port_registry)
464 const auto &map = get_hash_map ();
465 for (
const auto &kv : map)
467 if (std::get<ProcessorParameter *> (kv.second)->get_unique_id () ==
id)
469 return std::get<ProcessorParameter *> (kv.second);
478 auto * val = find_by_unique_id (
id);
479 if (val ==
nullptr) [[unlikely]]
481 throw std::runtime_error (
482 fmt::format (
"Processor Parameter with unique id {} not found",
id));
488 struct ProcessorParameterRegistryBuilder
490 ProcessorParameterRegistryBuilder (dsp::PortRegistry &port_registry)
491 : port_registry_ (port_registry)
495 template <
typename T> std::unique_ptr<T> build ()
const
497 return std::make_unique<T> (
502 dsp::PortRegistry &port_registry_;
506 from_json (
const nlohmann::json &j, ProcessorParameterRegistry ®)
508 from_json_with_builder (
509 j, reg, ProcessorParameterRegistryBuilder{ reg.port_registry_ });
513 dsp::PortRegistry &port_registry_;