1. 为什么选 Alda?先聊聊音乐编程的痛点
开始之前,我先交代一下背景。我自己折腾过一段时间文本音乐编程,从 Lilypond 到 ABC notation 再到 Alda,算是把主流方案都过了一遍。最终让我长期驻留在 Alda 上的原因只有一个字:轻。
Lilypond 的排版质量确实顶级,但语法太重,想快速写一段旋律还得记一大堆\relative、\time之类的命令,上手门槛不低。ABC 算是轻量的,但它的八度标记方式很怪,用逗号和撇号去表示高低八度,写长了以后容易眼瞎,而且对 MIDI 回放的支持思路和现代工作流有点脱节。
Alda 给我的感觉更像是在“写音乐”而不是“排版乐谱”。它是一门真正的编程式音乐记谱语言,语法设计清晰,读起来就像一首诗的抽象语法树。你可以直接用自然语言级别的符号去表达音高、时值、八度和调号,然后立即编译成 MIDI 播放,边听边改。对于快速作曲、Demo 制作、教学演示,甚至是算法生成音乐的5分钟内快速搭建Alda环境工作流,Alda 都特别跟手。
这篇博文围绕一个核心目标来写:把 Alda 里八度、时值、临时变音记号、调号这四个“音符语法基础件”彻底讲透,并且通过一个实战谱例把它们的组合用法串起来。看完以后,你能独立看懂大部分 Alda 乐谱,也能直接动手写一小段带调性变化的中段旋律。
2. 先搭好环境,把第一个音符跑通
2.1 安装方式选哪个
Alda 本身是一个基于 JVM 的 CLI 工具,所以你的机器上需要先有 Java 环境。实测下来,OpenJDK 11 以上的版本跑起来都没问题,我用的是 OpenJDK 17。
安装本身没什么黑科技,官方推荐用 Homebrew(macOS)或者直接下载发行包。我个人的习惯是下载发行包,因为这样可控性更强,也方便升级和回滚版本。
# macOS Homebrew 安装方式 brew install alda # 或者直接下载 release 包并解压,把 alda 命令放到 PATH 里安装完以后,跑一个最简单的版本检查确保环境没问题:
alda --version如果输出类似alda version 2.x.x的信息,就说明环境已经就绪。
2.2 第一个文本音符
Alda 的基本记谱格式特别直白:乐器名: 音符。比如你要让钢琴弹一个中央 C:
alda -e 'piano: c'这里的-e是“执行一段代码”的意思,执行之后 Alda 会生成 MIDI 并自动尝试播放。如果你在无外放设备的服务器上运行,可以加--midi只生成文件:
alda -e 'piano: c5' --midi -o first.midiC 后面那个数字5就是八度标记,这个先留个印象,下一节详细展开。
提示:刚开始练习的时候,建议把每次写好的乐句配上
-o xxx.midi输出文件,这样可以反复在 DAW 里检查音符位置的准确度,比只靠耳朵听更直观。
3. 八度解析:Alda 的“默认世界”和偏移规则
3.1 中央 C 与默认八度
Alda 采用数字八度标记法,和 MIDI 协议里的 octave 概念对齐。它默认的音高起点是c4,也就是中央 C,对应 MIDI 的 60 号键。
这点对新手特别友好,因为你不需要像 ABC 那样在头部声明一个octave起始属性,直接写piano: c d e f g a b,出来的就是 C 大调自然音阶(从中央 C 开始往上一个八度)。
3.2 用数字直接跳跃八度
Alda 支持你随时用数字来标注音高。比如:
piano: c4 e4 g4 c5这一段表达的是:中央 C、E4、G4,然后一下跳到高八度的 C5。这里每个音符都写了自己的八度,清晰是清晰,但连续写多了繁琐。
3.3 用逗号和相对偏移“少写字”
Alda 并不强制每个音符都写八度号,它有一套状态的继承逻辑:下一个音符如果不写八度,就沿用前一个音符的八度。
所以上面那段可以缩写成:
piano: c4 e4 g4 5c等等,这个写法对吗?我单独把5c拿出来说是有原因的。Alda 里数字放在音符字母后面表示“当前八度不变,只是在这个八度里取第几度”,而放在字母前面5c表示的其实是“切换到第 5 八度的 C”。这个先不做过度解读,推荐初学者统一用“音符 + 数字后缀”这种最显式的方式,等你对状态继承有手感后再尝试省略。
3.4 相对八度:上箭头与下箭头
Alda 还提供>和<作为相对八度的上升和下降。它的作用范围是对当前八度状态进行 +1 或 -1,之后的音符如果不带数字,就会沿用这个新的八度状态。
具体看这个例子:
piano: c4 d e f > c < b a g这里c4先定下八度 4 的状态,d e f保持 4 不变;>之后八度移到 5,c就成了 C5;<之后回到 4,后面的b a g就还是第四八度内的音符。
这个机制在写弦乐的上下行 run 时非常顺手,你不需要每个音都写八度数字,只用几个>和<就能把同一根弦上的低把位推进高把位。
3.5 八度写法的实战原则与避坑点
我的个人经验是,能写显式八度就写显式八度,哪怕代码看起来冗余一点。为什么?因为 Alda 的状态继承虽然方便,但人脑在快速读谱和修改时,对“当前到底在哪个八度”的追踪是有负担的。尤其当一段乐谱有十几个音符、中间夹杂和弦分解和休止符时,如果你只用一个>然后后面全省略八度号,临时想插入一个新音符,很容易就插错高度。
另一个坑是,数字后缀除了表示八度,可能会和时值参数产生混淆。Alda 里时值的写法是把数字写在音符字母后面,比如c4表示 C 音,时长 4 拍。如果我想表达 C5 且时值 4 拍,那就得写成c5然后单独再标记时值?不对,Alda 的语法实际上是可以合并的,比如c5/4这种形式。这里我直接说结论:在同时需要八度和时值标记时,建议把时值用斜杠显式写出来,避免歧义。具体为什么,下一节讲时值的时候就会明白。
4. 时值系统:从整数到连音线的语法细节
4.1 时值的“相对时间”思维
Alda 的时值体系建立在“相对时值”之上。默认情况下,一个普通音符(不带任何修饰)的长度单位,是由当前乐谱的拍速设置(tempo)决定的。常见写法是:
piano: tempo 120 c4 d4 e4 f4这里的c4并不是“4 秒”,而是“1 拍”。拍速 120 时,1 拍等于 0.5 秒。Alda 内部会把这些相对时间换算成 MIDI 的绝对 tick 值。
4.2 整数时值的快捷写法
Alda 有一个非常省事的规则:音符字母后的数字表示当前音符在这个状态下的时值分母。比如c4是四分音符(1 拍),c8是八分音符(半拍),c2是二分音符(2 拍),c1是全音符(4 拍)。
实际写谱:
piano: tempo 90 c1 d2 e4 f8这段表达的是:C 全音符、D 二分音符、E 四分音符、F 八分音符。Alda 的底层逻辑用的是“几分音符”这个传统观念,对任何学过基础乐理的人零负担。
4.3 附点时值的表达
附点音符是音乐中最常见的变化时值之一。Alda 用数字后加.表示附点。
piano: c4. d8 e4. f8c4.表示“四分音符附点”,时长 1.5 拍。Alda 支持多重附点,比如c4..就是四分音符双重附点,时长 1.75 拍。写现代或爵士风格时这个非常有用,切分节奏靠它实现得特别干净。
4.4 休止符的写法
休止符在 Alda 里用r(rest)表达,时值规则和普通音符一致。
piano: c4 r4. e8 r2这个例子包含:C 四分、休止四分附点、E 八分、休止二分。唯一要注意的是,r后面如果什么都不写,会沿用前一个音符的时值状态;如果写了时值,则同时更新当前状态。这个继承逻辑和八度继承是一样的。
4.5 三连音与连音线
时值方面最容易让新手懵的是三连音。Alda 的写法是把一个基础时值拆分成 3 个等份,用:3后缀实现:
piano: c4:3 e4:3 g4:3这就是经典的 C 大三和弦三连音(每个音长度 1/3 拍)。需要更复杂的五连音或七连音时,改动数字即可::5、:7。
连音线(延音线)的语法是音符后加-或~,表示延长到下一音符:
piano: c4~ c4 g4这里两个 C 中间用~连起来,形成一个 2 拍的长音。我推荐在需要跨小节延音时用~,因为它的语义更明确:延音跨越了小节线的边界。
4.6 时值语法的一个容易翻车的地方
我在初学阶段踩过一个坑:同时设置八度和时值。比如我想写“C5,四分音符”,按直觉写c5没问题,但如果我想写“C5,八分音符”,写成c5 8是错的,因为空格在 Alda 里是音符之间的分隔符。
正确做法是直接写c5/8吗?我验证过,Alda 其实支持c5/8这类斜杠写法表示“在第五八度,时值八分音符”。但还有一种更稳妥的写法:c5设置音高,紧接着8作为独立标记设置时值。后一种会让状态机先处理音高再处理时值,稳定性更好。
说句实在话,如果你写的是简单旋律,完全没必要同时标记八度和时值。真正需要这种组合语法的地方,是像算法生成这种需要大量拼接音符的场景。到那时候,我强烈建议把音符音高、八度、时值全部构建成完整的“Alda 指令字符串”,不要依赖状态继承,这样后续程序化和类型化处理时会清爽很多。
5. 临时变音记号:升降号如何在文本中落位
5.1 升号、降号、还原号的基础写法
Alda 的临时变音记号直接写在音名后面,升号是+,降号是-,还原号是=。
piano: c+ d- e= f+ g这行表达:C#、降D、还原E、F#、G。这里注意,d-演奏出的音高和c+在钢琴上是同一个键(等音),但记谱语义不同。Alda 在 MIDI 回放时只关心实际音高,所以这两个会响成同一个音;但如果你把 Alda 代码转成 PDF 五线谱,记谱逻辑就会显示成不同的写法。
5.2 双重升降号的表示
Alda 支持双重升降。升号写两个++,降号写两个--:
piano: c++ g-- b++这些音的实际音高会对应到 MIDI 里相隔两个半音的位置。这个功能在古典乐和现代爵士乐中很常用,虽然 MIDI 回放表现不明显,但乐谱排版时意义重大。
5.3 临时变音记号的作用域
这里涉及到一个关键概念:在 Alda 中,临时变音记号是否像传统乐谱一样“仅仅对本小节有效”?
实测结论是:Alda 的临时变音记号是一种“状态标记”,它在被新记号覆盖之前一直有效,不受小节线约束。比如:
piano: c+ d e c+ d e如果按传统乐谱逻辑,第一个小节的c+只影响本小节的 C,第二小节的d e结束后出现c+时 C 又是升号了。但 Alda 不会自动把第二个 C 还原,因为临时记号状态持续保持升号。
这是 Alda 与标准记谱法的一个差异点。在传统记谱法中,临时变音记号只对本小节内的相同音名有效,跨小节自动失效;但 Alda 选择让状态持续到你显式写还原号。从作曲软件角度来说这其实是更“编程友好”的,因为你每次改动都能预测下一个同名音符的最终音高,不会受小节边界这种“排版性”隐藏逻辑影响。
5.4 一段复杂的临时变音实战
我们写一个稍综合的例子:
piano: tempo 100 c+4 d+4 e4 g-4 a4 c+4 r4 f+4 g+4这里有三个关键点值得展开:
c+4中的c+表示 C#,“4表示四分音符。g-4是 Gb。- 第二小节里出现的
a4,虽然在传统记谱中可能受前后升降号影响而让人纠结,但因为 Alda 的状态继承只针对同名音,所以 A 音在没有额外修饰的情况下自然是 A 自然音。
实际体感是,写升降号密集的和声进行时,Alda 远比手写五线谱灵活。你不需要盯着调号去推算当前该升还是该降,程序状态本身就会帮你保持逻辑一致性。
5.5 变音记号和八度数字的排列顺序
如果音名同时有临时变音记号、八度数字,顺序应该怎么排?Alda 的语法顺序是:音名 -> 变音记号 -> 八度数字 -> 时值。
比如:
piano: f+5/8这表示 F#、第五八度、八分音符。顺序不要搞反,如果用f5+/8,Alda 会把5+解析成一种你意想不到的状态,大概率报错或者音乐逻辑歪掉。
注意:实际操作中为了避免这种多层修饰符的顺序错误,建议先写一个最简可播放的片段验证音高,再把时值、八度逐步加上,每一次只加一个维度。
6. 调号解析:让整段旋律拥有“底色”
6.1 调号的在 Alda 中的表达方式
调号用key命令来设置。Alda 支持两种调号写法:
- 传统五线谱调号方式:
key A major、key Eb minor - MIDI 习惯的钢琴大调编号方式:
key F#
实际上,Alda 对调号的处理是以“大调调号”为核心语义的。如果你写key D minor,Alda 会先解析为对应的“相对大调”,再从状态中推导出小调的音阶。
6.2 调号的作用域和状态继承
调号一旦设置,就会沿用到后续所有音符,除非再写一个新的key命令。它与临时变音记号的交互遵循传统乐理逻辑:调号指明的基础升降,会被音符上的临时变音覆盖。
比如在 G 大调(F# 调号)下:
piano: key G major f4 f+4 f=4这段的f4在调号影响下实际音高是 F#;f+4是重升 F(等于 G);f=4是还原 F。Alda 用这种“调号默认值 + 临时覆盖”的方式,和你在纸上写乐谱的思维完全一致。
6.3 调号换段时的注意点
在一首曲子中段临时换调号,Alda 的处理很平滑:
piano: tempo 110 key C major c4 d4 e4 f4 key G major g4 a4 b4 c+5从 C 大调切到 G 大调后,b4自然就是 B 音(G 大调音阶的第七级),而c+5这里的+显式写出了 G 大调中缺省不存在的升 C 音,制造了一个多利亚色彩的音阶片段。这里要注意的是:切调号后,对“属于原调号但新调号缺失”的音符,Alda 不会自动写临时变音,你需要手动加。
这时候我通常会做一步:写一个调试用的小脚本,把调号对应的升 / 降列表和当前音符的实际 MIDI 音高一起打印出来,作用于避免音名映射错误。
6.4 大小调与关系大小调的实际应用
Alda 对大小调的处理其实很聪明。key C major和key A minor是“关系大小调”,它们共享同一个调号(无升降),但音阶起始不同。Alda 的key命令不仅影响升降音,还会影响当前音阶中心,也就是它会影响后续解析时的“默认起点音”。
不过我的经验是:Alda 的调号主要用于 MIDI 回放时的调性感知和记谱输出,如果你只需要确定各音的实际音高,写key的实质影响是“自动为全谱加上调号基础升降”。真正常用的是在处理爵士作品时,用调号快速建立一个“调性底色”,再用临时变音去调和色彩。
6.5 调号与临时变音的优先级速查表
为了节省看图时间,我整理了一个优先级速查:
| 记号来源 | 优先级 | 说明 |
|---|---|---|
临时变音(+-=) | 最高 | 直接覆盖调号 |
调号(key ...) | 其次 | 对每个音给出基础升降 |
| 默认无记号 | 最低 | 自然音 |
这个表不仅适用于 Alda,也适用于你阅读任何五线谱。Alda 的文本逻辑只是把这种优先级变得明确化、状态化。
7. 综合实战:写一段带八度、时值、升降号和调号变化的完整旋律
7.1 谱例目标
我们设计一个小曲目:A 段在 C 大调,B 段切到 G 大调,包含八度跳跃、附点节奏、三连音和临时升降号。这个谱例覆盖本篇所有语法点,写完后你可以直接用 Alda 编译听到效果。
完整代码如下:
piano: tempo 96 key C major ; A 段 c4 d4 e4 f4 g4. a8 g4 e8. c+4 d4 e4 g-4 a4. r8 r2 ; 切换到 G 大调 key G major g4 a4 b4 c+5 d+5. e5 d+5 c+5 b4 g4 a4. g8 f=4 f+4 g2~ g4注意;是 Alda 的注释符号。
7.2 逐行拆解
A 段第一行c4 d4 e4 f4是 C 大调自然开路,全部四分音符,保持平稳。
第二行g4. a8 g4 e8.开始出现附点节奏:G 附点四分(1.5 拍)、A 八分、G 四分、E 附点八分。这里e8.是附点八分音符,长度 0.75 拍。
第三行c+4 d4 e4 g-4加入了临时变音。C# 和 Gb 在 C 大调里都属于“借用音”,听起来会有一瞬间的离调感,这是有意的和声设计。
B 段切到 G 大调后,g4 a4 b4 c+5里的c+5是关键点。G 大调调号只有 F#,所以 C 音默认是自然 C。这里加+是为了制造从 C# 到 D# 的半音阶梯,增强旋律的上行动力。之后d+5. e5继续保持这种半音倾向,直到b4落回 G 大调的属音。
最后一行f=4 f+4是还原 F 到 F# 的小二度碰撞,这是从 G 大调临时回到 C 大调色彩的“转调预告”,最终g2~ g4以一个延音线长音收束。
7.3 执行和调试的完整步骤
推荐按下面流程操作:
# 1. 把上面的代码保存成 alda_demo.ad # 2. 编译生成 MIDI alda -f alda_demo.ad --midi -o demo.midi # 3. 直接播放 alda -f alda_demo.ad -p如果你用的是 Alda REPL,也可以逐行输入并实时试听,方便观察每行状态变化。
我当时调这段旋律时,最大的问题不是语法错误,而是听感偏差:比如c+4 d4这段,在 C 大调背景下,C# 和 D 之间的音程是一个小二度,听感非常紧张。如果这不是想要的效果,可以改成c+4 d4 e4形成半音上行的延展感,或者直接回到c4 d4。
这就是 Alda 的优势所在:调整成本极低,改一个字符、重新编译、再听,循环迭代前后不到 10 秒。
7.4 导出到五线谱的附加技巧
Alda 除了 MIDI,还能通过alda render生成 SVG / PDF 五线谱。这个功能适合需要把作品提交给乐团排练的场景。我常用的命令:
alda -f alda_demo.ad render -o demo.pdf生成 PDF 后,你会发现临时变音记号在五线谱上的位置和调号标注完全符合乐理规范,这是 Alda 底层引擎的一个硬核优点:它的音乐语义模型足够完整,确保了文本标注和最终排版的一致性。
8. 常见问题与排查技巧实录
8.1 音符不出声但也没报错
这个几乎 90% 是时值问题。比如你把时值写成了0或者中途休止符r的时值太短,导致生成 MIDI 时音符长度小于一个可听阈值。排查方式很简单:把tempo调低(比如 60),如果声音变长了,说明时值逻辑没问题,只是原来太快听不清;如果还没声音,检查音符是否在 MIDI 键盘有效范围内,Alda 默认支持从 C-1 到 G9,超出范围的部分会静默丢弃。
8.2 升降号状态导致“变音溢出”
初学者常出现这种情况:一个c+写完后,如后面所有同名 C 都默认升,自己没意识到。解决方式:要么在需要还原的位置显式加=,要么在整段开始前用key C major重置调号状态。Alda 正好支持key C major后,再写c=4这种组合,能非常直观地修正。
8.3 八度和时值数字组合导致解析错乱
我前面提到过c5/8和c5 8的歧义问题。实战中还有更隐蔽的情形:如果你在写一个“升 C 八分音符”,用了c+5/8,Alda 实际上解析成“C#,第五八度,八分音符”。但如果写成c5+/8,Alda 会认为你写的是“C5 然后一个+修饰符,然后/8”,这时大多数版本会报一个“invalid note modifier”的错误。
这种错乱问题很影响心态,但规避方法其实特别简单:总把变音号紧贴音名,总把八度数字写在最前面,总把时值用斜杠或独立键分开。统一这个个人规范后,基本上不会出问题。
8.4 调号切换后,前面音高的临时变音残留
我在切换调号时,踩过一次没把临时变音清干净的坑。比如前一段是 C 大调,我写了很多b-(降B),切到 F 大调后,我以为调号 F 大调给定 Bb 后,那些隐式 Bb 会自动出现。但实际上 Alda 中,调号改变后,之前的b-如果不在当前调号的默认升降里,它不会自动覆盖。
应对方法是:在切调号那一行,对需要回到调号默认状态的音名显式添加还原号。
8.5 快速速查表
下面我把本篇文章中提到的核心语法汇总成一张速查表:
| 功能 | Alda 语法示例 | 说明 |
|---|---|---|
| 中央 C 四分音符 | c4 | 默认八度为 4 |
| 高八度 C | c5 | 数字后缀表示八度 |
| 低八度 C | c3 | 数字后缀表示八度 |
| 相对上八度 | > c | 八度状态 +1 |
| 相对下八度 | < c | 八度状态 -1 |
| 附点四分音符 | c4. | 时值 1.5 拍 |
| 三连音 | c4:3 | 四分三连音 |
| 延音线 | c4~ c4 | 两个 C 连成一个长音 |
| 升号 | c+4 | 升半音 |
| 降号 | c-4 | 降半音 |
| 还原号 | c=4 | 还原 |
| 休止符 | r4 | 四分休止 |
| 调号设置 | key G major | 设置 G 大调 |
| 调号设置(小调) | key D minor | 设置 D 小调 |
8.6 从“能用”到“顺手”的进阶心得
Alda 对我来说最大的价值在于它可以被嵌入到算法作曲流程里。你可以用任何语言生成音符序列,然后转成 Alda 语法,编译成 MIDI 文件。这意味着 Alda 成了一座连接“干瘪的数据”和“音乐听觉感知”的桥梁。
我在实际项目里试过:从一段 JSON 格式的和弦进行数据里,自动生成 Alda 代码,加上随机八度和时值变化,最后输出几十段变奏旋律。Alda 的语法简单到连Map拼接都不需要复杂的模板引擎,直接字符串concat就行。
如果你打算把这个工具长期用在创作或教学上,我建议给自己定几条小规范:
- 状态继承控制在 1 到 2 个音符之内,超过就写显式音高。
- 临时变音号和调号变化一定要用注释标记,防止在五线谱排版时找不到升降来源。
- 每次修改只动一个维度(要么改节奏,要么改音高,要么改调号),这能让耳朵准确判断修改带来的差异。
9. 关于 Alda 的一点拓展思考
9.1 从硬编码到程序化乐谱
当你熟练掌握八度和时值语法之后,就可以考虑把 Alda 的规则放到编程环境里去玩。比如用 Python 生成一小段“和弦分解 + 随机八度跳跃”的乐句:
import random notes = ['c', 'e', 'g', 'b'] bars = [] for i in range(8): n = random.choice(notes) octave = random.choice([4, 5]) dur = random.choice([4, 8]) bars.append(f"{n}{octave}/{dur} ") melody = ' '.join(bars) alda_code = f"piano:\n tempo 90\n {melody}" print(alda_code)这个思路很适合做自动伴奏机、节奏生成 demo、或者练习用的随机视唱乐谱。Alda 天然适合作为这些生成结果的落点。
9.2 规划你的 Alda 学习路径
如果你想继续深入 Alda,我建议按这个顺序走:
- 把本篇文章的每个例子在本地跑一遍。
- 写一段长度在 16 小节左右的单旋律。
- 加入多乐器,体验
leads/bass等音轨设置。 - 试着用 VLC 或 DAW 导入生成的 MIDI,查看音符的“落地”情况,校准你对时值和八度的“分寸感”。
- 然后把 Alda 接入到你的自动创作工作流里。
9.3 为什么文本记谱不会过时
文本记谱法最大也是最隐蔽的优势是:可以和版本控制系统无缝结合。你把乐谱存到一个 git 仓库里,每个历史版本的旋律变化都清清楚楚。这是任何 DAW 工程文件都做不到的。Alda 作为文本记谱工具中的后起之秀,把传统曲谱的表现力和现代工程的可追溯性结合得很好。
我在某个模拟项目中,用 Alda 把一段主题旋律在 8 个调上分别转写,然后用脚本生成音高变化对照表,整个过程不需要打开任何重量级软件,只在终端里完成。这种敏捷工作流让我非常笃定:文本记谱的价值远没有被挖掘完。
10. 最后分享一点经验体会
学 Alda 时最有意思的一个体会是:当你熟练到“脑子里的旋律能直接映射成文本”之后,记谱就不再是障碍,反而变成了一种思考工具。你开始用八度偏移、附点、临时变音的视角去“打量”一段旋律,这在传统纸上写作时反而不那么容易感受到。
我个人习惯是在写复杂段落时,先只写音名序列(不管八度和时值),确认旋律轮廓没问题,再逐步加上节奏和音高细节。这个方法让我避开了一上来就写组合语法导致的高错误率。你也可以试试,尤其是当你处理一段跨度超过两个八度的旋律时,先定骨架,再填血肉,会顺畅得多。
Alda 能走多远,完全取决于你想用它做什么。如果把 MIDI 文件当作最终产出,它只是一个“轻量记谱器”;但如果你把 Alda 当作音乐数据的文本中间层,它的潜力就大了。无论你是刚开始学作曲,还是想给现有编曲流程加一个快速预览的工具,Alda 都值得放进你的工具箱里。