pzip

Macro pzip 

Source
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)]);