Zongzi.Engine behaviour (zongzi v0.3.0)

Copy Markdown

引擎契约 facade:任务只有两档——check(轻)与 render(重)。

覆盖范围不设 whole/partial 回调:请求里一律segments: [Windowing.Segment.t()]

  • 整轨 / 无 phrase cache:WholeTrack.window/1 → 通常 一个 Segment
  • 乐句切开:RestSplit3Beats 等 → 多个 Segment

引擎实现只消费 Segment 列表(及 notes / interventions / params), import Windowing 模块,也直接改 Timeline。

check vs render

checkrender
成本
产出t:check_artifactt:render_artifact
必选check/1否(@optional_callbacks
入参request()checked_request()不是裸 request

Request

map 形,不强制 struct:

  • 必填 segments — 至少可为 [];UTAU 友好路径多为 length 1
  • 常用:notes / notes_by_seqinterventions(结构存活集)、 params(Gender/Energy 等,非 intervention)、tempo_segmentsopts

参数两类

  1. Intervention — 可改的上游生成结果(曲线 / timing / 可编辑 G2P…)
  2. params — 非锚旋钮;check 做类型/范围校验

循环

rebase_all  Strategy.window  [Segment]
   check(%{segments: ..., interventions: ..., params: ...})
  用户决议
   render(%{request: ..., artifact: ..., fingerprint: ...})   # 可选

check 产出 {:ok, check_artifact} 后,由 Caller 与原始 requestfingerprint(内容哈希 / revision 戳)显式打包checked_request 再传给 renderrender 实现必须校验指纹仍匹配——绝不用变异后的 项目状态渲染旧 artifact。

Summary

Types

check 阶段产出:非 final audio

check/1 验证后的 request,显式捆上 artifact 与指纹。

render 阶段产出:引擎定义的终态

Callbacks

语义与参数检查(轻)。

重渲染(可选)。

Types

check_artifact()

@type check_artifact() :: term()

check 阶段产出:非 final audio

checked_request()

@type checked_request() :: %{
  request: request(),
  artifact: check_artifact(),
  fingerprint: term()
}

check/1 验证后的 request,显式捆上 artifact 与指纹。

这消除了一条隐式缝:render 实现直接拿到「这是哪次 check 的产物」, 不需要 Caller 暗中传递、引擎猜对应关系。

render_artifact()

@type render_artifact() :: term()

render 阶段产出:引擎定义的终态

request()

@type request() :: %{
  :segments => [Zongzi.Windowing.Segment.t()],
  optional(:timeline) => term(),
  optional(:notes) => list(),
  optional(:notes_by_seq) => map(),
  optional(:interventions) => list(),
  optional(:tempo_segments) => term(),
  optional(:params) => map(),
  optional(:opts) => keyword() | map(),
  optional(any()) => any()
}

Callbacks

check(request)

@callback check(request()) :: {:ok, check_artifact()} | {:error, term()}

语义与参数检查(轻)。

segments 覆盖范围内的材料做投影比对 / Declaration.resolve / params 约束。返回 check_artifact,不是 final render。

render(checked_request)

(optional)
@callback render(checked_request()) ::
  {:ok, render_artifact()} | {:error, term()} | {:async, ref :: term()}

重渲染(可选)。

消费 checked_request——即经 check/1 验证后的 request + artifact + fingerprint。实现必须校验 fingerprint 与当前状态一致;若项目已在 check 后被其他编辑修改,应拒绝而非静默产出过期音频。

返回 {:async, ref} 时,Caller 负责管理 result delivery protocol (progress/ok/error/cancel),并拒收 fingerprint 已失效的迟到结果。

Functions

supports_render?(mod)