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