メディア芸術の基礎 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
