pub struct PollingParameterNumberMessageScanner { /* private fields */ }
Expand description
Scanner for detecting (N)RPN messages in a stream of short messages with polling.
Supports the following message sequences (x
and y
represent the bytes that make up the
parameter number, MSB represents either a data entry MSB or an increment/decrement value):
[x, y, MSB]
: Interpreted as 7-bit data entry or increment/decrement message.[x, y, MSB, LSB]
: Interpreted as 14-bit data entry message.[x, y, LSB, MSB]
: Interpreted as 14-bit data entry message.[x, y, MSB, MSB, ...]
: Interpreted as 7-bit data entry or increment/decrement messages.[x, y, MSB, LSB, MSB, LSB, ...]
: Interpreted as 14-bit data entry messages.[x, y, MSB, LSB, LSB, ...]
: Interpreted as 14-bit data entry messages.
Please note that this requires invoking the poll
method on a regular basis because a
timeout is used to wait for potentially relevant messages that might arrive a bit later.
§Example
use helgoboss_midi::test_util::{control_change, channel, u7, u14};
use helgoboss_midi::{ParameterNumberMessage, PollingParameterNumberMessageScanner};
use std::time::Duration;
let mut scanner = PollingParameterNumberMessageScanner::new(Duration::from_millis(0));
let result_1 = scanner.feed(&control_change(2, 99, 3));
let result_2 = scanner.feed(&control_change(2, 98, 37));
let result_3 = scanner.feed(&control_change(2, 6, 126));
let result_4 = scanner.poll(channel(2));
assert_eq!(result_1, [None, None]);
assert_eq!(result_2, [None, None]);
assert_eq!(result_3, [None, None]);
assert_eq!(
result_4,
Some(ParameterNumberMessage::non_registered_7_bit(
channel(2),
u14(421),
u7(126)
))
);
Implementations§
Source§impl PollingParameterNumberMessageScanner
impl PollingParameterNumberMessageScanner
Sourcepub fn new(timeout: Duration) -> PollingParameterNumberMessageScanner
pub fn new(timeout: Duration) -> PollingParameterNumberMessageScanner
Creates a new scanner.
The timeout determines how long to wait for the second value byte.
Sourcepub fn feed(
&mut self,
msg: &impl ShortMessage,
) -> [Option<ParameterNumberMessage>; 2]
pub fn feed( &mut self, msg: &impl ShortMessage, ) -> [Option<ParameterNumberMessage>; 2]
Feeds the scanner a single short message.
Returns zero, one or two (N)RPN messages. Two if the scanner was currently waiting for a data entry LSB (after receiving an MSB) and encountering a data increment or decrement. In this case we have two complete messages to emit.
Sourcepub fn poll(&mut self, channel: Channel) -> Option<ParameterNumberMessage>
pub fn poll(&mut self, channel: Channel) -> Option<ParameterNumberMessage>
Returns the (N)RPN message as soon as the timeout of waiting for the second value message has been exceeded.
Trait Implementations§
Source§impl Clone for PollingParameterNumberMessageScanner
impl Clone for PollingParameterNumberMessageScanner
Source§fn clone(&self) -> PollingParameterNumberMessageScanner
fn clone(&self) -> PollingParameterNumberMessageScanner
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Default for PollingParameterNumberMessageScanner
impl Default for PollingParameterNumberMessageScanner
Source§fn default() -> PollingParameterNumberMessageScanner
fn default() -> PollingParameterNumberMessageScanner
Source§impl PartialEq for PollingParameterNumberMessageScanner
impl PartialEq for PollingParameterNumberMessageScanner
Source§fn eq(&self, other: &PollingParameterNumberMessageScanner) -> bool
fn eq(&self, other: &PollingParameterNumberMessageScanner) -> bool
self
and other
values to be equal, and is used by ==
.