yoppa.org


immediate bitwave

コンピュータミュージック 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

参考: 音階 (モード) による即興

次回までの課題!

  • これまで紹介してきたSonic Piの機能を活用して、ループする旋律を作曲する
    • 楽器(synth)とサンプル(sample)
    • 演奏(play)とパラメータ(amp, pan, atack, release, cutoff…)
    • 乱数(rrand, rrand_i, choose, one_in)
    • リスト(list)
    • 和音(chord)
    • 音階(scale)
  • 次回簡単な発表会を行います!