rill_patchbay/strategy.rs
1//! # Стратегии управления автоматами
2//!
3//! Определяют как автомат воздействует на параметр узла и как
4//! разрешаются конфликты между автоматическим и ручным управлением.
5
6/// Как автомат воздействует на целевой параметр
7#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
8#[derive(Debug, Clone, Copy, PartialEq)]
9pub enum ControlStrategy {
10 /// Автомат задаёт значение параметра напрямую.
11 ///
12 /// Выход автомата ожидается в диапазоне [0, 1] и маппится
13 /// на [min, max] целевого параметра.
14 Absolute,
15
16 /// Автомат модулирует вокруг базового значения.
17 ///
18 /// Выход автомата ожидается в диапазоне [-1, 1].
19 /// Финальное значение: `base + mod_val * depth * (max - min)`,
20 /// обрезанное до [min, max].
21 Modulation {
22 /// Глубина модуляции (0.0 — нет модуляции, 1.0 — полный диапазон)
23 depth: f64,
24 },
25}
26
27/// Стратегия разрешения конфликта между UI и автоматом
28#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
29#[derive(Debug, Clone, Copy, PartialEq)]
30pub enum ConflictStrategy {
31 /// Касание UI замораживает автомат для этого порта.
32 ///
33 /// При получении `SetBase` автомат прекращает влиять на параметр.
34 /// При получении `Release` автомат возобновляет управление.
35 TouchOverride,
36
37 /// UI задаёт базовое значение, автомат модулирует вокруг него.
38 ///
39 /// Финальное значение вычисляется по формуле стратегии управления
40 /// с учётом базового значения от UI и модуляции от автомата.
41 BasePlusModulation,
42
43 /// Последний записавший в очередь побеждает.
44 ///
45 /// UI и автомат пишут в очередь независимо. Порядок применения
46 /// определяется порядком сообщений в `MpscQueue`.
47 LastWriteWins,
48}
49
50/// Команда от UI в PortCombiner
51#[derive(Debug, Clone)]
52pub enum UiCommand {
53 /// Установить базовое значение
54 SetValue(f64),
55
56 /// Отпустить контроль (только для TouchOverride)
57 Release,
58}