0:00/0:00
// Songbird — Kenny G
// 67 bpm, 4/4, key A 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: duplicate parts dropped: ch 15 "Sax Echo" alto sax (copy of ch 16 "Alto Sax" alto sax, 0.094 beats late)
// note: Full arrangement: all 63 bars on a 48-step grid, each part at one level; ghost notes are separate "_soft" parts. Source detail keeps the original performance.
setcpm(67/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 · "Bass"
const bass = note(`<
~@3 A B A B A B A B C D C E A F A B A B A B A B G H G E I J A B A K A B A B G H G L I J A B A B A B A B G H G E G D G
M@2 ~
>`.pickRestart({
A: "a1@15 ~", B: "g1@15 ~", C: "a1@7 ~ b1@7 ~", D: "c2@11 ~ b1@4", E: "e2@15 ~", F: "e1@11 ~ e2@4", G: "a1 b1",
H: "c2@3 b1", I: "a1", J: "e1@3 e2", K: "g1@7 ~", L: "e2@7 ~", M: "[e1@31 ~]/2",
})).s("gm_fretless_bass").gain(0.3)
// chords · epiano1 · "El.Pno 1"
const epiano1 = note("<A@7 B@5 C D E@7 F@5 G H E@7 I@5 G H J@7 K@5 L@4 M@4 ~>".pickRestart({
A: "[~@49 e4@45 ~@2 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@2 a3, ~@47 a3@45 ~@3 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@4, ~@16 [b3,c4]@15 ~@17 [b3,c4]@15 ~@17 [b3,c4]@15 ~@17]/7", // Bm Gsus2 Cmaj7
B: "[~ e4@45 ~@2 [b3,d4]@45 ~@3 [b3,c4,e4]@45 ~@3 [b3,d4]@45 ~@4 e4@21 ~@2 [b3,d4,f#4]@21 ~@3, [b3,c4]@45 ~@2 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 [g3,a3]@21 ~@3 a3@21 ~@4, ~@48 c4@5 ~@7]/5", // Bm Cmaj7 Bm Cmaj7 Gsus2
C: "[b3,c4,e4,g4]@33 ~@3 [b3,d4,f#4]@8 ~@3 [g3,a3], ~@35 a3@9 ~@4", // Cmaj7 Bm Gsus2
D: "~ e4@21 ~@2 [b3,d4,f#4]@21 ~@2 a3, c4@21 ~@2 a3@20 ~@5", // Bm
E: "[~ e4@43 ~@5 e4@45 ~@3 e4@45 ~@3 e4@45 ~@2 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@2 a3, [b3,d4]@43 ~@4 a3@45 ~@3 a3@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@4, ~@16 [b3,c4]@15 ~ [b3,d4]@15 ~ [b3,c4]@15 ~@17 [b3,c4]@15 ~@17]/7", // Bm Gsus2 Cmaj7 Bm Cmaj7
F: "[~ e4@45 ~@2 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@4 e4@21 ~@2 [b3,d4,f#4]@21 ~@3, [b3,c4]@45 ~@2 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 [g3,a3]@21 ~@3 a3@20 ~@5, ~@96 [b3,c4]@45 ~@51 c4@20 ~@28]/5", // Bm Cmaj7 Gsus2 Cmaj7
G: "~ e4@32 ~@3 [b3,d4,f#4]@8 ~@3 [g3,a3], [b3,c4,g4]@33 ~@2 a3@9 ~@4", // Bm Gsus2 Cmaj7
H: "~ e4@21 ~@2 [b3,d4,f#4]@21 ~@2 a3, c4@21 ~@2 a3@21 ~@4", // Bm
I: "[[b3,c4,e4]@45 ~@3 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@4 e4@21 ~@2 [b3,d4,f#4]@21 ~@3, ~@47 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 [g3,a3]@21 ~@3 a3@20 ~@5, ~@32 [b3,c4]@15 ~@17 c4@7 ~@9]/5", // Cmaj7 Bm Gsus2 Cmaj7
J: "[~ e4@43 ~@5 e4@45 ~@3 e4@45 ~@2 [b3,c4,e4]@45 ~@3 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@2 a3, [b3,d4]@43 ~@4 a3@45 ~@3 a3@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@4, ~@16 [b3,c4]@15 ~ [b3,d4]@15 ~@33 [b3,c4]@15 ~@17]/7", // Cmaj7 Bm Gsus2 Cmaj7 Bm Cmaj7
K: "[~ e4@45 ~@2 [b3,d4]@45 ~@4 e4@45 ~@2 [b3,d4]@45 ~@4 e4@21 ~@2 [b3,d4,f#4]@21 ~@3, [b3,c4]@45 ~@2 [g3,a3]@45 ~@3 a3@45 ~@3 [g3,a3]@45 ~@3 [g3,a3]@21 ~@3 a3@21 ~@4, ~@32 [b3,c4]@15 ~@17 c4@7 ~@9]/5", // Bm Cmaj7 Gsus2 Cmaj7
L: "[~ e4@32 ~@3 [b3,d4,f#4]@8 ~@5 e4@21 ~@2 [b3,d4,f#4]@21 ~@4 e4@43 ~@5 e4@21 ~@2 [b3,d4,f#4]@21 ~@3, [b3,c4,g4]@33 ~@2 a3@9 ~@3 [g3,a3]@21 ~@3 a3@21 ~@3 a3@43 ~@5 [g3,a3]@21 ~@3 a3@21 ~@4, ~@48 c4@21 ~@27 [b3,d4]@43 ~@5 c4@21 ~@27]/4", // Bm Cmaj7 Gsus2 Bm
M: "[~ e4@32 ~@3 [b3,d4,f#4]@8 ~@5 e4@21 ~@2 [b3,d4,f#4]@21 ~@4 e4@94 ~, [b3,c4,g4]@33 ~@2 a3@9 ~@3 [g3,a3]@21 ~@3 a3@21 ~@3 a3@94 ~@3, ~@24 c4@10 ~@14 [b3,d4]@47 ~]/4", // Bm Cmaj7 Gsus2 Bm
})).s("gm_epiano1").gain(0.3).pan(0.3)
// chords · epiano2 · "El.Pno 2"
const epiano2 = note("<A@7 B@5 C D E@7 B@5 C D E@7 B@5 C D E@7 B@5 F@4 G@4 ~>".pickRestart({
A: "[~@48 [b4,c5,e5]@45 ~@3 [b4,d5]@45 ~@3 [b4,c5,e5]@45 ~@3 [b4,d5]@45 ~@3 [b4,c5,e5]@45 ~@3 [b4,d5]@45 ~@2 a4, ~@47 a4@45 ~@3 [g4,a4]@45 ~@3 a4@45 ~@3 [g4,a4]@45 ~@3 a4@45 ~@3 [g4,a4]@45 ~@4]/7", // Cmaj7 Bm Cmaj7 Bm Cmaj7 Bm Gsus2
B: "[[b4,c5,e5]@15 ~ [b4,d5]@15 ~ [b4,c5,e5]@15 ~ [b4,d5]@15 ~ [c5,e5]@7 ~ [b4,d5,f#5]@7 ~, ~@47 [g4,a4]@45 ~@3 a4@45 ~@3 [g4,a4]@45 ~@3 [g4,a4]@21 ~@3 a4@21 ~@4]/5", // Cmaj7 Bm Cmaj7 Bm C Bm Gsus2
C: "[b4,c5,e5,g5]@33 ~@3 [b4,d5,f#5]@8 ~@3 [g4,a4], ~@35 a4@9 ~@4", // Cmaj7 Bm Gsus2
D: "[c5,e5]@21 ~@3 [b4,d5,f#5]@21 ~@2 a4, ~@23 a4@21 ~@4", // C Bm
E: "[[b4,d5,e5]@43 ~@5 [b4,c5,e5]@45 ~@3 [b4,d5,e5]@45 ~@3 [b4,c5,e5]@45 ~@3 [b4,d5]@45 ~@3 [b4,c5,e5]@45 ~@3 [b4,d5]@45 ~@2 a4, ~@47 a4@45 ~@3 a4@45 ~@3 a4@45 ~@3 [g4,a4]@45 ~@3 a4@45 ~@3 [g4,a4]@45 ~@4]/7", // E7 Cmaj7 E7 Cmaj7 Bm Cmaj7 Bm Gsus2
F: "[[b4,c5,e5,g5]@33 ~@3 [b4,d5,f#5]@8 ~@4 [c5,e5]@21 ~@3 [b4,d5,f#5]@21 ~@3 [b4,d5,e5]@43 ~@5 [c5,e5]@21 ~@3 [b4,d5,f#5]@21 ~@3, ~@35 a4@9 ~@3 [g4,a4]@21 ~@3 a4@21 ~@3 a4@43 ~@5 [g4,a4]@21 ~@3 a4@21 ~@4]/4", // Cmaj7 Bm C Bm E7 C Bm Gsus2
G: "[[b4,c5,e5,g5]@33 ~@3 [b4,d5,f#5]@8 ~@4 [c5,e5]@21 ~@3 [b4,d5,f#5]@21 ~@3 [b4,d5,e5]@94 ~@2, ~@35 a4@9 ~@3 [g4,a4]@21 ~@3 a4@21 ~@3 a4@94 ~@3]/4", // Cmaj7 Bm C Bm E7 Gsus2
})).s("gm_epiano2").gain(0.3).pan(0.7)
// chords · pad sweep · "Pad Syn"
const pad_sweep = note(`<
~@3 A B A B A B A B C D C E ~@2 F G F G F G F G H I H J ~@2 F G F G F K F G H I H J ~@2 F G F G F G F G H I H J H I H
L@2 ~
>`.pickRestart({
A: "[a3,b3,c4,e4]@47 ~", B: "[g3,a3,b3,d4]@47 ~", C: "[g3,a3,c4,e4]@23 ~ [a3,b3,d4,f#4]@23 ~",
D: "[b3,c4,e4,g4]@35 ~ [a3,b3,d4,f#4]@11 ~", E: "[a3,b3,d4,e4]@23 ~", F: "[b3,c4,e4]@47 ~", G: "[a3,b3,d4]@47 ~",
H: "[a3,c4,e4]@23 ~ [b3,d4,f#4]@23 ~", I: "[c4,e4,g4]@35 ~ [b3,d4,f#4]@11 ~", J: "[b3,d4,e4]@15 ~", K: "[b3,d4]@47 ~",
L: "[b3,d4,e4]/2", // E7
})).s("gm_pad_sweep").gain(0.2)
// other · string ensemble 1 · "Strings1"
const string_ensemble_1 = note("<~@21 A B A C D E F G ~@28 D E F H@2 ~>".pickRestart({
A: "a6", B: "e7 d7", C: "f#6@3 a6 d6@4", D: "a6@7 g6 f#6@2 g6@2 e6@4", E: "e7@7 g6", F: "a6 b6", G: "e6@15 ~",
H: "e6/2",
})).s("gm_string_ensemble_1").gain(0.2).pan(0.7)
// other · string ensemble 2 · "Strings2"
const string_ensemble_2 = note(`<
~ A B ~@8 C B C D E@2 D F D G H I H J K L M N O P Q ~@7 C B C A R S ~@8 C B C A K L M T@2 ~
>`.pickRestart({
A: "[e5,e6]", B: "[d5,d6]", C: "[a4,a5] [b4,b5]", D: "[e4,e5]", E: "e6/2", F: "[f#4,f#5]@2 [d4,d5] [a4,a5]",
G: "[f#4,f#5]@6 [a4,a5]@2 [d4,d5]@3 ~ [e4,e5]@2 [g4,g5]@2", H: "a5", I: "e6 d6", J: "f#5@3 a5 d5@4",
K: "a5@7 g5 f#5@2 g5@2 e5@4", L: "e6@7 g5", M: "a5 b5", N: "e5@15 ~", O: "[a5,a6]@3 [g5,g6]", P: "[e5,e6]@3 [a5,a6]",
Q: "[b5,b6]", R: "[e4,e5]@3 [a4,a5]", S: "[b4,b5] [d5,d6] [e5,e6] [g5,g6]", T: "e5/2",
})).s("gm_string_ensemble_2").gain(0.2).pan(0.3)
// other · vibraphone · "Vibes"
const vibraphone = note(`<
~ A B A C A C A C A C ~@4 A B A C A C D C A C ~@4 D E A C A C A C A C ~@4 A B A C A C A C D C ~@10
>`.pickRestart({
A: "~@3 e5@3 c6@3 a5@3 b5@3 a5@3 c6@3 e5@3 c6@3 a5@3 b5@3 a5@3 c6@2 ~ e5@3 c6@3 b5@2 ~",
B: "~@3 d5@3 g5@3 a5@3 b5@3 a5@3 g5@3 d5@3 g5@3 a5@3 b5@3 a5@3 g5@3 d5@3 g5@2 ~ a5@2 ~",
C: "d5@6 a5@3 b5@3 a5@3 g5@3 d5@3 g5@3 a5@3 b5@3 a5@3 g5@3 d5@3 g5@3 a5@2 ~ b5@2 ~",
D: "~@3 e5@3 c6@3 a5@3 b5@3 a5@3 c6@3 e5@3 c6@3 a5@3 b5@3 a5@3 c6@3 e5@3 c6@3 b5@2 ~",
E: "~@3 d5@3 g5@3 a5@3 b5@3 a5@3 g5@3 d5@3 g5@3 a5@3 b5@3 a5@3 g5@3 d5@3 g5@3 a5@2 ~",
})).s("gm_vibraphone").gain(0.2).pan(0.3)
// other · marimba
const marimba = note("<~@15 A B ~@12 C D ~@12 A B ~@18>".pickRestart({
A: "~@3 e4@3 c5@3 a4@3 b4@3 a4@3 c5@3 e4@3 c5@3 a4@3 b4@3 a4@3 c5@2 ~ e4@3 c5@3 b4@2 ~",
B: "~@3 d4@3 g4@3 a4@3 b4@3 a4@3 g4@3 d4@3 g4@3 a4@3 b4@3 a4@3 g4@3 d4@3 g4@2 ~ a4@2 ~",
C: "~@3 e4@3 c5@3 a4@3 b4@3 a4@3 c5@3 e4@3 c5@3 a4@3 b4@3 a4@3 c5@3 e4@3 c5@3 b4@2 ~",
D: "~@3 d4@3 g4@3 a4@3 b4@3 a4@3 g4@3 d4@3 g4@3 a4@3 b4@3 a4@3 g4@3 d4@3 g4@3 a4@2 ~",
})).s("gm_marimba").gain(0.15).pan(0.8)
// drums · kick
const kick = s("bd").struct(`<
~ A@2 B@4 C B@3 C B@3 A@2 B@2 C B C B@2 C B@4 D@2 B@4 C@2 B@5 C A@2 B@8 C B@2 C B@3 ~@3
>`.pickRestart({
A: "~@7 x!2 ~@7", B: "x ~@6 x!2 ~@7", C: "x!2", D: "~ x",
})).gain(0.45)
// drums · kick · soft notes
const kick_soft = s("bd").struct("<~@7 A ~@3 A ~@7 A ~ A ~@2 A ~@4 A@2 ~@4 A@2 ~@5 A ~@10 A ~@2 A ~@6>".pickRestart({
A: "~@7 x ~@8",
})).gain(0.3)
// drums · rim
const rim = s("rim").struct("<~@11 A@4 ~@10 A@4 ~@10 A@4 ~@10 A@7 ~@3>".pickRestart({
A: "~ x ~ x",
})).gain(0.45)
// drums · snare
const snare = s("sd").struct("<~@3 A@12 ~@2 A@12 ~@2 A@12 ~@2 A@15 ~@3>".pickRestart({
A: "~@3 x",
})).gain(0.35)
// drums · hihat
const hihat = s("hh").struct("<[x!4] [x!16]!59 ~@3>").gain(0.2)
// drums · low tom
const low_tom = s("lt").struct("<~ A B ~@12 A B ~@12 A B ~@12 A B ~@18>".pickRestart({
A: "~@15 x", B: "x ~@6 x",
})).gain(0.35)
// drums · mid tom
const mid_tom = s("mt").struct(`<
~@2 A@2 ~ A ~ A ~ A ~@6 A@2 ~ A ~ A ~ A ~@6 A@2 ~ A ~ A ~ A ~@6 A@2 ~ A ~ A ~ A ~@11
>`.pickRestart({
A: "~@15 x",
})).gain(0.35)
// drums · high tom
const high_tom = s("ht").struct("<~@2 A ~@13 A ~@13 A ~@13 A ~@18>".pickRestart({
A: "~@13 x ~@2",
})).gain(0.35)
// drums · ride
const ride = s("rd").struct("<~ [x ~@6 x!2 ~@7]!59 ~@3>").gain(0.2)
// drums · cabasa
const cabasa = s("cabasa:4").struct("<~ [~@2 x!2 ~@2 x!2 ~@2 x!2 ~@2 x!2]!59 ~@3>").gain(0.75)
// drums · shaker
const shaker = s("sh").struct("<~ [~@6 x ~@9 x ~@13 x ~@8 x ~@8]!59 ~@3>").gain(0.15)
stack(
bass, epiano1, epiano2, pad_sweep, string_ensemble_1, string_ensemble_2, vibraphone, marimba, kick, kick_soft, rim,
snare, hihat, low_tom, mid_tom, high_tom, ride, cabasa, shaker
)
More by Kenny G
Not in the database
That song isn't here.
Nothing in the database matches this link. It may have been renamed, or the address was mistyped. The closest songs to :
Real transcriptions · Editable patterns · Instrumental
Type a song.
Get Strudel code.
Chords, structure, melody, bass and drums compiled from open transcriptions into Strudel live-coding patterns. Play it here, scrub through the bars, then open it in strudel.cc and start hacking.
Smells Like Teen SpiritNirvana
The JokerSteve Miller Band · 1973
Love Me DoThe Beatles · 1964
I Don't MindJames Brown · 1961
- Real transcriptionsMcGill chord charts, Lakh MIDI and quality-filtered PDMX scores. The library includes alternate transcriptions of some songs.
- One bar, one cycleEvery layer follows the same bar timeline, keeping the code, playback and song structure aligned.
- Instrumental by designDetected vocal parts are removed. Guitar riffs, harmonica and other instrumental leads stay.