Strudelify

amazing grace

John Newton

KeyD majorTempo66 bpm
0:00/0:00
// amazing grace — John Newton
// 66 bpm, 3/4, key D major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Tempo changes preserved in elapsed time; displayed bars use the dominant tempo.
// note: metre changes (1/4 at bar 1, 3/4 at bar 2, 4/4 at bar 47, 3/4 at bar 50, ...) are rendered on a constant 3/4 grid of one bar per cycle
// note: Transcription provider: pdmx. https://musescore.com/score/1954541; license: https://creativecommons.org/publicdomain/zero/1.0/
// note: Full arrangement: all 55 bars on a 32-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(66/3)

// 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 · trumpet · "Bb Trumpet"
const trumpet = note("<~@32 A@8 B@2 C@2 D E ~@9>".pickRestart({
  A: "[~@21 a4@3 b4@3 ~ d5@3 d5@20 f#5@5 g5 d5@3 f#5@20 f#5@3 e5@3 d5@3 ~ d5@19 b4@7 ~ a4@2 a4@20 a4@3 b4@3 d5@3 d5@20 f#5@5 g5 d5@4 f#5@19 e5@10 a5@29 ~@20]/8",
  B: "[~ f#5@7 a5@2 ~ a5@15 f#5@5 a5@5 f#5@5 d5@3 e5@3 ~ f#5@13 ~@3]/2",
  C: "[~@2 a4@5 b4@5 d5@15 d5@10 f#5@3 ~ e5@3 d5@13 ~ a4@3 b4@3]/2", D: "d5@3 ~ d5@20 f#5@6 d5@2",
  E: "~@2 f#5@20 e5@7 d5@3",
})).s("gm_trumpet").gain(0.67)

// other · trumpet · "Bb Trumpet" · soft notes
const trumpet_soft = note("<~@17 A@2 B A@4 C ~@4 B D A E ~@13 F@3 G@6>".pickRestart({
  A: "~@11 g4@10 g4@11", B: "~@11 a4@10 a4@11", C: "d5@5 ~@6 d5@5 ~@5 d5@11", D: "~@11 g4@10 f4@11",
  E: "a4@11 b4@10 ~@11", F: "[d5@30 d5@43 ~@23]/3",
  G: "[~@16 a4@3 b4@5 ~ d5@16 f#5@3 e5@4 d5@3 f#5@21 ~ f#5@4 e5@3 d5@4 d5@105 ~@3]/6",
})).s("gm_trumpet").gain(0.27)

// other · trumpet · "B♭ Trumpet"
const trumpet_2 = note("<~@32 A@8 B@4 C D ~@9>".pickRestart({
  A: "[~@21 a4@3 b4@3 ~ d5@3 d5@20 f#5@5 g5 d5@3 f#5@20 f#5@3 e5@3 d5@3 ~ d5@19 b4@7 ~ a4@2 a4@20 a4@3 b4@3 d5@3 d5@20 f#5@5 g5 d5@4 f#5@19 e5@10 a5@29 ~@20]/8",
  B: "[~ f#5@7 a5@2 ~ a5@15 f#5@5 a5@5 f#5@5 d5@3 e5@3 ~@4 d4@3 e4@3 ~@9 a4@5 b4@5 d5@15 d5@10 f#5@3 ~ e5@3 d5@13 ~ a4@3 b4@3, ~@41 [d4,f#4]@10 ~@7 f#4@13 g4@30 ~@27, ~@48 f#5@13 ~@67]/4", // D
  C: "d5@3 ~ d5@20 f#5@6 d5@2", D: "~@2 f#5@20 e5@7 d5@3",
})).s("gm_trumpet").gain(0.55)

// other · trumpet · "B♭ Trumpet" · soft notes
const trumpet_soft_2 = note("<~@32 A ~@13 B@3 ~@6>".pickRestart({
  A: "a4@11 b4@10 ~@11", B: "[d5@30 d5@43 ~@23]/3",
})).s("gm_trumpet").gain(0.33)

// other · trumpet · "Bb Trumpet"
const trumpet_3 = note("<~@17 A@2 B A@3 C D E F G F A H A I@8 J@5 K L@3 M@6>".pickRestart({
  A: "~@11 e4@10 e4@11", B: "~@11 f4@10 f4@11", C: "~@11 d4@10 d4@11", D: "g4@5 d4@5 ~ g4@5 d4@5 g4@11",
  E: "e4@11 e4@21", F: "e4", G: "f4", H: "~@11 e4@10 d4@11",
  I: "[a3@11 b3@10 c#4@10 f#4@29 a4@29 ~ g4@19 g4@7 ~ f#4@2 f#4@29 d4@29 ~ a4@29 c#5@29 ~@20]/8",
  J: "[~@11 a4@30 f#4@10 d4@3 e4@3 ~ f#4@13 b4@20 b4@10 a4@20 ~ a4@10 b4@20 b4@6 a4@2]/5", K: "~ a4@10 a4@5",
  L: "[b4@10 d5@10 a4@10 g4@11 b4@32 ~@23]/3", M: "[~@19 g#4@32 g4@33 g4@51 f#4@54 ~@3]/6",
})).s("gm_trumpet").gain(0.24)

// other · trumpet · "Bb Trumpet"
const trumpet_4 = note("<~@17 A@6 B C D E F G A H A I@8 J@5 K L@3 M@6>".pickRestart({
  A: "~@11 c4@10 c4@11", B: "~@11 b3@10 b3@11", C: "d4@5 d4@5 ~ d4@5 d4@5 d4@11", D: "c4@11 c4@21", E: "a#3",
  F: "a3@21 a3@5 ~ b3@5", G: "c4", H: "~@11 c4@10 b3@11",
  I: "[a3@11 b3@10 c#4@10 d4@29 c#4@29 ~ b3@29 d4@29 d4@29 ~ d4@29 e4@29 ~@20]/8",
  J: "[~@11 d4@30 d4@10 d4@3 e4@3 ~ f#4@13 g4@30 f#4@20 ~ f#4@10 g4@20 g4@6 f#4@2]/5", K: "~ d4@10 c#4@5",
  L: "[d4@10 d4@10 d4@10 g4@43 ~@23]/3", M: "[~@19 e4@32 d4@33 d4@105 ~@3]/6",
})).s("gm_trumpet").gain(0.24)

// other · french horn · "F Mellophone"
const french_horn = note("<~@32 A@8 B@5 C ~@9>".pickRestart({
  A: "[~@11 b3@10 c#4@10 f#4@15 d4@5 f#4@5 d4@4 f#4@15 d4@5 f#4@5 d4@5 g4@14 d4@5 g4@5 a4@5 f#4@15 d4@5 f#4@5 d4@4 a4@20 [d4,a4]@10 [d4,d5]@29 [c#4,c#5]@29 ~@20]/8", // D5 D C#
  B: "[~ c#5@10 d5@20 d5@10 c#5@20 c5@10 b4@20 b4@10 d5@20 ~ c#5@10 b4@20 b4@8]/5", C: "~ a4@10 a4@5",
})).s("gm_french_horn").gain(0.8)

// other · french horn · "F Mellophone" · soft notes
const french_horn_soft = note("<~@25 A B C D E F E G ~@13 H@7 I@2>".pickRestart({
  A: "~@11 a4@10 b4@11", B: "c5@21 ~@6 g4@5", C: "a4@5 c5@16 a4@5 ~ g4@5", D: "g4@21 g4@11", E: "c4", F: "e4@21 d4@11",
  G: "a3@11 ~@21", H: "[b4@30 b4@43 ~@10 d4@32 g#3@32 g3@33 ~@11 g3@12 ~ a3@13 b3@7]/7", I: "[~@7 a3@54 ~@3]/2",
})).s("gm_french_horn").gain(0.48)

// other · french horn · "Horn in F"
const french_horn_2 = note("<~@32 A@8 B@5 C D ~@8>".pickRestart({
  A: "[~@31 f#4@15 d4@5 f#4@5 d4@4 f#4@15 d4@5 f#4@5 d4@5 g4@14 d4@5 g4@5 a4@5 f#4@15 d4@5 f#4@5 d4@4 a4@20 a4@10 d5@29 c#5@29 ~@20]/8",
  B: "[~ c#5@10 d5@20 d5@10 c#5@20 c5@10 b4@20 b4@10 d5@20 ~ c#5@10 b4@20 b4@8]/5", C: "~ a4@10 a4@5", D: "b4@15 ~",
})).s("gm_french_horn").gain(0.8)

// other · french horn · "F Mellophone"
const french_horn_3 = note("<~@32 A@8 B@5 C D@7 E@2>".pickRestart({
  A: "[~@11 b3@10 c#4@10 d4@29 c#4@29 ~ b3@19 b3@6 ~ c#4@3 d4@29 d4@20 [d4,a4]@10 [d4,d5]@29 [c#4,c#5]@29 ~@20]/8", // D5 D C#
  B: "[~ [c#4,c#5]@10 [d4,d5]@20 [d4,d5]@10 [c#4,c#5]@20 [c4,c5]@10 g3@10 g3@5 d3@5 g3@3 ~ b3@3 c#4@3 [d4,d5]@20 ~ [e4,c#5]@10 [d4,b4]@28, ~@71 b4@20 b4@10 ~@59]/5", // C# D C# C D C#m G
  C: "~ [d4,a4]@10 [d4,a4]@5", D: "[~@10 d4@10 a3@10 g3@11 b3@32 ~@10 f#3@32 g#3@32 g3@33 ~@11 g3@12 ~ a3@13 b3@7]/7",
  E: "[~@7 a3@54 ~@3]/2",
})).s("gm_french_horn").gain(0.48)

// other · french horn · "F Mellophone" · soft notes
const french_horn_soft_2 = note("<~ A B@2 A@2 B C D B E F A F G A@3 B F A@2 B C H B E I B F J A K ~@22>".pickRestart({
  A: "g3", B: "c4", C: "b3", D: "d4", E: "a#3", F: "a3", G: "c4@21 b3@11", H: "d4@11 d4@10 d4@11",
  I: "a3@21 a3@5 ~ b3@5", J: "~@11 g3@10 f3@11", K: "a3@11 ~@21",
})).s("gm_french_horn").gain(0.24)

// other · trombone · "Euphonium"
const trombone = note("<A B C D E B F G H I J K L B C M N B C D O B F G H I P K E B C M ~@9 Q R@2 S ~@10>".pickRestart({
  A: "~@21 g3@5 ~ c4@5", B: "c4@21 e4@5 ~ c4@5", C: "e4@21 d4@5 ~ c4@5", D: "c4@21 a3@5 ~ g3@5", E: "g3@21 c4@11",
  F: "e4@21 d4@11", G: "g4", H: "~@21 e4@3 g4@8", I: "g4@16 e4@5 g4@5 ~ e4@5", J: "c4@21 ~@6 g3@5",
  K: "a3@5 c4@16 a3@5 ~ g3@5", L: "g3@21 g3@5 ~ c4@5", M: "d4@5 c4@5 ~ c4@21", N: "g3@11 c4@10 g3@3 c4@8",
  O: "g3@21 g3@3 c4@8", P: "g4@21 ~@6 g3@5", Q: "~@9 [f#3,a3]@20 d3@3",
  R: "[~ e3@3 f#3@3 g3@10 g3@5 d3@5 g3@3 ~ [b2,b3]@3 [c#3,c#4]@3 [d3,a3,d4]@20 ~@7]/2", // B C# D5
  S: "~@4 b3@10 d3@3 f#3@3 b3@3 ~ d4@8",
})).s("gm_trombone").gain(0.3)

// other · trombone · "Euphonium"
const trombone_2 = note("<~@32 A@8 B@2 C@4 D@2 E@7>".pickRestart({
  A: "[~@11 b2@10 c#3@10 a2@29 d3@20 d3@10 d3@19 d3@6 ~ d3@3 d3@20 ~@3 a2@3 b2@3 d3@29 ~ f#3@29 e3@20 e3@3 e3@3 e3@3 e3@3 ~ e3@3 e3@3 d3@3 ~ d3@3 d3@3]/8",
  B: "[~ c#3@3 c#3@3 ~ c#3@3 f#3@20 f#3@7 f#3@3 f#3@20 d3@3]/2",
  C: "[~ e3@3 f#3@3 g3@10 g3@5 d3@5 g3@3 ~ b2@3 c#3@3 [d3,a3]@20 ~ [c#3,a3]@10 [b2,g3]@10 d3@3 f#3@3 b3@3 ~ d4@30 a3@10]/4", // D5 F#m Em
  D: "[b3@10 d4@5 d4@17]/2", E: "[~@19 d3@32 e3@32 d3@33 d3@105 ~@3]/7",
})).s("gm_trombone").gain(0.35)

// other · trombone · "Euphonium" · soft notes
const trombone_soft = note("<~ A@6 B C A D A@3 E A@3 D A@2 D F@2 G F@2 H I J F K L ~@22>".pickRestart({
  A: "c3", B: "d3", C: "d3@5 ~@6 d3@5 ~@5 d3@11", D: "e3", E: "e3@21 d3@11", F: "g3", G: "g3@5 d3@5 ~ g3@5 d3@5 g3@11",
  H: "f3@21 a3@5 ~ b3@5", I: "c4", J: "a3", K: "e3@11 g3@10 e3@11", L: "a2@11 ~@21",
})).s("gm_trombone").gain(0.23)

// bass · tuba · "C Tuba"
const bass = note("<~ A@2 B A@3 C D E F G H I J K L A@2 B A@3 C D M F G H I N K O@8 P@6 Q@7 R@2>".pickRestart({
  A: "c2@5 g2@11 g2@16", B: "c2@5 a2@11 a2@16", C: "g2@5 b2@11 b2@11 g2@5", D: "g2@11 a2@10 b2@11",
  E: "c2@5 g2@11 g2@11 g2@5", F: "e2@5 c3@11 c3@16", G: "f2@5 a2@11 a2@16", H: "c2@5 g2@16 g2@5 ~ g#2@5",
  I: "a2@3 ~@2 a2@11 a2@16", J: "g2@3 ~@2 g2@16 g2@11", K: "c2", L: "g1", M: "c3@5 g2@11 g2@11 g2@5",
  N: "g2@3 ~@2 g2@11 g2@16",
  O: "[a1@11 b1@10 c#2@10 d2@20 d2@9 d2@20 d2@7 f#2@2 ~ g2@19 g2@6 ~ a2@3 d2@20 ~@3 a2@3 b2@3 d2@20 d2@10 d2@19 d2@10 a2@29 a2@10 b2@10]/8",
  P: "[~ c#3@10 d2@20 d2@7 e2@3 f#2@20 f#2@10 g2@20 ~@4 [b1,b2]@3 [c#2,c#3]@3 [d2,d3]@20 ~ c#3@10 b2@20 b2@6 c#3 a2@3 a2@20 f#2@3 g2@3 ~ a2@3]/6", // B C# D
  Q: "[b2@20 [a1,a2]@10 [g1,g2]@43 ~@10 f#2@32 e2@32 a2@33 d2@44]/7", R: "[~@7 [d1,d2]@54 ~@3]/2",
})).s("gm_tuba").gain(0.15)

stack(
  trumpet, trumpet_soft, trumpet_2, trumpet_soft_2, trumpet_3, trumpet_4, french_horn, french_horn_soft, french_horn_2,
  french_horn_3, french_horn_soft_2, trombone, trombone_2, trombone_soft, bass
)

More by John Newton