yoppa.org


immediate bitwave

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