# Techno Syndrome (Mortal Kombat, 1993) for the RouterOS beeper # https://lab.glossema.dev/play/mortal-kombat # One speaker, one tone at a time. 130 BPM, strict sixteenths, A minor. # --- Instrument ------------------------------------------------------------- # Equal temperament, A4 = 440 Hz, integers only. :global notes {"A2"=110; "D3"=147; "E3"=165; "A4"=440; "C5"=523; "D5"=587; "E5"=659}; # s = sixteenth, e = eighth, q = quarter, h = half. The gap is added after # every note so repeated sixteenths articulate instead of smearing. :global durs {"s"=95ms; "e"=210ms; "q"=440ms; "h"=900ms}; :global gap 20ms; # Octave switch: 1 for the hook, 2 when it comes back an octave up. :global oct 1; # One note. "-" is a rest: it keeps the clock and sounds nothing. :global play do={ :global notes; :global durs; :global gap; :global oct; :local d ($durs->$2); :if ($1 = "-") do={ :delay ($d + $gap); } else={ :beep frequency=(($notes->$1) * $oct) length=$d; :delay ($d + $gap); } } # --- Score ------------------------------------------------------------------ # The shouted name: three low notes, then air. :local shout {"A2:e"; "A2:e"; "E3:h"; "-:q"}; # The riff: two bars of sixteenths circling A, C, D and E. :local riff { "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "C5:s"; "C5:s"; "D5:s"; "D5:s"; "C5:s"; "C5:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "A4:s"; "C5:s"; "C5:s"; "D5:s"; "D5:s"; "E5:s"; "E5:s"; "D5:s"; "D5:s"; "C5:s"; "C5:s" }; # The hook that sings over it. :local hook { "A4:e"; "C5:e"; "D5:q"; "C5:e"; "A4:e"; "E5:h"; "-:e"; "A4:e"; "C5:e"; "D5:q"; "E5:e"; "D5:e"; "C5:e"; "A4:h" }; # --- Shout ------------------------------------------------------------------ :put "Shout"; :foreach ev in=$shout do={ :local c [:find $ev ":"]; :local nm [:pick $ev 0 $c]; :local du [:pick $ev ($c + 1) [:len $ev]]; $play $nm $du; } # --- Riff ------------------------------------------------------------------- :put "Riff"; :for i from=1 to=3 do={ :foreach ev in=$riff do={ :local c [:find $ev ":"]; :local nm [:pick $ev 0 $c]; :local du [:pick $ev ($c + 1) [:len $ev]]; $play $nm $du; } } :foreach ev in=$hook do={ :local c [:find $ev ":"]; :local nm [:pick $ev 0 $c]; :local du [:pick $ev ($c + 1) [:len $ev]]; $play $nm $du; } # --- Drop ------------------------------------------------------------------- # One bar of rest: sixteen sixteenths of 115 ms at 130 BPM. :put "Drop"; :local bar (115ms * 16); :delay $bar; # --- Riff again ------------------------------------------------------------- :put "Riff again"; :for i from=1 to=2 do={ :foreach ev in=$riff do={ :local c [:find $ev ":"]; :local nm [:pick $ev 0 $c]; :local du [:pick $ev ($c + 1) [:len $ev]]; $play $nm $du; } } :set oct 2; :foreach ev in=$hook do={ :local c [:find $ev ":"]; :local nm [:pick $ev 0 $c]; :local du [:pick $ev ($c + 1) [:len $ev]]; $play $nm $du; } :set oct 1;