2016年6月9日木曜日

UGenの音量を調整 - Env, EnvGen

MIDIのADSRを調整することを、
SuperColliderのEnvクラスを用いて行います。

次のコードを実行すると、下の図が表示されます。

実行例:
Env.linen(0.01, 1, 1, 1, 0).plot


Envのlinenメソッドを呼び出しています。
その名前の通り、直線的に値が描かれます。

linen(attackTime, sustainTimereleaseTimelevel, curve)

です。

曲線的な動きにするならば、curveの箇所の値を変えてやると良いです。

実行例:
Env.linen(0.01, 1, 1, 0.8, -5).plot


このような図がプロットできます。

では、Envクラスを用いて発音の長さを調整してみます。
そのために EnvGenクラスを用います。

先ほど Envクラスで作成したオブジェクトをもちいて、
新しくEnvGenクラス(UGen)を作成します。


実行例:
{
  var env = Env.linen(0.01, 1, 1, 0.8, -5);
  EnvGen.ar(env)
}.plot(3)




それでは、これをSinOscと重ね合わせたのが次のコードです。


実行例:
{
  var env = Env.linen(0.01, 1, 1, 0.8, -5);
  SinOsc.ar(440) * EnvGen.ar(env)
}.plot(3)



簡単に音量調整できました。

また、Env.linenメソッド以外にも、Env.newメソッドを使って、
Envクラスを作成する方法もあります。

実行例:
Env.new([0, 1, 0.8, 0], [0.5, 1, 1], [0, 0, -5]).plot



Env.newでは、配列で

『音量』
『前の値からの経過時間』
『傾きの種類』

を指定します。

実行例:
{
  var env = Env.new([0, 1, 0.8, 0], [0.5, 1, 1], [0, 0, -5]);
  var envGen = EnvGen.ar(env);
  SinOsc.ar(440) * envGen
}.play



2016年6月8日水曜日

UGenでmulの値にUGenを用いて音量を編集する

SinOscなどUGenの引数には、
出力される値を掛ける引数がありますが、
その引数にSinOscなどを用いることで、
周期的に音量が変化するサウンドをつくれます。


実行例:
{
  var vol = SinOsc.kr(1, 0, 0.5, 0.5);
  SinOsc.ar(440, 0, vol)
}.play


波形図(with SinOsc)

周期的に音量が小さくなったり大きくなったりを繰り返します。


変数 vol に用いている SinOsc.kr(1, 0, 0.5, 0.5)は、
1Hz のサイン波に0.5をかけて 0.5 足したものです。
音量になるので、値が負の数にならないようにしています。


他のUGenを使って様々な効果がねらえます

実行例2(LFNoise2):
{
  var vol = LFNoise2.ar(1, 0.5, 0.5);
  SinOsc.ar(440, 0, vol)
}.play



波形図  ( with LFNoise2)

音量の大小の変化はランダムに変わります。


実行例3(LFSaw):
{
  var vol = LFSaw.ar(1, 0, 0.5, 0.5);
  SinOsc.ar(440, 0, vol)
}.play


波形図( with LFSaw)

無音から直線的に大きくなる・・・の繰り返しです。
※無音に戻る際にノイズが起こります。



実行例4(LFPulse):
{
  var vol = LFPulse.kr(1, 0, 0.5);
  SinOsc.ar(440, 0, vol)
}.play


波形図( with LFPulse)

オン・オフの繰り返しです。
1から0に移るタイミングでノイズが発生します。

ノイズ生成 - WhiteNoise

{WhiteNoise.ar()}.play

すべての周波数で一定の音量の出力を行う波形を出力します。


周波数値




プロット図

ノイズ生成 - PinkNoise

ピンクノイズを生成します。

{PinkNoise.ar()}.play

引数は

・掛ける値
・足す値

ですが、特に指定する必要はありません。

実行すると、
すべての周波数帯で、
高周波になるにつれて、
音量が小さくなる波形が生成されます。



周波数値


波形(プロット図)





乱数生成にも用いられたりします。

矩形波 - LFPulse

矩形波を出力するには LFPulse を用います。
引数は大体他のUGenと同じく、

・周波数
・位相
・矩形の幅
・掛ける値
・足す値

です。


波形を plot で確認してみると次のようになります。

実行例:
{LFPulse.ar(440, 0, 0.5)}.plot




+1 と -1 の値のみとります。

実際に実行してみると次のような音色になります。

実行例:
{
  var freq = XLine.kr(440, 220, 10);
  LFPulse.ar([freq, freq], 0, 0.5)
}.play

※ 440Hz から 220Hz まで 10秒かけてピッチを変えてます。


ここで、周波数値を見てみると次のような周波数になります。



LFPulse.ar(440)


奇数倍音のみ含む周波数が生成されています。
同じ奇数倍音のみ含む三角波は次のようになります。


LFTri.ar(440)

波形のピークの値の減り方が矩形波と三角波では異なることがわかります。
(三角波の方が値の減り方が大きい)


音源で比較すると次のような具合です。

実行例:
{
  var freq = XLine.kr(440, 220, 10);
  [LFPulse.ar(freq),
    LFTri.ar(freq)]
}.play




ちなみに、のこぎり波(LFSaw)と比較すると次のようになります。

実行例:
{
  var freq = XLine.kr(440, 220, 10);
  [LFPulse.ar(freq),
    LFSaw.ar(freq)]
}.play





矩形の幅


矩形波の引数にあった矩形の幅ですが、
これを調整することで音色を変えていくことができます。

実行例:
{LFPulse.ar(440, 0, width)}.plot


波形 (width = 0.1)
※ 1の割合が極端に少ない



波形(width = 0.5)
※ 1の値と0.5 の値が同じ割合


波形( width = 0.9 )
※ 1の割合が極端に多い


それぞれの音色の違いは、Line関数を用いて、
下のコードのように実行すると分かりやすいと思います。

{
  var width = Line.kr(0.0, 1.0, 5);
  LFPulse.ar(440, 0, width)
}.play

出力される周波数の確認 - FreqScope

plotscope を用いて波形を確認することができますが、
実際に出力されている周波数を確認するために、
FreqScope」クラスを用いることができます。


FreqScope は plot や scope と違って、
別に実行する必要があります。

実行例:

FreqScope.new(400, 200, 0);

引数は(ウインドウの横幅、縦幅、オーディオバスナンバー)です。
続けて背景色や線の色など指定できますが、
デフォルトで十分です。

3つ目の引数は、確認するオーディオのバスナンバーですが、
特に指定がなければで大丈夫です。




終了する際には、画面を閉じる前に、
パワー(緑色のボタン)をオフにしておくようにと、
ヘルプファイルに書いてあります。
"stop"と"start" の切り替えをうまくして、
CPUパワーを節約するようにとのことだと思います。


また、GUIでは、パワーのオン・オフの他に、

・確認するオーディオバスナンバーの指定

・周波数を対数(Log)・比例(Linear)で表示するかどうか

・確認するデジベル(指定した値以下を無視)をどうするか

などオプションが指定できます。




実行すると、(デフォルトでは)真っ黒の何もない画面が出力されます。
縦軸が音量、横軸が周波数です。

横軸・縦軸のメモリは、GUIで指定したオプションで変わってきます。



例えば、FreqAnalyzer を起動した状態で次のコードを実行すると、

{SinOsc.ar(440)}.play

対数(Log)表示にしていた場合、




このように表示されますが、比例(Linear)の場合だと、




このように横軸が変化することがわかります。


現在出力している音色の周波数を確認するのには、
もってこいの機能です。

三角波形 - LFTri

三角波を出力する UGen が LFTri です。


{LFTri.ar(440)}.play


引数は他のUGenと大体同じです。

LFTri.ar(周波数、位相、掛ける値、足す値

になります。

波形の形を plot で見ると次のようになります。


LFTri ( 440Hz )


-1 から +1 の間を直線的に移動する繰り返しです。

LFSaw と似ていますが、
LFSawが -1 から +1まで進んだ後、
すぐに -1 に値が戻るのに対し、
LFTri は +1 から -1 まで直線的に戻る点で、大きく違います。



LFSaw ( 440 Hz )




出力される周波数値でそれぞれの違いを確認すると次のようになります。


LFTri ( 440 Hz )



LFSaw ( 440 Hz )


倍音の数がこんなにも異なることがわかります。

のこぎり波(LFSaw)はすべての整数倍音を含んでおり、
三角波(LFTri)は、奇数倍音のみ含んでいるようです。

参考:
Wikipedia (https://ja.wikipedia.org/wiki/のこぎり波)
Wikipedia (https://ja.wikipedia.org/wiki/三角波_(波形))

倍音の違いで音色がこうも変わる良い例だとおもいます。