SuperCollider学习笔记(四)- 失真(Distortion)

18 篇文章 1 订阅
4 篇文章 1 订阅

前言

失真(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; // 释放空间
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值