コンピュータミュージック 2017 - 明治大学先端メディアサイエンス学科
Sonic Pi 実践1 : 構造化 – イテレーション・ループ・条件分岐、データ構造 – リスト・和音・音階
今日の内容
- より高度なSonic Piのプログラミング
- プログラムの構造
- ブロック
- イテレーション・ループ
- 条件分岐
- 和音と旋律
- 和音 chord の使用
- 音階 scale の使用
スライド資料
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)
- 次回簡単な発表会を行います!