以下の記事で使ってきた Sonic Pi の話です。
- Node.js で発生させた乱数で自動で音を鳴らす(Sonic Pi に OSC通信でデータを送信して音を出す) - Qiita
- Sonic Pi による音の出力を Node.js のプログラム(osc.js を利用)から制御: OSC over UDP による通信 - Qiita
- Sonic Pi でのいろいろな音の鳴らし方についてのメモ(自分用まとめ その1) - Qiita
- Sonic Pi でのいろいろな音の鳴らし方についてのメモ(自分用まとめ その2) - Qiita
その中でペンタトニックスケールを扱ってみます。
ペンタトニックスケールについて
自分は音楽関連は詳しくないので、説明は以下のサイトなどに譲ります。
これを使おうとした理由は、ランダムに鳴らした音が良い感じに聞こえるようにしたい、というものです。
Sonic Pi と ペンタトニックスケール
ペンタトニックスケールを扱う方法
Sonic Pi では :major_pentatonic
などという指定ができるものがあるようです。
アプリでも見られる公式チュートリアルの 8.3 に以下の記載があります。
その前の 8.2 に以下の記載などもありますが、単純に和音として鳴らすなら以下のような形になるようです。
試しにループやスリープを含め、以下のようにしてみました。
単純に一定間隔で和音が鳴るだけ、のものになります。
loop do
play scale(:c, :major_pentatonic)
sleep 1
end
num_octaves
を組み合わせた形も試してみました。
loop do
play scale(:c, :major_pentatonic, num_octaves: 3)
sleep 1
end
ランダムに音を選んで鳴らす
こちらは、スリープの時間を半分にして、ランダムに 1音ずつ選んで鳴らすものです。
loop do
play choose(scale(:C, :major_pentatonic, num_octaves: 3))
sleep 0.5
end
use_synth
と組み合わせてみました。
use_synth :tb303
loop do
play choose(scale(:C, :major_pentatonic, num_octaves: 3))
sleep 0.25
end
use_bpm
も使ってみたものです。
use_bpm 120
use_synth :tb303
loop do
play choose(scale(:C3, :major_pentatonic, num_octaves: 3))
sleep 0.25
end
ランダムに音を選んで鳴らす2
さらに別パターンも試してみます。
play_pattern_timed
を使ったバージョンです。
loop do
use_octave [1, 2, 3].choose
play_pattern_timed scale(:c3, :major_pentatonic), 0.125, release: 0.1
sleep [0.25, 0.25, 0.5].choose
end
use_bpm 80
use_synth :tb303
loop do
use_octave [1, 2, 3].choose
play_pattern_timed scale(:c3, :major_pentatonic, num_octaves: 2), 0.125, release: 0.1
sleep [0.25, 0.25, 0.5].choose
end
ランダムに音を選んで鳴らす2
live_loop
や amp
、 cutoff
なども使ってみます。
use_bpm 80
live_loop :mp do
use_synth :tb303
use_octave [1, 2].choose
play choose(scale(:C, :major_pentatonic, num_octaves: 2)), amp: rrand(0.3, 0.4), cutoff: rrand(60, 100)
sleep [0.25, 0.25, 0.5].choose
end
live_loop :mp2 do
use_synth :tech_saws
play choose(scale(:C, :major_pentatonic)), amp: rrand(0.5, 0.7), cutoff: rrand(60, 120)
sleep 0.25
end
最後のものは、動かしてみた時の様子を動画にしてみました。
使い方を少しずつ学ぶため触ってた Sonic Pi、@akichika さんに音を作る話というので聞いたペンタトニックスケールを使うやり方を調べたり、Sonic Pi のチュートリアル等を見たりなどしてランダムな要素を盛り込む方法を調べたりして、
— you (@youtoy) November 20, 2021
ひとまずこんな感じのものが出来上がった! pic.twitter.com/tbX3FVsAAW
改良の余地はいろいろあると思うのですが、音楽・作曲とかが全く分からない自分が 10行ちょっとのコードを書いただけで、こんな感じの音が出来上がるのは面白いと感じました。
参考情報(後からも、いくつか追加)
●メロディーを鳴らす
https://sonic-pi.mehackit.org/exercises/ja/01-introduction/02-play-a-melody.html
●Class: SonicPi::Scale — Documentation for samaaron/sonic-pi (main)
https://www.rubydoc.info/github/samaaron/sonic-pi/SonicPi/Scale
●tick
https://sonic-pi.mehackit.org/exercises/ja/04-generate-sounds/02-tick.html
live_loop :arp do
play (scale :e3, :minor_pentatonic).tick, release: 0.1
sleep 0.125
end
live_loop :arp2 do
use_synth :dsaw
play (scale :e2, :minor_pentatonic, num_octaves: 3).tick, release: 0.25
sleep 0.25
end
●変数
https://sonic-pi.mehackit.org/exercises/ja/04-generate-sounds/03-variables.html
上記の改変版1
live_loop :melody do
use_synth :blade
r = [0.25, 0.25, 0.5, 1].choose
play (scale(:C, :major_pentatonic, num_octaves: 2)).choose, attack: 0, release: r
sleep r
end
上記の改変版2
live_loop :bass do
use_synth :fm
n = (scale :C, :major_pentatonic).tick
3.times do
play n
sleep 1
end
play n
sleep 0.5
play (scale :C, :major_pentatonic).tick
sleep 0.5
end
live_loop :bass do
use_synth :fm
r = [0.25, 0.25, 0.5, 1].choose
n = (scale :C, :major_pentatonic, num_octaves: 2).tick
play n, attack: 0, release: r
sleep 0.35
end