跳转到内容

在 SuperCollider 中设计声音/纯数据对象等效物

来自维基教科书,开放的书籍,开放的世界

以下列表基于 Christopher Ariza 编写的 **纯数据 (PD) 对象参考词汇表**,可在以下 URL 获取:http://www.flexatone.net/docs/pdg

SuperCollider 示例的系数已适应纯数据对象的行为。


以毫秒为单位,以恒定速率发送一系列砰的一声。

// example: [metro 2012]
// 2012 ms = 2.012 s 
// BPM: 60 / 2.012 = 29.821073558648
// BPS: BPM / 60 = 0.49701789264413 -> ~ 0.497 Hz

Impulse.kr((2012/1000).reciprocal); // equals to Impulse.kr(60/(2012/1000)/60);


带通滤波器。参数初始化中心频率和 Q。

// [bp~] and BPF.ar differ in their behaviour. 
// This example is just an approximation to [bp~].

BPF.ar(signal, centerFrequency, Q.reciprocal)


cos~ 对象输出其信号输入的 2π 倍的余弦值。因此 -1、0、1 和 2 输出 1,0.5 输出 -1,依此类推。

(signal * 2pi).cos

或者,使用更常见的相位调制和查找表

SinOsc.ar(phase: 0.5pi + (2pi * signal))

[delwrite~]

[编辑 | 编辑源代码]

延迟信号。提供一个信号作为输入,将其添加到延迟线。一个或多个 [delread~] 或 [vd~] 对象可以从由 [delwrite~] 对象创建的延迟线读取。

第一个参数:延迟线名称第二个参数:延迟线长度(以毫秒为单位)(= 最大延迟时间)

// at first: a buffer for the UGens to use
buffer = Buffer.alloc(s, s.sampleRate * seconds, 1); // or LocalBuf(s.sampleRate * seconds, 1) ... whatever suits best

DelTapWr.ar(buffer, signal)

一极高通滤波器。

(signal - OnePole.ar(signal, exp(-2pi * (freq * SampleDur.ir))))


一极低通滤波器。

OnePole.ar(signal, exp(-2pi * (freq * SampleDur.ir)))


返回两个信号中较大的一个。

signal1.max(signal2)


返回两个信号中较小的一个。

signal1.min(signal2)


均匀分布的白噪声;输出介于 -1 和 1 之间。

WhiteNoise.ar


[phasor~]

[编辑 | 编辑源代码]

锯齿波振荡器。从 0 递增到 1;可以被认为是介于 0 和 1 之间的锯齿波。

LFSaw.ar(0.5, 1, 0.5, 0.5)


粉红噪声发生器。

PinkNoise.ar


对信号求幂。

signal.pow(exponent)


延迟信号。一个或多个独立的 [vd~] 对象可以从一个命名的 [delwrite~] 对象读取延迟线。延迟线必须作为构造参数命名。信号输入将设置延迟时间(以毫秒为单位)。

// works in conjunction with DelTapWr and an allocated buffer
DelTapRd.ar(buffer, outputOfDelTapWr, delTime)


vline~ 对象与 line~ 相似,会生成线性斜坡,其电平和时间由您发送给它的消息决定。消息包含目标值、时间间隔(如果没有提供则为零)和初始延迟(如果没有提供则为零)。斜坡可能在音频样本之间开始和停止,在这种情况下,输出将相应地插值。

// Equivalent in SuperCollider for the following message sent to [vline~]: [1 1000 500, 0 1000 2500]
EnvGen.ar(Env.new([0, 0, 1, 1, 0], [0.5, 1, 1, 1]))

// the pure data message means: 
// go to 1 in 1000ms but wait 500ms from the starting point, 
// then go to 0 in 1000ms but wait 2500 ms from the starting point:
Env.new([0, 0, 1, 1, 0], [0.5, 1, 1, 1]).plot


模 1 的余数。[wrap~] 对象给出输入与不超过它的最大整数之间的差值(对于正数,这是小数部分)。

Wrap.ar(signal)

或使用运算符 "wrap"

signal.wrap(0, 1)
华夏公益教科书