TuttiCodeTuttiCode 指南

可视化反馈

程序播放时在编辑器里画出钢琴卷帘、打孔卡、示波器和频谱:看到一个声部演奏了什么、听起来怎样。

可视化(visual)是声部上的一个方法,在程序播放时把这个声部画出来。它从不改变声音: 声部的演奏和不加它时完全一样。可视化只在 TuttiCode(tuttidaw.com/code)上绘制; 工作室里的 Pattern Clip 演奏同一段程序,但什么也不画。

每种可视化都有两种写法:

  • 带下划线的 ._pianoroll() 画在代码里:调用结束的那一行下面的一条横带。 可以同时显示好几个,各自挨着自己的声部。
  • 不带下划线的 .pianoroll() 淡淡地画在编辑器后面,代码仍然清楚地显示在上层。

音符在做什么:pianoroll 和 punchcard

._pianoroll() 让声部的音符滚动经过播放头:时间从左到右,音越高位置越高, 正在发声的音符在播放头处画成空心框。

note("c3 [e3 g3] a3 <f3 b3>").s("triangle")._pianoroll()
在 /TuttiCode 中打开

选项写在一个对象里。cycles 是横向能放下几个周期(4),playhead 是播放头的位置 (0 最左 .. 1 最右,0.5),vertical: 1 把卷帘竖过来,时间从上往下走。 行下面的卷帘会自动适应它显示的音域;想要固定的音域,就给出 minMidi / maxMidi。

n("0 2 4 <6 7>").scale("C:minor").s("sawtooth").lpf(1200)
  ._pianoroll({cycles: 2, playhead: 0.25})
在 /TuttiCode 中打开

._punchcard() 把同样的音符画成圆角格子,没有播放头线:很适合鼓的节奏型。

s("bd*2, ~ sd, hh*8")._punchcard()
在 /TuttiCode 中打开

声音在做什么:scope 和 spectrum

._scope() 是示波器:声部播放时的波形。它显示的是这个声部自己的输出, 经过它的效果和推子之后,而不是整个混音。选项:color、thickness(3)、 scale(0.25)、pos(0 顶部 .. 1 底部)、align 和 trigger。

note("c2 c2 eb2 g1").s("sawtooth").lpf(600)._scope()
在 /TuttiCode 中打开

._spectrum() 把声部的频率画成一条线,左边是低频,右边是高频。 选项:color、thickness、min 和 max(单位 dB,默认 -80 和 0)。

note("<[c3,eb3,g3] [ab2,c3,eb3]>").s("sawtooth").lpf(2000)._spectrum()
在 /TuttiCode 中打开

看着滤波器动起来

滑块在播放时改变程序; 同一个声部上的示波器让你看到它的效果。把截止频率往下拖,锯齿波的棱角就会被磨圆, 变得接近正弦波:

note("a1*8").s("sawtooth").lpf(slider(2000, 100, 6000))._scope()
在 /TuttiCode 中打开

换成 ._spectrum(),就能看到高频逐渐消失。

编辑器后面

不带下划线的写法在整个编辑器后面画一个视图;它不接收点击,所以你可以继续打字。

bass: note("c2*4").s("sawtooth").lpf(400).pianoroll()
hats: s("hh*8").gain(0.5)
在 /TuttiCode 中打开

限制

  • spiral / _spiral 会被接受,但目前什么也不画。
  • 示波器或频谱只显示一个声部(带这个调用的那个)。想看两个声部,就在每个声部上各调用一次。
  • 有些选项会被接受但还没有绘制:pianoroll 的 labels、smear、填充与描边开关, 以及 spectrum 的 speed。