-
Notifications
You must be signed in to change notification settings - Fork 2
Description
项目正遇到一些开发上的问题,我决定重构其编写方式以支持更多功能!
我正尝试在最短时间内实现这些功能!为了支持后期各种参数编辑的加入,计划大致如下:
决定重构 VocalSynth 的代码
后端
前置工具库
FFTW,AudioFiles
参数库
-
发音参数表
-
(ADSR,弃用,改用参数锚点)
生成
- 输入参数(共振峰,音符类型,音符长度,前后交融参数,湍流参数,响度参数(ADSR))
- 输出音符的渲染(两种类型:1. 带前后交融 2. 不带前后交融)规定发音开头必须要在准线上。
- ADSR 和 共振峰是可变长列表,音符长度设计成小数,拍子时长使用分母记法,渲染的时候再用小数。
- 直接输出到 Temp 中,目前不考虑性能优化,直接渲染所有音。
前端 GUI
-
上方栏有:文件,偏好。
- 文件:
- 保存
- 另存为
- 导出
- 加载声库
- 偏好:
- 默认响度曲线( ADSR)(空则为 (0,100) & (100,100)),此处使用百分数
- 设置输出设备
- 量化(节奏线)
- 采样率
- 声道
- 曲谱设置
- 升降号标记
- 调性突出(钦定调性,简谱显示,在右侧写简谱)
- 文件:
-
交互操作:
-
曲谱 BPM。(仿照 SV)
-
左边钢琴卷帘,音高线上,会有音高标记,用升号标记(偏好里设置升降号标记)
- 偏好:辅助音高显示:直接在音符右侧上显示音高。
- 偏好:默认歌词:a
- 音符左侧显示音素。(同一个音节音素应当用空格分开,然后由系统自己分别识别)
- 暂时开发英文和日文的声库。
-
调性突出
-
长按左键拖动输入音符,shift+左键,生成单位音符,音符头尾可以拖长缩短,点住音符可以拖拽。
-
双击音符可以编辑详细信息,实现时可选以下两种方式
- 弹出窗口,并阻塞原来进程(V4)
- 右侧弹出栏目,(SV)
需要支持:
- 编辑响度锚点。
- 编辑音高锚点。
- 编辑共振峰。
- 编辑 EQ。
- 编辑长度占比和过渡(交叉)渲染参数
编辑思路是:直接在仪表上操作,双击产生新锚点和坐标/输入数字,显示在仪表上。
-
保存项目文件:使用 .txt 格式。
- 音符用如下格式保存:
- 音高 - 长度 - 音节
- 各种参数,在后面输出。
- 音符用如下格式保存:
-
内部 API 只渲染音符,并输出到文件里面。
外部的工作是:分割音符并且操控锚点,写入曲谱文件,交给内部渲染器。
曲谱文件:
这次重构将很多参数暂时ban掉,不过也会规范写法,方便后期加入功能。
第一行一个 BPM。
一个音符,第一行三个基本信息照旧。
第二行启用响度锚点(ADSR),0 表示使用默认 ADSR,否则是一个 x 后跟 2x 个数的形式,都是百分数
第三行,启用 EQ,0 表示默认,否则是一个 x 后跟 2x 个数的形式,一个表示频点,一个小数(至多保留两位),一个表示相对响度,一个小数。(至多保留三位)
第四行启用音高锚点,0 表示默认,否则是一个 x 后跟 2x 个数的形式,都是小数,一个表示位置,一个表示偏移量。(采用偏移量而不是绝对音高,否则精度和运算量会有点问题)
暂时ban掉共振峰编辑,感觉很神秘,不太好做,不过重写的时候也稍微注意一下。
如果锚点的开头和末尾不存在,则默认为 0.
一行空行分割音符(主要是方便调试)
如此就完成了所有要存的东西。
前端再考虑将同一个音符的不同音素分割开来,并且保持音高锚点的一致性。一个音符是一个音节,包含参数:
- 非单音节(即单元音):发音长短占比。(暂时ban掉,有点难写,后期再加)
- 双元音:交变参数编辑。(Disabled,暂时ban掉,不过反正要重构代码,稍微写成比较好改的样子)