Strudelify

Stars

Simply Red

KeyB minorTempo104 bpm
0:00/0:00
// Stars — Simply Red
// 104 bpm, 4/4, key B minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: pitch bends are ignored
// note: Full arrangement: all 107 bars on a 16-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
// note: Guitar parts that double another keep only their own notes (fills, solos): guitar program 28.
setcpm(104/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 · piano
const piano = note(`<
  ~ A B C D B@2 C E F E G H F I J H F E G H F I J H F K L H F K L M B@2 C E F E G H F I J H F E G H F I J H F K L H F K
  L N B@2 C E A B C D B@2 C E F E G H F I J H F E G H F I J H F K L H F K L N F K L H F K L O@3
>`.pickRestart({
  A: "g2@5 ~ g2@6 g2@3 ~", B: "g2@5 ~ g2@5 ~ g2@3 ~", C: "b2@5 ~ b2@6 b2@3 ~", D: "b2@5 ~ b2@5 ~ b2@3 ~", E: "b2",
  F: "g2", G: "a2@3 a2@5", H: "b2@5 ~ b2@10", I: "b2@3 b2@5", J: "a2@5 ~ a2@10", K: "f#2", L: "a2", M: "b2@7 ~ b2@7 ~",
  N: "b2@7 ~ b2@6 ~@2", O: "[b2@11 ~@5]/3",
})).s("gm_piano").gain(0.45).pan(0.3)

// chords · piano
const piano_2 = note(`<
  ~ A B C D E F G H I J K L M N O P I J K L M N O P Q J R S Q J R S E F G H I J K L M N O P I J K L M N O P Q J R S Q J
  R S E F G H A B C D E F G H I J K L M N O P I J K L M N O P Q J R S Q J R S Q J R S Q J R T@2 ~
>`.pickRestart({
  A: "[b3,d4,g4]@5 ~ [b3,d4,g4]@5 ~ [b3,d4,g4]@3 ~", B: "[b3,d4,g4]@5 ~ [d4,g4,b4]@5 ~ [d4,g4,b4]@2 ~@2",
  C: "[a3,e4,f#4,b4]@4 ~@2 [a3,e4,f#4,b4]@5 ~ [a3,e4,f#4,b4]@3 ~", // Asus2
  D: "[a3,d#4,f#4,b4]@4 ~@2 [a3,d#4,f#4,b4]@5 ~ [a3,d#4,f#4,b4]@2 ~@2", // B7
  E: "[b3,d4,g4]@4 ~@2 [b3,d4,g4]@5 ~ [b3,d4,g4]@2 ~@2", F: "[b3,d4,g4]@2 ~ [d4,g4,b4]@2 ~ [d4,g4,b4] ~",
  G: "[a3,e4,f#4,b4]@4 ~@2 [a3,e4,f#4,b4]@5 ~ [a3,e4,f#4,b4]@2 ~@2", H: "[a3,d#4,f#4,b4]@15 ~", I: "[b3,d4,g4]@15 ~",
  J: "[a3,d4,f#4]", K: "[g3,c4,e4]@3 [g3,c4,e4,a4]@5", L: "[a3,b3,e4,f#4]@5 ~ [a3,b3,d#4,f#4]@9 ~",
  M: "[g3,b3,d4]@15 ~", N: "[a3,d4,f#4]@5 ~ [a3,d4,f#4]@10", O: "[g3,c4,e4]@6 [g3,c4,e4]@9 ~",
  P: "[a3,b3,e4,f#4]@3 [a3,b3,d#4,f#4]@5", Q: "[b3,d4,g4]", R: "[g3,c4,e4]", S: "[a3,b3,e4,f#4] [a3,b3,d#4,f#4]",
  T: "[a3,b3,e4,f#4]/2", // Asus2
})).s("gm_piano").gain(0.3).pan(0.7)

// bass · synth bass 2
const bass = note(`<
  ~ A B C D A B C E F G H I J K L M N O P Q R S T U V W X Y V W X Z A B C Z F G H I J K L M N O P Q R S T U V W X Y V W
  X Z AA@2 ~ AB A B C D A B C AC F G H I J K L M N O P Q R S T AD V W X Y V W X AE V W X Y V W X AF@2 ~
>`.pickRestart({
  A: "g1@2 g1!2 ~@2 g1@4 g1@2 f#2 g2 d2 b1", B: "g1@2 g1!2 ~@2 g1@4 g1@2 f#2 g2 d2 g1",
  C: "b1@2 b1!2 ~@2 b1@4 b1@2 a2 b2 f#2 d2", D: "b1@2 b1 b1@3 e2 f#2 a2 b2 d3 b2 a2 f#2 e2 d2", E: "b1@11 ~ b2@3 ~",
  F: "g1@3 g1@2 g1 ~ g1", G: "b1@5 ~ b1@4 b1@2 ~@2 b1@2", H: "a1@2 a1@2 e2 ~ a2@4 e2@2 a1@2 a#1@2",
  I: "b1@5 ~ b1@4 a1@2 b1@4", J: "g1@5 ~ g1@4 g1@2 ~@2 g1@2", K: "b1@3 b1@2 b1 ~ b1",
  L: "a1 ~ a1@3 ~ a2@4 e2@2 a1@2 a#1@2", M: "b1@2 b1@2 a1@2 b1@3 ~ b1@2 a1@4", N: "g1@6 g1@4 g1@3 ~ g1@2",
  O: "b1@6 b1@3 ~ b1@3 ~ b1@2", P: "a1 ~ a1@3 ~ a1@3 ~ a1@4 a#1@2", Q: "b1@5 ~ b1@3 ~ b1@2 a1@3 ~",
  R: "g1@5 ~ g1@4 g1@4 g1@2", S: "b1@3 b1@2 b1@2 b1", T: "a1@3 a1@2 g1 a1 a#1", U: "b1 ~ b1@3 ~ b1@3 ~ b1@2 a1@4",
  V: "g1 ~ g1@4 g1@4 g1@3 ~ g1@2", W: "f#1 ~ f#1@2 g1 ~ g#1@2 a1 ~ b1@5 ~", X: "a1 ~ a1@3 ~ a1@7 ~ a1 a#1",
  Y: "b1@6 b1@3 ~ b1@2 a1@4", Z: "b1", AA: "g1/2", AB: "~@6 f#2 g2 a2 b2 d3 b2 a2 g2 e2 d2", AC: "b1@11 ~ b1@3 ~",
  AD: "b1 ~ b1@3 ~ b1@3 ~ b1@2 a1 g1@2 ~", AE: "b1 ~ b1@3 ~ b1@3 ~ g1 a1 b1 g1 a1 g1", AF: "b1/2",
})).s("gm_synth_bass_2").gain(0.45)

// chords · piano
const piano_3 = note(`<
  ~ A B C D B@2 E F G H I J K L M N G H I J K L M N O H P Q R H P Q B@2 E F G H I J K L M N G H I J K L M N R H P Q R H
  P Q B@2 E F A B C D B@2 E F G H I J K L M N G H I J K L M N R H P Q R H P Q R H P Q R H P S@2 ~
>`.pickRestart({
  A: "a4@3 g4@3 b4@3 g4@2 ~ g4@4", B: "a4@3 g4@3 b4@3 g4@3 g4@4", C: "a4@2 e4 a4@3 a4@2 e4 a4@3 a4@4", D: "f#4@3 f#4",
  E: "a4@2 e4 a4@2 ~ a4@2 e4 a4@2 ~ a4@4", F: "[b3,d#4,f#4]", G: "[b3,d4,g4]@15 ~", H: "[a3,d4,f#4]",
  I: "[g3,c4,e4]@3 [g3,c4,e4,a4]@5", J: "[a3,b3,e4,f#4]@5 ~ [a3,b3,d#4,f#4]@9 ~", K: "[g3,b3,d4]@15 ~",
  L: "[a3,d4,f#4]@5 ~ [a3,d4,f#4]@10", M: "~@6 g4@9 ~, ~@2 a3@13 ~, ~@4 c4@11 ~", N: "[b3,e4,f#4]@3 [b3,d#4,f#4]@5",
  O: "[b3,d4,g4]@8 [b3,d4,g4]@3 ~ [b3,d4,g4]@3 ~", P: "[g3,c4,e4]", Q: "[a3,b3,e4,f#4]@8 [a3,b3,d#4,f#4]@7 ~",
  R: "[b3,d4,g4]", S: "[a3,b3,e4,f#4]/2",
})).s("gm_piano").gain(0.25).pan(0.1)

// chords · piano
const piano_4 = note("<~ A@2 B C A@2 B D ~@24 A@2 B D ~@24 A@2 B D A@2 B C A@2 B D ~@34>".pickRestart({
  A: "[b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~ [b3,d4,g4] ~", // G
  B: "[b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~ [b3,e4,f#4] ~", // Bsus4
  C: "[a3,d#4,f#4] ~ [a3,d#4,f#4] ~ [a3,d#4,f#4] ~ [a3,d#4,f#4] ~ [a3,d#4,f#4] ~ [a3,d#4,f#4] ~ [a3,d#4,f#4] ~ [a3,d#4,f#4] ~", // D#dim
  D: "[a3,d#4,f#4]", // D#dim
})).s("gm_piano").gain(0.25).pan(1)

// other · electric guitar muted
const electric_guitar_muted = note(`<
  ~@16 A ~ B C D E B C F ~@19 A E B C D ~ B C F ~@27 A ~ B C D E B C F ~@18
>`.pickRestart({
  A: "~@14 d4 e4", B: "~@14 c4 ~", C: "~@2 f#4 ~@13", D: "~@6 d#4!2 ~@6 d4 e4", E: "~@2 a4 ~@13", F: "~@6 d#4@9 ~",
})).s("gm_electric_guitar_muted").gain(0.3).pan(0.1)

// chords · electric guitar clean
const electric_guitar_clean = note(`<
  ~@17 A B C D A B C D E F G H E F G ~@13 A B C D A B C D E F G H E F G ~@21 A B C D A B C D E F G H E F G H E F G H E F
  G ~@3
>`.pickRestart({
  A: "[g4,b4,d5] ~ [g4,b4,d5]!3 ~ [g4,b4,d5]!3 ~ [g4,b4,d5]!3 ~ [g4,b4,d5]!2", // G
  B: "[f#4,a4,d5] ~ [f#4,a4,d5]!3 ~ [f#4,a4,d5]!3 ~ [f#4,a4,d5]!3 ~ [f#4,a4,d5]!2", // D
  C: "[e4,g4,c5] ~ [e4,g4,c5]!3 ~ [e4,g4,c5]!3 ~ [e4,g4,c5]!3 ~ [e4,g4,c5]!2", // C
  D: "[e4,f#4,b4] ~ [e4,f#4,b4]!3 ~ [e4,f#4,b4]!2 [d#4,f#4,b4] ~ [d#4,f#4,b4]!3 ~ [d#4,f#4,b4]!2", // Esus2 B
  E: "[g4,b4,d5] ~ [g4,b4,d5]!3 ~ [g4,b4,d5]!7 ~ [g4,b4,d5]!2", // G
  F: "[f#4,a4,d5] ~ [f#4,a4,d5]!3 ~ [f#4,a4,d5]!7 ~ [f#4,a4,d5]!2", // D
  G: "[e4,g4,c5] ~ [e4,g4,c5]!3 ~ [e4,g4,c5]!7 ~ [e4,g4,c5]!2", // C
  H: "[e4,f#4,b4] ~ [e4,f#4,b4]!3 ~ [e4,f#4,b4]!2 [d#4,f#4,b4]!5 ~ [d#4,f#4,b4]!2", // Esus2 B
})).s("gm_electric_guitar_clean").gain(0.25).pan(0.9)

// chords · acoustic guitar nylon
const acoustic_guitar_nylon = note("<A B@2 C@2 D@2 E@2 ~@55 A B@2 C@2 D@2 E@2 ~@34>".pickRestart({
  A: "~@15 g4", B: "[a4@3 ~@3 a4@4 g4@21 d4, ~@3 d5@28 ~]/2", C: "[f#4@3 ~@3 f#4@24 ~ g4, ~@3 b4@27 ~@2]/2",
  D: "[a4@3 ~@3 a4@4 g4@20 ~ d4, ~@3 d5@27 ~@2]/2", E: "[f#4@3 ~@3 f#4@26, ~@3 b4@29]/2",
})).s("gm_acoustic_guitar_nylon").gain(0.35)

// other · pad sweep
const pad_sweep = note(`<
  ~@17 A B C D A B E D A B C F A B C ~@13 A B C D A B E D A B C F A B C ~@13 A B C D A G H D A B C D A B E D A B C F A B
  C ~ A B C F A B C ~@3
>`.pickRestart({
  A: "d5", B: "f#5", C: "e5", D: "e5@3 d#5@5", E: "e5@15 ~", F: "e5@7 ~ d#5@7 ~", G: "f#5@3 a5@5", H: "g5",
})).s("gm_pad_sweep").gain(0.2)

// drums · kick
const kick = s("bd").struct("<A B@31 C B@26 ~@2 C D C D B@7 E B@7 E B@7 E B@7 E B@7 C ~@2>".pickRestart({
  A: "~@13 x ~@2", B: "x ~@2 x ~ x ~@2", C: "x", D: "~@3 x", E: "x ~@5 x ~@2 x!2 ~@5",
})).gain(0.4)

// drums · snare
const snare = s("sd").struct(`<
  A B C B C B C B D B@7 E B@7 E B@7 ~ B C B F B@7 E B@7 G B@7 ~ H ~@3 B C B C B C B I B@7 E B@7 G B@7 E B@7 ~@3
>`.pickRestart({
  A: "~@11 x!4 ~", B: "~ x ~ x", C: "~@3 x!2 ~@7 x ~@3", D: "~@3 x ~@12", E: "~@4 x ~@7 x ~@2 x", F: "~@3 x ~@8 x ~@3",
  G: "~@4 x ~@5 x!3 ~@3", H: "x", I: "~@3 x ~@8 x ~@2 x",
})).gain(0.45)

// drums · low tom
const low_tom = s("lt").struct("<A ~@61 B ~ B ~@7 C ~@15 D ~@18>".pickRestart({
  A: "~@7 x", B: "~@3 x", C: "~@3 x ~@4", D: "~@13 x ~@2",
})).gain(0.45)

// drums · hihat
const hihat = s("hh").struct(`<
  A B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B D B C B C B C B C B C B C B C B C B C B C B C B C B C
  B D ~@3 E B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B C B ~@3
>`.pickRestart({
  A: "~@7 x", B: "x!8", C: "x!5 ~ x!2", D: "x", E: "~@10 x!3 ~ x ~",
})).gain(0.3)

// drums · mid tom
const mid_tom = s("mt").struct("<A ~@61 B ~ B ~@7 C ~@15 B ~@18>".pickRestart({
  A: "~@13 x ~@2", B: "~@3 x", C: "~@5 x ~@10",
})).gain(0.45)

// drums · open hat
const open_hat = s("oh").struct(`<
  A ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@3 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B
  ~@7 B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~ B ~@4
>`.pickRestart({
  A: "~@13 x ~@2", B: "~@5 x ~@2",
})).gain(0.45)

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

// drums · high tom
const high_tom = s("ht").struct("<[~@3 x] ~@71 [~ x ~@2] ~@34>").gain(0.45)

// drums · ride bell
const ride_bell = s("rd").struct("<~@44 [~@13 x!2 ~] ~@62>").gain(0.45)

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

// drums · congas
const congas = s("conga:18").struct("<~ A@7 ~ A@23 ~ A@3 ~ A@3 ~ A@7 ~ A@7 ~ A@3 ~@5 A@7 ~ A@31 ~@3>".pickRestart({
  A: "~@2 x!2 ~@3 x ~ x ~@6",
})).gain(0.95)

// drums · congas
const congas_2 = s("conga:33").struct("<~ A@7 ~ A@23 ~ A@3 ~ A@3 ~ A@7 ~ A@7 ~ A@3 ~@5 A@7 ~ A@31 ~@3>".pickRestart({
  A: "~@2 x!2 ~ x ~@2",
})).gain(0.95)

// drums · cabasa
const cabasa = s("cabasa:4").struct(`<
  ~ A B C D C@2 E ~ B F C G C@2 H C@2 I C J C G C@4 H G J C G K J C E K G C@3 G J C E C@2 I C J G L G C J@2 C@3 J K ~@4
  C@4 E G C ~ C@2 H E G C@3 E@2 C H E C E C@4 J C J@2 B C M H@2 C@2 H ~@3
>`.pickRestart({
  A: "~@2 x!2 ~@2 x!3 ~ x!3 ~ x!2", B: "~@2 x!3 ~ x!3 ~ x!2 ~@2 x!2", C: "x ~ x!3 ~ x!3 ~ x!3 ~ x!2",
  D: "x ~ x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2", E: "x ~ x!3 ~ x!2 ~@2 x!3 ~ x!2", F: "x ~ x!2 ~@2 x!2 ~@2 x!3 ~ x!2",
  G: "x ~ x!2 ~@2 x!3 ~ x!3 ~ x!2", H: "~@2 x!3 ~ x!3 ~ x!3 ~ x!2", I: "~@2 x!2 ~@2 x!2 ~@2 x!3 ~ x!2",
  J: "x ~ x!3 ~ x!3 ~ x!2 ~@2 x!2", K: "x", L: "~@2 x!3 ~ x!2 ~@2 x!3 ~ x!2", M: "x ~ x!2 ~@2 x!3 ~ x!2 ~@2 x!2",
})).gain(1.01)

// drums · cabasa · soft notes
const cabasa_soft = s("cabasa:4").struct(`<
  ~ A B ~ C ~@2 D E B F ~ G ~@2 E ~@2 H ~ I ~ G ~@4 E G I ~ G ~ I ~ D ~ G ~@3 G I ~ D ~@2 H ~ I G J G ~ I@2 ~@3 I ~@9 D
  G ~ E ~@2 E D G ~@3 D@2 ~ E D ~ D ~@4 I ~ I@2 B ~ K E@2 ~@2 E ~@3
>`.pickRestart({
  A: "x!2 ~@2", B: "x ~@2 x", C: "~ x!3", D: "~ x", E: "x", F: "~ x!2 ~", G: "~ x ~@2", H: "x!3 ~", I: "~@3 x",
  J: "x!2", K: "~ x ~ x",
// … 12 more lines

More by Simply Red