Shawarma

Example songs: five songs with code

These are the starting points in Shawarma's New project dialog, shown with their full code. Each one is a complete song in code: read the code, or open it in Shawarma and change it by asking.

Simple beat

A kick and hats at 120 BPM. A blank page with a pulse.

setcpm(30) // 120 BPM

s("bd*4, [~ hh]*4").gain(.8)

What to listen for

The smallest song there is: a kick on every beat and a hi-hat between the beats, at 120 BPM. The comma plays the two parts at once, and gain(.8) leaves room for what you add next.

Things to ask for

  • Youadd a clap on two and four
  • Youmake it 128 BPM and add a bass line in A minor

House groove

Four-on-the-floor, off-beat bass and minor seventh stabs, in four sections.

setcpm(31) // 124 BPM

const drums = s("bd*4, [~ cp]*2, [~ hh]*4, ~ ~ ~ oh").gain(.36)
const bass = note("<[c2 c3]*4 [a1 a2]*4 [f1 f2]*4 [g1 g2]*4>")
  .s("sawtooth").lpf(700).decay(.15).sustain(0).gain(.22)
const stabs = note("<[c4,eb4,g4,bb4] [a3,c4,eb4,g4] [f3,ab3,c4,eb4] [g3,bb3,d4,f4]>")
  .struct("[~ x]*2").s("piano").gain(.2).room(.3)

arrange(
  [4, drums],                        // intro
  [8, stack(drums, bass, stabs)],    // groove
  [4, stack(bass, stabs)],           // breakdown
  [8, stack(drums, bass, stabs)],    // groove again
)

What to listen for

A 124 BPM groove in four sections. The bass jumps between two octaves on every eighth note, moving through C, A, F and G, one root per bar; a low-pass filter and a short decay keep it tight. Piano chords land on beats two and four. arrange sets the form: four bars of drums, eight of the full groove, four without drums, then the groove again.

Things to ask for

  • Youmake the breakdown longer and filter the bass in it
  • Youswap the piano for a warm pad

Ambient pad

Slow major-seventh pads with a wandering filter and a few bell notes.

setcpm(15) // 60 BPM

const pad = note("<[c3,g3,e4,b4] [a2,e3,c4,g4] [f2,c3,a3,e4] [g2,d3,b3,d4]>")
  .s("sawtooth").attack(1.5).release(3).lpf(sine.range(500, 1500).slow(16))
  .gain(.18).room(.9).size(8)
const bells = note("<e5 ~ b4 ~ g5 ~ ~ d5>").s("triangle")
  .decay(.8).sustain(0).gain(.25).delay(.4).room(.8)

arrange(
  [8, pad],                 // pads alone
  [8, stack(pad, bells)],   // bells drift in
)

What to listen for

Slow chords at 60 BPM, mostly major sevenths, on a sawtooth synth with a long attack and release, so each chord swells in and fades out. The filter follows a sine wave that takes 16 bars to open and close. After eight bars, triangle-wave bells come in with an echo.

Things to ask for

  • Youadd a soft, low drone under the pads
  • Youmake the bells play less often

Maqam groove

Maqsum rhythm on darbuka with an oud-like line in maqam Hijaz on D.

setcpm(27.5) // 110 BPM, maqsum (dum tek - tek dum - tek -)

const dum = s("darbuka:0").struct("x ~ ~ ~ ~ ~ x ~ ~ ~ ~ ~ ~ ~ ~ ~").gain(.9)
const tek = s("darbuka:4").struct("~ ~ ~ ~ x ~ ~ ~ ~ ~ ~ ~ x ~ ~ ~, ~ ~ x ~ ~ ~ ~ ~ ~ ~ x ~ ~ ~ ~ ~").gain(.6)
const riq = s("white").struct("[~ x]*8").hpf(8000).decay(.04).sustain(0).gain(.08)
// Hijaz on D: D Eb F# G A Bb C
const oudLine = note(`<
  [d4 ~ eb4 f#4 g4 ~ f#4 eb4]
  [d4 ~ f#4 g4 a4 bb4 a4 g4]
  [a4 ~ bb4 a4 g4 f#4 g4 ~]
  [f#4 eb4 d4 ~ ~ ~ d4 ~]
>`).s("gm_acoustic_guitar_nylon").lpf(2000).decay(.3).sustain(.2).gain(.6).room(.3)
const drone = note("d2").s("sawtooth").lpf(300).gain(.12)

arrange(
  [4, stack(dum, tek, riq)],                 // percussion
  [8, stack(dum, tek, riq, oudLine, drone)], // the line enters
)

What to listen for

A darbuka at 110 BPM, with low dum and high tek strokes on a sixteen-step grid, and a riq-like shimmer made from filtered white noise. After four bars, a nylon-string guitar plays a line in maqam Hijaz on D (D, E flat, F sharp, G, A, B flat, C) over a low drone on D.

Things to ask for

  • Youadd a second phrase that goes up to the high D
  • Youmake the percussion busier in the last four bars

Breakbeat

A syncopated break with a rolling bass line.

setcpm(34) // 136 BPM

const breakbeat = s("bd ~ ~ bd ~ ~ bd ~, ~ ~ sd ~ ~ sd ~ [~ sd], hh*8").gain(.6)
const bass = note("<[e1 ~ e2 ~ ~ e1 g1 ~] [a1 ~ a2 ~ ~ a1 b1 ~]>")
  .s("square").lpf(500).decay(.2).sustain(0).gain(.32)

arrange(
  [4, breakbeat],               // drums
  [8, stack(breakbeat, bass)],  // bass joins
)

What to listen for

A syncopated break at 136 BPM: kicks and snares off the beat over steady eighth-note hats, with a ghost snare just before the loop turns. The square-wave bass rolls between E and A, alternating each bar.

Things to ask for

  • Youmake the bass line busier in the second half
  • Yougive the bass more growl

Open in Shawarma makes a new project with that song, after you sign in. You can also pick them by name under New project. To learn the code behind them, start with the tutorial; the drum patterns guide explains the beats.

Try it in Shawarma

Shawarma is a music editor where every song is code. Your song plays on a loop; ask the assistant for a change in plain words, listen to it, and keep it only if you like it. Or edit the code yourself, as in this guide. The editor is free, with 5 assistant replies to try it; Pro starts with 7 days free.