Sonic Pi を使って Ruby で音を楽しむ
Ruby Advent Calendar 2018 の12日目の投稿です。
Sonic Pi とは?
Sonic Pi は音楽を Ruby でライブコーディングできる IDE です。現時点での最新版は v3.0.1 です。
内部的には Super Collider という音響合成環境の Ruby ラッパーとなっています。
と、突然音楽用ライブコーディング IDE と言われても聞き慣れないものなのでイメージしにくいかもしれません。
どんなことが出来るのか、作者である Sam Aaronさんが実際にパフォーマンスをしている様子を YouTube に投稿しているので置いておきます。
めちゃくちゃかっこいいですよね!!そして頭がおかしい!
今回は、そんなSonic Pi の使い方を簡単に説明していきます。
音楽用語がいくつか載っていますが、今回それらについては説明しません。あしからず。
音を鳴らす
IDE の画面は以下の感じです。
左側でコーディングして、右側に波形やログが表示されます。
メニューバーの Run ボタンを押してコードを再生するといった具合です。
まず、音を鳴らすには play
メソッドを使います。
引数に鳴らしたい音名を渡します。
play :c
chord
メソッドを使ってコードを鳴らすことも出来ます。
play chord(:c, :major)
play
メソッドには音量を指定できる amp
やパンニングを指定できる pan
といったオプションもあります。
play :c, amp: 0.6, pan: -1 sleep 0.25 play :e, amp: 0.8, pan: 0 sleep 0.25 play :g, amp: 1, pan: 1
実行すると左スピーカーから右スピーカーへ徐々に音量を上げてアルペジオが流れます。
sleep
は休符です。play
は複数書いたとき同時に音を鳴らすようになっています。
ずらして音を鳴らすためには sleep
でタイミングを変える必要があります。 sleep: 1
で 1 拍休みです。
ループで音を鳴らすには、鳴らす内容を live_loop
にブロックで渡せば良いです。
live_loop :sample do chrod(:f, :M) sleep 1 chrod(:d, :m7) sleep 1 chrod(:g, :M) sleep 1 chrod(:c :M) sleep 1 end
エフェクトを使う
音に味わいを出すために様々なエフェクトが使えます。リバーブやエコー、ディストーションを掛けられます。
エフェクトを使うには with_fx
ブロックを使います。
# リバーブ with_fx :reverb do play chord(:c, :major) end # エコー with_fx :echo do play chrod(:c, :major) end
with_fx
には min
や room
といったオプションもあり、エフェクトのかかり具合が変更できます。
このあたりは実際に調整しながら遊んでみたほうが理解しやすいと思います。
with_fx :reverb, room: 1 do sample :loop_amen_full end with_fx :echo, mix: 0.3, phase: 0.25 do sample :loop_amen_full end
Ruby の構文を使う
Sonic Pi は冒頭で述べたように Super Collider の Ruby ラッパーなわけですから、Ruby の構文ももちろん使えます。
10.times do play :c sleep 1 end
とか
notes = %w(c d e f g a b c5) notes.each do |note| play note sleep 0.25 end
といったようなこともできます。
ちなみに、
class A def initialize play :c end end A.new
や
loop do `say "東京は夜の七時"` sleep 1 end
といったコードはエラーになってしまって実行できませんでした。ざんねんー
say
をいい感じに使えたら面白くなりそうなのにな。
まとめ
基本的な使い方、なんとなくイメージできたでしょうか。
Sonic Pi で出来ることをなんとなくでも理解してもらえたら幸いです。
ドキュメントを見てもらうと分かりますが、Sonic Pi が秘めている能力はこんなものではないです。
かなり細かくチューニングできる仕様になっています。
気になった人は一度覗いてみると、さらに面白みが分かると思います。
Sonic Pi を使って Minecraft をやるとかいう謎の機能もあった気がする。
Ruby でコーディングして音を鳴らすのたのしいです 🍰