前回はアルペジオからシーケンサーにするところまで行きました。今回はそれをおさらいしつつ、リズムについてもワンショットのサンプル音源を使って追加していきたいと思います。
シーケンサーにする
前回では「play_pattern」もしくは「play_pattern_timed」命令を使ってシーケンスをつくっていきました。特に譜割りができるので「_timed」のほうが便利かもしれません。ここではおさらいとして、「play_pattern_timed」命令をつかったシーケンスについてみていきます。
まずはよくハードウェアとして、またソフトウェアでも公開されている16ステップのシーケンサーをイメージしながら書いていきます。16ステップのシーケンサーは1小節のパターンを組むことができるものが多く、4拍子のものがほとんどですよね。そして1拍はさらに4つのボタンに分割されていて、ボタンの1つ1つが16分音符ということになります。図に表すとこんな感じです。
例えば発音される音階はレに固定されていたとして、16個のボタンすべてがオンの状態になっているとすると図に表せば以下のようになります。
これをコードで表現すると以下のようになります。
use_bpm 120
with_fx :distortion, mix: 0.8, distort: 0.6 do
loop do
use_synth :fm
play_pattern_timed [:d4], [0.25]
end
end
これをタンタタというリズムパターンにしようとすると、各拍の2つ目のボタンがオフになった状態になります。
これをコードで表現すると以下のようになります。
use_bpm 120
with_fx :distortion, mix: 0.8, distort: 0.6 do
loop do
use_synth :fm
play_pattern_timed [:d4, :d4, :d4], [0.5, 0.25, 0.25]
end
end
さらに付点8分音符を使ってタッタタッタというパターンにすると各拍の2と3のボタンがオフになった状態になります。
これをコードで表現すると以下のようになります。
use_bpm 120
with_fx :distortion, mix: 0.8, distort: 0.6 do
loop do
use_synth :fm
play_pattern_timed [:d4, :d4], [0.75, 0.25]
end
end
最後に頭に休符がくるパターン、ンタタタの場合は各拍の1のボタンがオフになった状態です。
コードでは発音しないけどタイミングだけは必要なので番号にゼロを指定するとよいでしょう。
use_bpm 120
with_fx :distortion, mix: 0.8, distort: 0.6 do
loop do
use_synth :fm
play_pattern_timed [0, :d4, :d4, :d4], [0.25]
end
end
これでなんとなくシーケンサーとしての使い方はイメージできたでしょうか?では本題に入りましょう。
ループを同期する
リズムループをつくってみましょう。とりあえずさきほどのシンセパートはおいておきたいので、コメントにします。「with_fx」から「end」までの先頭にシャープ記号「#」を付けていってください。すると文字がグレーになると思います。コメントは人間がコードを読むときにわかりやすくするために記述するものです。ですからSonic Piは#で始まる行については無視してくれます。
ではループをつくりますよ!とりあえず「loop do」「end」を書きましょう。
loop do
end
そうしたら、この中にサンプル音源を並べていきます。今回はバスドラムのみとりあえず並べていきますので、「:bd_haus」というのを使います。4つ打ちにしたいので次のように書きましょう。
loop do
sample :bd_haus
sleep 1
end
これを実行するとドンドンドンドンというリズムが刻まれ始めたと思います。sleepが1拍なので、4つ打ちになるわけですね。一応、ハイハット(クローズ)も入れて、裏拍に「チッ」というのも入れましょうか。
loop do
sample :bd_haus
sleep 0.5
sample :drum_cymbal_closed
sleep 0.5
end
これでドンチッドンチッという4つ打ちになりました。では、とりあえず最初のシンセパートのコメント記号を外して(削除して)同時に再生させてみましょう。
うまくいきましたか?そう、うまくいかないですよね。
下手をするとリズムパートは再生されないかもしれません。これはどうしてかというと、それぞれが好き勝手なシーケンスをしている、つまり同期していないからです。
シーケンスソフトなどはトラックごとに同期をとっています。ハードウェアでは同じタイミングでスイッチが入るから違うかもしれませんね。図にすると、このように好き勝手な状態になっているのです。
これではまともな音楽になりません。では同期してもらうにはどうしたらいいでしょうか?各ループをいわゆる「トラック」だとすると、マスターとなるトラックからの合図にスレーブとなるトラックが合わせるのがいいですね。指揮者に合わせて演奏する、という感じです。イメージではこうなります。
では、これをコードにします。まずはシンセパートをマスターにするために特殊な行を追加します。「loop do」の上の行に「in_thread do」を、このループの最後の「end」の下の行に「end」を追加します。
in_thread do
loop do
use_synth :fm
play_pattern_timed [0, :d3, :d3, :d3], [0.25]
end
end
ちょっとベースにしようと思って音階を1オクターブ下げております。これで実行してみてください。FMシンセのベースが鳴るなか、ドンチッと4つ打ちが繰り返されます。最後にピコピコを追加して、さらに同期させてみましょう。in_threadはその命令をしたブロックのすぐ次のloopにしか作用しません。ですからリズムパートにもin_threadを書いておきます。
use_bpm 120
in_thread do
loop do
use_synth :fm
play_pattern_timed [:d3, 0, :d3, :d3], [0.25]
end
endin_thread do
loop do
sample :bd_haus
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
これでパートが増えていっても大丈夫ですね。
最後に
今回はリズムトラックと同期したシーケンスをプログラミングする方法を学びました。これでもうかなり使えるパターンシーケンサーくらいにはなりました。テンポや音色変化などをさらに加えるともっとよくなりそうですね!
次回はそうした音色変化も楽しめるようにしていきましょう。
0コメント