本文主要是介绍SuperCollider学习笔记(四)- 失真(Distortion),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
前言
失真(Distortion)在维基百科中的定义是 “一个物体、影像、声音、波形或其他信息形式其原本形状(或其他特征)的改变现象”,在一定限度内的信号失真,如果没有影响到信号本身的准确程度的话,会产生十分奇特的效果。摇滚乐中如果没有吉他与贝斯的失真音色,将会失去了很多魅力。
分类解读
基本数学操作
- 这个分类下包含 abs, max, squared 和 cubed 等,分别将信号取绝对值、取当前信号量与0相比的最大值、平方值和立方值:
{ SinOsc.ar(300, 0, 0.2) }.scope(1); // 原信号
{ SinOsc.ar(300, 0, 0.2).abs }.scope(1); // 取绝对值
{ SinOsc.ar(300, 0, 0.2).max(0) }.scope(1); // 与0比较大值
{ SinOsc.ar(300, 0).squared * 0.2 }.scope(1); // 平方之后乘0.2
{ SinOsc.ar(300, 0).cubed * 0.2 }.scope(1); // 立方之后乘0.2
进阶信号处理
- 包含 distort, softclip, clip2, fold2, wrap2 等,其中 distort 操作是套用公式 x / (1 + abs(x)) 进行非线性处理,clip、fold和wrap分别是指信号削波、信号折叠和信号包裹:
{ SinOsc.ar(300, 0, MouseX.kr(0.1,80,1)).distort * 0.2 }.scope(1); // 非线性处理,公式为 x / (1 + abs(x))
{ SinOsc.ar(300, 0, MouseX.kr(0.1,80,1)).softclip * 0.2 }.scope(1); // 削波处理,仅保留值在-0.5到+0.5之间的信号,将超出部分削去,但是对边缘部分进行线性处理,使其比较圆滑
{ SinOsc.ar(300, 0, MouseX.kr(0.1,80,1)).clip2(1) * 0.2 }.scope(1); // 削波处理,仅保留值在-1到+1之间的信号,将超出部分削去,不做线性处理
{ SinOsc.ar(300, 0, MouseX.kr(0.1,80,1)).fold2(1) * 0.2 }.scope(1); // 折叠处理,将在-1和+1之外的信号折叠起来
{ SinOsc.ar(300, 0, MouseX.kr(0.1,80,1)).wrap2(1) * 0.2 }.scope(1); // 包裹处理,将信号包裹在-1到+1之间
- scaleneg 的作用是将值小于0的负信号乘以一个值,而对正信号无作用:
{ SinOsc.ar(200, 0, 0.2).scaleneg(MouseX.kr(-1, 1)) }.scope(1);
- Shaper 可以查看储存在Buffer中的数值,据此对信号进行处理,其中Buffer是用切比雪夫多项式进行初始化的。下面使用sendMsg来实现数组空间申请和初始化:
s.sendMsg(\b_alloc, 80, 1024); // 分配空间
s.listSendMsg([\b_gen, 80, \cheby, 7] ++ {1.0.rand2.squared}.dup(6)); // 用略微失真的切比雪夫多项式来初始化列表{ Shaper.ar(80, SinOsc.ar(600, 0, MouseX.kr(0,1))) * 0.3; }.scope(1);s.listSendMsg([\b_gen, 80, \cheby, 7] ++ {1.0.rand2.squared}.dup(6)); // 改变数值
s.listSendMsg([\b_gen, 80, \cheby, 7] ++ {1.0.rand2.squared}.dup(6));
还可以不使用sendMsg实现:
s.boot; // 服务器启动
b = Buffer.alloc(s, 512, 1, { |buf| buf.chebyMsg([1,0,1,1,0,1])}); // 分配空间并初始化
(
{Shaper.ar(b,SinOsc.ar(300, 0, Line.kr(0,1,6)),0.5)
}.scope;
)
b.free; // 释放空间
这篇关于SuperCollider学习笔记(四)- 失真(Distortion)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!