编程语言音频CLI【免费下载链接】aldaA music programming language for musicians. :notes:项目地址https://gitcode.com/gh_mirrors/al/alda点击查看免费下载本篇技术指南围绕 Alda 音乐编程语言的核心基础——音符Notes展开系统讲解音符的三大组成要素八度组、时值与音名/变音记号并深入介绍 Alda 独有的高级节奏能力非标准音符时值、十进制时值、毫秒/秒时长。读完本篇你将掌握用 Alda 编写可运行乐谱的基本功能够独立写出从单音符到带调号的完整音阶与旋律片段并理解其底层解析与事件生成原理。本文对应仓库中的官方文档 doc/doc_zh_cn/notes_zh_cn.md。音符语法总览Alda 的音符语法深受 MMLMusic Macro Language 启发。一个音符由以下部分组成从a到g的一个音名必选任意数量的临时变音记号可选一个音符时值标记可选。即音名 [变音记号] [时值标记]例如c表示默认八度、默认时值的 C 音c4表示升 C 的四分音符。在扫描器层面c会被识别为NoteLettertoken为Sharp-为Flat_为Natural数字时值则生成NoteLength/NoteLengthMs/NoteLengthSecondstoken具体实现见 client/parser/scanner.go。八度组Octave西方音乐理论将音高划分为每 12 个音一组十二平均律的重复八度组例如升序的c c# d d# e f f# g g# a a# b再往上是高八度的c c# d ...。音名如 C#与八度的组合决定了音符的频率Hz。八度组用数字表示通常在 1 到 7 之间对应科学音高记号也称国际音高记号。例如中央 C 与 A440 都位于第 4 个八度组——这也是 Alda 的默认八度组。与 MML 一样八度组与音符本身是分开设置的八度不是附加在音符上的而是每个音符在解析时查看当前的八度组来确定自己的音高。设置八度组有两种方式语法含义o5将八度组设置为 5任何整数都可以跟在o后面将当前八度组减少 1将当前八度组增加 1o指令、与在扫描器中分别对应OctaveSet、OctaveDown、OctaveUp三种 token见 client/parser/scanner.go并最终转化为模型层OctaveSet/OctaveUp/OctaveDown这类属性更新AttributeUpdate见 client/model/attributes.go。解析器的测试用例 client/parser/octaves_test.go 验证了包括连续上移三个八度、上移→下移→上移、以及c、c这类八度指令紧跟音符/音符紧跟八度指令在内的各种写法。音符时值Duration在 Alda 中音符时值通常以标准音乐符号中的音符长度表示采用数字形式4是四分音符2是二分音符1是全音符以此类推。附点Dots音符后面可以添加任意数量的点.其作用与标准音乐符号中的附点一致——将音符的时值延长到其原值的 1.5 倍即延长其一半的时值。后续每加一个点延长的时值都是上一个点所延长时值的一半写法含义拍数2二分音符2 拍2.附点二分音符3 拍2 × 1.52..复附点二分音符3.5 拍2 × 1.5 2 × 0.5 × 0.5模型层通过NoteLength{Denominator, Dots}表达这一概念拍数计算公式为(4 / Denominator) * (2 - 2^(-Dots))见 client/model/duration.go 与Beats()实现client/model/duration.go。单元测试 client/model/duration_test.go 验证了这些换算四分音符 1 拍、附点四分音符 1.5 拍、全音符 4 拍、附点全音符 6 拍、复附点全音符 7 拍。连音线Tie音符时值也可以用连音线语法~相加例如4~4表示两个四分音符连在一起总共 2 拍。在扫描器中~生成Tietoken见 client/parser/scanner.go在模型层Duration由若干DurationComponent相加得到Beats()与Ms()都会把所有组件求和见 client/model/duration.go。默认时值的粘性跟踪当音符在乐谱中按顺序解析时Alda 会持续跟踪当前八度组和当前默认音符时值。每当指定新的八度组或音符时值那些数据就成为新的默认值后续未显式写明时值的音符都会沿用这一默认时值。在每个乐器部分的开头默认八度组为4默认音符时值为4即四分音符1 拍。源码层面时值粘性由 client/model/note.go 中的effectiveDuration与updateDefaultDuration实现若音符未指定时值则使用该乐器部分当前默认的part.Duration若指定了时值则该时值同时被写回为部分的新默认值。这意味着你可以在乐谱中先写一个c4后面的d e f都会自动按四分音符演奏直到下一个显式时值出现。高级节奏Advanced RhythmsAlda 在节奏表达上有几个超越传统记谱的独特能力1. 非标准数字时值。你可以使用非 2 的幂的数字作为音符时值标记。例如6表示在 4/4 拍中持续 1/6 小节的音符。在标准记谱中没有六分音符这种东西这种时值通常会被记作四分音符三连音中的一个音符但在 Alda 中六分音符不一定是三连音的一部分这为创造更多有趣的节奏提供了可能性。2. 非整数十进制音符时值。扩展到上述概念Alda 允许小数音符时值例如c0.5西方古典记谱中的双全音符的时值是c1全音符的两倍。这些数字不必是 2 的幂例如c2.4同样是合法的。扫描器的parseNoteLength会先消费整数部分若遇到小数点后跟数字则继续消费小数部分最终把整个数值作为denominator解析见 client/parser/scanner.go。3. Cram 表达式。Alda 还提供了一种指定节奏的替代方法——cram 表达式用于在一段时间内塞入指定数量的音符。4. 毫秒与秒。音符时值还可以用毫秒ms和秒s表示并且可以随意与标准音符长度混搭c350ms # 持续350毫秒的C音符 d2s # 持续2秒的D音符 e2s~200ms # 持续2秒200毫秒的E音符 f300ms~4. # 持续300毫秒附点四分音符的F音符扫描器在数字后遇到s且其后是合法分隔符时生成NoteLengthSecondstoken遇到ms时生成NoteLengthMstoken见 client/parser/scanner.go。模型层对应NoteLengthMs与NoteLengthSeconds两种时值组件毫秒组件直接返回自身毫秒数秒组件乘以 1000 转换为毫秒见 client/model/duration.go。注意这两种组件无法直接换算为拍数Beats()会直接 panic见 client/model/duration.go但它们可以自由地与标准音符时值通过~组合成同一个Duration。音符格式与临时变音记号一个音符的完整格式为从a到g的一个字母 任意数量的临时变音记号可选 音符时值标记可选。降号和升号分别使音高降低/升高半音。在 Alda 中降号表示为-升号表示为。你可以使用多个升号或降号甚至把它们组合起来使用例如c 升 Cc 双升号 C Db- 降 B解析器测试 client/parser/notes_test.go 中包含了c升音、b-降音、c双升音、b--双降音等用例验证了任意数量变音记号的累积效果。在模型层LetterAndAccidentals保存音名与变音记号列表CalculateMidiNote会将每个升号 1、每个降号 -1 得到最终的 MIDI 音高见 client/model/pitch.go。用调号代替逐个升降号对于非 C 大调的乐曲如果每个不在调内的音都需要写升/降号重复书写会非常繁琐。此时更推荐使用调号为每个需要的音名预设升/降号以匹配调性乐谱会按定义的升降号自动演奏。下文示例中演示了具体用法。用临时变音记号覆盖调号要覆盖调号预设的降号/升号可以添加临时变音记号/-使音符临时升调/降调_代表还原号强制音符为自然音。例如c_是 C 自然音无论调号预设中给 C 音名设置了什么升降号。这对应扫描器中的Naturaltoken 与模型层Accidental枚举中的Natural见 client/model/pitch.go。完整示例B 大调音阶以下是 1 个八度的 B 大调音阶从第 4 个八度组开始先上行后下行o4 b4 c8 d e f g a b4 a8 g f e d c b2.第二个示例在开头处预设了 B 大调中被升高的那些音名f c g d a这样乐谱中就不必重复书写升降号音符会自动以预设的升降号演奏(key-signature f c g d a) o4 b4 c8 d e f g a b4 a8 g f e d c b2.仓库示例 examples/key_signature.alda 展示了更完整的调号实战先用字符串形式设置(key-signature f c g)再用c_、f_、g_还原号覆盖个别音随后切换到(g minor)小调调号最后使用列表形式(e (flat) b (flat))指定降号。调号相关属性的完整说明值类型、缩写key-sig、支持的调式等见 doc/doc_zh_cn/attributes_zh_cn.md。源码层面的实现原理扫描与解析从源码结构看Alda 的音符解析分为两个阶段扫描器 client/parser/scanner.go 先将源码文本切分为 tokenNoteLetter、Sharp、Flat、Natural、NoteLength、OctaveSet、OctaveUp、OctaveDown、Tie等再由语法解析器组合成 AST 更新见 client/parser/parser.go。isNoteLetter限定只有a到g是合法的音符字母client/parser/scanner.gofollowsNoteLetter决定一个字母后可以跟随什么字符数字、变音记号、~连音线、/八度移动等从而避免歧义client/parser/scanner.go。时值如何变成真实时长在模型层每个音符最终会被转换为带绝对时间信息的NoteEventMIDI 音符号、偏移、时长、可听时长、音量、声像等见 client/model/note.go。Note.UpdateScore会为每个当前乐器部分计算时长标准音符时值依据Beats()换算拍数再结合part.Tempo得到毫秒数60000 / tempo为每拍毫秒数见 client/model/duration.go未连音非 slur的音符还会乘以part.Quantization得到可听时长。这些换算关系可以在 client/model/duration_test.go 的测试用例中看到——例如附点音符、全音符到拍数/毫秒的转换都有一一对应的断言。变音记号与 MIDI 音高LetterAndAccidentals.CalculateMidiNote展示了完整求音高流程先按(octave 1) * 12 音名音程计算基准 MIDI 音符号若音符未显式给出变音记号则取调号keySignature[NoteLetter]中的默认升降号否则使用音符自带的变音记号列表逐项加减最后叠加乐器移调见 client/model/pitch.go。这也印证了文档中临时变音记号覆盖调号的行为只要音符自带/-/_调号即被忽略。至此你已经掌握了 Alda 音符语法的全部核心内容八度组o//、标准与附点/连音时值、高级节奏非标准数字、小数、ms/s、变音记号与调号的配合使用。建议结合仓库中的 examples/key_signature.alda、examples/dynamics.alda 等示例以及 cram 表达式、属性 文档继续深入配合alda play命令见 client/cmd/play.go实际聆听效果逐步构建完整的 Alda 作曲工作流。赞分享编程语言音频CLI【免费下载链接】aldaA music programming language for musicians. :notes:项目地址https://gitcode.com/gh_mirrors/al/alda点击查看免费下载相关推荐Alda 和弦Chords完全指南同时发声音符的语法、时值规则与实战应用Alda 和弦Chords完全指南同时发声音符的语法、时值规则与实战应用 导读 在和弦是音乐编程语言 Alda 中最基础也最常用的结构之一它允许你将多个编程语言音频CLI使用 AWS SDK for Rust 操作 AWS Elemental MediaPackageChannel 与 Origin Endpoint 的列举实战使用 AWS SDK for Rust 操作 AWS Elemental MediaPackageChannel 与 Origin Endpoint 的列举实编程语言音频CLIAlda 和弦Chord语法完全指南同时发声的音符组合与最短时值推进机制Alda 和弦Chord语法完全指南同时发声的音符组合与最短时值推进机制 和弦chord 是 Alda 音乐编程语言中表示多个音符在同一时刻开始发声的编程语言音频CLI上一篇QuantStats技术解构量化投资分析效率提升的四个实践维度下一篇FullCalendar 版本演进全解析从 v1 到 v7 的架构变革、破坏性变更与升级要点创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考