コンテンツにスキップ

Modulation

Modulation は, AM 波形データ (&[u8]) をデバイスへ送るコマンド.

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

Modulation::new は書き込み先バンクを ModulationBank::B0, ループを Infinite, 遷移を Immediate とする. 別バンクへ書く場合は Modulation::with_bank(bank, config, data) を使う. ループ回数や遷移タイミングも変えたい場合は, フィールドを直接指定して構築する.

フィールド デフォルト 説明
bank ModulationBank ModulationBank::B0 書き込み先・再生対象のバンク
config SamplingConfig 再生サンプリング周波数
data &[u8] AM 波形サンプル列 (2 サンプル以上)
loop_behavior LoopBehavior LoopBehavior::Infinite 再生ループ回数
transition_mode TransitionMode TransitionMode::Immediate バンク切替時の遷移挙動

configSamplingConfig で指定する. datamodulation_buffer() で確保したバッファへ書き込む. loop_behavior / transition_mode の挙動は ChangeModulationBank を参照.

modulation の計算には幾つかのヘルパ関数が用意されている.

ModulationWriteModulationBuffer + ConfigModulation + ChangeModulationBank の 3 つと等価である. データが 1 フレームに収まる場合は融合して 1 フレームで送られ, 収まらない場合は上記の 3 コマンドに展開される. 以下は Modulation { bank, config, data, loop_behavior, transition_mode } と等価な組み合わせである

WriteModulationBuffer {
bank,
offset: 0,
data: &data,
};
ConfigModulation {
bank,
config,
size: data.len(),
loop_behavior,
};
ChangeModulationBank {
bank,
transition_mode,
};
use autd3_rs::commands::Modulation;
use autd3_rs::geometry::{Autd3, Geometry};
use autd3_rs::units::Hz;
use autd3_rs::value::SamplingConfig;
use autd3_rs::{Client, ClientConfig};
use autd3_rs_link_nop::Nop;
use autd3_rs_modulation::{SineOption, modulation_buffer, sine};
let geometry = Geometry::new(vec![Autd3::default()]);
let client = Client::open(&geometry, Nop, ClientConfig::default()).await?;
let mut data = modulation_buffer();
sine(150 * Hz, &SineOption::default(), &mut data)?;
let mut builder = client.datagram_builder();
builder.push(Modulation::new(SamplingConfig::FREQ_4K, &data));
let frames = builder.build()?;
for frame in &frames {
client.send_checked(frame).await?;
}
client.close().await?;