Skip to content

Modulation

Modulation is a command that sends AM waveform data (&[u8]) to the device.

Modulation::new(config, &data);
Modulation::with_bank(bank, config, &data);
Modulation {
bank,
config,
data: &data,
loop_behavior,
transition_mode,
};

Modulation::new sets the destination bank to ModulationBank::B0, the loop to Infinite, and the transition to Immediate. To write to another bank, use Modulation::with_bank(bank, config, data). To also change the loop count or transition timing, construct it by specifying the fields directly.

Field Type Default Description
bank ModulationBank ModulationBank::B0 Bank to write to / play back
config SamplingConfig — Playback sampling frequency
data &[u8] — AM waveform sample sequence (at least 2 samples)
loop_behavior LoopBehavior LoopBehavior::Infinite Playback loop count
transition_mode TransitionMode TransitionMode::Immediate Transition behavior on bank switching

config is specified with SamplingConfig. data is written to a buffer allocated by modulation_buffer(). For the behavior of loop_behavior / transition_mode, see ActivateModulationBank.

Several helper functions are provided for computing modulation.

Modulation is equivalent to the three commands WriteModulationBuffer + ConfigModulation + ActivateModulationBank. The following is equivalent to Modulation { bank, config, data, loop_behavior, transition_mode }

for (i, chunk) in data.chunks(WriteModulationBuffer::MAX_LEN).enumerate() {
WriteModulationBuffer {
bank,
offset: i * WriteModulationBuffer::MAX_LEN,
data: chunk,
};
}
ConfigModulation {
bank,
config,
size: data.len(),
loop_behavior,
};
ActivateModulationBank {
bank,
transition_mode,
};
use autd3_rs::commands::{Clear, Modulation, Synchronize};
use autd3_rs::geometry::{Autd3, Geometry};
use autd3_rs::units::Hz;
use autd3_rs::value::SamplingConfig;
use autd3_rs::Client;
use autd3_rs::udp::TransportOption;
use autd3_rs_modulation::{SineOption, modulation_buffer, sine};
let geometry = Geometry::new(vec![Autd3::default()]);
let option = TransportOption::default();
let mut client = Client::open(&geometry, &option).await?;
client.send(Clear).await?;
client.send(Synchronize).await?;
let config = SamplingConfig::FREQ_4K;
let mut data = modulation_buffer();
sine(150 * Hz, &SineOption::default(), config, &mut data)?;
client.send(Modulation::new(config, &data)).await?;