yoppa.org


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

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

次回までの課題!

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