これは開発版のドキュメントである. 内容は次のリリースまでに変更される可能性がある. 最新のリリース版は 0.6.x を参照.
ChangeModulationBank
ChangeModulationBank は, 再生対象の Modulation バンクを切り替える低レベルコマンド.
ChangeModulationBank { bank, transition_mode,};ChangeModulationBank( bank=bank, transition_mode=transition_mode,)new ChangeModulationBank( bank: bank, transitionMode: transitionMode);| フィールド | 型 | 説明 |
|---|---|---|
bank |
ModulationBank |
切り替え先バンク |
transition_mode |
TransitionMode |
切り替え時の挙動 |
TransitionMode
Section titled “TransitionMode”Immediate |
即時 |
SyncIdx |
次に再生インデックスが0になった時 |
SysTime(DcSysTime, margin) |
指定した DC システム時刻 (margin は後述. 省略可) |
Gpio(GpioIn) |
指定 GPIO 入力ピンのトリガ |
Ext |
拡張モード (バンク内の再生が終わると次のバンクに自動で切り替え) |
Later |
遷移しない (バンクへの書き込みだけを行う) |
SysTime は指定時刻が近すぎると FPGA が遷移を取りこぼす可能性がある, 「現在時刻 + マージン」より前の指定を MISS_TRANSITION_TIME エラーで拒否する.
マージンはデフォルトで 10 ms である.
Later は「バンクへ書き込むだけで遷移しない」ことを表す.
Modulation / FociStm / PatternStm の transition_mode に指定すると, 末尾のバンク切り替えを送らず書き込みと設定だけを行う.
遷移コマンドである ChangeModulationBank / ChangePatternBank 自身に指定した場合はビルド時エラーになる.
また Later は遷移しないため, LoopBehavior との組み合わせ制約の対象外である.
Gpio(GpioIn) の詳細は GPIO ピン を参照.
同一バンクへの切り替えでは, TransitionMode や LoopBehavior の設定は機能しない.
バンク運用の詳細は バンクの切り替え チュートリアル を参照.
Example
Section titled “Example”ChangeModulationBank は WriteModulationBuffer + ConfigModulation でバンクを準備した後に送り, 再生対象を切り替える.
use autd3_rs::commands::{ChangeModulationBank, ConfigModulation, WriteModulationBuffer};use autd3_rs::geometry::{Autd3, Geometry};use autd3_rs::units::Hz;use autd3_rs::value::{LoopBehavior, ModulationBank, SamplingConfig, TransitionMode};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 bank = ModulationBank::B0;
let mut builder = client.datagram_builder();builder.push(WriteModulationBuffer { bank, offset: 0, data: &data,});builder.push(ConfigModulation { bank, config: SamplingConfig::FREQ_4K, size: data.len(), loop_behavior: LoopBehavior::Infinite,});builder.push(ChangeModulationBank { bank, transition_mode: TransitionMode::Immediate,});let frames = builder.build()?;for frame in &frames { client.send_checked(frame).await?;}
client.close().await?;import asyncio
from autd3 import Client, ClientConfigfrom autd3.commands import ChangeModulationBank, ConfigModulation, WriteModulationBufferfrom autd3.geometry import Autd3, Geometryfrom autd3.units import Hzfrom autd3.value import LoopBehavior, ModulationBank, SamplingConfig, TransitionModefrom autd3_link_nop import Nopfrom autd3_modulation import SineOption, modulation_buffer, sine
async def main() -> None: geometry = Geometry([Autd3([0.0, 0.0, 0.0], [1.0, 0.0, 0.0, 0.0])]) client = await Client.open(geometry, Nop(), ClientConfig())
data = modulation_buffer() sine(150.0 * Hz, SineOption(), data)
bank = ModulationBank.B0
builder = client.datagram_builder() builder.push( WriteModulationBuffer( bank=bank, offset=0, data=data, ) ) builder.push( ConfigModulation( bank=bank, config=SamplingConfig.FREQ_4K, size=len(data), loop_behavior=LoopBehavior.Infinite, ) ) builder.push( ChangeModulationBank( bank=bank, transition_mode=TransitionMode.Immediate, ) ) frames = builder.build() for frame in frames: await client.send_checked(frame)
await client.close()
asyncio.run(main())using System.Numerics;using System.Threading.Tasks;using AUTD3;using AUTD3.Link;using Nop = AUTD3.Link.Nop;using static AUTD3.Units;
var geometry = new Geometry(new[] { new Autd3(Vector3.Zero) });var client = await Client.OpenAsync(geometry, new Nop(), new ClientConfig());
var data = Modulation.ModulationBuffer();Modulation.Sine(150 * Hz, new SineOption(), data);
var bank = ModulationBank.B0;
var builder = client.DatagramBuilder();builder.Push(new WriteModulationBuffer( bank: bank, offset: 0, data: data));builder.Push(new ConfigModulation( bank: bank, config: SamplingConfig.Freq4k, size: (uint)data.Length, loopBehavior: LoopBehavior.Infinite));builder.Push(new ChangeModulationBank( bank: bank, transitionMode: TransitionMode.Immediate));var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}
await client.CloseAsync();