コンピュータミュージック 2018 – 明治大学先端メディアサイエンス学科
第4回: Sonic Pi 実践1 : 構造化 – イテレーション・ループ・条件分岐、データ構造 – リスト・和音・音階
今日の内容
引き続きSonic Piのプログラミングを進めていきます。今回はより高度なSonic Piのプログラミングを行います。
まずプログラムの構造化に関する様々な機能を紹介します。「ブロック」「ループ (イテレーション)」「条件分岐」といった内容をとり扱います。
後半は、和音 (Chord) と旋律 (Scale) についてとりあげます。コード名やスケール名を指定するだけで複雑な和音や旋律を生成することが可能となります。
最後にステイーブ・ライヒの「ピアノフェイズ」のSonic Piによるコピーに挑戦します!
スライド資料
Sonic Piでプログラムの構造を作る
- 構造化プログラミング、3つの構成要素
- 順次 (Sequence)、反復 (Iteration)、分岐 (Selection)
たとえば、Processingだと…
// 順次
fill(31, 127, 255)
ellipse(widht/2, height/2, 100, 100);
// 反復
for(int i = 0; i < 100; i++){
...
}
//分岐
if(position.x > 100){
...
}
今までSonic Piで扱ってきたのは、順次と (単純な)反復
loop do
use_synth :fm
freq = choose([ 60, 67 ])
play freq
play freq + choose([ 0, 4, 5, 7])
play freq + choose([ 0, 4, 5, 7])
play freq + choose([-12, 0, 12])
sleep choose([ 0.25, 0.5])
end
- より複雑な反復のパターンを理解
- 回数を指定した反復、反復のネスト
反復
回数を指定した反復
3.times do
play 50
sleep 0.5
sample :elec_blup
sleep 0.5
play 62
sleep 0.25
end
反復のネスト(入れ子構造)
4.times do
sample :drum_heavy_kick
2.times do
sample :elec_blip2, rate: 2
sleep 0.25
end
sample :elec_snare
4.times do
sample :drum_tom_mid_soft
sleep 0.125
end
end
今まで使用してきた「loop」や「live-loop」は無限ループだった
loop do
4.times do
sample :drum_heavy_kick
2.times do
sample :elec_blip2, rate: 2
sleep 0.25
end
sample :elec_snare
4.times do
sample :drum_tom_mid_soft
sleep 0.125
end
end
4.times do
sample :drum_heavy_kick
2.times do
sample :elec_blip2, rate: 2
sleep 0.25
end
end
end
条件分岐
- 条件分岐
- Sonic Piでもif文が使える
条件分岐の例
i = 0
loop do
if i % 4 == 0 then
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.125
i = i+1
end
- if文と、one_in() を組合せる
- one_in(N) : N回に1回の割合で発生させるランダム
- サイコロを振る感覚
if と one_in のサンプル
loop do
if one_in(3)
sample :drum_heavy_kick
else
sample :drum_cymbal_closed
end
sleep 0.125
end
if と one_in のサンプル 2
loop do
if one_in(3)
sample :drum_heavy_kick
sleep 0.25
else
sample :drum_cymbal_closed
sleep 0.125
end
end
実習1
- 反復を利用して、かっこいいリズムパターンを組んでみる
- 反復とsleepによる微妙なニュアンス
- 条件分岐とone_inによるゆらぎ
- loopとlive_loop、どちらを使ったほうがやりやすいか?
例 : 複数のリズムの共存
live_loop :live do
sample :drum_heavy_kick
4.times do
sample :elec_blip2, rate: 2
sleep 1.0/8.0
end
sample :elec_snare
4.times do
sample :drum_tom_mid_soft
sleep 0.125
end
end
live_loop :live2 do
sample :drum_heavy_kick
3.times do
sample :elec_blip2, rate: 2
sleep 1.0/8.0
end
sample :elec_snare
4.times do
sample :drum_tom_mid_soft
sleep 0.125
end
end
Sonic Piのデータ構造
- リスト(list)を使用してみる
- リスト: データの集合、配列のようなもの
- 前回、chooseを使用した際に既に使用していた
chooseとリスト
loop do
play choose([:c, :f, :g, :a, :b])
sleep 0.25
end
- 一度に演奏
play [52, 55, 59]
- オプションを指定して一度に演奏
play [52, 55, 59], amp: 0.3
- 音階で指定
play [:E3, :G3, :B3]
リストの要素にアクセス (55が演奏される)
loop do
play [52, 55, 59][1]
sleep 0.25
end
和音
- chordを使用すると、コードネームを使用して和音を生成できる
- 様々な複雑な和音が用意されている
play chord(:C4, :major)
いろいろなコードが定義されているので、試してみる!
play chord(:C4, :major)
sleep 1.0
play chord(:C4, :major7)
sleep 1.0
play chord(:C4, :minor)
sleep 1.0
play chord(:C4, :minor7)
sleep 1.0
play chord(:C4, :dim)
sleep 1.0
play chord(:C4, :dim7)
sleep 1.0
play chord(:C4, :sus2)
sleep 1.0
play chord(:C4, :sus4)
sleep 1.0
play chord(:C4, :augmented)
sleep 1.0
- playの代わりに play_pattern_timed を使うとリストをアルペジオ演奏できる
- play_pattern_timed コードのリスト, 速さ
- 例: Cメジャーを、0.25のタイミングで
play_pattern_timed chord(:C4, :major), 0.25
いろいろなアルペジオを試してみる
loop do
play_pattern_timed chord(:C4, :major), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :major7), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :minor), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :minor7), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :dim), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :dim7), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :add9), 0.25
sleep 0.5
play_pattern_timed chord(:C4, :add13), 0.25
sleep 0.5
end
音階(scale)
- Sonic Piでは、和音と同様に様々な音階(scale)が定義されている
- 例:「ドレミファソラシド」が演奏される → メジャースケール
loop do
play_pattern_timed scale(:C4, :major), 0.25
end
いろいろな音階(scale)を試してみる
loop do
play_pattern_timed scale(:C4, :major), 0.25
sleep 0.25
play_pattern_timed scale(:C4, :minor), 0.25
sleep 0.25
play_pattern_timed scale(:C4, :aeolian), 0.25
sleep 0.25
play_pattern_timed scale(:C4, :ahirbhairav), 0.25
sleep 0.25
play_pattern_timed scale(:C4, :augmented), 0.25
sleep 0.25
play_pattern_timed scale(:C4, :augmented2), 0.25
sleep 0.25
play_pattern_timed scale(:C4, :bartok), 0.25
sleep 0.25
end
chooseとchord、chooseとscaleを組み合わせる
- ランダムな選択と強い制約
- 制限された調整の中でのランダムが簡単に実現できる
例1: マイナーコード (短三和音) から音を1つ選ぶ
loop do
play choose(chord(:C4, :minor))
sleep 0.25
end
例2: メジャーコード (長三和音) から音を1つ選ぶ
loop do
play choose(chord(:C4, :major))
sleep 0.25
end
スケールを使用した即興
use_synth :prophet
live_loop :live do
play choose(scale(:c3, :minor, num_octaves: 3)), cutoff: rrand(60, 100)
play choose(scale(:c4, :minor, num_octaves: 3)), cutoff: rrand(60, 100)
play choose(scale(:c5, :minor, num_octaves: 3)), cutoff: rrand(60, 100)
sleep 0.25
end
スケールを書き換えて聞き比べてみる
use_synth :prophet
live_loop :live do
play choose(scale(:c3, :lydian, num_octaves: 3)), cutoff: rrand(60, 100)
play choose(scale(:c4, :lydian, num_octaves: 3)), cutoff: rrand(60, 100)
play choose(scale(:c5, :lydian, num_octaves: 3)), cutoff: rrand(60, 100)
sleep 0.25
end
複数の楽器で + さらにパラメータを加えてみる
live_loop :live do
use_synth :prophet
cut = rrand(20, 120)
6.times do
play choose(scale(:c2, :aeolian, num_octaves: 5)), cutoff: cut, pan: rrand(-1, 1)
end
use_synth :chiplead
4.times do
play choose(scale(:c3, :aeolian, num_octaves: 5)), cutoff: cut, pan: rrand(-1, 1), amp: 0.7
end
sleep 0.25
end
参考: 音階 (モード) による即興
- Miles Davis, Kind of Blue
- https://play.google.com/music/m/B33unovhtea3gysf57azgei5wmi
次回までの課題!
- これまで紹介してきたSonic Piの機能を活用して、ループする旋律を作曲する
- 楽器(synth)とサンプル(sample)
- 演奏(play)とパラメータ(amp, pan, atack, release, cutoff…)
- 乱数(rrand, rrand_i, choose, one_in)
- リスト(list)
- 和音(chord)
- 音階(scale)
- 次回簡単な発表会を行います!