Strudelify

Seven Seconds

Youssou N'Dour

KeyC♯ minorTempo152 bpm
0:00/0:00
// Seven Seconds — Youssou N'Dour
// 152 bpm, 4/4, key C# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 194 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(152/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.

// bass · fretless bass
const bass = note(`<
  A B C D E B F G E B F G E B F G E B F G E B F G E B F G E B F G E B F G H I J K L M N O P Q@2 R S T U V W X Y Z S T U
  V AA X Y Z E B F G E B F G E B F G E B F G E B F G H I J AB S T U V W X Y Z S T U V W X Y Z E B F G E B F G E B F G E
  B F G E B F G H I J AC L M N O P AD AE AF AG AH AI AJ AK AL P@3 AM S T U V W X Y Z S T U V AA X Y Z S T U V W X Y Z S
  T U V W X Y Z S T U V W X Y Z S T U V W X Y AN
>`.pickRestart({
  A: "f#2@2 ~@2 f#2@9 ~@3", B: "e2 ~ e2 ~ e2@9 ~ d#2 ~", C: "d#2@3 ~ d#2@9 ~@3", D: "d2@3 ~ d2@9 ~ f#2 ~",
  E: "f#2 ~ f#2@5 ~", F: "d#2@2 ~@2 d#2@9 ~@3", G: "d2@3 ~ d2@8 ~@2 f#2 ~", H: "f#2@2 ~@2 f#2@10 e2 ~",
  I: "e2@2 ~@2 e2@9 ~ d#2 ~", J: "d#2@2 ~@2 d#2@9 ~ d2 ~", K: "d2@3 ~ d2@8 ~@2 b0@2, ~@14 f#1 ~",
  L: "b1@2 f#1@2 b1@9 ~ f#1@2", M: "b1@2 ~@2 b1@9 ~ b0@2", N: "b1@2 f#1@2 a1@9 ~ f#1@2", O: "a1@2 ~@2 a1@9 ~ f#1@2",
  P: "g#1@3 ~ g#1@9 ~ f#1 ~", Q: "g#1@2 ~@2 g#1@9 ~ f#1 ~", R: "g#1@3 ~ g#1@9 ~ g#1 ~",
  S: "c#2@2 ~@2 c#2@2 ~@2 c#2@7 ~", T: "c#2@2 g#1@2 c#2@5 ~ g#1 ~ c#2@2 g#1@2", U: "b1@2 ~@2 b1@2 ~@2 b1@6 g#1 ~",
  V: "b1@2 ~@2 b1@9 ~ e1 ~", W: "a1@2 e1 ~ a1@9 ~ e1@2", X: "a1@2 ~@2 a1@8 ~@2 g#1 ~", Y: "b1@3 ~ b1@8 ~@2 g#1 ~",
  Z: "b1@2 ~@2 b1@5 ~ g#1 ~ b1@2 g#1 ~", AA: "a1@2 e1 ~ a1@10 e1@2", AB: "d2@3 ~ d2@8 ~@2 g#2 ~",
  AC: "d2@3 ~ d2@8 ~@2 b0@2", AD: "g#1@2 ~@2 g#1@9 ~ g#1 ~", AE: "c#2@2 ~@2 c#2@8 ~@2 g#1 ~",
  AF: "c#2@3 ~ c#2@5 ~ g#1 ~ c#2@2 g#1@2", AG: "a1@3 ~ a1@10 e1@2", AH: "a1@2 ~@2 a1@5 ~ e1@2 a1@2 g#1@2",
  AI: "c#2@2 ~@2 c#2@9 ~ g#1 ~", AJ: "c#2@2 ~@2 c#2@5 ~ g#1@2 c#2@2 g#1@2", AK: "a1 ~ a1@5 e1",
  AL: "a1@3 ~ a1@6 e1@2 a1@2 e1@2", AM: "g#1@3 ~ g#1@6 e1 ~ g#1@2 e1@2", AN: "b1@2 ~@2 b1@5 ~@7",
})).s("gm_fretless_bass").gain(0.46)

// other · whistle
const whistle = note(`<
  ~@62 A@2 B@2 C@4 ~@64 D@6 E@2 F@4 G H I J K L I M G H I J K L I M G H I J K L I M G H I J K L I M G H I J K L I M G H
  I J N ~@3
>`.pickRestart({
  A: "[~@7 c#6@7 c#6 ~]/2", B: "c#6 ~ c#6 ~ c#6 ~ c#6 ~", C: "[c#6@2 ~@2 c#6@2 ~@2 c#6@2 f#2@51 ~@3]/4",
  D: "[~@2 c#5@59 e5@35]/6", E: "c#5/2", F: "[f#5@59 ~@5]/4", G: "~@2 c#5 d#5@2 c#5 g#5@2",
  H: "c#5 g#5@2 c#5 g#5@2 ~@2", I: "~@2 b4 d#5@2 b4 g#5@2", J: "b4 g#5@2 b4 g#5@2 b4 ~", K: "~@2 b4 c#5@2 b4 g#5@2",
  L: "b4@2 g#5@4 b4@2 g#5@3 ~ b4@2 ~@2", M: "b4 g#5@2 b4 g#5@2 ~@2", N: "~@2 b4 ~@5",
})).s("gm_whistle").gain(0.06).pan(0.7)

// other · whistle · soft notes
const whistle_soft = note(`<
  ~@62 A ~@70 B ~@13 C ~ D ~ D ~ E ~ C ~ D ~ D ~ E ~ C ~ D ~ D ~ E ~ C ~ D ~ D ~ E ~ C ~ D ~ D ~ E ~ C ~ D ~@4
>`.pickRestart({
  A: "~@2 a#5 ~@13", B: "~@4 a#4 ~@11", C: "~@12 c#5@2 g#5 ~", D: "~@14 g#5 ~", E: "~@12 b4@2 d#5 ~",
})).s("gm_whistle").gain(0.04).pan(0.7)

// chords · pad warm
const pad_warm = note(`<
  A@8 B C D E B C D E B C D E B C D E B C D E B C D E B C D E B C D E F@4 G@4 H@2 I@2 J@2 I@2 H@2 I@2 J@2 I@2 A@8 B C D
  E B C D E B C D E B C D E H@2 I@2 J@2 I@2 H@2 I@2 J@2 I@2 A@8 B C D E B C D E B C D E B C D E K@4 L@2 M@7 N@5 O@4 P@4
  H@2 Q@6 H@2 Q@6 H@2 Q@6 H@2 Q@6 H@2 Q@6
>`.pickRestart({
  A: "[[f#2,f#3] [e2,e3] [d#2,d#3] [d2,d3] [f#2,f#3] [e2,e3] [d#2,d#3] [d2,d3], [a3,c#4,f#4]]/8", B: "[f#2,f#3]",
  C: "[e2,e3]", D: "[d#2,d#3]", E: "[d2,d3]", F: "[[b2,d4] [a2,c#4], f#3, b3 ~@31 a3 ~@31]/4",
  G: "[b3 ~@7 g#4@7 ~, [g#2,g#3,c4,d#4,f#4]]/4", H: "[c#2,c#3,g#3,c#4,e4]/2", I: "[b1,b2,g#3,b3,d#4]/2",
  J: "[a1,a2,g#3,c#4,e4]/2", K: "[[b2,b3,d4]@31 ~ c#4@32, f#4, ~@31 a2@33, ~@16 a3@15 ~]/4",
  L: "[~ g#3, [g#2,c4,d#4]]/2", M: "[c#3@31 ~ a3@31 ~ g#3@31 ~ a2@16, [c#4,e4], ~@31 a2@32 c#3@32 a3@17]/7",
  N: "[~@15 f#4@32 ~ g#4@32, ~@15 [g#2,c4,d#4]@64 ~]/5", O: "[[c#2,c#3,c#4,e4] [b1,b2,b3,d#4], g#4]/4",
  P: "[[a1,a2,a3,e4] [b1,b2,b3,d#4], c#4]/4", // A5 B
  Q: "[[b1,b2,b3,d#4] [a1,a2,a3,e4] [b1,b2,g#3,b3,d#4], g#3@2 ~, ~ c#4@2]/6", // B A5 G#m
})).s("gm_pad_warm").gain(0.26).pan(0.4)

// other · pad choir
const pad_choir = note(`<
  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 C E A B C D A B C E F@4 G@4 ~@16 A B C D A B C E A B C D A
  B C E A B C D A B C E ~@16 A B C D A B C E A B C D A B C E A B C D A B C E ~@66
>`.pickRestart({
  A: "e5", B: "d5", C: "c#5", D: "c5", E: "c5@7 ~", F: "[[b3,d4] [a3,c#4], f#3]/4",
  G: "[b3 ~@7 g#4@7 ~, [c4,d#4,f#4]]/4", // Cdim
})).s("gm_pad_choir").gain(0.01).pan(0)

// chords · string ensemble 1
const string_ensemble_1 = note("<~@48 A@6 B@6 C@2 D@2 ~@24 A@6 B@6 C@2 D@2 ~@90>".pickRestart({
  A: "[[c#4,e4] [b3,d#4] [c#4,e4], g#3]/6", B: "[[b3,d#4] e4 [b3,d#4], c#4@2 ~, ~ g#3@2]/6", C: "[g#3,c#4,e4]/2",
  D: "[b3,c#4,d#4]/2", // B
})).s("gm_string_ensemble_1").gain(0.06).pan(0.3)

// other · violin
const violin = note("<~@111 A B C@6 D E F G@2 H I J K L@4 M@2 ~@60>".pickRestart({
  A: "~@14 g#5 a5", B: "~ g#5@12 c#5@3", C: "[~ c#5@41 f#5@3 g#5@16 a5@29 g#5@3 b5@3]/6",
  D: "a5@6 g#5@2 f#5@3 e5@3 d5@2", E: "d5", F: "c#5@13 ~ c#5@2",
  G: "[e5@3 d5@2 c#5@3 b4@3 a4@3 g#4@5 f#4@2 g#4@3 a4@3 b4@3 a4@2]/2", H: "g#4@15 ~", I: "a4@13 g#4@3",
  J: "f#4@3 g#4@2 a4@3 c#5@3 b4@2 a4@3", K: "a5@3 g#5@3 f#5@2 b5@3 a5@3 g#5@2", L: "f#5/4", M: "[f#5@27 ~@5]/2",
})).s("gm_violin").gain(0.32).pan(0.4)

// other · oboe
const oboe = note(`<
  ~@31 A@2 B C D E F G H I J K L M N O P Q R S T U V@2 W Q R X Y Z V@2 AA@2 ~@2 AB@2 ~@20 R S T U V@2 W Q R X Y Z V@2
  AA@2 ~@2 AB@2 ~@19 I J K L M N O P ~@3 AC ~@2 AD AE AF AG Q R S T U V@2 W Q R X Y Z V@2 W Q R S T U V@2 W Q R X Y Z
  V@2 W Q R S T U V@2 W Q R X Y Z V@2 ~
>`.pickRestart({
  A: "[~@8 e4 ~ f#4 ~ e4 ~ f#4@6 e4 ~@5 e4 ~ f#4 ~ e4 ~]/2", B: "f#4@4 e4 ~@7 f#4 ~ g#4 ~",
  C: "a4 ~ g#4 ~ f#4 ~ g#4 ~ a4 ~ g#4 ~ g#4@4", D: "f#4@4 e4 ~ e4 ~ e4@2 f#4 ~ e4 ~ f#4@2",
  E: "~@8 e4@2 f#4 ~ e4 ~ f#4@2", F: "~@8 e4@2 f#4 ~ e4@2 f#4@2", G: "~@2 c#4@2 ~@2 e4@4 f#4@2 ~@2 a4 ~",
  H: "g#4 ~ g#4@3 ~ a4 g#4 f#4@5 ~@3", I: "~@10 e4 ~@2 f#4 e4 ~", J: "f#4@3 ~ e4@2 f#4@5 ~@5",
  K: "~@8 e4@2 ~ f#4@2 e4 ~@2", L: "f#4@5 ~@7 g#3 ~ g#4@2", M: "~@2 a4@2 ~@2 a4@3 ~ g#4@3 ~@3",
  N: "~@8 e4@3 ~ e4 ~ c#5@2", O: "~@2 g#4@2 ~@2 f#4@4 e4 ~@3 c#5@2", P: "~@2 g#4@3 ~ f#4@4 e4 ~ f#4@2 e4 ~",
  Q: "f#4@3 ~ g#4@2 ~@10", R: "b4@2 a4@2 ~@2 g#4@2 ~@2 f#4@2 ~@2 e4 ~", S: "f#4@4 g#4@3 ~@9",
  T: "b4@2 a4@2 ~@2 g#4@2 ~@2 e4 ~ f#4@2 ~@2", U: "f#4@4 e4@7 f#4@3 ~@2", V: "[~@8 c#4@3 ~ e4 ~ f#4@6 g#4@2 ~@10]/2",
  W: "~@10 e4 ~ f#4@2 e4 ~", X: "f#4@4 g#4@2 ~@8 e4 ~", Y: "b4 ~ b4@2 ~@2 b4 ~@3 b4 ~ c#5@2 ~@2",
  Z: "f#4@4 e4@7 f#4 ~@4", AA: "[~@8 c#4@2 ~@2 e4 ~ f#4@6 e4 ~@11]/2", AB: "[~@8 b4@3 ~ e4 ~ f#4@6 g#4 ~@11]/2",
  AC: "~@2 g4 ~@3 f#4@4 e4 ~@5", AD: "~@4 g#4 ~ g#4@2 ~@2 g#4@3 ~ c#5@2", AE: "~@2 g#4@3 ~ f#4@3 ~ e4@2 ~@2 c#5@2",
  AF: "~@2 g#4@3 ~ f#4@3 ~ e4 ~ f#4@2 e4 ~", AG: "c#5 ~@3 g#4@2 f#4@2 ~@2 e4 ~ f#4@2 e4 ~",
})).s("gm_oboe").gain(0.32)

// other · pad halo
const pad_halo = note(`<
  ~@48
  [g#4 ~@3 g#4 ~@3 g#4 ~@3 g#4 ~@3]!16
  [f#4 ~@3 f#4 ~@3 f#4 ~@3 f#4 ~@3]!6
  ~@18
  [g#4 ~@3 g#4 ~@3 g#4 ~@3 g#4 ~@3]!16
  [f#4 ~@3 f#4 ~@3 f#4 ~@3 f#4 ~@3]!6
  ~@84
>`).s("gm_pad_halo").gain(0.08).pan(0.7)

// other · pad halo · soft notes
const pad_halo_soft = note(`<
  ~@70
  [f#4 ~@3 f#4 ~@3 f#4 ~@3 f#4 ~@3]
  [f#4 ~@3 f#4 ~@11]
  ~@38
  [f#4 ~@3 f#4 ~@3 f#4 ~@3 f#4 ~@3]
  [f#4 ~@3 f#4 ~@11]
  ~@82
>`).s("gm_pad_halo").gain(0.05).pan(0.7)

// other · glockenspiel
const glockenspiel = note("<~@8 A ~@23 B ~@31 C ~@39 D ~@89>".pickRestart({
  A: "~@8 b6 ~@7", B: "b6 ~@15", C: "~@8 c#6 ~@7", D: "~@8 b5 ~@7",
})).s("gm_glockenspiel").gain(0.29).pan(0.8)

// other · trumpet
const trumpet = note("<~@153 A ~@7 B ~@8 C D@2 E F G H@2 I J K L M N O P Q R S ~@5>".pickRestart({
  A: "f#4 ~@3 e4@6 f#4@3 ~@3", B: "f#4 ~ e4 ~ e4@6 f#4@2 ~@4", C: "e4 ~ e4 ~ e4@3 d#4@5 c#4@2 ~@2",
  D: "[~@12 g#4 f#4 e4 f#4@5 ~ c#4 ~@2 c#4 ~ d#4 ~ e4@2 ~@2]/2", E: "f#4 ~ f#4@2 ~@2 b3@2 ~@6 d#4@2",
  F: "~ e4@6 ~ e4@2 ~@6", G: "~@8 g#4 ~ f#4@2 e4@3 ~", H: "[~@8 c#4 ~ d#4@2 e4@2 f#4@6 c#4@2 ~@10]/2",
  I: "~@7 e4 ~@2 e4 ~ d#4 ~ c#4 ~", J: "b3@3 ~@9 g#4 ~ e4 ~, ~@13 f#4@2 ~", K: "d#4@4 c#4@2 ~@4 c#4 ~ d#4 ~ e4 ~",
  L: "f#4@2 ~ f#4@2 ~@9 c#4 ~", M: "e4 ~ f#4 ~ a4 ~ g#4 ~ f#4 ~ f#4!2 ~@4", N: "~@10 e4 ~ g#4 ~ a4 ~",
  O: "b4@5 g#4 ~ f#4 ~ e4@2 ~@5", P: "~@11 e4 f#4 ~@2 g#4", Q: "~ b4@6 ~ g#4 ~ f#4 ~ e4@2 ~@2",
  R: "~@10 e4 f#4 ~ g#4 ~@2", S: "b4@6 g#4 ~@2 f#4 ~ g#4!2 ~@3",
})).s("gm_trumpet").gain(0.26)

// drums · kick
const kick = s("bd").struct(`<
  A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A
  C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B
  A C A B A C A B A C A B A C A B A C A B A C A B A C A B A B A C A B A C A B A C A B A C A B A C A B A C A B A C A B A
  C A B A C A B A C A B A C A B A ~
>`.pickRestart({
  A: "x!2 ~@2", B: "x!3 ~@4 x", C: "x ~ x ~@4 x",
})).gain(0.63)

// drums · snare
const snare = s("sd").struct("<[~ x]!193 ~>").gain(0.63)

// drums · hihat
const hihat = s("hh").struct("<[x!4]!193 ~>").gain(0.49)

// drums · tambourine
const tambourine = s("tb").struct(`<
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B
  A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A B A
  B A B A B A B A B A B A B A B A ~
>`.pickRestart({
  A: "~@4 x!4", B: "x!2 ~@6",
})).gain(0.35)

// drums · tambourine · soft notes
const tambourine_soft = s("tb").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~@2
>`.pickRestart({
  A: "~@2 x!3 ~@3",
})).gain(0.14)

// drums · crash
const crash = s("cr").struct("<A ~@47 A ~@23 A ~@15 A ~@7 A ~@15 A ~@33 A ~@15 A ~@15 A ~@15>".pickRestart({
  A: "x",
})).gain(0.28)

// drums · bongos
const bongos = s("bongo:4").struct(`<
  A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~ A ~@3 A ~@3 A
  ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3 A ~@3
>`.pickRestart({
  A: "~ x ~@6",
})).gain(1.11)

// drums · triangle
const triangle = s("triangles:30").struct(`<
  ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~
  A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A ~ A
// … 20 more lines