# エフェクトの実践

エフェクトの外観は一見シンプルですが、実際には内部は異常に複雑なモンスターです。そのシンプルさは、しばしば、この機能を酷使させようと誘惑します。もしもあなたが強力なマシンを持っている場合は問題は無いかもしれませんが、Raspberry Piで動作させる場合、確実にビートを刻み続けるようにしたいのであれば、どのくらいの負荷をかけているのか注意する必要があります。

このコードを考えてみましょう。

    loop do
      with_fx :reverb do
        play 60, release: 0.1
        sleep 0.125
      end
    end

このコードは非常に短いリリース時間で音符`60`を演奏しています。そして、リバーブを加えたいために、コードをリバーブで囲んでいます。問題はなさそうには見えますが…。

コードが何をするかを見ていきましょう。まず、`loop`は内側のすべてが永遠に繰り返すことを意味します。次に、`with_fx`ブロックがあります。これはループが繰り返される度に、新しいリバーブエフェクトを作成することを意味します。ギターの弦を弾くたびに別々のリバーブエフェクターを用意して演奏しているようなものです。そんなことができたらかっこいいかもしれませんが、それはあなたが望むものとは限らないということです。たとえば、Raspberry Piでこのコードを実行させるためにはとても労力を要します。リバーブは`with_fx`によって制御され、停止か消去されるまで、生成され続け、スム−ズな演奏に必要とする大切なCPUパワーを奪うことになりかねません。

ギタリストのように、すべての音が1つのリバーブエフェクターを通る従来の設定と同様の流れを作るには、どうしたら良いでしょうか？ とてもシンプルです。

    with_fx :reverb do
      loop do
        play 60, release: 0.1
        sleep 0.125
      end
    end

`with_fx` ブロックの内部に`loop`を配置します。この方法では、ループ内すべての音符の再生にリバーブを1つだけ作成します。このコードは効率的で、Raspberry Piで正常に動作します。

`loop`内の繰り返しの上位に`with_fx`を使うことで折り合いを付けます。

    loop do
      with_fx :reverb do
        16.times do
          play 60, release: 0.1
          sleep 0.125
        end
      end
    end

`loop`の外部に`with_fx`を引き上げることで、16音符ごとに新しいリバーブを作成しています。

このようなパターンは一般的なので、`16.times`のブロックを書かずに全く同じ動作をするオプションを`with_fx`はサポートしています。

    loop do
      with_fx :reverb, reps: 16 do
        play 60, release: 0.1
        sleep 0.125
      end
    end

`reps: 16`の例も`16.times do`の例も同様に振る舞います。`reps: 16`は`do/end`のブロックを16回繰り返すので、どちらも交換可能に使うことができ、どちらか好きな方を選ぶことができます。

「間違いはない、あるのはただ可能性だけ」と言ったのを思い出してください。しかしながら、これらの異なるアプローチからは、異なるサウンド、また異なる性能をもたらします。あなたのプラットフォームの性能の制約の中で、最も良いと思うアプローチを使いながら演奏するようにしましょう。