yoppa.org


SFC – デザインとプログラミング 2024

補講: ライブコーディング入門

今回の補講は番外編として「ライブコーディング (Live Coding)」について紹介していきます。ライブコーディングとは、まるで楽器を演奏するようにコード (プログラム) を用いて音と映像をリアルタイムに生成するライブパフォーマンスの手法です。今回の講義では、まず簡単にライブコーディングの概要と誕生の歴史を紹介します。その後、StrudelというWebブラウザー上で動作するライブコーディング環境を使用して、ライブコーディングを体験します。

スライド資料

サンプルコード

リズム (ドラム)

// 音を出す
$: s("cp")

// 音色を変える
$: s("casio")

// 音色のバリエーション
$: s("casio:1")

// ドラムサウンド
$: s("bd hh sd oh")

// ドラムセットの切り替え
$: s("bd hh sd oh").bank("RolandTR909")

// 沢山の音を1シーケンスに
$: s("bd bd hh bd rim bd hh bd")

// テンポの変更
$: s("bd bd hh bd rim bd hh bd").cpm(40)

// 休符
$: s("bd hh ~ rim")

// サブシーケンス
$: s("bd [hh hh] sd [hh bd]")

// サブサブシーケンス
$: s("bd [[rim rim] hh]")

// かけ算
$: s("bd hh*2 rim hh*3")

// サブシーケンスのかけ算
$: s("bd [hh rim]*2 bd hh*3")

// 超高速かけ算
$: s("bd hh*16 rim hh*8")

// パラレルに演奏
$: s("cp*3, rim*4")

// パラレルに演奏、さらに追加
$: s("cp*3, rim*4, bd*5")

// サブシーケンスのパラレル
$: s("cp*3, rim*4, bd [bd*2, hh*4]")

// 複数のパートを同時に演奏
$: s("bd(3, 8), [~ hh]*4")
  .bank("RolandTR909")
$: s("cp(7, 16)").jux(rev)
$: s("piano(9, 16)")
  .speed("<2 3 0.5 1>*16")
  .delay(0.5).delaytime(0.625)

メロディー (シンセサイザー)

// シンプルにシンセを鳴らしてみる
$: s("supersaw*4").note(60)

// 音階で指定
$: s("supersaw*4").note("c4")

// 半音階、シャープ
$: s("supersaw*4").note("cs4")

// 半音階、フラット
$: s("supersaw*4").note("df4")

// シンセの音色の種類を変えてみる
$: s("supersaw sine square triangle").note(60)

// 音階を弾く
$: s("supersaw*4").note("c d e f")

// ランダムな音階
$: s("supersaw*4").note(irand(12).add(40))

// 短かい持続
$: s("supersaw*4")
note(irand(12).add(40)).legato(0.2)

// 短かい持続と長い持続
$: s("supersaw*4")
.note(irand(12).add(40)).legato("<0.2 1.0>*4")

// メロディーの生成
$: s("supersaw*8")
  .legato("<1.2 0.5>*8")
  .note("<c4 e4 f4 g4 b4>*8"

// メロディーの生成
$: s("supersaw*8")
  .legato("<0.5 1.2>*8")
  .note("<c4 e4 f4 g4 b4>*8"
  .add("0 -12")
  .add("[0, 7, 12]"))

// メロディーの生成2
$: s("supersaw*8")
  .note("{40 44 45 47 49 52}%11".add("[0, <5 7>, 12], 24"))

// メロディー + フィルター + エフェクト
$: s("supersaw*8")
  .note("{40 44 45 47 49 52}%11".add("[0, <5 7>, 12]"))
  .lpf("<400 2000 1200 8000>*8").delay(0.75).delaytime(0.125)

// メロディー + フィルター + エフェクト その2
$: s("supersaw(11, 16)")
  .note("{40 47 52}%21"
  .add("[0, <5 7 -5>]")
  .add("<0 12 -12 24>*4"))
  .lpf(sine.segment(32).range(400, 8000)).resonance(12)
  .delay(0.75).delaytime(0.125).delayfeedback(0.7)

// メロディー + フィルター + エフェクト + リズム
$: s("supersaw(5, 16, [0, 5, 12])")
  .note(
    "<c d e f g a>*2"
    .add("[0, <12 -12>]")
    .add("[0, 7, 12]")
    .add("<-12 -12 -12 0>/8")
  )
  .legato("<0.5 1.7>*2")
  .delay(0.75).delaytime(0.625).delayfeedback(0.5)
  .lpf(sine.segment(32).range(100, 8000)).resonance(10)
$: s("bd(3, 8), [~ hh]*4")
  .bank("RolandTR909")
  .gain(1.3)

// メロディー + リズム その2
$: s("supersaw(7, 16, [0])")
  .note("<c f g>*8".add("[0, 7] [0, 12]".add("<0 7 -12>*8")))
  .legato("0.7 1.5")
  .lpf(sine.slow(32).range(1200, 8000)).resonance(10)
  .delay(0.2).delaytime((3/8))
  .jux(iter(16)).gain(0.7)
$: s("supersaw(11, 16, [3])").note("<c2 f2 g2>, <c1 g1>*4".add("[0, 7, 12]"))
  .legato("0.9 0.5")
  .lpf(sine.slow(12).range(2000, 4000)).resonance(10)
  .delay(0.7).delaytime((5/8)).delayfeedback(0.8)
  .gain(1.0)
$: s("hh(9, 16, 3), cp(9, 16, 5)")
  .delay(0.7).delaytime((4/8)).delayfeedback(0.8)
$: s("bd(3, 8)").gain(2.0).bank("RolandTR909")

関連リンク

アンケート

今回の補講に参加した方は下記のアンケートに答えてください