# 音をコントロールする

ここまでで、このシリーズではサウンドをトリガーすることに焦点を当ててきました。我々は、`play`や`synth`でSonic Piに組み込まれた多くのシンセサイザーを起動させることができ、`sample`であらかじめ録音されたサンプルをトリガーする方法を見てきました。また、トリガーされたサウンドを、`with_fx`コマンドを使ってリバーブやディストーションなどのスタジオ・エフェクト内にどのようにラップできるかを見てきました。これをSonic Piの信じられないほど正確なタイミングシステムと組み合わせると、広大なサウンド、ビート、リフを生成することができます。しかし、特定のサウンドのオプションを慎重に選択してトリガーすると、再生されている間にそのサウンドを変更することはできないでしょうか？ それができるのです！ 今日は、実行中のシンセをコントロールするとてもパワフルな方法を学びます。

## 基本的なサウンド

はじめに、良い感じの簡単な音を作ってみましょう。Sonic Piを起動し、新しいBufferに以下のコードを打ち込んでください：

    synth :prophet, note: :e1, release: 8, cutoff: 100

では、左上にある`Run`ボタンを押して、素敵な響きのシンセサウンドを聞きましょう。続いて、`Run`ボタンを何度か押して、その音の感覚を掴みましょう。できましたか？ では制御してみましょう！

## シンセ・ノード

`play`, `synth`, `sample`といった関数が、実行中のサウンドを表象する`SynthNode`と呼ばれるものを返却することは、Sonic Piで少し知られている機能かもしれません。これらの`SynthNode`は標準的な変数に入れることができ、後で制御することができます。例えば、`cutoff:`のオプションを1拍後に変更してみましょう。

    sn = synth :prophet, note: :e1, release: 8, cutoff: 100
    sleep 1
    control sn, cutoff: 130

各行を順番に見ていきましょう。

最初に、`:prophet`シンセを`synth`関数でいつものようにトリガーしています。しかし、その結果を`sn`という変数に入れています。この変数は`synth_node`や`jane`といった何か全く異なるものでも構いません。しかし、何か意味のある名前を選ぶことがあなたのパフォーマンスや後でこのコードを読む人々にとって重要でしょう。私は、シンセ・ノードのニーモニック（略名）が良かったので、`sn`を選びました。

2行目では、標準的な`sleep`コマンドを呼んでいます。これは何も特別なことはありません。次の行に進む前に1拍待つようコンピュータに指示しているだけです。

3行目はコントロールによって楽しくなるところです。ここでは、`control`関数を使って実行中の`SynthNode`にカットオフの値を`130`に変更するよう指示しています。Runボタンを叩くと、`:prophet`シンセが前と同じように演奏され、1拍後にそのサウンドが明るくなるのを聞くことができるでしょう。

調整可能なオプション

Sonic Piのシンセやエフェクトのオプションのほとんどは、トリガーされた後に変更できるかもしれません。しかし、これはすべてに当てはまるという訳ではないのです。例えば、エンベロープのオプション `attack:`, `decay:`, `sustain:`と`release:`は、シンセをトリガーするときだけ設定できます。オプションを変更できるどうかは簡単です。特定のシンセまたはエフェクトのドキュメントに進み、個々のオプションのドキュメントまでスクロールして、”May be changed whilst playing”（演奏中に変更可能です）か”Can not be changed once set”（一度設定されると変更できません）というフレーズを探すだけです。例えば、`:beep`シンセの`attack:`オプションのドキュメントは、それを変更できないことを明確にしています：

- Default: 0
- Must be zero or greater
- Can not be changed once set
- Scaled with current BPM value

## 複数の変更

シンセが動作している間は、一度だけ変更することに限らず、何度でも自由に変更することができます。例えば、次のように`:prophet`をミニ・アルペジエーターにすることができます：

    notes = (scale :e3, :minor_pentatonic)
    sn = synth :prophet, note: :e1, release: 8, cutoff: 100
    sleep 1
    16.times do
      control sn, note: notes.tick
      sleep 0.125
    end

このコードスニペットでは、いくつか余分なものを追加しました。最初に、`notes`という新しい変数を定義しました。この変数には、循環させたい音符が含まれています（アルペジエーターは音符のリストを順番に循環する何かに名前を付けたものです）。第二に、私たちは単一の呼び出しを`control`に置き換え、それを16回呼び出す反復で置き換えました。`control`の呼び出しの度に、`notes`のリングを順に`.tick`していきます（Sonic Piのリングの素晴らしいパワーのおかげで、リングは末尾に達すると先頭に戻ります）。ちょっとした変化として、`.tick`を`.choose`で置き換えて、その違いを聞くことができるかどうか確認してください。

複数のオプションを同時に変更することもできます。コントロールの行を次のように変更して、その違いを聞いてみてください：

    control sn, note: notes.tick, cutoff: rrand(70, 130)

## スライド

`SynthNode`をコントロールすると、正確に時間通りに応答し、ボタンを押したり、変更を要求するスイッチをフリックしたかのように、オプションの値を新しいものに即座に変更します。これは、特にオプションがの`cutoff:`ような音色の1つをコントロールしている場合に、リズミカルでパーカッシブに聞こえることがあります。しかし、瞬間的に変更が発生することを望まないこともあります。その代わりに、スライダーやダイヤルを移動した場合のように、現在の値から新しい値にスムーズに移動したい場合があります。もちろん、Sonic Piでも`_slide:`オプションを使うことで、これを行うことができます。

変更可能なオプションには、それぞれ対応する`_slide:`という特別なオプションがあり、スライドの時間を指定できます。例えば、`amp:`は`amp_slide:`を、`cutoff:`は`cutoff_slide:`を持っています。これらのスライド・オプションは、次にそれらがコントロールされたときにどのように動作するかをシンセの音符に指示するという点で、他のすべてのオプションとは少し異なります。次のコードを見てみましょう：

    sn = synth :prophet, note: :e1, release: 8, cutoff: 70, cutoff_slide: 2
    sleep 1
    control sn, cutoff: 130

この例が`cutoff_slide:`を除いて先の例と全く同じであることに注目してください。これは、このシンセで次に`cutoff:`をコントロールすると、現在の値から新しい値にスライドするのに2拍かかることを示しています。したがって、`control`を使用したとき、カットオフが70から130までスライドするのを聞くことができるでしょう。これは、音に興味深いダイナミックな感触を作り出します。次に、 `cutoff_slide:`の時間を0.5などの短い値や4などのより長い値に変更して、音の変化を確認してください。変更可能なオプションであれば、これと同じようにスライドできることを覚えておいてください。それぞれの`_slide:`の値は完全に異なるので、あなたがやろうとすれば、カットオフをゆっくりとスライドしつつ、アンプは速くスライドし、パンをどこかの間をスライドさせることも可能です…

## まとめ

シンセがトリガーされた後にコントロールする力を実証する短い例を見てみましょう。エフェクトもシンセと同じようにスライドできますが、少し文法が異なることに注目してください。エフェクトのコントロールについての情報は、チュートリアルのセクション7.2をチェックしてみてください。

以下のコードを使用可能なBufferにコピーして聞いてみてください。そこで止めずに、そのコードで遊んでみてください。スライドの時間や音符、シンセ、エフェクトやスリープの時間を変更して、全く異なるものに変更できたことを確認してください！

    live_loop :moon_rise do
      with_fx :echo, mix: 0, mix_slide: 8 do |fx|
        control fx, mix: 1
        notes = (scale :e3, :minor_pentatonic, num_octaves: 2).shuffle
        sn = synth :prophet , sustain: 8, note: :e1, cutoff: 70, cutoff_slide: 8
        control sn, cutoff: 130
        sleep 2
        32.times do
          control sn, note: notes.tick, pan: rrand(-1, 1)
          sleep 0.125
        end
      end
    end