Strudelify

The Key, the Secret

Urban Cookie Collective

KeyF majorTempo130 bpm
0:00/0:00
// The Key, the Secret — Urban Cookie Collective
// 130 bpm, 4/4, key F major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 119 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(130/4)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · "a, b" plays two voices at once.
// A part's distinct bars are riffs (A, B, C...) played in order: edit a riff to change every repeat.

// chords · piano · "A.PIANO 1"
const piano = note(`<
  ~@4 A B C D A B C E ~@28 A B C D A B C E ~@40 A B C D A B C E A B C D A B C E A B C D A B C E A B C D A B F
>`.pickRestart({
  A: "[f3,c4,f4,a4]@11 ~ c4@2 f3@2, ~@3 [f4,a4]", B: "[c3,c4,e4,g4]@11 ~ c4@2 c3@2, ~@3 [e4,g4]",
  C: "[eb3,bb3,eb4,g4]@11 ~ bb3@2 eb3@2, ~@3 [eb4,g4]", D: "[bb2,bb3,d4,f4]@11 ~ bb3@2 a2@2, ~@3 [d4,f4]",
  E: "[bb2,bb3,d4,f4]@11 ~ bb3@2 bb2@2, ~@3 [d4,f4]", F: "[eb3,bb3,eb4,g4] ~@15",
})).s("gm_piano").gain(0.64)

// bass · synth bass 2 · "SYN BASS 2"
const bass = note(`<
  ~@12 A B A B A B A B A B A ~ A C A B A C A B ~@16 A B A B A B A ~ A B A B A B A ~ A B A B A B A B A B A B A B A B ~@39
>`.pickRestart({
  A: "f1 ~ f1 ~ f1 ~ f1 ~", B: "f1 ~ f1 ~ bb1 ~ bb1 ~", C: "f1 ~ f1 ~ c2 ~ c2 ~",
})).s("gm_synth_bass_2").gain(0.64)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth = note("<~@4 A@20 ~@8 A@23 ~ A@32 ~@8 A@22 B>".pickRestart({
  A: "[c4,f4] ~@2 [c4,f4] ~@4 [c4,f4] ~ [c4,f4] ~@5", B: "[c4,f4] ~@2 [c4,f4] ~@4 [c4,f4] ~@7",
})).s("gm_lead_2_sawtooth").gain(0.43)

// chords · synth strings 1 · "SYN STR 1"
const synth_strings_1 = note(`<
  A B C D A B C D A B C D ~@12 A B C D A B C D ~@8 A B C D A B C D ~@32 A B C D A B C D A B C D A B C D A B C D A B C D
  A B C D A B C D A B C D A B E
>`.pickRestart({
  A: "[f4,c5,f5,a5]", B: "c4@3 d4, [c5,e5,g5]", C: "[eb4,bb4,eb5,g5]", D: "bb3@2 d4 e4, [bb4,d5,f5]",
  E: "[eb4,bb4,eb5,g5] ~@15", // Eb
})).s("gm_synth_strings_1").gain(0.32)

// chords · percussive organ · "ORGAN 2"
const percussive_organ = note(`<
  ~@13 A ~ A ~ B ~ A ~ A ~@11 A ~ A ~ B ~ A ~@17 A ~ A ~ B ~@3 A ~ A ~ B ~ A ~ A ~ A ~ B ~ A ~@39
>`.pickRestart({
  A: "~@9 [d6,f6]!2 ~ [d6,f6] ~ [d6,f6]!2", B: "~@9 [bb5,d6]!2 ~ [bb5,d6] ~ [bb5,d6]!2",
})).s("gm_percussive_organ").gain(0.36)

// bass · lead 8 bass lead · "BASS&LEAD"
const bass_2 = note(`<
  ~@12 A B A B A B A B A B A ~ A C A B A C A B ~@16 A B A B A B A ~ A B A B A B A ~ A B A B A B A B A B A B A B A B ~@39
>`.pickRestart({
  A: "~@2 f3!2 ~@2 f3!2 ~@2 f3!2 ~@2 f3!2", B: "~@2 f3!2 ~@2 f3!2 ~@2 bb3!2 ~@2 bb3!2",
  C: "~@2 f3!2 ~@2 f3!2 ~@2 c4!2 ~@2 c4!2",
})).s("gm_lead_8_bass_lead").gain(0.24)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth_2 = note("<~@4 A@20 ~@8 A@23 ~ A@32 ~@8 A@22 B>".pickRestart({
  A: "~@6 [c4,f4] ~@7 [c4,f4] ~", B: "~@6 [c4,f4] ~@9",
})).s("gm_lead_2_sawtooth").gain(0.28).pan(0.3)

// chords · lead 2 sawtooth · "SAW WAVE"
const lead_2_sawtooth_3 = note("<~@4 A@20 ~@8 A@23 ~ A@32 ~@8 A@22 B>".pickRestart({
  A: "~@4 [c4,f4] ~@2 [c4,f4] ~ [c4,f4] ~@2 [c4,f4] ~@3", B: "~@4 [c4,f4] ~@2 [c4,f4] ~@8",
})).s("gm_lead_2_sawtooth").gain(0.21).pan(0.8)

// drums · kick
const kick = s("bd").struct("<~@12 A@11 ~ A@8 ~@4 A@3 B A@8 ~@8 A@7 ~ A@16 ~@24 A@14 C>".pickRestart({
  A: "x!4", B: "x!2 ~@2", C: "x!3 ~",
})).gain(0.72)

// drums · snare
const snare = s("sd").struct("<~@12 A@11 ~ B@16 A@8 ~@4 B@3 ~ A@7 ~ A@16 ~@24 A@14 C>".pickRestart({
  A: "~@7 x ~@2 x ~@4 x", B: "~@4 x ~@2 x ~@2 x ~ x ~@2 x", C: "~@7 x ~@8",
})).gain(0.24)

// drums · snare · soft notes
const snare_soft = s("sd").struct("<~@12 A@11 ~ A@24 ~@4 A@3 ~ A@7 ~ A@16 ~@24 A@14 B>".pickRestart({
  A: "~@6 x ~@2 x ~@6", B: "~@3 x ~@4",
})).gain(0.08)

// drums · clap
const clap = s("cp").struct("<~@12 A@11 ~@17 A@8 ~@8 A@7 ~ A@16 ~@24 A@14 B>".pickRestart({
  A: "~ x ~ x", B: "~ x ~@2",
})).gain(0.48)

// drums · hihat
const hihat = s("hh").struct("<~@4 A@19 ~ A@24 ~@8 A@7 ~ A@54 B>".pickRestart({
  A: "x ~ x!3 ~@3 x ~ x ~ x ~ x ~", B: "x ~ x!3 ~@3 x ~@7",
})).gain(0.72)

// drums · hihat · soft notes
const hihat_soft = s("hh").struct("<~@4 A@19 B A@24 ~@4 A@3 B A@7 B A@54 C>".pickRestart({
  A: "x!4", B: "x", C: "x!3 ~",
})).gain(0.08)

// drums · open hat
const open_hat = s("oh").struct("<~@4 A@19 ~ A@24 ~@4 A@3 ~ A@7 ~ A@54 B>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "~ x ~ x ~@4",
})).gain(0.48)

// drums · tambourine
const tambourine = s("tb").struct("<~@4 A@8 B@11 A B@24 A@4 B@3 ~ B@7 A B@16 A@16 B@22 C>".pickRestart({
  A: "~ x ~ x ~ x ~ x", B: "x!3 ~ x!7 ~ x!4", C: "x!3 ~ x!5 ~@7",
})).gain(0.4)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct("<~@12 A@11 ~ A@24 ~@4 A@3 ~ A@7 ~ A@16 ~@16 A@22 B>".pickRestart({
  A: "~@3 x ~@7 x ~@4", B: "~@3 x ~@12",
})).gain(0.24)

// drums · ht
const ht = s("ht").struct("<~@11 A ~@11 A ~@7 A ~@15 A ~@7 A ~@7 A ~@15 A ~@23 A ~@7 A ~@7>".pickRestart({
  A: "x ~@5 x!3 ~ x!2 ~@4",
})).gain(0.32)

// drums · mt
const mt = s("mt").struct("<~@11 A ~@11 A ~@7 A ~@15 A ~@7 A ~@7 A ~@15 A ~@23 A ~@7 A ~@7>".pickRestart({
  A: "~@11 x!2 ~ x ~",
})).gain(0.72)

stack(
  piano, bass, lead_2_sawtooth, synth_strings_1, percussive_organ, bass_2, lead_2_sawtooth_2, lead_2_sawtooth_3, kick,
  snare, snare_soft, clap, hihat, hihat_soft, open_hat, tambourine, tambourine_soft, ht, mt
)