Skip to main content

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}