diff --git a/plugins/examples/gain/src/lib.rs b/plugins/examples/gain/src/lib.rs index 8aeba795..1f56862a 100644 --- a/plugins/examples/gain/src/lib.rs +++ b/plugins/examples/gain/src/lib.rs @@ -1,20 +1,23 @@ use nih_plug::prelude::*; use parking_lot::RwLock; use std::pin::Pin; -use std::sync::Arc; struct Gain { params: Pin>, } +/// The [`Params`] derive macro gathers all of the information needed for the wrapepr to know about +/// the plugin's parameters, persistent serializable fields, and nested parameter groups. You can +/// aslo easily implement [`Params`] by hand if you want to, for instance, have multiple instances +/// of a parmaeters struct for multiple identical oscillators/filters/envelopes. #[derive(Params)] struct GainParams { + /// The parameter's ID is used to identify the parameter in the wrappred plugin API. As long as + /// these IDs remain constant, you can rename and reorder these fields as you wish. The + /// parameters are exposed to the host in the same order thye were defined in. #[id = "gain"] pub gain: FloatParam, - #[id = "stable"] - pub but_field_names_can_change: BoolParam, - /// This field isn't used in this exampleq, but anything written to the vector would be restored /// together with a preset/state file saved for this plugin. This can be useful for storign /// things like sample data. @@ -53,37 +56,20 @@ impl Default for Gain { impl Default for GainParams { fn default() -> Self { Self { - // There are three ways to specify parameters: - // - // ...either manually specify all fields: - gain: FloatParam { - value: 0.0, - default: 0.0, - smoothed: Smoother::new(SmoothingStyle::Linear(50.0)), - value_changed: None, - range: FloatRange::Linear { + gain: FloatParam::new( + "Gain", + 0.0, + FloatRange::Linear { min: -30.0, max: 30.0, }, - step_size: Some(0.01), - name: "Gain", - unit: " dB", - // This is actually redundant, because a step size of two decimal places already - // causes the parameter to shown rounded - value_to_string: Some(formatters::f32_rounded(2)), - string_to_value: None, - // ...or specify the fields you want to initialize directly and leave the other - // fields at their defaults: - // // ..Default::default(), - }, - // ...or use the builder interface: - but_field_names_can_change: BoolParam::new("Important value", false).with_callback( - Arc::new(|_new_value: bool| { - // If, for instance, updating this parameter would require other parts of the - // plugin's internal state to be updated other values to also be updated, then - // you can use this callback to for instance modify an atomic in the plugin. - }), - ), + ) + .with_smoother(SmoothingStyle::Linear(50.0)) + .with_step_size(0.01) + .with_unit(" dB") + // This is actually redundant, because a step size of two decimal places already + // causes the parameter to shown rounded + .with_value_to_string(formatters::f32_rounded(2)), // Persisted fields can be intialized like any other fields, and they'll keep their when // restoring the plugin's state. random_data: RwLock::new(Vec::new()), diff --git a/src/param/float.rs b/src/param/float.rs index 45aba005..94436621 100644 --- a/src/param/float.rs +++ b/src/param/float.rs @@ -10,9 +10,6 @@ use super::Param; /// A floating point parameter that's stored unnormalized. The range is used for the normalization /// process. -/// -/// You can either initialize the struct directly, using `..Default::default()` to fill in the -/// unused fields, or you can use the builder interface with [`FloatParam::new()`]. // // XXX: To keep the API simple and to allow the optimizer to do its thing, the values are stored as // plain primitive values that are modified through the `*mut` pointers from the plugin's diff --git a/src/param/integer.rs b/src/param/integer.rs index 6a777221..511149c6 100644 --- a/src/param/integer.rs +++ b/src/param/integer.rs @@ -10,9 +10,6 @@ use super::Param; /// A discrete integer parameter that's stored unnormalized. The range is used for the normalization /// process. -/// -/// You can either initialize the struct directly, using `..Default::default()` to fill in the -/// unused fields, or you can use the builder interface with [`IntParam::new()`]. // // XXX: To keep the API simple and to allow the optimizer to do its thing, the values are stored as // plain primitive values that are modified through the `*mut` pointers from the plugin's