macro_rules! pzip {
($params:ident[$($kind:ident $path:tt),+]) => { ... };
($expr_head:ident $(. $expr_part:ident $( ( $($args:tt)* ) )? )+ [$($kind:ident $path:tt),+]) => { ... };
}Expand description
Utility to get a per-sample iterator including the state of multiple parameters.
This is a convenient way to consume a [BufferStates] object if you intend
to track the per-sample state of multiple parameters.
This macro indexes into a [BufferStates] object with a list of parameter
ids and their types. See the examples below for usage.
§Examples
let params = ConstantBufferStates::new_defaults(
vec![
StaticInfoRef {
title: "Numeric",
short_title: "Numeric",
unique_id: "gain",
flags: Default::default(),
type_specific: TypeSpecificInfoRef::Numeric {
default: 0.0,
valid_range: 0.0..=1.0,
units: None,
},
},
StaticInfoRef {
title: "Enum",
short_title: "Enum",
unique_id: "letter",
flags: Default::default(),
type_specific: TypeSpecificInfoRef::Enum {
default: 1,
values: &["A", "B", "C"],
},
},
StaticInfoRef {
title: "Switch",
short_title: "Switch",
unique_id: "my special switch",
flags: Default::default(),
type_specific: TypeSpecificInfoRef::Switch {
default: false,
},
},
],
);
let samples: Vec<_> = pzip!(params[
numeric "gain",
enum "letter",
switch "my special switch"
]).take(2).collect();
assert_eq!(samples, vec![(0.0, 1, false), (0.0, 1, false)]);§Global Expression Parameters
For synths, you can also access global expression controllers
using global_expression_numeric and global_expression_switch.
Note that this requires the parameter source to implement
SynthParamBufferStates.
let params = ConstantBufferStates::new_synth_defaults(
vec![
StaticInfoRef {
title: "Gain",
short_title: "Gain",
unique_id: "gain",
flags: Default::default(),
type_specific: TypeSpecificInfoRef::Numeric {
default: 0.5,
valid_range: 0.0..=1.0,
units: None,
},
},
],
);
let samples: Vec<_> = pzip!(params[
numeric "gain",
global_expression_numeric ModWheel,
global_expression_switch SustainPedal
]).take(1).collect();
assert_eq!(samples, vec![(0.5, 0.0, false)]);§External Numeric Parameters
You can also inject a NumericBufferState
from outside the params object using external_numeric. The expression must
be wrapped in parentheses.
let params = ConstantBufferStates::new_defaults(
vec![
StaticInfoRef {
title: "Gain",
short_title: "Gain",
unique_id: "gain",
flags: Default::default(),
type_specific: TypeSpecificInfoRef::Numeric {
default: 0.5,
valid_range: 0.0..=1.0,
units: None,
},
},
],
);
let external: NumericBufferState<std::iter::Empty<_>> = NumericBufferState::Constant(0.75);
let samples: Vec<_> = pzip!(params[
numeric "gain",
external_numeric (external)
]).take(2).collect();
assert_eq!(samples, vec![(0.5, 0.75), (0.5, 0.75)]);