SuperCollider:Mul和Add(以及UGen的引数)

两个引数被采用在很多UGen中,我们将在这份教程中将它们分开来说说。它们非常有用,因为它们提供了一种保持信号被适当保持在一个合适的范围内并作为输出给其它UGen使用的方法——因为系统音频输出的数值是在-1到1之间,同时一个频率也许要求的数字是20到2000,这些不同种类的比例界定是通过 mul 和 add 引数来解决的。

// 我们将继续使用internal server和它的图释工具
Server.default=s=Server.internal;

s.boot;

如果你查看UGen的帮助文档,你常会看到 mul 和 add 作为最后的引数:
// 选中并cmd+d
[SinOsc]

注意 mul 是第三引数而 add 是第四引数——你可以使用冒号语法直接将那些输入放到振荡器(那些“引数”):

{SinOsc.ar(mul:1)}.scope

对于音频输出来说(ar里边的东西,这些是最后从声卡出来的东西),数值必须保持在-1和1之间(如果写 mul:0.1,之前的声音将保持在-0.1到0.1之间,位于安全范围内)。


下边是一个过载的声音(谨慎聆听):
// 大声!默认440Hz,振幅倍加2.0
{SinOsc.ar(mul:2.0)}.scope

下边是一个具有更合适音量振幅的声音

{SinOsc.ar(mul:0.1)}.scope

由上可见,代码中 mul: 的部分实际上是建立了一个振幅倍加器,即,它界定信号在y轴的比例。

// 鼠标界定振幅的小样
{SinOsc.ar(mul:MouseY.kr(1.0,0.1))}.scope

还有另外一个你将看到发生在信号身上的事,是偏移y轴。我用UGen的 add 输入来做这个。
// 鼠标控制偏移的小样
{SinOsc.ar(mul:0.1, add:MouseY.kr(0.9,-0.9))}.scope

mul 和 add 控制帮助界定一个你想要作为输入的信号的值到一个你希望的范围内。
// 鼠标控制振幅界定小样
{SinOsc.ar(mul:MouseX.kr(0.1,1.0), add:MouseY.kr(0.9,-0.9))}.scope

你可以使用*+作为设定 mul 和 add 的捷径。
{0.1*SinOsc.ar}.scope

等同于

{SinOsc.ar(mul:0.1)}.scope

///////////////////////////

{0.1*SinOsc.ar+0.5}.scope

等同于

{SinOsc.ar(mul:0.1,add:0.2)}.scope

我是用冒号语法来将值作为SinOsc UGen的特定输入。我们怎么知道这些输入,或者还有其它什么运用它们的方法吗?

SinOsc的引数是freq(频率), phase(相位), mul(乘), add(加)
我怎么知道的?选中SinOsc并按cmd+d调出帮助文档或者按cmd+j调出源代码设定。


因此,如果我清楚的写出整个UGen的输入:
SinOsc.ar(freq, phase, mul, add)

期望的输入值可能为:
freq- 20 到 10000 (Hz)
phase- 0.0 到 1.0循环
mul: 0.0 到 1.0,振幅从无声到满档
add: 0.0 无偏移


在代码中使用SinOsc UGen,我必须用合适的值来替代那些输入。这些值可以是固定的常数,也可以是其它UGen。在这种情况下,它们可能会是随时间变化的值。如果我不指定一个给定的输入,默认值将被使用,那正是你在上边所听到的声音。

为所有输入使用常数:

{SinOsc.ar(440, 0.0, 0.1, 0.0)}.scope

插入一个UGen,一个MouseX控制,到频率输入:

{SinOsc.ar(MouseX.kr(440,880), 0.0, 0.1, 0.0)}.scope

让频率的参数保持之前(它是第一个输入,记住),使用冒号给到特定的输出比例,并让其他引数为默认:

{SinOsc.ar(MouseX.kr(440,880), mul:0.1)}.scope

完成一件事的方法永远不止一个。比如说,要限制一个单独SinOsc的音量,我们可以写:
// 直接提供freq和mul的引数
{SinOsc.ar(440,0.0,0.1)}.scope

或者

// 仅设置倍加器的参数
{SinOsc.ar(mul:0.1)}.scope

或者

{0.1*SinOsc.ar}.scope

或者

// 使用dB!在初始化UGen的时候计算仅一次。
{SinOsc.ar(440, mul: -20.dbamp)}.scope

一条调制的笔记:

mul 和 add 对于建立调制器(modulator)非常有用。mul 输入可以获得精确的调制,即,将不同的信号乘到一起。

使用一个SinOsc调制另一个的频率:

{SinOsc.ar(SinOsc.ar(3,mul:40,add:440),0,0.1)}.scope

内部的SinOsc就是一个调制器。每秒三次,它在+-40间变化(由 mul 界定)。我 add:440 以使输出值在400和480之间游走。这对外部SinOsc来说,是一个合适的输入变化频率控制。

Be Sociable, Share!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.