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) を使う.
ループ回数や遷移タイミングも変えたい場合は, フィールドを直接指定して構築する.
Modulation(config, data)
Modulation(config, data, bank=bank)
Modulation( bank=bank, config=config, data=data, loop_behavior=loop_behavior, transition_mode=transition_mode,)Modulation は書き込み先バンクをデフォルトで ModulationBank.B0, ループを Infinite, 遷移を Immediate とする.
別バンクへ書く場合は Modulation(config, data, bank=bank) を使う.
ループ回数や遷移タイミングも変えたい場合は, loop_behavior / transition_mode 引数を渡す.
new Modulation(config, data);
new Modulation(bank, config, data);
new Modulation( bank: bank, config: config, data: data, loopBehavior: loopBehavior, transitionMode: transitionMode);new Modulation(config, data) は書き込み先バンクを ModulationBank.B0, ループを Infinite, 遷移を Immediate とする.
別バンクへ書く場合は new Modulation(bank, config, data) を使う.
ループ回数や遷移タイミングも変えたい場合は, loopBehavior / transitionMode 引数を渡す.
| フィールド | 型 | デフォルト | 説明 |
|---|---|---|---|
bank |
ModulationBank |
ModulationBank::B0 |
書き込み先・再生対象のバンク |
config |
SamplingConfig |
— | 再生サンプリング周波数 |
data |
&[u8] |
— | AM 波形サンプル列 (2 サンプル以上) |
loop_behavior |
LoopBehavior |
LoopBehavior::Infinite |
再生ループ回数 |
transition_mode |
TransitionMode |
TransitionMode::Immediate |
バンク切替時の遷移挙動 |
config は SamplingConfig で指定する.
data は modulation_buffer() で確保したバッファへ書き込む.
loop_behavior / transition_mode の挙動は ActivateModulationBank を参照.
modulation の計算には幾つかのヘルパ関数が用意されている.
等価な低レベルコマンド
Section titled “等価な低レベルコマンド”Modulation は WriteModulationBuffer + ConfigModulation + ActivateModulationBank の 3 つと等価である.
以下は 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,};samples = data.to_numpy()for offset in range(0, len(samples), WriteModulationBuffer.MAX_LEN): WriteModulationBuffer( bank=bank, offset=offset, data=ModulationBuffer.from_array(samples[offset : offset + WriteModulationBuffer.MAX_LEN]), )ConfigModulation( bank=bank, config=config, size=len(data), loop_behavior=loop_behavior,)ActivateModulationBank( bank=bank, transition_mode=transition_mode,)var samples = data.ToArray();for (var offset = 0; offset < samples.Length; offset += WriteModulationBuffer.MaxLen){ using var chunk = ModulationBuffer.FromBytes(samples[offset..Math.Min(offset + WriteModulationBuffer.MaxLen, samples.Length)]); new WriteModulationBuffer( bank: bank, offset: (uint)offset, data: chunk );}new ConfigModulation( bank: bank, config: config, size: (uint)data.Length, loopBehavior: loopBehavior);new ActivateModulationBank( bank: bank, transitionMode: transitionMode);Example
Section titled “Example”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?;import asyncio
from autd3 import Client, TransportOptionfrom autd3.commands import Clear, Modulation, Synchronizefrom autd3.geometry import Autd3, Geometryfrom autd3.units import Hzfrom autd3.value import SamplingConfigfrom autd3_modulation import SineOption, modulation_buffer, sine
async def main() -> None: geometry = Geometry([Autd3()]) with await Client.open(geometry, TransportOption()) as client: await client.send(Clear()) await client.send(Synchronize())
config = SamplingConfig.FREQ_4K data = modulation_buffer() sine(150 * Hz, SineOption(), config, data)
await client.send(Modulation(config, data))
asyncio.run(main())using System.Threading.Tasks;using AUTD3;using static AUTD3.Units;
var geometry = new Geometry(new[] { new Autd3() });using var client = await Client.OpenAsync(geometry, new TransportOption());await client.SendAsync(new Clear());await client.SendAsync(new Synchronize());
var config = SamplingConfig.Freq4k;var data = Modulation.ModulationBuffer();Modulation.Sine(150 * Hz, new SineOption(), config, data);
await client.SendAsync(new Modulation(config, data));