Задача: Вынести runtime VoiceScenario в общий модуль для синтезатора и визуализатора

Вынести runtime VoiceScenario в общий модуль для синтезатора и визуализатора

Устранить дублирование логики исполнения VoiceScenario между synthesizeScenario и ScenarioVisualizer.

Задача

Вынести общую логику исполнения VoiceScenario в единый runtime-модуль и использовать его одновременно в синтезаторе и визуализаторе.

Сейчас логика prepareScenario, evaluateBezier, updateAutomations, executeCommand и вычисление текущего VoiceControlState фактически дублируется. Это создаёт риск расхождения: визуализатор может показывать не то состояние, которое реально использует DSP.

Что нужно сделать

  • Создать общий runtime-модуль для VoiceScenario (например, VoiceSynthesizer/src/runtime.ts).
  • Вынести туда подготовку композиции сценариев и общей timeline.
  • Вынести интерпретацию set и animate.
  • Вынести вычисление cubic bezier.
  • Вынести обновление активных automation и семантику сохранения to после окончания duration.
  • Обеспечить получение фактического VoiceControlState во времени или итерацию состояния по временной шкале.
  • Перевести synthesizeScenario на этот runtime.
  • Перевести ScenarioVisualizer на тот же runtime, чтобы график был отображением реального состояния синтезатора, а не отдельной интерпретацией сценария.
  • Сохранить существующую семантику композиции массивов сценариев: initial только у первого сценария, последующие продолжают текущее состояние без reset.

Критерий результата

Для одного и того же VoiceScenario синтезатор и визуализатор используют одну и ту же реализацию state machine. После изменения runtime-семантики невозможно получить ситуацию, когда DSP исполняет сценарий одним образом, а визуализатор отображает его другим.