前橋工科大学 – サウンドプログラミング(環境情報デザイン) 2021
Sonic Pi 基本3 – コード (和音) とスケール (旋法)
前回「データ構造」で解説したリストは、複数の値をひとつにまとめることができる機能でした。リストをplayのnote(音程)に用いることで、複数の異なる音階の音を同時に演奏することができました。つまり和音(chord)を演奏することが可能です。
Sonic Piでは、コードネームからその和音に含まれる音をリストとして生成する「chord」という関数が搭載されています。この機能を用いることで、コードネームを指定するだけで複雑なコード進行をプログラムで指定することが可能となります。
またchord関数とよく似た機能として、scale関数があります。scaleはスケール(旋法)を指定する関数です。スケール名を指定することで複数の音階から構成される音列を生成することが可能です。
スライド資料
参考資料:
サンプルコード
live_loop :list do play choose([52, 55, 59]) sleep 0.25 end # 一度に演奏 play [52, 55, 59] # オプションを指定して一度に演奏 play [52, 55, 59], amp: 0.3 # 音階で指定 play [:E3, :G3, :B3] # リストの要素にアクセス loop do play [52, 55, 59][1] sleep 0.25 end # コードいろいろ live_loop :chord do 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 end # カノン live_loop :chord do use_synth :fm play chord(:C5, :M) sleep 1.5 play chord(:G4, :M) sleep 1.5 play chord(:A4, :m) sleep 1.5 play chord(:E4, :m) sleep 1.5 play chord(:F4, :M) sleep 1.5 play chord(:C4, :M) sleep 1.5 play chord(:F4, :M) sleep 1.5 play chord(:G4, :M) sleep 1.5 end # 王道進行 live_loop :chord do use_synth :fm play chord(:F4, :M7) sleep 1.5 play chord(:G4, '7') sleep 1.5 play chord(:E4, :m7) sleep 1.5 play chord(:A4, :m) sleep 1.5 end # TK進行 live_loop :chord do use_synth :fm play chord(:A4, :m) sleep 1.5 play chord(:F4, :M) sleep 1.5 play chord(:G4, :M) sleep 1.5 play chord(:C4, :M) sleep 1.5 end # カノンアルペジオ live_loop :chord do play_pattern_timed chord(:C5, :major), 0.25 sleep 0.5 play_pattern_timed chord(:G4, :major), 0.25 sleep 0.5 play_pattern_timed chord(:A4, :minor), 0.25 sleep 0.5 play_pattern_timed chord(:E4, :minor), 0.25 sleep 0.5 play_pattern_timed chord(:F4, :major), 0.25 sleep 0.5 play_pattern_timed chord(:C4, :major), 0.25 sleep 0.5 play_pattern_timed chord(:F4, :major), 0.25 sleep 0.5 play_pattern_timed chord(:G4, :major), 0.25 sleep 0.5 end # カノンアルペジオ2 live_loop :chord do play_pattern_timed chord(:C5, :major), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:G4, :major), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:A4, :minor), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:E4, :minor), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:F4, :major), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:C4, :major), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:F4, :major), [0.25, 0.5] sleep 0.5 play_pattern_timed chord(:G4, :major), [0.25, 0.5] sleep 0.5 end # いろいろなスケール (旋法) live_loop :scale do play_pattern_timed scale(:C5, :major), 0.25 sleep 0.5 play_pattern_timed scale(:C5, :minor), 0.25 sleep 0.5 play_pattern_timed scale(:C5, :iwato), 0.25 sleep 0.5 play_pattern_timed scale(:C5, :ritusen), 0.25 sleep 0.5 play_pattern_timed scale(:C5, :diatonic), 0.25 sleep 0.5 play_pattern_timed scale(:C5, :augmented), 0.25 sleep 0.5 play_pattern_timed scale(:C5, :bartok), 0.25 sleep 0.5 end # モード live_loop :live do play_pattern_timed scale(:C4, :ionian), 0.25 sleep 0.5 play_pattern_timed scale(:D4, :dorian), 0.25 sleep 0.5 play_pattern_timed scale(:E4, :phrygian), 0.25 sleep 0.5 play_pattern_timed scale(:F4, :lydian), 0.25 sleep 0.5 play_pattern_timed scale(:G4, :mixolydian), 0.25 sleep 0.5 play_pattern_timed scale(:A4, :aeolian), 0.25 sleep 0.5 play_pattern_timed scale(:B4, :locrian), 0.25 sleep 0.5 end # スケールによる即興 1 live_loop :live do use_synth :prophet play choose(scale(:c3, :mixolydian, num_octaves: 3)), cutoff: rrand(60, 100) sleep 0.25 end # スケールによる即興 2 live_loop :live do use_synth :prophet play scale(:C3, :ionian, num_octaves: 4).shuffle.take(3), cutoff: rrand(60, 100) sleep 0.25 end ## 複数のパートによる即興 live_loop :live do use_synth :prophet play scale(:C3, :ionian, num_octaves: 4).shuffle.take(3), cutoff: rrand(60, 100) sleep 0.25 end live_loop :live2 do use_synth :fm play scale(:D5, :dorian, num_octaves: 2).shuffle.take(1), release: 0.1, cutoff: rrand(40, 100) sleep 0.125 end # エフェクトをつける + 転調可能に base = :D3 live_loop :live do with_fx :echo , decay: 2.0, phase: 0.75 do use_synth :prophet play scale(base, :dorian, num_octaves: 4).shuffle.take(2), cutoff: rrand(60, 120), release: 0.3 sleep 0.125 end end live_loop :live2 do with_fx :echo , decay: 2.0, phase: 0.25 do use_synth :fm play scale(base + 24, :dorian, num_octaves: 2).shuffle.take(1), release: 0.1, cutoff: rrand(80, 110) sleep 0.125 end end ## コードパートを付加 base = :E3 live_loop :harmony do with_fx :panslicer, phase: 0.25 do use_synth :dsaw play chord(base, :m7, num_octaves: 4), release: 3.0, cutoff: 95, amp: 1.5 sleep 4 end end live_loop :melo1 do with_fx :echo , decay: 1.0, phase: 0.75 do use_synth :prophet play scale(base, :dorian, num_octaves: 4).shuffle.take(2), cutoff: rrand(60, 120), release: 0.5 sleep 0.125 end end live_loop :melo2 do with_fx :echo , decay: 1.0, phase: 0.625 do use_synth :fm play scale(base + 24, :dorian, num_octaves: 2).shuffle.take(1), release: 0.1, cutoff: rrand(60, 90), amp: 0.7 sleep 0.125 end end