yoppa.org


前橋工科大学 – サウンドプログラミング 2023

Strudel はじめの一歩

スライド資料

アンケート

本日の講義を受講した方は以下のアンケートに回答してください

Strudelについて

Strudelとは

Strudel (シュトゥルーデル)

  • 語源: 薄い生地で具材を包んだパン
  • なぜこの名前にしたのかは不明

Strudelの特徴

  • ダイナミックな音楽作品を表現力豊かに作成
  • TidalCyclesのJavascript版
  • しかし、JavaScriptやTidalCyclesの知識は不要
  • Strudel REPL (https://strudel.tidalcycles.org/) のサイトにアクセスしてすぐに利用可能

Strudelで何ができる?

  • ライブコーディング: リアルタイムでコードを使用して音楽を作成
  • アルゴリズム作曲: Tidalの強力なパターン操作の機能を活用して、アルゴリズミックに音楽を作曲
  • 教育: 誰でもすぐに利用できるので、音楽とプログラムを同時に学べる!
  • 他の音楽制作環境と統合: MIDI、OSCなどを使用して外部の環境と連動できる

コード例

stack(
  // ドラム
  s("bd,[~ <sd!3 sd(3,4,2)>],hh*8")
    .speed(perlin.range(.8, .9)), // ランダムなサンプル速度の変化
  // ベースライン
  "<a1 b1*2 a1(3,8) e2>"
    .off(1 / 8, x => x.add(12).degradeBy(.5)) // ランダムなオクターブジャンプ
    .add(perlin.range(0, .5)) // ランダムなピッチの変化
    .superimpose(add(.05)) // 2つ目の、わずかにデチューンされた音声を追加
    .note() // "note"で囲む
    .decay(.15).sustain(0) // 各音符を同じ長さにする
    .s('sawtooth') // 波形
    .gain(.4) // 音量を下げる
    .cutoff(sine.slow(7).range(300, 5000)), // カットオフを自動化
  // コード
  "<Am7!3 <Em7 E7b13 Em7 Ebm7b5>>".voicings('lefthand')
    .superimpose(x => x.add(.04)) // 2つ目の、わずかにデチューンされた音声を追加
    .add(perlin.range(0, .5)) // ランダムなピッチの変化
    .note() // "note"で囲む
    .s('sawtooth') // 波形
    .gain(.16) // 音量を下げる
    .cutoff(500) // 固定カットオフ
    .attack(1) // ゆっくりフェードイン
).slow(3 / 2)
  • さらに詳しく: Strudel REPLにアクセスし、シャッフルを押してランダムにサンプルを聞いてみる

サウンド機能入門

はじめの一歩

  • 以下のコードを入力
sound("casio")
  • 音の操作
    • テキストフィールドをクリック
    • ctrl+enterを押して再生
    • casioからmetalに変更してみる
    • ctrl+enterで更新
    • ctrl+.で停止
  • 他のサウンドも試してみる!
    • 例: insect wind jazz metal east crow casio space numbers

サンプル番号をコロン (:) で指定

sound("casio:1")
  • 指定したサウンド(この例だとcasio)の種類を変更
  • 何も指定しない場合は :0 と同じ

ドラムサウンド

ドラムサウンド基本

sound("bd hh sd oh")
  • 始めから様々なドラムセットの音が入っている
  • 2つの文字はドラムセットの様々なパートを省略している
    • bd = bass drum (バスドラム)
    • sd = snare drum (スネアドラム)
    • rim = rimshot (リムショット)
    • hh = hihat (ハイハット)
    • oh = open hihat (オープンハイハット)
  • 文字を書き換えて様々なドラムパターンを作ってみよう!
    • 実際に音を聞きながら

応用: ドラムセットを切り替える

sound("bd hh sd oh").bank("RolandTR909")
  • .bank() を使用してドラムセットごと切り替えられる
  • その他にも以下のようなドラムマシンがあるので試してみよう!
    • AkaiLinn
    • RhythmAce
    • RolandTR808
    • RolandTR707
    • ViscoSpaceDrum
  • コピペすると楽!

シーケンス

  • シーケンス: 反復進行 (はんぷくしんこう sequence)
  • 同じ音のまとまりを何度も繰り返すこと
  • Strudelでは様々な方法でシーケンスを組み立てられる

シーケンス基本

sound("bd hh sd hh")
  • これまでやってきた基本
  • スペースで区切ることでシーケンス内で複数のサウンドを再生できる

沢山の音を鳴らす

sound("bd bd hh bd rim bd hh bd")
  • シーケンスが長い(たくさんの音がある)ほど速くなる
  • シーケンスの中身が1サイクルに押し込められるため

テンポを変更する

sound("bd bd hh bd rim bd hh bd").cpm(40)
  • 1つの方法は cpm() を使用する方法
  • cpm
    • cycle per minutes
    • 1分あたり何サイクルするか、という単位
  • その他にも方法があるがまた後述

休符

sound("bd hh ~ rim")
  • ~ は休符(音を出さないパート)をあらわす

サブシーケンス

sound("bd [hh hh] sd [hh bd]")
  • [] で囲うとサブシーケンスが作成される
  • シーケンスの1要素の中をさらに分割するイメージ

かけ算 – スピードアップ

sound("bd hh*2 rim hh*3")
  • 「* (かけ算)」記号はそのシーケンス内で分割してくりかえす
  • スピードアップ(カットアップ?)

シーケンスのスピードアップ

sound("bd [hh rim]*2")
  • サブシーケンスのかけ算も可能

高速かけ算

sound("bd hh*16 rim hh*8")
  • かけ算の数を大きくすると分割が細かくなる
  • 徐々に一定の音程に聞こえてくる

サブ・サブシーケンス

sound("bd [[rim rim] hh]")
  • [] を入れ子構造にすることで、サブシーケスのサブシーケンスをつくる

パラレルに演奏

sound("hh hh hh, bd casio")
  • コンマ(,)で区切って2つのシーケンスを記述する
  • パラレルに2つのシーケンスが演奏される
sound("hh hh hh, bd bd, ~ casio")
  • いくつでも増やせる
sound("hh hh hh, bd [bd,casio]")
  • サブシーケンスの中をパラレルに演奏

サンプル番号でシーケンス

n("0 1 [4 2] 3*2").sound("jazz")
  • このコードは以下のコードと同じ
sound("jazz:0 jazz:1 [jazz:4 jazz:2] jazz:3*2")