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( bank=bank, config=config, data=data, loop_behavior=loop_behavior, transition_mode=transition_mode,)Modulation は書き込み先バンクをデフォルトで ModulationBank.B0, ループを Infinite, 遷移を Immediate とする.
別バンク・ループ回数・遷移タイミングを指定したい場合は, 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 の挙動は ChangeModulationBank を参照.
modulation の計算には幾つかのヘルパ関数が用意されている.
等価な低レベルコマンド
Section titled “等価な低レベルコマンド”Modulation は WriteModulationBuffer + 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,};WriteModulationBuffer( bank=bank, offset=0, data=data,)ConfigModulation( bank=bank, config=config, size=len(data), loop_behavior=loop_behavior,)ChangeModulationBank( bank=bank, transition_mode=transition_mode,)new WriteModulationBuffer( bank: bank, offset: 0, data: data);new ConfigModulation( bank: bank, config: config, size: (uint)data.Length, loopBehavior: loopBehavior);new ChangeModulationBank( bank: bank, transitionMode: transitionMode);Example
Section titled “Example”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?;import asyncio
from autd3 import Client, ClientConfigfrom autd3.commands import Modulationfrom autd3.geometry import Autd3, Geometryfrom autd3.units import Hzfrom autd3.value import SamplingConfigfrom 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)
builder = client.datagram_builder() builder.push(Modulation(SamplingConfig.FREQ_4K, data)) 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 builder = client.DatagramBuilder();builder.Push(new Modulation(SamplingConfig.Freq4k, data));var frames = builder.Build();foreach (var frame in frames){ await client.SendCheckedAsync(frame);}
await client.CloseAsync();