Strudelify

You Oughta Know

Alanis Morissette

KeyF♯ minorTempo110 bpm
0:00/0:00
// You Oughta Know — Alanis Morissette
// 110 bpm, 4/4, key F# minor. Source: midi.
// Generated by strudelify. One cycle = one bar.
// note: pitch bends are ignored
// note: Full arrangement: all 107 bars on a 32-step grid, each part at one level. Source detail keeps the original performance.
setcpm(110/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(`<
  ~@8 A B@3 C D E F G H I J K L M N O P Q R S T U V W X H I J K L M N G H I J K L M N G H I J K L M N O P Q R S T U V
  ~@17 G H I J K L M N O P Q R S T U V O P Q R S T U V ~
>`.pickRestart({
  A: "~ f#1@2 ~ f#1@3 ~@6 f#1@2 ~@5 f#1@3 ~@9",
  B: "[f#1@3 ~ f#1@3 ~@6 f#1@3 ~@4 f#1@2 ~@9 f#1@3 ~@2 f#1@3 ~@5 f#1@3 ~@5 f#1@2 ~@9 f#1@3 ~@2 f#1@3 ~@7 f#1@2 ~@4 f#1@3 ~@9]/3",
  C: "f#1@3 ~ f#1@3 ~@5 f#1@3 ~@5 f#1@3 ~@9", D: "f#1@2 ~@2 f#1@2 ~@7 f#1@3 ~@4 f#1@3 ~@9",
  E: "f#1@2 ~@2 f#1@3 ~@6 f#1@3 ~@4 f#1@3 ~@9", F: "f#1@3 ~ f#1@2 ~@7 f#1@2 ~@5 f#1@3 ~@9",
  G: "~ f#1@3 ~ f#1@3 ~@6 f#2 ~ f#2@2 ~@2 a1@2 ~@2 a1@2 b1@2 e1@3 ~",
  H: "f#1@3 ~ f#1@3 ~@7 c#2 ~ c#2@2 ~@2 b1@2 ~@2 b1@2 c#2@2 e1@3 ~",
  I: "f#1@3 ~ f#1@3 ~@6 f#2 ~ f#2@2 ~@3 a1@2 ~@2 a1@2 b1@2 e1@3 ~",
  J: "f#1@3 ~ f#1@3 ~@6 c#2 ~ c#2@2 ~@3 b1@3 ~@2 d#2@3 e1@3 ~, ~@24 e2@3 ~@5",
  K: "f#1@3 ~ f#1@2 ~@8 f#2 ~ f#2@2 ~@2 a1@2 ~ a1@2 ~ b1@2 e1@4",
  L: "f#1@3 ~ f#1@3 ~@6 c#2 ~ c#2@3 ~ b1@3 ~@3 a1@2 ~ e1@3 ~, ~@24 b1@2 ~@2 f1 ~@3",
  M: "f#1@3 ~ f#1@3 ~@6 f#2@2 f#2@2 ~@2 a1@3 ~ a1@2 ~@2 e1@3 ~@2, ~@13 b1 ~@2",
  N: "f#1@3 ~ f#1@3 ~@6 c#2@2 c#2@2 ~@3 c#2@4 ~@2 d#2@2 e1@2 ~@2, ~@25 e2@3 ~@4",
  O: "f#1@4 f#1@4 ~@7 f#1 f#1@3 ~ f#1@4 ~@8", P: "~ e1@4 e1@4 ~@4 e1@2 e1@5 e1@4 ~@8",
  Q: "a1@3 ~ a1@4 ~@6 a1 ~ a1@3 ~ a1@3 ~@9", R: "~ b1@3 b1@3 ~@7 b1@2 b1@3 f#2@3 ~ f#2@2 d#2@2 c#2@4 ~",
  S: "f#1@4 f#1@4 ~@6 f#1 ~ f#1@4 f#1@4 ~@8", T: "e1@4 e1@4 ~@5 e1@2 e1@4 ~ e1@4 ~@8",
  U: "a1@4 a1@4 ~@5 a1 ~ a1@4 ~ a1@3 ~@9", V: "b1@4 b1@3 ~@7 b1 ~ b1@4 b1@3 ~@9", W: "~@10 e2@2 f#2 f#1 a1@2",
  X: "f#1 f#1@3 f#1 f#1@3 ~@6 f#2 ~ f#2@2 ~@2 a1@2 ~@2 a1@2 b1@2 e1@3 ~",
})).s("gm_fretless_bass").gain(0.6)

// chords · electric guitar clean · "Clean Electric Guitar"
const electric_guitar_clean = note(`<
  ~@8 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~@9 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 A@2 B@2 C@2 D@2 ~@8 E F@8 G@8 H@2 B@2 C@2 D@2
  ~@17
>`.pickRestart({
  A: "[f#3@2 a3@2 ~@2 [a3,e4]@23 ~@3, c#4@4 f#3@25 ~@3]/2", // A5
  B: "[f#3@2 b3@2 ~@8 a4@11 [f#3,b3,f#4,a4]@6 ~@3, d#4@4 f#3@19 ~@9, ~@6 [b3,f#4]@17 ~@9]/2", // B7 B5
  C: "[[f#3,c#4]@2 a3@2 ~@2 [a3,a4]@23 ~@3, ~@4 f#3@25 ~@3]/2", // F#5 A
  D: "[f#3@2 b3@2 f#3@2 [f#3,b3,f#4,b4]@19 ~@7, d#4@3 ~@13]/2", E: "~@31 f#3",
  F: "[~ [e3,e4]@55 ~@9 d#4@58 ~@6 [e3,e4]@58 ~@6 [d#3,d#4]@56 ~@7, [b3,c#4]@56 ~@6 f#3@61 ~@4 f#3@60 ~@2 f#3@59 ~@8, ~@63 b3@59 ~@6 [b3,c#4]@59 ~@4 b3@58 ~@7, ~@64 [d#3,c#4]@59 ~@69 c#4@57 ~@7]/8", // E D# Bsus2 D#7
  G: "[~ e4@57 ~@7 d#4@57 ~@7 e4@58 ~@6 d#4@57 ~@5 [e3,b3], [e3,f#3,b3,c#4]@58 ~@3 f#3@61 ~@4 f#3@60 ~@3 f#3@60 ~@5 f#3@2, ~@63 [d#3,b3]@59 ~@5 [e3,b3]@60 ~@4 [d#3,b3,c#4]@59 ~@6, ~@64 c#4@58 ~@6 c#4@59 ~@69]/8", // E5 Esus2 G#m E5 G#m
  H: "[~@2 a3@2 ~@2 [a3,e4]@23 ~@3, [f#3,c#4]@4 f#3@25 ~@3]/2", // A5 F#5
})).s("gm_electric_guitar_clean").gain(0.32)

// chords · overdriven guitar
const overdriven_guitar = note(`<
  ~@16 A@8 B C D E F C G H ~ A@24 B C D E F C G H ~@17 A@8 B C D E F C G H B C D E F C G H ~
>`.pickRestart({
  A: "[[f#3,c#4,f#4]@62 ~@2 [c#4,f#4]@63 ~ [c#4,f#4]@64 [c#4,f#4]@61 ~@3, ~@63 f#3@190 ~@3]/8", B: "[f#2,c#4,f#4]",
  C: "[e2,b3,e4]", D: "~ e4@31, [a2,a4]", E: "[b2,f#4,b4]", F: "~ [f#2,c#4,f#4]@31", G: "[a2,e4,a4]",
  H: "[b2,f#4,b4]@7 ~", // B5
})).s("gm_overdriven_guitar").gain(0.32)

// drums · kick
const kick = s("bd").struct(`<
  ~@8
  [x ~ x ~@4 x!2 ~ x ~@5]!24
  ~
  [x ~ x ~@4 x!2 ~ x ~@5]!32
  ~@9
  [x ~ x ~@4 x!2 ~ x ~@5]!32
  ~
>`).gain(0.5)

// drums · snare
const snare = s("sd").struct(`<
  A@8 B@7 C B@7 C B@7 C ~ B@7 C B@7 C B@7 C B@7 C ~ A@8 B@7 C B@7 C B@7 C B@7 C ~
>`.pickRestart({
  A: "~@9 x ~@5 x ~@3 x ~@5 x ~@6", B: "~@4 x ~@7 x ~@2 x", C: "~@4 x ~@7 x ~ x!2",
})).gain(0.5)

// drums · low tom
const low_tom = s("lt").struct("<~@81 [~@7 x!3 ~ x!2 ~ x ~] ~@25>").gain(0.5)

// drums · pedal hat
const pedal_hat = s("hh").struct("<~@8 [x!8]!24 ~ [x!8]!32 ~@9 [x!8]!32 ~>").gain(0.5)

// drums · mid tom
const mid_tom = s("mt").struct("<~@81 [x!2 ~ x!3 ~@10] ~@25>").gain(0.5)

// drums · open hat
const open_hat = s("oh").struct("<~@8 [~@3 x ~@4]!24 ~ [~@3 x ~@4]!32 ~@9 [~@3 x ~@4]!32 ~>").gain(0.5)

// drums · shaker
const shaker = s("sh").struct("<[~ x ~@3 x ~@7 x ~@3 x ~@3 x ~@10]!8 ~@58 [~ x ~@3 x ~@7 x ~@3 x ~@3 x ~@10]!8 ~@33>")
  .gain(0.5)

stack(bass, electric_guitar_clean, overdriven_guitar, kick, snare, low_tom, pedal_hat, mid_tom, open_hat, shaker)

More by Alanis Morissette