Ameba Ownd

アプリで簡単、無料ホームページ作成

なるーらぼ

[音楽をプログラミングしよう] #06 - 音色変化であそぼう

2016.03.18 04:02

前回はループを同期させてシンセフレーズにリズムパターンをつけて遊んでみました。今回はさらにループミュージックによくある音色変化をさせて遊んでみたいと思います。


おさらい

2つ以上のループを同期するには「in_thread」命令をつかって同期させるということをお話ししました。こんな風です。

use_bpm 120
in_thread do
  loop do

    use_synth :fm

    play_pattern_timed [:d3, 0, :d3, :d3], [0.25]

  end

end

in_thread do

  loop do

    sample :bd_haus,rate: 0.8

    sleep 0.5

    sample :drum_cymbal_closed

    sleep 0.5

  end

end

loop do

  use_synth :saw

  play_pattern_timed [:d5, :d5, :fs5, :a5], [0.25], amp: 0.3, pan: -0.4, release: 0.2

end

前回、最後に示したコードです。このコードにはちょっとした問題があります。それは、コードを変更したら一度停止して、再度実行しなければ同じループが複数鳴ってしまうというものです。試しに実行ボタンを何度かクリックしてみてください。大変なことになると思います。どうしてこうなってしまうかというと、「in_thread」命令のせいなのです。厳密にはin_thread命令は複数回実行されるとトラックを実行された回数作成してしまうという機能なのです。

これは…という感じですね。そこで、これらトラックに名前を付けることができるようになっています。名前をつけると、同じ名前のトラックは再生をスキップするようになります。

use_bpm 120
in_thread(name: :bass) do
  loop do
    use_synth :fm
    play_pattern_timed [:d3, 0, :d3, :d3], [0.25]
  end

end

in_thread(name: :rythem) do

  loop do

    sample :bd_haus

    sleep 0.5

    sample :drum_cymbal_closed

    sleep 0.5

  end

end

in_thread(name: :seq) do

  loop do

    use_synth :saw

    play_pattern_timed [:d5, :d5, :fs5, :a5], [0.25], amp: 0.3, pan: -0.4, release: 0.2

  end

end


音色変化を楽しむ

それでは今回の本題です。ものすごくシンプルなループに戻してみましょう。

use_bpm 124
loop do
  use_synth :dull_bell
  play_pattern_timed [72,74,76,77], [0.25]
end

うん、シンプルですね。16分音符で「ドレミファ」を繰り返す、鐘っぽいシーケンスフレーズです。このシーケンスに味付けをしていきます。


みなさんはシンセサイザーについてご存知でしょうか?特にアナログでもバーチャルアナログでも結構ですし、有名なVSTプラグインのsynth1でも結構です。

一般的なシンセサイザーの構成を念のためお話ししておきます。シンセサイザーはいくつかの回路からできていて、大きくは「オシレータ」「エンベロープジェネレータ」「フィルター」という構成になっています。

左から順に「音波を発生させるところ」「音量の推移を制御するところ」「ある周波数帯をカットするところ」です。Sonic Piではオシレータ部分は「use_synth」命令で選択するので割愛させていただきます(注:音色によっては波形を選択することができるものもあります)。そしてエンベロープジェネレータとフィルタのところのみを中心にお話ししていきます。


エンベロープジェネレータ

これは音量の時間推移をつくるところです。よく「ADSR」と言われますが、これは「Attack」「Decay」「Sustain」「Release」のそれぞれの頭文字をとっています。

最初のアタック(Attack)は発音が始まってから音量が最大になるまでの時間を言います。

これが小さければ小さいほど鋭く「コツン」とした音になりますし、逆に大きいと「ふわーっ」とした音になります。次のディケイ(Decay)はその次のサステイン(Sustain)に移るまでの時間です。サステインは例えばピアノなら鍵盤を押さえている間に音が鳴り続ける時の音量です。最後のリリース(Release)はピアノなら鍵盤から指を離したあとに音が鳴り続ける時間です。

順番にいってみましょう!さきほどのループの「play_pattern_timed」命令の行末にさらにカンマを打って、続けて書いていきます。最初はアタックの音色変化です。抜粋していきますね。

play_pattern_timed [72,74,76,77], [0.25], attack: 0

この状態で実行すると何もかわりません。しかし、「attack: 0.1」にすると…少しふわふわしてきますよね。さらに大きくしていくと・・・もうなんだかよくわからなくなってきます。


次はわかりやすさでリリースです。まずは短めに0.1くらいからいきましょう。

play_pattern_timed [72,74,76,77], [0.25], release: 0.1

有名な「ポップコーン」てきなポコポコした音になりましたよね。徐々に値を大きくしていくと…「release: 2」くらいにすると本当に鐘の音のようになりました。これら4つの値を指定していくとシンセサイザーとして音色づくりを楽しむこともできます。


フィルター

次はフィルターです。実は大きくは2種類しかパラメータはありません。1つはカットオフというもので、通す周波数の幅を指定します。つまり値が小さいほど通すことができる幅が狭いのでこもった音になります。Sonic PiではLPF(ローパスフィルター、低い周波数帯を通す)になっているようです。

また、このフィルター関係のパラメータが制御できる音色とそうでないものがあるようです。分かりやすさのために少しコードを変えてみましょう。

use_bpm 124
loop do
  use_synth :tb303
  play_pattern_timed [36,38,40,41], [0.25], release: 0.3,cutoff: 0
end

「:tb303」って…そうです。RolandのTB-303ですね。

ということで音階も2オクターブほど下げました。元のリリースが長いので短くしてあります。いまカットオフはゼロにしてありますので、できる限り高い周波数帯を削っている状態です。実行してみてください。モコモコした音になります。これを120くらいまでは上げていくことができるので、20ずつくらい上げていってみてください。徐々にキラキラ成分が含まれてきてビヨビヨいいはじめると思います。


もうひとつのパラメータはレゾナンスです。

長いのでパラメータ名は「res:」です。これもゼロから1までの間の数で指定していきます。0.2くらいずつ徐々に上げていってみてください。カットオフの値を固定して、上げていくとかかり方がよくわかると思います。よくシンセサイザーでビヨーンといわせているアレがSonic Piでもできる、ということです!


パラメータを変化させてみよう

音色の編集については基本的なところを見てきたと思います。今度はこれを自動的に変化するようにしましょう。命令として、「rrand」と「rand」をご紹介します。いずれも「rand」と名前にありますが、ランダムな、ということです。つまりランダムな数値をつくってくれます。


「rrand」のほうは範囲を指定することができるもので、範囲は整数になります。

「rand」のほうは小数で指定で、何も指定しなければ0から1までの小数がランダムにつくられます。


これらを何に使うか?ですが、先ほどのパラメータに使います。そうすると勝手にパラメータの値が変わっていきますのでランダムな音色変化を楽しむことができます。では早速。一番面白いのはフィルターでしょう。

use_bpm 124
loop do
  use_synth :tb303
  play_pattern_timed [36,38,40,41], [0.25], release: 0.3, cutoff: rrand(70, 120), res: rand()
end

こんな感じで使います。実行してみると、モコモコしたりビヨビヨしたりと、ツマミをいじって音色をリアルタイムに変更して演奏しているような雰囲気を醸し出すことができます。また、ランダムではなくゆっくりフィルターを開いていく操作のようにするのであれば、シンプルな方法としては値を足しこんでいくというものがあります。


以下の例では先ほどのカットオフ値を繰り返しごとに5ずつ加算していって、加算値が60を超えるとゼロに戻すというような動きをさせています。

use_bpm 124
val = 0
loop do
  use_synth :tb303
  play_pattern_timed [36,38,40,41], [0.25], release: 0.3, cutoff: 60 + val, res: rand()

  val += 5

  val = 0 if val > 60

end

なにやら見慣れないものが出てきましたね。ここで登場した「val」は変数といい、値をわかりやすく名前付けして覚えておくことができるものです。


最後に

今回は音色変化を楽しんでみました。次回は変数も登場したことなので、さらにコントロールする方法を見ていきたいと思います。