[音楽をプログラミングしよう] #05 - リズムトラックと同期しよう

前回はアルペジオからシーケンサーにするところまで行きました。今回はそれをおさらいしつつ、リズムについてもワンショットのサンプル音源を使って追加していきたいと思います。


シーケンサーにする

前回では「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
end

in_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

これでパートが増えていっても大丈夫ですね。


最後に

今回はリズムトラックと同期したシーケンスをプログラミングする方法を学びました。これでもうかなり使えるパターンシーケンサーくらいにはなりました。テンポや音色変化などをさらに加えるともっとよくなりそうですね!


次回はそうした音色変化も楽しめるようにしていきましょう。

もんが(なるーらぼ)

個人でプログラミングの学習サイト「なるーらぼ」を運営しています。
https://nalu-labo.amebaownd.com
PowerShell入門の電子書籍2冊も出版しています。
http://www.amazon.co.jp/dp/B017LJOCJ2

なるーらぼ

忙しい非プログラマに贈るプログラミング学習サイトです。 3分動画を使ったPowerShellや要件定義の入門講座、パソコン活用のtipsを公開しています

0コメント

  • 1000 / 1000