Back
Strudel
music
Strudel を読み込み中…
// ============================================================ // midnight signal — electro band set (BPM136 / F#m) // // つくり: // - セクション(intro / aMelo / bMelo / sabi / outro)は全部変数 // - 一番下の arrange() の [サイクル数, セクション] を // 並べ替えるだけで曲の構成を変えられる // - 音色は「共通の音色」の関数を全セクションで使い回すので、 // ここを変えると曲全体の音が変わる // - slider(...) は右のパネルからリアルタイムで動かせる // ============================================================ // ---------- 音色スライダー(動かすと即反映) ---------- const drumLevel = slider(0.9, 0, 1.5) const bassBright = slider(700, 80, 4000) const leadBright = slider(2400, 200, 8000) const padSpace = slider(0.5, 0, 1) const leadEcho = slider(0.4, 0, 0.95) // ---------- 共通の音色(全セクションで同じ楽器) ---------- const dr = (p) => s(p).gain(drumLevel) const bass = (p) => note(p).s("sawtooth") .lpf(bassBright).lpq(6) .attack(0.004).decay(0.12).sustain(0.5).release(0.06) .gain(0.7) const pluck = (p) => note(p).s("triangle") .attack(0.005).decay(0.14).sustain(0.1).release(0.05) .delay(0.25).delaytime(0.375).delayfeedback(0.35) .gain(0.5) const pad = (p) => chord(p).voicing().s("sawtooth") .attack(0.35).release(0.4) .lpf(leadBright).room(padSpace) .gain(0.32) const lead = (p) => note(p).s("sawtooth") .lpf(leadBright).lpq(4) .attack(0.01).release(0.15) .delay(leadEcho).delaytime(0.375).delayfeedback(0.4) .room(0.35) .gain(0.55) // ---------- コード進行(全セクション共通・1サイクル1コード) ---------- const prog = "<D E F#m C#m>" const roots = "<d1 e1 f#1 c#1>" // ============================================================ // セクション定義 // ============================================================ // --- イントロ: 四つ打ち + うねるシンセベース --- const intro = stack( dr("bd*4"), dr("[~ hh]*4").gain(0.45), bass(roots).struct("x*8") .lpf(sine.range(200, 1600).slow(8)), pad(prog).gain(0.18), ) // --- Aメロ: 乾いた打ち込みビート + ぽつぽつアルペジオ --- const aMelo = stack( dr("bd*4"), dr("[~ hh]*4").gain(0.4), dr("~ cp ~ cp").gain(0.35), bass(roots).struct("x ~ x ~ ~ x ~ x"), pluck(`< [d3 a3 f#3 a3] [e3 b3 g#3 b3] [f#3 c#4 a3 c#4] [c#3 g#3 e3 g#3] >`), ) // --- Bメロ: ざらついたブレイクビーツで景色を変える --- const bMelo = stack( dr("[bd ~ ~ bd ~ ~ bd ~]").crush(6), dr("[~ ~ sd ~] [~ sd ~ sd]").crush(6).sometimesBy(0.25, ply(2)), dr("hh*16").gain(rand.range(0.15, 0.5)).degradeBy(0.25).crush(8), bass(roots).struct("x*4").lpf(400), pad(prog).gain(0.26), ) // --- サビ: 全部乗せ。オープンハットとリードで開ける --- const sabi = stack( dr("bd*4"), dr("~ sd ~ sd"), dr("[~ ho]*4").gain(0.5), dr("hh*8").gain(0.3), bass(roots).struct("x*8"), pad(prog), lead(`< [f#4 ~ a4 ~ c#5 ~ b4 a4] [e4 ~ f#4 a4 ~ f#4 e4 ~] [f#4 ~ a4 ~ c#5 ~ e5 c#5] [b4 a4 f#4 ~ e4 ~ f#4 ~] >`), ) // --- アウトロ: 少しずつ引いていく --- const outro = stack( dr("bd*4").gain(0.7), dr("[~ hh]*4").gain(0.3), pad(prog), bass(roots).struct("x ~ ~ ~ x ~ ~ ~"), ) // ============================================================ // 曲の構成(ここを並べ替えて遊んでね) // ============================================================ arrange( [8, intro], [16, aMelo], [8, bMelo], [16, sabi], [8, aMelo], [8, bMelo], [16, sabi], [8, outro], ).cpm(136 / 4)