メディア芸術の基礎 2017 – 東京工科大学
第11回:Sonic piでサウンドプログラミング3 構造化 – イテレーション・ループ・条件分岐 データ構造 – リスト・和音 (chord) ・音階 (scale)
引き続きSonic Piを使った音楽プログラミングについて考えていきます。
今回は、Sonic Piにおけるプログラムの構造化とデータ構造に焦点を絞って解説していきます。構造化プログラミング言語における基本的なプログラム構造は「順次」「反復」「条件分岐」の3に代表されます。Sonic Piでもこの3つのプログラム構造を作成することが可能です。実際に音に出して確認しながらSonic Piにおけるプログラムの構造化を学びます。
もう1つデータ構造について考えます。Sonic Piでは「リスト」というデータ構造が多用されます。リストとはデータの一覧を構成するデータの型です。まず始めにリストの使用法を解説します。さらにSonic Piでは多くの和音(chord)と音階(scale)がリスト形式で定義されています。和音と音階の使用方、また和音や音階による即興について考えていきます。
スライド資料
課題: 和音、音階を利用して旋律を作る
- Sonic Piの和音(chord)もしくは音階(scale)を使用してループする旋律(メロディー)を作曲してください
課題の提出方法
- emailで提出
- To : tadokoro+teu17@gmail.com
- Subject: 課題7
- 作成したプログラムのソースコードを本文にカット&ペースト
- 本文に以下の内容を記入して提出
- 学籍番号
- 氏名
- 締切: 次回の講義開始時間 (7月10日 16:45) まで!
サンプルコード
# 回数を指定した反復 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 #条件分岐 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 loop do if one_in(3) sample :drum_heavy_kick else sample :drum_cymbal_closed end sleep 0.125 end #ifとone_in2 loop do if one_in(3) sample :drum_heavy_kick sleep 0.25 else sample :drum_cymbal_closed sleep 0.125 end 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 #和音 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_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 #アルペジオ2 play_pattern_timed chord(:C4, :major), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :major7), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :minor), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :minor7), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :dim), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :dim7), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :add9), [0.25, 0.5] sleep 0.5 #スケール(音階) play_pattern_timed scale(:C4, :major), 0.25 sleep 0.5 play_pattern_timed scale(:C4, :minor), 0.25 sleep 0.5 play_pattern_timed scale(:C4, :aeolian), 0.25 sleep 0.5 play_pattern_timed scale(:C4, :ahirbhairav), 0.25 sleep 0.5 play_pattern_timed scale(:C4, :augmented), 0.25 sleep 0.5 play_pattern_timed scale(:C4, :augmented2), 0.25 sleep 0.5 play_pattern_timed scale(:C4, :bartok), 0.25 sleep 0.5 #スケールとchooseによる即興 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 #ライヒ Piano Phase 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