これは何?
過去に音楽系の記事をいくつか書いているのですが、最近 Sonic Pi というコードベースで音楽を作成できるツールを知ったので、少し遊んでみました。
過去書いた音楽系の記事:
Rubyでクラシカルなアルペジオを作ってみた
Scratch でジングルベルを演奏してみた
Sonic Pi とは
Rubyをベースにした記法で音楽を作成できるツールで、プログラミングや音楽の勉強などにも使われいるそうです。
DLはこちらから → https://sonic-pi.net/
画面の説明
左上がコードの入力になっており、Rubyをベースにした記法で音楽を鳴らす命令を書いていく部分となります。
左下には、いくつかのタブが用意されていて詳しくは下記になります。
-
Turtorial
- Sonic Pi の使い方が詳しく書いてあります
-
Examples
- すぐにそれっぽい音が鳴らせるようなサンプルプログラムが紹介されています。
- 選んだものを画面左上のコード入力欄にペーストして再生することで確認ができます。
- すぐにそれっぽい音が鳴らせるようなサンプルプログラムが紹介されています。
-
Synths
- 音を鳴らすための楽器の種類が紹介されています。
- 実際に音階を奏でる場合にはこちらから何かしら一つの楽器を選ぶ必要があります。
-
Fx
- SynthsやSamplesの音を加工するためのエフェクターが紹介されています。
-
Samples
- 音のサンプルがいくつか紹介されています。楽器とは違い、音階を決めずにそのまま鳴らすものというイメージです。効果音というのが正しい表現かもしれません。
-
Lang
- コードの記法についてのドキュメントが記載されています。
ドラムパターンの作成
まずは曲のテンポを決めます
use_bpm
という命令で、曲のテンポを指定できるので、use_bpm 180
と入力します。
バスドラムを設定します
SamplesのDrum Soundsの中にある :drum_heavy_kick
を使用します。
※▶︎で音を確認できます。
メタル系のフレーズを作りたいので、バスドラムは16部音符でまるでツーバスのような感じで連打します。
Samplesの中にある音を再生させるには、sample :drum_heavy_kick
とします。
一旦書いてみたコードがこちら
loop do
sample :drum_heavy_kick
sleep (1.0/4)
end
繰り返し構文とSleep
という次の音を何拍後に鳴らすかという命令を組み合わせて作成しています。
今回は 16部音符で鳴らしたいので、1拍の4分の1としています。
スネアドラムを設定します
SamplesのSnare Drumsの中にある :sn_zome
を使用します。
スネアドラムは2拍目と4拍目で鳴らすのが一般的なので、先にSleep
を挟みながら処理を書きます。
loop do
sleep (1.0)
sample :sn_zome
end
ライドシンバルを設定します
SamplesのDrum Soundsの中にある :drum_cymbal_soft
を使用します。
ライドシンバルは各拍の頭で鳴らすのが一般的なので、バスドラムと似たような形で処理を書きます。
loop do
sample :drum_cymbal_soft
sleep (1.0)
end
ドラム全体を合わせてみる
それぞれの設定が終わったので、一度再生ボタンを押してみますが、バスドラムの音しか鳴りません。
プログラムは基本的には上から下に順番に実行されるので、一番上のloop構文が無限ループしており、スネアに到達していません。
そこでSonic Piに用意されている live_loop
という命令を使います。
live_loop
は各ループを同時に鳴らしてくれます。
なので、各 loop
命令をlive_loop
に置き換えていきます。
※live_loop
には名前が必要なので合わせて設定していきます。
live_loop :drums_k do
sample :drum_heavy_kick
sleep (1.0/4)
end
live_loop :drums_s do
sleep (1.0)
sample :sn_zome
end
live_loop :drums_h do
sample :drum_cymbal_open
sleep (1.0)
end
これでドラムパターンは完成です。
とても激しいドラムの音が聞こえてきたかと思います。
アルペジオパターンの作成
ネオクラシカルといえば、アルペジオを主体としたフレーズが多く使われるので、メインとなるアルペジオを作成していきます。
音色を設定します
Synthsの中にある :piano
を使用します。
(色々とそれっぽい音を探してみたのですが、いまいち合うものがなかったので、大人しくピアノの音色を使うことにしました)
Synths の音を鳴らす場合には、use_synth :piano
をいう感じに音を鳴らす前に宣言する必要があります。
use_synth :piano
# 音階を書いていく
end
音階を設定します
折角なので、Rubyでクラシカルなアルペジオを作ってみたで使用したアルペジオを再利用します。
音階を鳴らすためには play note(symbol_or_number)
を使います。
前回作成したアルペジオは6音で1パターンとしていたので、今回はドラムパターンとリズムが合うように3連符で設定してきます。
use_synth :piano
play :E3
sleep (1.0/3)
play :A3
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :E4
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :A3
sleep (1.0/3)
...
ドラムパターンとアルペジオを合わせて完成
繰り返し回数なども調整しつつ、実際に完成したのがこちらになります。
use_bpm 180
live_loop :drums_k do
sample :drum_heavy_kick
sleep (1.0/4)
end
live_loop :drums_s do
sleep (1.0)
sample :sn_zome
end
live_loop :drums_h do
sample :drum_cymbal_open
sleep (1.0)
end
live_loop :arpeggio do
use_synth :piano
4.times do
play :E3
sleep (1.0/3)
play :A3
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :E4
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :A3
sleep (1.0/3)
end
4.times do
play :D3
sleep (1.0/3)
play :G3
sleep (1.0/3)
play :B3
sleep (1.0/3)
play :D4
sleep (1.0/3)
play :B3
sleep (1.0/3)
play :G3
sleep (1.0/3)
end
4.times do
play :C3
sleep (1.0/3)
play :F3
sleep (1.0/3)
play :A3
sleep (1.0/3)
play :C4
sleep (1.0/3)
play :A3
sleep (1.0/3)
play :F3
sleep (1.0/3)
end
4.times do
play :B2
sleep (1.0/3)
play :E3
sleep (1.0/3)
play :Ab3
sleep (1.0/3)
play :B3
sleep (1.0/3)
play :Ab3
sleep (1.0/3)
play :E3
sleep (1.0/3)
end
end
音源
最後に
Rubyを使ったことがある人であれば、比較的スムーズにコードで音楽が作れるので、普通に楽しかったです。
また、用意されている音源やより高度な命令も用意されているので、コードベースでかなり本格的な音楽も作成できそうだなと思いました。
音楽を作りながら、プログラムの基本的な構文やアルゴリズムの勉強もできるので、教育現場でもかなり役立ちそうに思いました!