TuttiDAW 代码编曲TuttiDAW Code 指南

TuttiDAW 扩展

带预设和参数加载任意 TuttiDAW 乐器、MIDI 效果器或音频效果器;声部、编组和 Open in TuttiDAW。

像 .lpf 或 .room 这样的 Strudel 控制只是笼统地描述声音。TuttiDAW 增加了三个方法, 直接指名真实设备(就是你在工作室浏览器里看到的那些),并带上它们的工厂预设和参数:

方法 添加什么 放在哪里
.inst(name, params) 一个乐器(每个声部一个) 声部的乐器位置
.midifx(name, params) 一个 MIDI 效果器 乐器之前,按调用顺序
.fx(name, params) 一个音频效果器 乐器之后,按调用顺序

它们是 TuttiDAW 独有的:用到它们的程序无法在 strudel.cc 上播放,所以 /code 页面会为这样的 程序隐藏 “Open in strudel.cc” 链接。

乐器:.inst

名字是一个设备,或者是设备加上它的某个工厂预设,中间用冒号连接。大小写和标点不影响匹配。

setcpm(30)
bass: note("c2 [~ c2] eb2 [~ g1]").inst("Drift:Deep Bass")
keys: chord("<Cm7 Ab^7 Fm7 G7>").voicing().inst("Electric")
在 /code 中打开

即使声部同时写了 s(...),也由 .inst 决定乐器。在鼓声部上,s(...) 仍然负责选择打击垫, 所以这些鼓名可以在任何鼓组上演奏:

s("bd*2 [~ bd] sd ~, hh*8").inst("Drum Rack:909 Core Kit")
在 /code 中打开

音频效果器:.fx

效果器按你调用的顺序加在乐器之后。多次调用 .fx 就能搭出一条效果链。

note("<[c3,eb3,g3] [bb2,d3,f3]>")
  .inst("Wavetable")
  .fx("Chorus:Wide Classic")
  .fx("Reverb:Large Hall", { decayTime: "4s", dryWetBalance: 0.35 })
在 /code 中打开

MIDI 效果器:.midifx

MIDI 效果器在音符进入乐器的路上改变它们,例如 Arpeggiator 把按住的和弦变成快速的琶音。 片段保留你写下的音符;效果器像在工作室里一样实时演奏它们。

note("<[c3,eb3,g3] [ab2,c3,eb3]>")
  .midifx("Arpeggiator", { style: "UpDown", rate: "1/16" })
  .inst("Operator")
在 /code 中打开
note("c3 ~ f3 ~").midifx("Chord:Minor 7 Chord").inst("Electric")
在 /code 中打开

参数

第二个参数是一个参数值对象:

  • 键是设备的参数键(decayTime、cutoff、dryWetBalance);参数在 Live 中唯一的标签 也可以用。设备目录列出了每个键的范围和单位。
  • 数字使用参数自己的单位(Hz、ms、dB、半音)。带单位的字符串会自动换算:"250ms"、 "2s"、"-6dB"、"1.2kHz"、"30%"。
  • 选项可以写它的标签("UpDown"、"1/16"、"Dorian")或从 0 开始的序号; 开关写 true 或 false。
  • 两个保留键:on 打开或关闭设备,id 在同一个声部用了两台相同设备时给设备命名。
s("bd*4, ~ sd, hh*8")
  .fx("Saturator", { drive: "6dB" })
  .fx("Compressor", { threshold: "-18dB", ratio: 4, attack: "10ms" })
在 /code 中打开

超出参数范围的值会被限制在范围内,并给出警告。设备参数目前只接受常量;把 "<300 600>" 这样的模式写成设备参数会被报告,暂时不生效。Strudel 控制(.lpf("<300 600>"))已经可以 随时间变化。

Strudel 控制与设备一起用

Strudel 控制在设备旁边照常工作:.lpf(...) 仍然会加一台 Auto Filter。当声部自己指名了同类设备时, 控制会作用到那台设备上,而不是再加一台:.room(0.4) 配合 .fx("Reverb:...") 设置的是 那台 Reverb 的干湿比。

内联控件:slider 和 toggle

slider(value, min, max) 在编辑器里的数字旁边放一个小滑块;播放时拖动它就会改变程序。 toggle(1)(TuttiDAW 新增)在那里放一个开关。

note("c2*8").s("sawtooth").lpf(slider(800, 200, 4000))
在 /code 中打开
stack(
  s("bd*4"),
  s("hh*8").mask(toggle(1))
)
在 /code 中打开

声部变成轨道

程序里每个带标签的声部就是一条轨道。/code 页面上的 Open in TuttiDAW 会把程序保存为工作室项目:

  • 程序放在一条编组轨道上:它的 {} 按钮打开代码,在那里求值会更新所有声部;
  • 每个声部是编组里的一条轨道,带着它的乐器、效果器,以及一个装着该声部代码的 Pattern Clip;
  • 变化中的控制会变成片段包络。

手动编辑某个声部(它的音符,或者代码设置过的参数)会让这个声部脱离代码,从而保留你的修改。 Re-attach 会把它交还给代码。单独的 Pattern Clip(放在 MIDI 片段里、没有编组的代码) 只演奏音符:代码里指名的设备在那里不会生效。