Strudelify
KeyG majorTempo120 bpm
0:00/0:00
// amazing grace — for Flute Choir by Marissa Hoisington
// 120 bpm, 3/4, key G major. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: Transcription provider: pdmx. https://musescore.com/score/2052011; license: https://creativecommons.org/publicdomain/mark/1.0/
// note: Full arrangement: all 21 bars on a 16-step grid, each part at one level. Source detail keeps the original performance.
setcpm(120/3)

// Notation: c3@3 lasts 3 steps · ~ is a rest · [c3,e3] is a chord · [...]/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 · flute
const flute = note("<~@4 A B C D E B C F@2 G H I E B C J@2>".pickRestart({
  A: "d5@10 ~ d4@5", B: "g4@10 ~ b4@2 g4@3", C: "b4@10 ~ a4@5", D: "g4@10 ~ e4@5", E: "d4@10 ~ d4@5",
  F: "[d5@25 ~@2 b4@5]/2", G: "d5@8 b4@3 d5@2 b4@3", H: "g4@10 ~ d4@5", I: "e4@8 g4@3 g4@2 e4@3", J: "[g4@15 ~]/2",
})).s("gm_flute").gain(0.4)

// other · flute
const flute_2 = note("<~@4 A B C D E F G H I J K L M N O P Q>".pickRestart({
  A: "b4@5 ~@3", B: "b4@5 b4@5 ~ d5@5", C: "d5@5 [d5,f#5]@5 ~ [d5,f#5]@5", D: "e5@5 c5@5 ~ c5@5",
  E: "g4@5 g5@3 a5@3 g5@2 f#5@3", F: "e5@10 ~ g5@5", G: "[e5,g5]@5 [e5,g5]@5 ~ [e5,g5]@5", H: "g5@5 [e5,c6]@5 ~@6",
  I: "f#5@5 [c5,a5]@5 ~@6", J: "b5@5 b5@5 ~ g5@5", K: "d5@5 d5@5 ~ f#5@5", L: "g5@5 g5@5 ~ c5@5", M: "b4@5 b4@5 ~ g4@5",
  N: "g4@5 e4@5 ~ g4@5", O: "g4@5 g4@5 ~ a4@5", P: "b4@5 d5@5 ~ g5@5", Q: "[b4,f#5]@5 [b4,g5]@10 ~",
})).s("gm_flute").gain(0.25)

// other · flute
const flute_3 = note("<~@4 A B C D E F G H I J K L M N O P Q>".pickRestart({
  A: "g4@5 ~@3", B: "g4@5 g4@5 ~ b4@5", C: "g4@5 a4@5 ~ b4@5", D: "a4@5 e5@5 ~ g5@5", E: "g5@5 g5@5 ~ f#5@5",
  F: "e4@3 b4@2 c5@3 d5@3 e5@5", G: "a5@5 b5@5 ~ a5@5", H: "a5@5 a5@5 ~ d5@5", I: "a5@5 f#5@5 ~@6",
  J: "g5@5 d5@5 ~ d5@5", K: "f5@5 f5@5 ~ g5@5", L: "c5@5 e5@5 ~ g5@5", M: "g5@5 g5@5 ~ e5@2 d5@3",
  N: "e5@5 g5@5 ~ b5@5", O: "d5@5 d5@5 ~ d5@5", P: "g5@5 d5@5 ~ b4@5", Q: "g4@5 g4@10 ~",
})).s("gm_flute").gain(0.25)

stack(flute, flute_2, flute_3)