Strudelify

Donna donna

Claude Francois

KeyA minorTempo102 bpm
0:00/0:00
// Donna donna — Claude Francois
// 102 bpm, 4/4, key A minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: metre changes (1/16 at bar 1, 4/4 at bar 2) are rendered on a constant 4/4 grid of one bar per cycle
// note: bank select 127 (Roland MT-32 map) read through the MT-32 patch table: ch 8 Marimba -> marimba
// note: Full arrangement: all 87 bars on a 24-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(102/4)

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

// other · string ensemble 1
const string_ensemble_1 = note(`<
  A@2 B C@2 ~@6 D@2 E F@2 G H I J K L@3 M@3 ~@9 D@2 E F@2 G H I J K L@3 M@3 ~@9 D@2 E F@2 G H I J K L@3 M@3 J K N@5 O
  P@2
>`.pickRestart({
  A: "[[e5,e6]@6 [a4,a5]@6 [b4,b5]@3 [c5,c6]@2 [d5,d6]@6 e5@6 ~ [a5,a6]@6 [f#5,f#6]@2 ~ e5@3 [d5,d6]@5 ~, ~@38 e6@3 ~@7]/2", // E A B C D A F# D
  B: "[c5,c6]@6 [a4,a5]@2 ~ c6@3 [b4,b5]@3 [g4,g5]@3 [d5,d6]@3 [b4,b5]@3, ~@8 c5@3 ~@13", C: "[a4@31 ~@17, a5 ~]/2",
  D: "[~@23 [b4,b5]@24 ~]/2", E: "[c5,c6]@4 [d5,d6] [c5,c6] [b4,b5] [a4,a5]",
  F: "[[g4,g5]@36 [f5,f6]@3 [e5,e6]@2 [d5,d6]@3 ~ [c5,c6]@3]/2", G: "[d5,d6]@23 [e5,e6]",
  H: "~ [d5,d6] [c5,c6]@2, [e5,e6]@3 ~@5", I: "[b4,b5]@23 ~", J: "[a4,a5] ~@3", K: "[b4,b5]",
  L: "[[c5,c6]@23 [d5,d6]@24 [e5,e6]@12 [d5,d6]@6 ~ c6@6, ~@65 c5@6 ~]/3", // C D E D
  M: "[[b4,b5]@23 ~ c5@23 ~ b4@11 ~@13, ~@23 c6@24 b5@11 ~@14]/3", // B
  N: "[[c5,c6]@23 [d5,d6]@24 [e5,e6]@12 [d5,d6]@6 [c5,c6]@6 [b4,b5]@24 [c5,c6]@25]/5", O: "[b4,b5]@7 ~@5",
  P: "[~@10 [e3,a3,c4]@25 ~@13]/2", // Am
})).s("gm_string_ensemble_1").gain(0.15).pan(0.8)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note("<A B C D ~@14 E F ~@23 E F ~@23 E F ~@7 F ~@9>".pickRestart({
  A: "e4@6 a3@5 ~ b3@3 c4@3 d4@6, d#4 ~@23", B: "e4@6 a4@5 ~ f#4@3 e4@3 d4@6", C: "c4@2 a3 c4 b3 g3 d4 b3",
  D: "a3@11 ~", E: "~@2 [f#3,a3] [g#3,b3]", F: "[a3,c4]@5 ~@7",
})).s("gm_acoustic_guitar_nylon").gain(0.4).pan(0.8)

// bass · fretless bass
const bass = note(`<
  A B C D A@2 B E F@2 B G H I J K L M N O P Q R S T U V W@2 A@2 B E F@2 B G H I J K L M N O P Q R S T U V W@2 A@2 B E
  F@2 B G H I J K L M N O P Q R S T U V X P Q Y S T Z AA AB@2
>`.pickRestart({
  A: "a1 e2", B: "a1 d2", C: "f2 g2, ~@12 f#2 ~@11", D: "a1@16 ~@5 e2@2 ~", E: "a1@11 ~ e2@12", F: "a1@12 e2@11 ~",
  G: "a1@5 ~ e2@6 a1@9 g#1@3", H: "g1@9 g1@2 ~ g1@9 b1@3", I: "c2@8 ~ c2 ~@2 c2@12", J: "g1@7 ~@2 g1@2 ~ g1@12",
  K: "c2@8 ~ c2@2 ~ c2@11 ~", L: "g1@8 ~ g1 ~@2 g1@11 ~", M: "c2 b1 a1@2", N: "~@12 f#1@5 ~ g#1@6, e2@3 ~",
  O: "a1@6 a1@6 b1@6 c2@5 ~", P: "e2@8 ~ e2 ~@2 e2@9 d2@3", Q: "a1@7 ~@2 a1 ~@2 a1@6 g#1@5 ~",
  R: "g1@7 ~@2 g1@2 ~ g1@8 ~ g1@3", S: "c2@8 ~ c2 ~@2 c2@5 ~ d2@5 ~", T: "e2@8 ~ e2 ~@2 e2@6 b1@6",
  U: "a1@8 ~ a1 ~@2 a1@7 ~@2 a1@2 ~", V: "e2@7 ~@2 e2@2 ~ a1@6 e2@6", W: "[a1@23 ~]/2", X: "a1@5 ~ a1@6 b1@6 c2@5 ~",
  Y: "g1@7 ~@2 g1 ~@2 g1@8 ~ g1@3", Z: "a1@8 ~ a1 ~@2 a1@8 ~ a1@3", AA: "e2@4 ~@2 e2 ~ a1@4",
  AB: "[e2@9 ~ a1@26 ~@12]/2",
})).s("gm_fretless_bass").gain(0.5)

// chords · marimba
const marimba = note(`<
  ~@4 A@2 B A@3 B C D E D F D G H I J K L E J K J I ~ A@2 B A@3 B C D E D F D G H I J K L E J K J I ~ A@2 B A@3 B C D E
  D F D G H I J K L E J K J I J K L E J K M N ~
>`.pickRestart({
  A: "[e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2", // Am E
  B: "[e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2 [d4,f4,a4] ~@2", // Am Dm
  C: "[e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2", // Am E Am
  D: "[d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2", // G
  E: "[e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2", // C
  F: "[e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [e4,g4,a4,c5] ~@2", // C Am7
  G: "[e4,g4,c5] ~@2 [e4,g4,c5] ~@2 [d4,g4,b4] ~@2 [d4,g4,b4] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2", // C G Am
  H: "[e4,a4,c5] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2", // Am E
  I: "[e4,a4,c5] ~@23", // Am
  J: "[e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2 [e4,g#4,b4] ~@2", // E
  K: "[e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2 [e4,a4,c5] ~@2", // Am
  L: "[g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2 [g4,b4,d5] ~@2", // G
  M: "[e4,g#4,b4] ~@3 [e4,g#4,b4] ~@3 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2 [e4,g#4,b4]@2 ~@2", // E
  N: "[e4,g#4,b4]@2 ~@3 [e4,g#4,b4]@2 ~@17", // E
})).s("gm_marimba").gain(0.11)

// chords · string ensemble 1
const string_ensemble_1_2 = note("<A@3 B@3 C D@4 E@8 F G H@8 I J C D@4 E@8 F G H@8 ~@16 G K@8 L@8>".pickRestart({
  A: "[[a2,a3,c4]@11 [e2,g#3,b3]@12 ~ a2@11 ~ d2@11 [f2,c4]@12 ~ [g2,b3]@12, e3@34 ~ [f#3,d4]@12 ~@12 [g3,d4]@12 ~, ~@23 c4@12 ~@37, ~@2 a3@3 ~]/3", // Am E F5 G D G5
  B: "[e4@24 ~@12 e2@12 [a2,c4]@11 [e2,g#3,b3]@13, [a2,c4] ~, a3@34 ~ [g#3,b3]@13 a3@10 ~@14, ~ e3@2]/3", // Am E Am G#m
  C: "[a2,c4]@11 [d2,f3,d4]@12 c4, a3", // Am Dm
  D: "[a2@11 [e2,g#3,b3]@13 [a2,a3,c4]@11 ~ g#3@11 [a2,a3,c4]@12 [e2,g#3,b3]@12 [a2,c4]@12 [d2,d4]@12 [a2,e3,c4], e3@82 ~ f3@10 ~@3, ~@35 [e2,b3]@12 ~@24 a3@25]/4", // E Am E Am D Am E5
  E: "[~@5 [e2,g#3,b3]@6 [a2,a3,c4]@12 ~ [g2,b3]@23 [c3,c4,e4]@24 ~ g2@23 [c3,c4,e4]@25 [g2,b3,d4]@23 ~ c3@5 [g2,b3,d4]@6 [a2,a3,c4]@12 ~ g#2@11 e2@12 ~, ~@23 g3@131 ~@14 [g#3,b3]@24, ~@23 d4@24 ~@24 [b3,d4]@24 ~@48 [c4,e4]@6 ~@6 e4@37]/8", // E Am G C G Am G#m Bm …
  F: "[a2,a3,c4]@13 ~@11", G: "[e2,e3,g#3,b3,d4]",
  H: "[[a2,a3,c4]@23 ~ g2@23 [c3,c4,e4]@24 ~ [e2,d4]@24 [a2,a3,c4]@23 d4 ~@6 e2@18 ~@23 e4@24 ~, ~@23 g3@47 ~ e3@120 ~, ~@23 [b3,d4]@24 ~@24 [g#3,b3]@24 ~@24 [g#3,b3,e4]@25 [a2,a3,c4]@48]/8", // Am C E7 Am Bm G#m E Am
  I: "~ e2, ~@11 [g#3,b3]@13", J: "[a2,c4]@11 [e2,g#3,b3]@13, a3@5 ~@7",
  K: "[[a2,a3,c4]@23 ~ g2@23 [c3,c4,e4]@24 ~ [e2,d4]@24 [a2,a3,c4]@23 d4 ~@6 e2@18 ~@24 [e2,e3,g#3,b3,d4]@24, ~@23 g3@47 ~ e3@97 ~@24, ~@23 [b3,d4]@24 ~@24 [g#3,b3]@24 ~@24 [g#3,b3,e4]@25 [a3,c4]@48]/8", // Am C E7 Am E7 Bm G#m E …
  L: "[[a2,a3,c4]@23 ~ g2@23 [c3,c4,e4]@24 ~ d4@23 [a2,a3,c4]@24 d4 ~@7 e2@26 [a3,c4]@26 ~@13, ~@23 g3@46 ~@2 e3@108 ~@13, ~@23 [b3,d4]@24 ~@24 [e2,g#3,b3]@24 ~@24 [g#3,b3,e4]@35 ~@38]/8", // Am C Am Bm E
})).s("gm_string_ensemble_1").gain(0.04).pan(0.4)

// drums · kick
const kick = s("bd").struct(`<
  A@3 B A@3 C A@3 C A@7 D A@8 E A@3 C A@3 C A@7 D A@8 E A@3 C A@3 C A@7 D A@7 D A@6 F G ~
>`.pickRestart({
  A: "x ~@2 x!2 ~@3", B: "x ~@2 x!2 ~ x ~", C: "x ~@8 x ~@2 x ~@3 x ~@4 x ~@2", D: "x", E: "x ~@2 x!2 ~@2 x",
  F: "x ~@2 x!2 ~", G: "~@5 x ~@6",
})).gain(0.64)

// drums · rim
const rim = s("rim").struct("<A@7 B A@3 B A@7 ~@8 A@5 B A@3 B A@7 ~@8 A@5 B A@3 B A@7 ~@18>".pickRestart({
  A: "~ x ~ x", B: "~@2 x!2 ~@2 x ~",
})).gain(0.48)

// drums · snare
const snare = s("sd").struct("<A@19 ~ A@8 B A@15 ~ A@8 B A@15 ~ A@7 ~ A@6 C D ~>".pickRestart({
  A: "~ x ~ x", B: "~@3 x ~@4 x!2 ~@2", C: "~ x ~", D: "x",
})).gain(0.32)

// drums · low tom
const low_tom = s("lt").struct("<~@3 [~@7 x] ~@81 [x ~@4 x ~@18] ~>").gain(0.4)

// drums · hihat
const hihat = s("hh").struct("<A@8 B A@10 ~ A@13 B A@10 ~ A@13 B A@10 ~ A@7 ~ A@6 C D ~>".pickRestart({
  A: "x!8", B: "~@2 x!6", C: "x!6", D: "x ~@4 x ~@18",
})).gain(0.32)

// drums · mid tom
const mid_tom = s("mt").struct("<~@3 [~@5 x!2 ~] ~@80 [~@4 x!2] ~@2>").gain(0.4)

// drums · open hat
const open_hat = s("oh").struct("<~@8 x ~@24 x ~@24 x ~@28>").gain(0.4)

// drums · high tom
const high_tom = s("ht").struct("<~@3 [~@13 x ~@10] ~@80 [~@7 x ~@4] ~@2>").gain(0.48)

// drums · crash
const crash = s("cr").struct(`<
  ~@4 A ~@7 A ~@6 A@2 ~@8 A ~@7 A ~@6 A@2 ~@8 A ~@7 A ~@6 A@2 ~@6 A@2 ~@6 B ~
>`.pickRestart({
  A: "x", B: "~@5 x ~@6",
})).gain(0.32)

// drums · ride
const ride = s("rd").struct(`<
  ~@4 A ~@3 A ~@3 A ~@6 A B@7 ~@2 A ~@3 A ~@3 A ~@6 A B@7 ~@2 A ~@3 A ~@3 A ~@6 A B@7 A B@6 C D ~
>`.pickRestart({
  A: "x", B: "x!8", C: "x!6", D: "x ~@4 x ~@4 x ~@13",
})).gain(0.4)

// drums · tambourine
const tambourine = s("tb").struct("<A@19 ~ A@24 ~ A@24 ~ A@7 ~ A@6 B C ~>".pickRestart({
  A: "~ x ~ x", B: "~ x ~", C: "x!2 ~@22",
})).gain(0.64)

// drums · bongos
const bongos = s("bongo:4").struct("<~@12 [~@3 x ~@4]!7 ~@18 [~@3 x ~@4]!7 ~@18 [~@3 x ~@4]!7 ~@18>").gain(1.26)

// drums · congas
const congas = s("conga:13").struct("<~@12 [~@5 x ~@2]!7 ~@18 [~@5 x ~@2]!7 ~@18 [~@5 x ~@2]!7 ~@18>").gain(1.54)

// drums · congas
const congas_2 = s("conga:18").struct("<~@13 [~ x]!6 ~@19 [~ x]!6 ~@19 [~ x]!6 ~@18>").gain(1.54)

// drums · congas · soft notes
const congas_soft = s("conga:18").struct("<~@12 [~ x] ~@24 [~ x] ~@24 [~ x] ~@24>").gain(1.02)

// drums · congas
const congas_3 = s("conga:33").struct("<~@13 [~@19 x ~@4]!6 ~@19 [~@19 x ~@4]!6 ~@19 [~@19 x ~@4]!6 ~@18>").gain(1.54)

// drums · congas · soft notes
const congas_soft_2 = s("conga:33").struct("<~@12 [~@19 x ~@4] ~@24 [~@19 x ~@4] ~@24 [~@19 x ~@4] ~@24>").gain(1.02)

stack(
  string_ensemble_1, acoustic_guitar_nylon, bass, marimba, string_ensemble_1_2, kick, rim, snare, low_tom, hihat,
  mid_tom, open_hat, high_tom, crash, ride, tambourine, bongos, congas, congas_2, congas_soft, congas_3, congas_soft_2
)

More by Claude Francois