Weft(纬线)+ Tone(音) —— Pattern 是纬线,Playlist 是织物。
An open-source, cross-platform DAW built from scratch with C# / .NET 10.
Weftone(纬音)是一个用 C# / .NET 从零构建的开源、跨平台数字音频工作站(DAW), 目标平台 Windows / macOS / Linux。工作流致敬 FL Studio 的 Pattern → Playlist → Mixer 范式,但代码、UI、DSP、工程格式全部自研:
- 正向规格驱动开发(spec-first),不做二进制逆向;
- 不复制任何专有资产,不复刻 FL Studio 内部架构;
- 不使用 FL / Fruity / Image-Line 的命名或视觉资产。
仓库当前包含:项目章程(AGENTS.md)、八项已定稿的
架构决策记录、贡献指南、
GPLv3 许可证与第三方声明、
vendored miniaudio,
以及第一条可运行竖切:Abstractions 端口 / Engine 正弦渲染与 RT 分配断言 /
miniaudio 适配器 / weftone CLI(离线渲染 + 实时播放)/ 引擎与架构测试 /
三平台 CI。验收标准见 specs/M0_FOUNDATION.md。
采用六边形架构(端口与适配器)+ 编译器模式 + 数据导向实时层:
ProjectDocument(可编辑 / 可撤销 / 富对象)
→ Compile(非实时线程)
→ RenderPlan(扁平数组 / 预分配 / 无对象图)
→ AtomicSwap(RCU 双缓冲)
→ RealtimeEngine(音频回调只读)
- 编辑模型与实时模型彻底分离:音频线程永远看不到 Note / Clip / Document;
- 实时纪律:音频回调零分配、零锁、零 GC、零异常、零 native malloc,
CI 以分配断言强制(
GC.GetAllocatedBytesForCurrentThread()差值 == 0); - 确定性渲染:同配置下输出位一致,支持黄金音频回归;
- headless 优先:先
.weft工程 → WAV 离线渲染,再贴 UI; - wheel-first:外围用轮子(音频 I/O、解码、重采样), 核心自研(音频图、transport、PDC、文档模型、撤销), 所有第三方依赖经 adapter 隔离,核心不泄漏第三方类型。
| 领域 | 选型 |
|---|---|
| 运行时 | .NET 10 LTS / C# 14 |
| UI | Avalonia 11+ / SkiaSharp / CommunityToolkit.Mvvm(Piano Roll 等自绘) |
| 音频 I/O | miniaudio(MIT-0,vendored) |
| 插件 | CLAP(第一优先)、LV2;VST3 可选非核心模块;VST2 禁止 |
| 工程格式 | .weft(zip 容器:project.json + assets + presets,schema 版本化) |
| 测试 | NUnit / Verify / CsCheck / BenchmarkDotNet / NetArchTest |
/src C# 源码(Domain / Abstractions / Application / Engine / Dsp / Adapters / App …)
/native 原生代码(weftone_miniaudio shim、clap_bridge、vendored 库)
/specs 功能规格(SPEC-first)
/docs/adr 架构决策记录(ADR-0001 ~ 0008 已定稿)
/tests 引擎测试 / 架构测试 / 黄金音频回归
/tools HeadlessRender CLI(weftone)
| 里程碑 | 内容 |
|---|---|
| M0(进行中) | 仓库 / CI / 架构测试 / miniaudio shim / 正弦出声 / RT 断言 / 渲染 CLI |
| M1a | headless 竖切:文档模型、.weft 存取、命令撤销、编译器、transport、Sampler、Mixer、导出 |
| M1b | 最小 UI:Piano Roll / Playlist / Mixer / 传输条 / 工程存取 |
| M2+ | 自动化曲线、CLAP 宿主、拉伸 / 切片、进程隔离、性能打磨 |
dotnet build -c Release
dotnet test -c Release
dotnet test -c Debug # RT_ASSERT 分配断言
cmake -S native -B native/build
cmake --build native/build --config Release# 离线渲染 5 秒 440Hz 正弦 WAV(不依赖 native)
dotnet run --project tools/HeadlessRender -c Release -- render --seconds 5 --out out.wav
# 实时播放(需先构建 native shim)
dotnet run --project tools/HeadlessRender -c Release -- play --seconds 5见 CONTRIBUTING.md。贡献协议(DCO 或 CLA)待定 (ADR-0005), 确定前暂不接受外部 PR;问题反馈欢迎。
- 主程序 / 引擎 / 内置插件:GPL-3.0-or-later
- Weftone.PluginSdk(规划中):独立 MIT,不引用 GPL 项目代码
- 第三方依赖仅接受宽松许可,台账见 THIRD_PARTY_NOTICES.md
- miniaudio(MIT-0)—— 音频设备 I/O