yoppa.org


immediate bitwave

メディア芸術の基礎 2018 – 東京工科大学

第11回:Sonic piでサウンドプログラミング3 構造化 – イテレーション・ループ・条件分岐

引き続きSonic Piを使った音楽プログラミングについて考えていきます。

今回は、Sonic Piにおけるプログラムの構造化とデータ構造に焦点を絞って解説していきます。構造化プログラミング言語における基本的なプログラム構造は「順次」「反復」「条件分岐」の3に代表されます。Sonic Piでもこの3つのプログラム構造を作成することが可能です。実際に音に出して確認しながらSonic Piにおけるプログラムの構造化を学びます。

スライド資料

サンプルコード

# 回数を指定しての反復
live_loop :loop do
  sample :bass_trance_c
  3.times do
    sample :drum_heavy_kick
    sleep 0.125
    sample :drum_cymbal_closed
    sleep 0.125
  end
  sample :drum_snare_hard
  sleep 0.25
end

#反復のネスト 1
live_loop :live 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
end

#反復のネスト 2
live_loop :live do
  7.times do
    sample :bass_trance_c
    3.times do
      sample :drum_heavy_kick
      sleep 0.125
      2.times do
        sample :drum_cymbal_closed
        sleep 0.125 / 2.0
      end
    end
    sample :drum_snare_hard
    sleep 0.25
  end
  8.times do
    sample :drum_cymbal_closed
    sleep 0.125
  end
end

#条件分岐
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

#コイントス
live_loop :live do
  if one_in(2)
    sample :drum_bass_hard
  end
  sleep 0.125
end

#コイントス、else文
live_loop :live do
  if one_in(4)
    sample :drum_bass_hard
  else
    sample :drum_cymbal_closed
  end
  sleep 0.125
end

#コイントスのネスト
live_loop :live do
  if one_in(4)
    sample :drum_bass_hard
  else
    if one_in(6)
      sample :drum_snare_hard
    else
      sample :drum_cymbal_closed
    end
  end
  sleep 0.125
end

#複数のループの共存
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

#ピアノフェイス基本
notes = [:E4, :Fs4, :B4, :Cs5, :D5, :Fs4, :E4, :Cs5, :B4, :Fs4, :D5, :Cs5]

live_loop :reich do
  i = 0
  12.times do
    play (notes[i]), release: 0.2
    sleep 0.15
    i = i + 1
  end
end

#ピアノフェイス、位相のずれ
notes = [:E4, :Fs4, :B4, :Cs5, :D5, :Fs4, :E4, :Cs5, :B4, :Fs4, :D5, :Cs5]

live_loop :reich1 do
  i = 0
  12.times do
    play (notes[i]), release: 0.2
    sleep 0.15
    i = i + 1
  end
end

live_loop :reich2 do
  i = 0
  12.times do
    play (notes[i]), release: 0.2
    sleep 0.151
    i = i + 1
  end
end

#ピアノフェイズ、いろいろアレンンジ
notes = [:E4, :Fs4, :B4, :Cs5, :D5, :Fs4, :E4, :Cs5, :B4, :Fs4, :D5, :Cs5]

use_synth :prophet
with_fx :reverb do
  live_loop :reich1 do
    i = 0
    12.times do
      play (notes[i]), release: 0.4, pan: 0.8, cutoff: 80
      sleep 0.15
      i = i + 1
    end
  end
  
  live_loop :reich2 do
    i = 0
    12.times do
      play (notes[i])+12, release: 0.4, pan: -0.8, cutoff: 80
      sleep 0.151
      i = i + 1
    end
  end
end