- 编程语言
- 音频
- CLI
【免费下载链接】alda
A music programming language for musicians. :notes:
Alda 是一款面向音乐家的音乐编程语言,其核心乐谱语法允许你用纯文本描述声部与音符。本文聚焦 Alda 内置的乐器(Instrument)系统:目前 Alda 完全基于General MIDI(GM)音色集提供 128 种音色乐器与一套完整打击乐映射,所有乐器名称与别名均可在乐谱中直接使用。读完本文,你将掌握 Alda 中乐器的书写规范、midi-前缀的含义、全部 16 组 128 种乐器的标准名称与别名,以及乐器在解析器与播放引擎(如 MIDI 通道分配)层面的实现原理。
一、概览:Alda 当前只支持 General MIDI 乐器
官方文档 doc/list-of-instruments.md 明确说明:目前 Alda 只支持General MIDI(GM)乐器。项目计划在未来加入波形合成能力,届时你将可以使用正弦波、方波、三角波、锯齿波,以及由这些波形构建的复杂合成器。但在当前版本中,乐谱可用的乐器就是下文列出的 GM 音色。
注意:部分短别名(如
piano、guitar)未来可能会被替换为非 MIDI 乐器(例如采样或波形乐器)。为了确保你的乐谱始终使用特定的 MIDI 乐器,请使用带midi-前缀的规范名称(如midi-acoustic-grand-piano)。
这一约定在源码中也有印证:所有规范名称都以midi-开头,别名则相对宽松。见 client/model/instruments.go 中midiNonPercussionInstruments与midiPercussionInstruments两个列表的定义。
二、在乐谱中使用乐器
任何一个乐器名称或其别名,都可以作为 Alda 乐谱中的**乐器部件(instrument part)**来使用。基本语法是在乐器名后加冒号,随后书写该乐器的音符事件:
midi-harpsichord: c8 d e f g a b > cAlda 处理乐谱时是顺序扫描的,它会为每个乐器独立跟踪音量、速度、时值、偏移量(offset)与八度等状态。当你切换到别的乐器再切回来时,不需要手动把参数改回去——Alda 会自动记住每个声部上一次的状态。这也是乐器部件可以分段书写、交错书写的基础,详见 doc/scores-and-parts.md。
三、乐器名称与别名是如何解析的:源码级原理
在 Go 源码中,每种乐器被建模为一个MidiInstrument,核心字段包括:
NameImpl:乐器的规范名称(即midi-开头的名称);PatchNumber:GM 音色程序号(Program Change 值);IsPercussion:是否为打击乐通道乐器。
定义见 client/model/instruments.go。程序初始化时,init()会把每一个规范名称和它的全部别名统一注册到stockInstruments这个 map 中,名称与别名都指向同一个MidiInstrument实例(client/model/instruments.go)。因此,在乐谱里写piano:与写midi-acoustic-grand-piano:效果完全相同。
当解析器遇到乐器声明时,会调用stockInstrument(identifier)做名称/别名反查,未识别的名称会报错unrecognized instrument: <name>(client/model/instruments.go),随后通过score.NewPart(name)创建声部,并为该声部设置一组默认属性(初始八度4、默认速度120、默认音量mf、默认量化0.9等,见 client/model/part.go)。
命令行上,你可以随时用alda instruments命令查看全部可用乐器的规范名称列表,其实现就是直接遍历InstrumentsList()(client/cmd/instruments.go,数据源为 client/model/instruments.go)。
四、完整乐器列表(按 GM 音色组划分)
以下乐器直接对应General MIDI 音色集,按 MIDI 规范中的音色组(patch group)划分,共 16 组、128 种音色。括号内是该乐器的别名。其中各组对应的音色程序号范围(1–128,从源码注释与 GM 规范可以对应)已标注在组名中。
4.1 Piano(钢琴,Patch 1–8)
- midi-acoustic-grand-piano (midi-piano, piano)
- midi-bright-acoustic-piano
- midi-electric-grand-piano
- midi-honky-tonk-piano
- midi-electric-piano-1
- midi-electric-piano-2
- midi-harpsichord (harpsichord)
- midi-clavi (midi-clavinet, clavinet)
4.2 Chromatic Percussion(有音调打击乐,Patch 9–16)
- midi-celesta (celesta, celeste, midi-celeste)
- midi-glockenspiel (glockenspiel)
- midi-music-box (music-box)
- midi-vibraphone (vibraphone, vibes, midi-vibes)
- midi-marimba (marimba)
- midi-xylophone (xylophone)
- midi-tubular-bells (tubular-bells)
- midi-dulcimer (dulcimer)
4.3 Organ(风琴,Patch 17–24)
- midi-drawbar-organ
- midi-percussive-organ
- midi-rock-organ
- midi-church-organ (organ)
- midi-reed-organ
- midi-accordion (accordion)
- midi-harmonica (harmonica)
- midi-tango-accordion
4.4 Guitar(吉他,Patch 25–32)
- midi-acoustic-guitar-nylon (midi-acoustic-guitar, acoustic-guitar, guitar)
- midi-acoustic-guitar-steel
- midi-electric-guitar-jazz
- midi-electric-guitar-clean (electric-guitar-clean)
- midi-electric-guitar-palm-muted
- midi-electric-guitar-overdrive (electric-guitar-overdrive)
- midi-electric-guitar-distorted (electric-guitar-distorted)
- midi-electric-guitar-harmonics (electric-guitar-harmonics)
4.5 Bass(贝斯,Patch 33–40)
- midi-acoustic-bass (acoustic-bass, upright-bass)
- midi-electric-bass-finger (electric-bass-finger, electric-bass)
- midi-electric-bass-pick (electric-bass-pick)
- midi-fretless-bass (fretless-bass)
- midi-bass-slap
- midi-bass-pop
- midi-synth-bass-1
- midi-synth-bass-2
4.6 Strings(弦乐,Patch 41–48)
这一组在 GM 规范中还包括定音鼓(Timpani),源码注释也俏皮地标注了 "no idea why this is in strings, but ok!"(client/model/instruments.go)。
- midi-violin (violin)
- midi-viola (viola)
- midi-cello (cello)
- midi-contrabass (string-bass, arco-bass, double-bass, contrabass, midi-string-bass, midi-arco-bass, midi-double-bass)
- midi-tremolo-strings
- midi-pizzicato-strings
- midi-orchestral-harp (harp, orchestral-harp, midi-harp)
- midi-timpani (timpani)
4.7 Ensemble(合奏,Patch 49–56)
- midi-string-ensemble-1
- midi-string-ensemble-2
- midi-synth-strings-1
- midi-synth-strings-2
- midi-choir-aahs
- midi-voice-oohs
- midi-synth-voice
- midi-orchestra-hit
4.8 Brass(铜管,Patch 57–64)
- midi-trumpet (trumpet)
- midi-trombone (trombone)
- midi-tuba (tuba)
- midi-muted-trumpet
- midi-french-horn (french-horn)
- midi-brass-section
- midi-synth-brass-1
- midi-synth-brass-2
4.9 Reed(簧片,Patch 65–72)
- midi-soprano-saxophone (midi-soprano-sax, soprano-saxophone, soprano-sax)
- midi-alto-saxophone (midi-alto-sax, alto-saxophone, alto-sax)
- midi-tenor-saxophone (midi-tenor-sax, tenor-saxophone, tenor-sax)
- midi-baritone-saxophone (midi-baritone-sax, midi-bari-sax, baritone-saxophone, baritone-sax, bari-sax)
- midi-oboe (oboe)
- midi-english-horn (english-horn)
- midi-bassoon (bassoon)
- midi-clarinet (clarinet)
4.10 Pipe(吹管乐器,Patch 73–80)
- midi-piccolo (piccolo)
- midi-flute (flute)
- midi-recorder (recorder)
- midi-pan-flute (pan-flute)
- midi-bottle (bottle)
- midi-shakuhachi (shakuhachi)
- midi-whistle (whistle)
- midi-ocarina (ocarina)
4.11 Synth Lead(合成器主音,Patch 81–88)
- midi-square-lead (square, square-wave, square-lead, midi-square, midi-square-wave)
- midi-saw-wave (sawtooth, saw-wave, saw-lead, midi-sawtooth, midi-saw-lead)
- midi-calliope-lead (calliope-lead, calliope, midi-calliope)
- midi-chiffer-lead (chiffer-lead, chiffer, chiff, midi-chiffer, midi-chiff)
- midi-charang (charang)
- midi-solo-vox
- midi-fifths (midi-sawtooth-fifths)
- midi-bass-and-lead (midi-bass+lead)
4.12 Synth Pad(合成器音色垫,Patch 89–96)
- midi-synth-pad-new-age (midi-pad-new-age, midi-new-age-pad)
- midi-synth-pad-warm (midi-pad-warm, midi-warm-pad)
- midi-synth-pad-polysynth (midi-pad-polysynth, midi-polysynth-pad)
- midi-synth-pad-choir (midi-pad-choir, midi-choir-pad)
- midi-synth-pad-bowed (midi-pad-bowed, midi-bowed-pad, midi-pad-bowed-glass, midi-bowed-glass-pad)
- midi-synth-pad-metallic (midi-pad-metallic, midi-metallic-pad, midi-pad-metal, midi-metal-pad)
- midi-synth-pad-halo (midi-pad-halo, midi-halo-pad)
- midi-synth-pad-sweep (midi-pad-sweep, midi-sweep-pad)
4.13 Synth Effects(合成器效果,Patch 97–104)
- midi-fx-rain (midi-fx-ice-rain, midi-rain, midi-ice-rain)
- midi-fx-soundtrack (midi-soundtrack)
- midi-fx-crystal (midi-crystal)
- midi-fx-atmosphere (midi-atmosphere)
- midi-fx-brightness (midi-brightness)
- midi-fx-goblins (midi-fx-goblin, midi-goblins, midi-goblin)
- midi-fx-echoes (midi-fx-echo-drops, midi-echoes, midi-echo-drops)
- midi-fx-sci-fi (midi-sci-fi)
4.14 Ethnic(民族风乐器,Patch 105–112)
- midi-sitar (sitar)
- midi-banjo (banjo)
- midi-shamisen (shamisen)
- midi-koto (koto)
- midi-kalimba (kalimba)
- midi-bagpipes (bagpipes)
- midi-fiddle
- midi-shehnai (shehnai, shahnai, shenai, shanai, midi-shahnai, midi-shenai, midi-shanai)
4.15 Percussive(打击乐器,Patch 113–120)
- midi-tinkle-bell (midi-tinker-bell)
- midi-agogo
- midi-steel-drums (midi-steel-drum, steel-drums, steel-drum)
- midi-woodblock
- midi-taiko-drum
- midi-melodic-tom
- midi-synth-drum
- midi-reverse-cymbal
4.16 Sound Effects(音效,Patch 121–128)
- midi-guitar-fret-noise
- midi-breath-noise
- midi-seashore
- midi-bird-tweet
- midi-telephone-ring
- midi-helicopter
- midi-applause
- midi-gunshot (midi-gun-shot)
五、特殊乐器:midi-percussion(打击乐/鼓组)
除了上面 128 种音色,Alda 还有一个特殊的midi-percussion乐器(别名percussion)。它提供多种打击乐音色,每种音色映射到不同的音符:每个音符对应一个独立的打击乐器,但声音的音高与音符本身无关——也就是说,你在鼓组里写c8表示"底鼓"这一打击乐音色,而不是"C 音"。
在源码中,midi-percussion被单独建模,其IsPercussion字段为true,且不携带 PatchNumber(client/model/instruments.go、client/model/instruments.go)。播放时,打击乐声部会被固定分配到MIDI 通道 9(General MIDI 规范中的打击乐专用通道),见 client/model/midi.go 中determineMidiChannel的实现。
官方文档给出的鼓组示例:
(tempo! 150) midi-percussion: V1: # bass and snare o2 c4 e8 c r c e c V2: # cymbals (hi-hat, crash, ride bell, another crash) o2 f+8 f+ r o3 c+8~8 f16 f r8 a其中o2 c4是底鼓(Bass Drum 1)、e是电军鼓(Electric Snare)、f+是闭镲(Closed Hi-Hat)、c+是吊镲(Crash Cymbal)、a是开镲(Open Hi-Hat)等。完整的音符到打击乐音色映射,可以参考仓库示例 examples/percussion.alda,其中按八度给出了每个半音对应的鼓件名称,例如:
| 八度 | 音符 | 打击乐音色 |
|---|---|---|
| o1 | b | Acoustic Bass Drum(原声底鼓) |
| o2 | c / c+ / d / d+ / e | Bass Drum 1 / Side Stick / Acoustic Snare / Hand Clap / Electric Snare |
| o3 | c+ / d+ / f / g / g+ | Crash Cymbal 1 / Ride Cymbal 1 / Ride Bell / Splash Cymbal / Cowbell |
| o4 | c / c+ / d / e / f / f+ / g / g+ | Hi Bongo / Low Bongo / Mute Hi Conga / Low Conga / High Timbale / Low Timbale / High Agogo / Low Agogo |
| o5 | c / c+ / d / d+ / e / f / f+ / g / g+ | Long Whistle / Short Guiro / Long Guiro / Claves / Hi Wood Block / Low Wood Block / Mute Cuica / Open Cuica |
| o6 | c … b | 更高八度的鼓组扩展音色 |
六、MIDI 通道分配:128 种乐器如何放进 16 个通道
从源码结构看,Alda 的音序引擎采用 MIDI 的16 个通道进行播放,其中通道 9 保留给打击乐。非打击乐乐器的通道分配逻辑在 client/model/midi.go 中实现:
simpleCheck:优先找一个完全空闲、或仅被本声部独占的通道;complexCheck:当通道紧张时,检查其他声部的音符是否与当前音符在时间上重叠,若某通道上其他声部此时没有音符,就可以共享该通道;availableMidiChannel:两种策略都失败时,返回错误并提示"乐谱中的乐器超过 16 个,且无法通过共享通道解决"。
这意味着 Alda 允许你在一个乐谱中使用超过 16 个乐器声部——只要它们在时间上不冲突,Alda 会自动把它们复用分配到同一通道。仓库示例 examples/all-instruments.alda 正是利用这一机制,用 128 种乐器依次演奏同一段旋律(The Lick™),并通过r1*N错开每个声部的起始时间,避免通道冲突。该示例注释也印证了这一点:
There are only 15 non-percussion channels available in the MIDI synthesizer, but Alda works around this limitation by intelligently assigning each note to a channel that's available at that point in time in the score.
七、实战技巧:乐器分组与别名
7.1 多乐器分组
你可以让多个乐器同时演奏同一段音符,使用斜杠/分组:
trumpet/trombone: c d e f g f e d c但要注意,Alda 仍为每个乐器独立跟踪音量、速度、八度、偏移量等状态,若希望它们严格同步,需要由作曲者自行保证各声部从同一偏移量开始。更详细的说明见 doc/scores-and-parts.md。
7.2 别名的解析规则
从源码看,别名与规范名称在stockInstrumentsmap 中是等价的(client/model/instruments.go)。写乐谱时优先使用midi-前缀的规范名称以获得长期稳定;短别名(如piano、guitar、organ、violin)适合快速草稿,但官方明确提示这些别名未来可能被替换为非 MIDI 乐器实现。
7.3 快速验证
- 运行
alda instruments可打印全部 129 个可用名称(128 种音色 +midi-percussion); - 用
alda play或 REPL 播放midi-harpsichord: c8 d e f g a b > c即可听到羽管键琴音色; - 完整试听 128 种乐器,可直接加载并播放 examples/all-instruments.alda。
八、中文资料
本主题另有官方中文翻译版本 doc/doc_zh_cn/list-of-instruments_zh_cn.md,其中乐器名称与别名保持英文原样,便于对照阅读。其余相关的乐谱语法(音符、和弦、声部、速度、标记等)可查阅 doc/index.md 下的对应文档。
- 编程语言
- 音频
- CLI
【免费下载链接】alda
A music programming language for musicians. :notes:
相关推荐
3步找回加密压缩包密码:免费开源工具的终极指南
3步找回加密压缩包密码:免费开源工具的终极指南 你是否曾经面对一个重要的加密压缩包,明明记得密码就在某个地方,却怎么也想不起来?那种无助感,相信很多人都经历过。
编程语言音频CLIAlda乐器大全:128种MIDI音色完整指南与使用技巧
Alda乐器大全:128种MIDI音色完整指南与使用技巧 Alda是一种创新的音乐编程语言,专为音乐家和程序员设计。作为音乐编程的终极工具,Alda提供了完整的
编程语言音频CLIFFmpeg-Kit 跨平台多媒体处理完整指南:8 种预构建包怎么选、6 个平台怎么接
FFmpeg Kit 跨平台多媒体处理完整指南:8 种预构建包怎么选、6 个平台怎么接 30 秒速览:FFmpeg Kit 是什么,现在该不该用 FFmpeg
编程语言音频CLI
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考