エフェクトの外観は一見シンプルですが、実際には内部は異常に複雑なモンスターです。そのシンプルさは、しばしば、この機能を酷使させようと誘惑します。もしもあなたが強力なマシンを持っている場合は問題は無いかもしれませんが、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回繰り返すので、どちらも交換可能に使うことができ、どちらか好きな方を選ぶことができます。
「間違いはない、あるのはただ可能性だけ」と言ったのを思い出してください。しかしながら、これらの異なるアプローチからは、異なるサウンド、また異なる性能をもたらします。あなたのプラットフォームの性能の制約の中で、最も良いと思うアプローチを使いながら演奏するようにしましょう。