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; // 釋放空間
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章