⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact 599011a577c4d835dd3e4d0dd25c75ce9e646a330073a08e50c7bf772107c039:

  • File source/main.cog — part of check-in [4cb0fff742] at 2022-03-27 22:44:18 on branch trunk — Updating JUCE link and build scripts (user: dev size: 56475)

0000: 40 3c 0a 40 3e 0a 54 68 69 73 20 69 73 20 6a 75  @<.@>.This is ju
0010: 73 74 20 61 20 73 61 6d 70 6c 65 0a 43 6f 70 79  st a sample.Copy
0020: 72 69 67 68 74 20 28 43 29 20 32 30 32 31 20 58  right (C) 2021 X
0030: 79 7a 7a 79 20 41 70 70 73 0a 53 65 65 20 68 74  yzzy Apps.See ht
0040: 74 70 73 3a 2f 2f 62 69 74 72 68 79 74 68 6d 2e  tps://bitrhythm.
0050: 78 79 7a 7a 79 61 70 70 73 2e 6c 69 6e 6b 2f 64  xyzzyapps.link/d
0060: 6f 63 73 2f 73 6f 75 72 63 65 2d 63 6f 64 65 2e  ocs/source-code.
0070: 68 74 6d 6c 20 66 6f 72 20 74 68 65 20 6c 61 74  html for the lat
0080: 65 73 74 20 73 6f 75 72 63 65 20 63 6f 64 65 0a  est source code.
0090: 40 40 0a 0a 23 20 43 6f 64 65 20 57 61 6c 6b 74  @@..# Code Walkt
00a0: 68 72 6f 75 67 68 0a 0a 40 3c 0a 69 6d 70 6f 72  hrough..@<.impor
00b0: 74 20 63 6f 67 0a 69 6d 70 6f 72 74 20 6f 73 0a  t cog.import os.
00c0: 0a 69 66 20 44 45 56 20 3d 3d 20 22 31 22 3a 0a  .if DEV == "1":.
00d0: 20 20 20 20 73 74 75 66 66 20 3d 20 22 22 22 0a      stuff = """.
00e0: 23 23 20 52 75 6e 6e 69 6e 67 0a 0a 6c 73 20 73  ## Running..ls s
00f0: 6f 75 72 63 65 2f 6d 61 69 6e 2e 63 6f 67 20 7c  ource/main.cog |
0100: 20 65 6e 74 72 20 2d 72 20 72 75 6e 73 65 72 76   entr -r runserv
0110: 65 72 2e 73 68 20 2d 62 0a 22 22 22 0a 20 20 20  er.sh -b.""".   
0120: 20 63 6f 67 2e 6f 75 74 28 73 74 75 66 66 29 0a   cog.out(stuff).
0130: 40 3e 0a 40 40 0a 23 23 20 43 6f 72 65 20 54 72  @>.@@.## Core Tr
0140: 61 63 6b 65 72 20 4c 6f 6f 70 0a 0a 49 6e 20 62  acker Loop..In b
0150: 69 74 72 68 79 74 68 6d 20 63 6f 64 65 20 69 73  itrhythm code is
0160: 20 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65   evaluated for e
0170: 76 65 72 79 20 63 79 63 6c 65 2e 0a 0a 31 20 62  very cycle...1 b
0180: 65 61 74 20 3d 20 36 30 20 2f 20 74 65 6d 70 6f  eat = 60 / tempo
0190: 0a 31 20 63 79 63 6c 65 20 3d 20 31 20 62 65 61  .1 cycle = 1 bea
01a0: 74 20 2f 20 74 69 63 6b 73 0a 0a 46 6f 72 20 65  t / ticks..For e
01b0: 76 65 72 79 20 63 79 63 6c 65 20 76 69 73 75 61  very cycle visua
01c0: 6c 20 61 6e 64 20 61 75 64 69 6f 20 63 6f 64 65  l and audio code
01d0: 20 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 0a   is evaluated...
01e0: 54 68 65 20 65 64 69 74 20 63 68 65 63 6b 62 6f  The edit checkbo
01f0: 78 20 61 6c 6c 6f 77 73 20 79 6f 75 20 74 6f 20  x allows you to 
0200: 70 65 72 66 6f 72 6d 20 6c 6f 6e 67 20 65 64 69  perform long edi
0210: 74 73 2c 20 77 68 65 72 65 20 6f 6e 6c 79 20 6f  ts, where only o
0220: 6c 64 20 63 6f 64 65 20 69 73 20 65 76 61 6c 75  ld code is evalu
0230: 61 74 65 64 2e 20 4f 6e 63 65 20 79 6f 75 20 64  ated. Once you d
0240: 69 73 61 62 6c 65 20 69 74 2c 20 61 6c 6c 20 74  isable it, all t
0250: 68 65 20 6e 65 77 20 65 64 69 74 20 63 68 61 6e  he new edit chan
0260: 67 65 73 20 61 72 65 20 61 70 70 6c 69 65 64 20  ges are applied 
0270: 69 6e 20 74 68 65 20 6e 65 78 74 20 63 79 63 6c  in the next cycl
0280: 65 2e 0a 0a 49 66 20 74 68 65 72 65 20 69 73 20  e...If there is 
0290: 61 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72  any syntax error
02a0: 2c 20 70 72 65 76 69 6f 75 73 20 77 6f 72 6b 69  , previous worki
02b0: 6e 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 2e  ng code is used.
02c0: 0a 0a 49 66 20 74 68 65 20 63 6c 69 63 6b 20 74  ..If the click t
02d0: 68 65 20 60 65 78 65 63 75 74 65 20 74 72 61 6e  he `execute tran
02e0: 73 69 74 69 6f 6e 60 20 69 73 20 73 65 6c 65 63  sition` is selec
02f0: 74 65 64 2c 20 74 68 65 20 74 72 61 6e 73 69 74  ted, the transit
0300: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  ion function is 
0310: 72 75 6e 2e 20 55 73 65 20 74 68 69 73 20 70 72  run. Use this pr
0320: 6f 67 72 65 73 73 69 6e 67 20 74 68 65 20 73 6f  ogressing the so
0330: 6e 67 20 66 72 6f 6d 20 69 6e 69 74 69 61 6c 69  ng from initiali
0340: 7a 69 6e 67 20 74 6f 20 74 77 65 61 6b 69 6e 67  zing to tweaking
0350: 2e 0a 0a 0a 50 61 74 74 65 72 6e 73 20 69 73 20  ....Patterns is 
0360: 61 6e 20 61 72 72 61 79 20 6f 66 20 73 74 72 69  an array of stri
0370: 6e 67 73 2c 20 65 61 63 68 20 73 74 72 69 6e 67  ngs, each string
0380: 20 63 61 6e 20 62 65 20 68 65 78 61 64 65 63 69   can be hexadeci
0390: 6d 61 6c 2c 20 64 65 63 69 6d 61 6c 20 6f 72 20  mal, decimal or 
03a0: 73 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 e2  something like .
03b0: 80 9c 78 30 30 30 20 78 30 30 30 20 78 30 30 30  ..x000 x000 x000
03c0: 20 78 30 30 30 e2 80 9d 2e 0a 69 73 48 69 74 20   x000.....isHit 
03d0: 61 6e 64 20 74 72 61 63 6b 5f 6e 6f 20 63 61 6e  and track_no can
03e0: 20 62 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e   be used to iden
03f0: 74 69 66 79 20 74 68 65 20 6c 61 79 65 72 20 69  tify the layer i
0400: 6e 20 74 68 65 20 6c 69 76 65 20 65 64 69 74 6f  n the live edito
0410: 72 2e 20 48 65 78 61 64 65 63 69 6d 61 6c 20 75  r. Hexadecimal u
0420: 73 65 73 20 5c 60 30 20 5c 60 31 20 5c 60 32 20  ses \`0 \`1 \`2 
0430: 5c 60 33 20 5c 60 34 20 5c 60 35 20 69 6e 73 74  \`3 \`4 \`5 inst
0440: 65 61 64 20 6f 66 20 74 68 65 20 52 6f 6d 61 6e  ead of the Roman
0450: 20 6e 75 6d 65 72 61 6c 73 20 61 62 63 64 65 20   numerals abcde 
0460: 66 6f 72 20 31 30 2c 20 31 31 2c 20 31 32 20 2e  for 10, 11, 12 .
0470: 2e 2e 0a 0a 53 63 68 65 64 75 6c 65 64 20 54 69  ....Scheduled Ti
0480: 6d 65 20 61 73 20 73 69 67 6e 69 66 69 65 64 20  me as signified 
0490: 62 79 20 74 68 65 20 76 61 72 69 61 62 6c 65 20  by the variable 
04a0: 74 69 6d 65 20 69 73 20 63 72 75 63 69 61 6c 20  time is crucial 
04b0: 77 68 65 6e 20 63 61 6c 6c 69 6e 67 20 6e 6f 74  when calling not
04c0: 65 20 74 72 69 67 67 65 72 73 2e 20 54 68 69 73  e triggers. This
04d0: 20 69 73 20 75 73 65 64 20 62 79 20 54 6f 6e 65   is used by Tone
04e0: 2e 6a 73 20 74 6f 20 73 63 68 65 64 75 6c 65 20  .js to schedule 
04f0: 6e 6f 74 65 73 20 74 6f 20 70 6c 61 79 20 69 6e  notes to play in
0500: 20 74 68 65 20 66 75 74 75 72 65 2e 0a 0a 23 23   the future...##
0510: 23 20 4f 62 73 65 72 76 65 72 73 0a 0a 53 69 64  # Observers..Sid
0520: 65 63 68 61 69 6e 20 63 6f 6d 70 72 65 73 73 69  echain compressi
0530: 6f 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20 61  on is a simple a
0540: 6c 67 6f 72 69 74 68 6d 20 77 68 69 63 68 20 6f  lgorithm which o
0550: 62 73 65 72 76 65 73 20 61 6d 70 6c 69 74 75 64  bserves amplitud
0560: 65 20 6f 66 20 61 6e 6f 74 68 65 72 20 69 6e 73  e of another ins
0570: 74 72 75 6d 65 6e 74 20 62 75 74 20 79 6f 75 20  trument but you 
0580: 63 61 6e 20 67 65 6e 65 72 61 6c 69 73 65 20 69  can generalise i
0590: 74 20 74 6f 20 61 6e 79 74 68 69 6e 67 2e 20 42  t to anything. B
05a0: 79 20 61 74 74 61 63 68 69 6e 67 20 6f 62 73 65  y attaching obse
05b0: 72 76 65 72 73 20 20 74 6f 20 74 69 6d 65 20 6f  rvers  to time o
05c0: 72 20 6f 74 68 65 72 20 69 6e 73 74 72 75 6d 65  r other instrume
05d0: 6e 74 73 20 79 6f 75 20 63 61 6e 20 63 72 65 61  nts you can crea
05e0: 74 65 20 73 65 63 74 69 6f 6e 73 20 77 69 74 68  te sections with
05f0: 69 6e 20 74 68 65 20 73 6f 6e 67 20 74 68 61 74  in the song that
0600: 20 63 61 6e 20 74 72 69 67 67 65 72 20 6f 74 68   can trigger oth
0610: 65 72 73 20 77 69 74 68 20 63 6f 6e 64 69 74 69  ers with conditi
0620: 6f 6e 61 6c 20 6c 6f 67 69 63 2e 20 54 68 69 73  onal logic. This
0630: 20 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70   is similar to p
0640: 75 72 65 20 64 61 74 61 27 73 20 62 61 6e 67 73  ure data's bangs
0650: 20 2d 20 5b 73 65 65 20 74 68 69 73 5d 28 68 74   - [see this](ht
0660: 74 70 73 3a 2f 2f 77 77 77 2e 79 6f 75 74 75 62  tps://www.youtub
0670: 65 2e 63 6f 6d 2f 77 61 74 63 68 3f 76 3d 6e 54  e.com/watch?v=nT
0680: 54 5a 5a 79 44 34 78 6c 45 29 2e 20 49 6e 20 66  TZZyD4xlE). In f
0690: 75 74 75 72 65 20 74 68 69 73 20 77 69 6c 6c 20  uture this will 
06a0: 62 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 61  be referred to a
06b0: 73 20 73 69 64 65 20 65 76 65 6e 74 73 2e 20 59  s side events. Y
06c0: 6f 75 20 63 6f 75 6c 64 20 64 65 63 72 65 61 73  ou could decreas
06d0: 65 20 74 68 65 20 76 6f 6c 75 6d 65 20 6f 66 20  e the volume of 
06e0: 74 68 65 20 64 72 75 6d 73 20 74 6f 20 68 61 76  the drums to hav
06f0: 65 20 74 68 65 20 73 6e 61 72 65 73 20 64 72 6f  e the snares dro
0700: 70 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20  p automatically 
0710: 66 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 0a 54 68  for example...Th
0720: 69 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20  is is something 
0730: 74 68 61 74 20 79 6f 75 20 63 61 6e 27 74 20 64  that you can't d
0740: 6f 20 69 6e 20 44 41 57 73 2e 0a 0a 60 60 60 7b  o in DAWs...```{
0750: 63 6f 64 65 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d  code-block} js.-
0760: 2d 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d  --.force: true.-
0770: 2d 2d 0a 0a 40 3c 0a 63 6f 72 65 5f 6c 6f 6f 70  --..@<.core_loop
0780: 20 3d 20 22 22 22 0a 0a 61 73 79 6e 63 20 70 6c   = """..async pl
0790: 61 79 28 29 20 7b 0a 20 20 20 20 76 61 72 20 73  ay() {.    var s
07a0: 65 6c 66 20 3d 20 74 68 69 73 3b 0a 20 20 20 20  elf = this;.    
07b0: 76 61 72 20 63 65 6c 6c 78 20 3d 20 77 69 6e 64  var cellx = wind
07c0: 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78 3b 0a  ow.cellx.cellx;.
07d0: 20 20 20 20 76 61 72 20 24 20 3d 20 6a 51 75 65      var $ = jQue
07e0: 72 79 3b 0a 0a 20 20 20 20 61 77 61 69 74 20 54  ry;..    await T
07f0: 6f 6e 65 2e 63 6f 6e 74 65 78 74 2e 72 65 73 75  one.context.resu
0800: 6d 65 28 29 0a 20 20 20 20 61 77 61 69 74 20 54  me().    await T
0810: 6f 6e 65 2e 73 74 61 72 74 28 29 3b 0a 20 20 20  one.start();.   
0820: 20 61 77 61 69 74 20 54 6f 6e 65 2e 54 72 61 6e   await Tone.Tran
0830: 73 70 6f 72 74 2e 73 74 61 72 74 28 29 3b 0a 20  sport.start();. 
0840: 20 20 20 54 6f 6e 65 2e 54 72 61 6e 73 70 6f 72     Tone.Transpor
0850: 74 2e 62 70 6d 2e 76 61 6c 75 65 20 3d 20 74 68  t.bpm.value = th
0860: 69 73 2e 73 74 61 74 65 2e 74 65 6d 70 6f 3b 0a  is.state.tempo;.
0870: 20 20 20 20 54 6f 6e 65 2e 54 72 61 6e 73 70 6f      Tone.Transpo
0880: 72 74 2e 73 77 69 6e 67 2e 76 61 6c 75 65 20 3d  rt.swing.value =
0890: 20 30 3b 0a 0a 20 20 20 20 77 69 6e 64 6f 77 2e   0;..    window.
08a0: 68 69 74 5f 6d 61 70 20 3d 20 7b 7d 3b 0a 0a 20  hit_map = {};.. 
08b0: 20 20 20 76 61 72 20 74 72 61 6e 73 69 74 69 6f     var transitio
08c0: 6e 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  n = function () 
08d0: 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 76 61 72  {.    }..    var
08e0: 20 61 6c 77 61 79 73 20 3d 20 66 75 6e 63 74 69   always = functi
08f0: 6f 6e 20 28 29 20 7b 0a 20 20 20 20 7d 0a 0a 20  on () {.    }.. 
0900: 20 20 20 76 61 72 20 72 65 6e 64 65 72 5f 6c 6f     var render_lo
0910: 6f 70 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29  op = function ()
0920: 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 76 61   {.    }..    va
0930: 72 20 61 6e 69 6d 61 74 69 6f 6e 20 3d 20 66 75  r animation = fu
0940: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
0950: 20 20 20 20 72 65 6e 64 65 72 5f 6c 6f 6f 70 28      render_loop(
0960: 29 3b 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f  );.        windo
0970: 77 2e 72 65 71 75 65 73 74 41 6e 69 6d 61 74 69  w.requestAnimati
0980: 6f 6e 46 72 61 6d 65 28 61 6e 69 6d 61 74 69 6f  onFrame(animatio
0990: 6e 29 0a 20 20 20 20 7d 0a 0a 20 20 20 20 54 6f  n).    }..    To
09a0: 6e 65 2e 4d 61 73 74 65 72 2e 6d 75 74 65 20 3d  ne.Master.mute =
09b0: 20 66 61 6c 73 65 3b 0a 20 20 20 20 64 6f 63 75   false;.    docu
09c0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
09d0: 79 49 64 28 27 74 65 6d 70 6f 2d 76 61 6c 75 65  yId('tempo-value
09e0: 27 29 2e 64 69 73 61 62 6c 65 64 20 3d 20 74 72  ').disabled = tr
09f0: 75 65 3b 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74  ue;.    document
0a00: 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28  .getElementById(
0a10: 27 74 69 63 6b 2d 76 61 6c 75 65 27 29 2e 64 69  'tick-value').di
0a20: 73 61 62 6c 65 64 20 3d 20 74 72 75 65 3b 0a 0a  sabled = true;..
0a30: 20 20 20 20 76 61 72 20 6d 65 6d 20 3d 20 73 65      var mem = se
0a40: 6c 66 2e 73 74 61 74 65 2e 6d 65 6d 3b 0a 20 20  lf.state.mem;.  
0a50: 20 20 77 69 6e 64 6f 77 2e 6d 65 6d 20 3d 20 6d    window.mem = m
0a60: 65 6d 3b 0a 20 20 20 20 76 61 72 20 68 61 6e 64  em;.    var hand
0a70: 6c 65 72 73 20 3d 20 7b 7d 3b 0a 20 20 20 20 77  lers = {};.    w
0a80: 69 6e 64 6f 77 2e 63 6f 75 6e 74 20 3d 20 2d 31  indow.count = -1
0a90: 3b 0a 0a 20 20 20 20 76 61 72 20 74 65 78 74 20  ;..    var text 
0aa0: 3d 20 65 64 69 74 6f 72 2e 67 65 74 56 61 6c 75  = editor.getValu
0ab0: 65 28 29 3b 0a 0a 20 20 20 20 65 64 69 74 6f 72  e();..    editor
0ac0: 2e 6f 6e 28 22 63 68 61 6e 67 65 22 2c 20 66 75  .on("change", fu
0ad0: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
0ae0: 20 20 20 20 74 65 78 74 20 3d 20 65 64 69 74 6f      text = edito
0af0: 72 2e 67 65 74 56 61 6c 75 65 28 29 3b 0a 20 20  r.getValue();.  
0b00: 20 20 7d 29 3b 0a 0a 20 20 20 20 76 61 72 20 70    });..    var p
0b10: 61 74 74 65 72 6e 73 20 3d 20 5b 20 63 65 6c 6c  atterns = [ cell
0b20: 78 28 22 30 30 30 30 22 29 20 5d 3b 20 2f 2f 20  x("0000") ]; // 
0b30: 6e 65 65 64 20 74 68 69 73 20 66 6f 72 20 66 69  need this for fi
0b40: 72 73 74 20 65 76 61 6c 0a 0a 20 20 20 20 76 61  rst eval..    va
0b50: 72 20 62 61 72 73 20 3d 20 30 3b 0a 20 20 20 20  r bars = 0;.    
0b60: 76 61 72 20 74 69 63 6b 20 3d 20 30 3b 0a 0a 20  var tick = 0;.. 
0b70: 20 20 20 76 61 72 20 71 75 61 72 74 65 72 5f 62     var quarter_b
0b80: 65 61 74 5f 6c 65 6e 67 74 68 20 3d 20 36 30 30  eat_length = 600
0b90: 30 30 2e 30 20 2f 20 74 68 69 73 2e 73 74 61 74  00.0 / this.stat
0ba0: 65 2e 74 65 6d 70 6f 3b 0a 20 20 20 20 76 61 72  e.tempo;.    var
0bb0: 20 62 65 61 74 5f 6c 65 6e 67 74 68 20 3d 20 71   beat_length = q
0bc0: 75 61 72 74 65 72 5f 62 65 61 74 5f 6c 65 6e 67  uarter_beat_leng
0bd0: 74 68 20 2a 20 34 3b 0a 20 20 20 20 76 61 72 20  th * 4;.    var 
0be0: 64 65 6c 74 61 20 3d 20 62 65 61 74 5f 6c 65 6e  delta = beat_len
0bf0: 67 74 68 20 2f 20 74 68 69 73 2e 73 74 61 74 65  gth / this.state
0c00: 2e 74 69 63 6b 73 3b 0a 0a 20 20 20 20 77 69 6e  .ticks;..    win
0c10: 64 6f 77 2e 73 61 6d 70 6c 65 73 20 3d 20 74 68  dow.samples = th
0c20: 69 73 2e 73 74 61 74 65 2e 73 61 6d 70 6c 65 73  is.state.samples
0c30: 3b 0a 20 20 20 20 76 61 72 20 65 76 61 6c 5f 67  ;.    var eval_g
0c40: 75 61 72 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  uard = false;.  
0c50: 20 20 73 65 6c 66 2e 74 69 6d 65 72 20 3d 20 73    self.timer = s
0c60: 65 74 49 6e 74 65 72 76 61 6c 28 66 75 6e 63 74  etInterval(funct
0c70: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 63 6f 75  ion () {.    cou
0c80: 6e 74 20 3d 20 63 6f 75 6e 74 20 2b 20 31 3b 0a  nt = count + 1;.
0c90: 20 20 20 20 74 69 63 6b 20 3d 20 28 63 6f 75 6e      tick = (coun
0ca0: 74 20 25 20 74 68 69 73 2e 73 74 61 74 65 2e 74  t % this.state.t
0cb0: 69 63 6b 73 29 3b 0a 20 20 20 20 69 66 20 28 74  icks);.    if (t
0cc0: 69 63 6b 20 3d 3d 3d 20 30 29 20 2b 2b 62 61 72  ick === 0) ++bar
0cd0: 73 3b 0a 0a 20 20 20 20 24 28 22 23 64 75 72 61  s;..    $("#dura
0ce0: 74 69 6f 6e 22 29 2e 68 74 6d 6c 28 22 22 20 2b  tion").html("" +
0cf0: 20 62 61 72 73 20 2b 20 22 2e 22 20 2b 20 74 69   bars + "." + ti
0d00: 63 6b 20 2b 20 22 20 2f 20 22 20 2b 20 63 6f 75  ck + " / " + cou
0d10: 6e 74 20 2b 20 22 20 2f 20 22 20 2b 20 77 69 6e  nt + " / " + win
0d20: 64 6f 77 2e 72 6f 75 6e 64 54 6f 28 54 6f 6e 65  dow.roundTo(Tone
0d30: 2e 54 72 61 6e 73 70 6f 72 74 2e 73 65 63 6f 6e  .Transport.secon
0d40: 64 73 2c 20 32 29 29 3b 0a 20 20 20 20 61 6c 77  ds, 2));.    alw
0d50: 61 79 73 28 29 3b 0a 20 20 20 20 66 6f 72 20 28  ays();.    for (
0d60: 76 61 72 20 69 20 3d 20 30 3b 20 69 20 3c 20 70  var i = 0; i < p
0d70: 61 74 74 65 72 6e 73 2e 6c 65 6e 67 74 68 3b 20  atterns.length; 
0d80: 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 69  i++) {.        i
0d90: 66 20 28 69 20 3d 3d 20 30 29 20 7b 0a 20 20 20  f (i == 0) {.   
0da0: 20 20 20 20 20 20 20 20 20 65 76 61 6c 5f 67 75           eval_gu
0db0: 61 72 64 20 3d 20 74 72 75 65 3b 0a 20 20 20 20  ard = true;.    
0dc0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
0dd0: 20 20 20 20 20 20 20 20 20 65 76 61 6c 5f 67 75           eval_gu
0de0: 61 72 64 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20  ard = false;..  
0df0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
0e00: 76 61 72 20 64 69 61 6c 73 20 3d 20 73 65 6c 66  var dials = self
0e10: 2e 73 74 61 74 65 2e 64 69 61 6c 73 3b 0a 20 20  .state.dials;.  
0e20: 20 20 20 20 20 20 76 61 72 20 6e 75 6d 62 65 72        var number
0e30: 73 20 3d 20 73 65 6c 66 2e 73 74 61 74 65 2e 6e  s = self.state.n
0e40: 75 6d 62 65 72 73 3b 0a 0a 20 20 20 20 20 20 20  umbers;..       
0e50: 20 69 66 20 28 64 6f 63 75 6d 65 6e 74 2e 67 65   if (document.ge
0e60: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 65 64  tElementById('ed
0e70: 69 74 2d 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65  it-mode').checke
0e80: 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  d) {.           
0e90: 20 76 61 72 20 70 5f 74 65 78 74 20 20 3d 20 6f   var p_text  = o
0ea0: 6c 64 50 61 74 74 65 72 6e 73 5b 69 5d 3b 0a 20  ldPatterns[i];. 
0eb0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
0ec0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
0ed0: 70 5f 74 65 78 74 20 3d 20 70 61 74 74 65 72 6e  p_text = pattern
0ee0: 73 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  s[i];.          
0ef0: 20 20 6f 6c 64 50 61 74 74 65 72 6e 73 5b 69 5d    oldPatterns[i]
0f00: 20 3d 20 70 5f 74 65 78 74 3b 0a 20 20 20 20 20   = p_text;.     
0f10: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20     }.        if 
0f20: 28 70 5f 74 65 78 74 28 29 20 26 26 20 70 5f 74  (p_text() && p_t
0f30: 65 78 74 28 29 2e 6c 65 6e 67 74 68 20 21 3d 3d  ext().length !==
0f40: 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   0) {.          
0f50: 20 20 76 61 72 20 74 72 61 63 6b 5f 6e 6f 20 3d    var track_no =
0f60: 20 69 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20   i + 1;.        
0f70: 20 20 20 20 76 61 72 20 70 61 74 74 65 72 6e 20      var pattern 
0f80: 3d 20 70 61 74 74 65 72 6e 5f 70 61 72 73 65 28  = pattern_parse(
0f90: 70 5f 74 65 78 74 28 29 29 3b 0a 20 20 20 20 20  p_text());.     
0fa0: 20 20 20 20 20 20 20 76 61 72 20 6d 65 74 61 20         var meta 
0fb0: 3d 20 70 61 74 74 65 72 6e 5f 6d 65 74 61 28 70  = pattern_meta(p
0fc0: 5f 74 65 78 74 28 29 29 3b 0a 20 20 20 20 20 20  _text());.      
0fd0: 20 20 20 20 20 20 76 61 72 20 69 73 48 69 74 20        var isHit 
0fe0: 3d 20 28 70 61 74 74 65 72 6e 2e 73 70 6c 69 74  = (pattern.split
0ff0: 28 27 27 29 5b 74 69 63 6b 5d 20 3d 3d 20 22 31  ('')[tick] == "1
1000: 22 29 20 3f 20 74 72 75 65 20 3a 20 66 61 6c 73  ") ? true : fals
1010: 65 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20  e;..            
1020: 74 72 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20  try {.          
1030: 20 20 20 20 20 20 69 66 20 28 64 6f 63 75 6d 65        if (docume
1040: 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49  nt.getElementByI
1050: 64 28 27 65 64 69 74 2d 6d 6f 64 65 27 29 2e 63  d('edit-mode').c
1060: 68 65 63 6b 65 64 29 20 7b 0a 20 20 20 20 20 20  hecked) {.      
1070: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 76                ev
1080: 61 6c 28 6f 6c 64 43 6f 64 65 29 3b 0a 20 20 20  al(oldCode);.   
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
10a0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
10b0: 20 20 20 20 20 20 20 20 20 20 65 76 61 6c 28 74            eval(t
10c0: 65 78 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ext);.          
10d0: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 64 6f            if (do
10e0: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
10f0: 74 42 79 49 64 28 27 72 65 64 6f 27 29 2e 63 68  tById('redo').ch
1100: 65 63 6b 65 64 29 20 7b 0a 20 20 20 20 20 20 20  ecked) {.       
1110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1120: 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65   document.getEle
1130: 6d 65 6e 74 42 79 49 64 28 27 72 65 64 6f 27 29  mentById('redo')
1140: 2e 63 68 65 63 6b 65 64 20 3d 20 66 61 6c 73 65  .checked = false
1150: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1160: 20 20 20 20 20 20 20 20 20 20 74 69 63 6b 20 3d            tick =
1170: 20 28 63 6f 75 6e 74 20 25 20 74 68 69 73 2e 73   (count % this.s
1180: 74 61 74 65 2e 74 69 63 6b 73 29 3b 0a 20 20 20  tate.ticks);.   
1190: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11a0: 20 20 20 20 20 63 6f 75 6e 74 20 2d 3d 20 74 69       count -= ti
11b0: 63 6b 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20  ck + 1;.        
11c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11d0: 69 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  i = 0;.         
11e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
11f0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
1200: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
1210: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1220: 20 20 20 69 66 20 28 64 6f 63 75 6d 65 6e 74 2e     if (document.
1230: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27  getElementById('
1240: 6c 6f 61 64 2d 6d 6f 64 65 27 29 2e 63 68 65 63  load-mode').chec
1250: 6b 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ked) {.         
1260: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1270: 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65  ocument.getEleme
1280: 6e 74 42 79 49 64 28 27 6c 6f 61 64 2d 6d 6f 64  ntById('load-mod
1290: 65 27 29 2e 63 68 65 63 6b 65 64 20 3d 20 66 61  e').checked = fa
12a0: 6c 73 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  lse;.           
12b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72 61               tra
12c0: 6e 73 69 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20  nsition();.     
12d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
12e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
12f0: 20 20 20 20 20 6f 6c 64 43 6f 64 65 20 3d 20 74       oldCode = t
1300: 65 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ext;.           
1310: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
1320: 20 20 20 20 20 20 20 24 28 22 23 65 72 72 6f 72         $("#error
1330: 22 29 2e 68 74 6d 6c 28 22 22 29 3b 0a 20 20 20  ").html("");.   
1340: 20 20 20 20 20 20 20 20 20 7d 20 63 61 74 63 68           } catch
1350: 20 28 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20   (ex) {.        
1360: 20 20 20 20 20 20 20 20 24 28 22 23 65 72 72 6f          $("#erro
1370: 72 22 29 2e 68 74 6d 6c 28 65 78 29 3b 0a 20 20  r").html(ex);.  
1380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 65 76                ev
1390: 61 6c 28 6f 6c 64 43 6f 64 65 29 3b 0a 20 20 20  al(oldCode);.   
13a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
13b0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 2e 62     }.    }.  }.b
13c0: 69 6e 64 28 74 68 69 73 29 2c 20 64 65 6c 74 61  ind(this), delta
13d0: 29 0a 0a 20 20 77 69 6e 64 6f 77 2e 72 65 71 75  )..  window.requ
13e0: 65 73 74 41 6e 69 6d 61 74 69 6f 6e 46 72 61 6d  estAnimationFram
13f0: 65 28 61 6e 69 6d 61 74 69 6f 6e 29 3b 0a 0a 7d  e(animation);..}
1400: 0a 22 22 22 0a 63 6f 67 2e 6f 75 74 28 63 6f 72  .""".cog.out(cor
1410: 65 5f 6c 6f 6f 70 29 0a 40 3e 0a 40 40 0a 60 60  e_loop).@>.@@.``
1420: 60 0a 0a 23 23 20 44 69 61 6c 73 0a 0a 42 69 74  `..## Dials..Bit
1430: 72 68 79 74 68 6d 20 70 72 6f 76 69 64 65 73 20  rhythm provides 
1440: 63 75 73 74 6f 6d 20 64 69 61 6c 73 2e 20 54 68  custom dials. Th
1450: 65 73 65 20 64 69 61 6c 73 20 63 61 6e 20 62 65  ese dials can be
1460: 20 6d 61 70 70 65 64 20 74 6f 20 61 6e 79 20 61   mapped to any a
1470: 73 70 65 63 74 73 20 6f 66 20 54 6f 6e 65 2e 6a  spects of Tone.j
1480: 73 2e 20 41 6c 6c 20 64 69 61 6c 73 20 61 72 65  s. All dials are
1490: 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 6e   available as an
14a0: 20 61 72 72 61 79 20 64 69 61 6c 73 20 69 6e 20   array dials in 
14b0: 74 68 65 20 6c 69 76 65 20 63 6f 64 65 20 65 64  the live code ed
14c0: 69 74 6f 72 2e 0a 0a 60 60 60 7b 63 6f 64 65 2d  itor...```{code-
14d0: 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a  block} html.---.
14e0: 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a  force: true.---.
14f0: 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 69  .@<.import cog.i
1500: 6d 70 6f 72 74 20 6f 73 0a 0a 64 69 61 6c 20 3d  mport os..dial =
1510: 20 22 22 22 0a 3c 64 69 61 6c 3e 0a 20 20 20 20   """.<dial>.    
1520: 3c 76 62 6f 78 3e 0a 20 20 20 20 20 20 20 20 3c  <vbox>.        <
1530: 64 69 76 20 63 6c 61 73 73 3d 22 6d 6c 2d 34 22  div class="ml-4"
1540: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 68  >.            <h
1550: 73 74 61 63 6b 3e 0a 20 20 20 20 20 20 20 20 20  stack>.         
1560: 20 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d 7b         <div id={
1570: 22 6b 6e 6f 62 22 20 2b 20 70 72 6f 70 73 2e 74  "knob" + props.t
1580: 69 7d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20  i}></div>.      
1590: 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 63            <div c
15a0: 6c 61 73 73 3d 22 6d 74 2d 31 22 20 73 74 79 6c  lass="mt-1" styl
15b0: 65 3d 22 68 65 69 67 68 74 3a 20 32 32 70 78 22  e="height: 22px"
15c0: 20 69 64 3d 7b 22 6b 6e 6f 62 2d 76 61 6c 75 65   id={"knob-value
15d0: 22 20 2b 20 70 72 6f 70 73 2e 74 69 7d 3e 3c 2f  " + props.ti}></
15e0: 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20  div>.           
15f0: 20 20 20 20 20 3c 73 70 61 6e 20 63 6c 61 73 73       <span class
1600: 3d 22 63 75 72 73 6f 72 2d 70 6f 69 6e 74 65 72  ="cursor-pointer
1610: 22 20 69 64 3d 7b 22 73 61 6d 70 6c 65 22 20 2b  " id={"sample" +
1620: 20 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 7d 20   this.props.ti} 
1630: 6f 6e 63 6c 69 63 6b 3d 7b 72 65 6d 6f 76 65 28  onclick={remove(
1640: 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 20 2d 31  this.props.ti -1
1650: 29 7d 3e 28 78 29 3c 2f 73 70 61 6e 3e 0a 20 20  )}>(x)</span>.  
1660: 20 20 20 20 20 20 20 20 20 20 3c 2f 68 73 74 61            </hsta
1670: 63 6b 3e 0a 20 20 20 20 20 20 20 20 3c 2f 64 69  ck>.        </di
1680: 76 3e 0a 20 20 20 20 3c 2f 76 62 6f 78 3e 0a 0a  v>.    </vbox>..
1690: 20 20 20 20 3c 73 63 72 69 70 74 3e 0a 0a 74 68      <script>..th
16a0: 69 73 2e 70 72 6f 70 73 20 3d 20 6f 70 74 73 3b  is.props = opts;
16b0: 0a 0a 72 65 6d 6f 76 65 28 69 6e 64 65 78 29 20  ..remove(index) 
16c0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 29 20  {.    return () 
16d0: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69  => {.        thi
16e0: 73 2e 70 72 6f 70 73 2e 72 6d 64 69 61 6c 28 69  s.props.rmdial(i
16f0: 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a  ndex);.    }.}..
1700: 74 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22 2c  this.on("mount",
1710: 20 28 29 20 3d 3e 20 7b 0a 20 20 20 20 69 66 20   () => {.    if 
1720: 28 6f 70 74 73 2e 76 29 20 7b 0a 0a 20 20 20 20  (opts.v) {..    
1730: 20 20 20 20 4e 65 78 75 73 2e 63 6f 6c 6f 72 73      Nexus.colors
1740: 2e 61 63 63 65 6e 74 20 3d 20 22 23 30 30 30 30  .accent = "#0000
1750: 30 30 22 0a 20 20 20 20 20 20 20 20 4e 65 78 75  00".        Nexu
1760: 73 2e 63 6f 6c 6f 72 73 2e 66 69 6c 6c 20 3d 20  s.colors.fill = 
1770: 22 23 66 66 66 66 66 66 22 0a 0a 20 20 20 20 20  "#ffffff"..     
1780: 20 20 20 76 61 72 20 63 65 6c 6c 20 3d 20 77 69     var cell = wi
1790: 6e 64 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78  ndow.cellx.cellx
17a0: 28 30 2e 35 29 3b 0a 20 20 20 20 20 20 20 20 76  (0.5);.        v
17b0: 61 72 20 64 69 61 6c 20 3d 20 6e 65 77 20 4e 65  ar dial = new Ne
17c0: 78 75 73 2e 44 69 61 6c 28 27 23 6b 6e 6f 62 27  xus.Dial('#knob'
17d0: 20 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e 74 69   + this.props.ti
17e0: 2c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  , {.            
17f0: 27 73 69 7a 65 27 3a 20 5b 34 35 2c 20 34 35 5d  'size': [45, 45]
1800: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 27 76  ,.            'v
1810: 61 6c 75 65 27 3a 20 30 2e 35 0a 20 20 20 20 20  alue': 0.5.     
1820: 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 63     });.        c
1830: 65 6c 6c 2e 6f 6e 43 68 61 6e 67 65 28 65 76 74  ell.onChange(evt
1840: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20   => {.          
1850: 20 20 69 66 20 28 65 76 74 2e 64 61 74 61 2e 70    if (evt.data.p
1860: 72 65 76 56 61 6c 75 65 20 21 3d 3d 20 65 76 74  revValue !== evt
1870: 2e 64 61 74 61 2e 76 61 6c 75 65 29 20 7b 0a 20  .data.value) {. 
1880: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64                 d
1890: 69 61 6c 2e 76 61 6c 75 65 20 3d 20 65 76 74 2e  ial.value = evt.
18a0: 64 61 74 61 2e 76 61 6c 75 65 3b 0a 20 20 20 20  data.value;.    
18b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
18c0: 20 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 64 69    });.        di
18d0: 61 6c 2e 63 6f 6c 6f 72 69 7a 65 28 22 61 63 63  al.colorize("acc
18e0: 65 6e 74 22 2c 22 23 30 30 30 22 29 0a 20 20 20  ent","#000").   
18f0: 20 20 20 20 20 64 69 61 6c 2e 6f 6e 28 27 63 68       dial.on('ch
1900: 61 6e 67 65 27 2c 20 28 76 61 6c 29 20 3d 3e 20  ange', (val) => 
1910: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  {.            va
1920: 6c 20 3d 20 77 69 6e 64 6f 77 2e 72 6f 75 6e 64  l = window.round
1930: 54 6f 28 76 61 6c 2c 20 34 29 3b 0a 20 20 20 20  To(val, 4);.    
1940: 20 20 20 20 20 20 20 20 24 28 27 23 6b 6e 6f 62          $('#knob
1950: 2d 76 61 6c 75 65 27 20 2b 20 74 68 69 73 2e 70  -value' + this.p
1960: 72 6f 70 73 2e 74 69 29 2e 68 74 6d 6c 28 76 61  rops.ti).html(va
1970: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
1980: 63 65 6c 6c 28 76 61 6c 29 3b 0a 20 20 20 20 20  cell(val);.     
1990: 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20 74 68     });.       th
19a0: 69 73 2e 70 72 6f 70 73 2e 76 5b 22 63 65 6c 6c  is.props.v["cell
19b0: 22 5d 20 3d 20 63 65 6c 6c 3b 0a 20 20 20 20 7d  "] = cell;.    }
19c0: 0a 7d 29 3b 0a 20 20 20 3c 2f 73 63 72 69 70 74  .});.   </script
19d0: 3e 0a 0a 3c 2f 64 69 61 6c 3e 0a 22 22 22 0a 0a  >..</dial>."""..
19e0: 63 6f 67 2e 6f 75 74 28 64 69 61 6c 29 0a 6f 73  cog.out(dial).os
19f0: 2e 73 79 73 74 65 6d 28 22 72 6d 20 70 75 62 6c  .system("rm publ
1a00: 69 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 64 69  ic/components/di
1a10: 61 6c 2e 74 61 67 22 29 0a 66 20 3d 20 6f 70 65  al.tag").f = ope
1a20: 6e 28 22 70 75 62 6c 69 63 2f 63 6f 6d 70 6f 6e  n("public/compon
1a30: 65 6e 74 73 2f 64 69 61 6c 2e 74 61 67 22 2c 20  ents/dial.tag", 
1a40: 22 77 22 29 0a 66 2e 77 72 69 74 65 28 64 69 61  "w").f.write(dia
1a50: 6c 29 0a 66 2e 63 6c 6f 73 65 28 29 0a 40 3e 0a  l).f.close().@>.
1a60: 40 40 0a 60 60 60 0a 0a 23 23 20 4e 75 6d 62 65  @@.```..## Numbe
1a70: 72 73 0a 0a 54 68 65 73 65 20 6e 75 6d 62 65 72  rs..These number
1a80: 73 20 63 61 6e 20 62 65 20 6d 61 70 70 65 64 20  s can be mapped 
1a90: 74 6f 20 61 6e 79 20 61 73 70 65 63 74 20 6f 66  to any aspect of
1aa0: 20 54 6f 6e 65 2e 6a 73 2e 20 41 6c 6c 20 6e 75   Tone.js. All nu
1ab0: 6d 62 65 72 20 62 6f 78 65 73 20 61 72 65 20 61  mber boxes are a
1ac0: 76 61 69 6c 61 62 6c 65 20 61 73 20 61 6e 20 61  vailable as an a
1ad0: 72 72 61 79 20 6e 75 6d 62 65 72 73 20 69 6e 20  rray numbers in 
1ae0: 74 68 65 20 6c 69 76 65 20 63 6f 64 65 20 65 64  the live code ed
1af0: 69 74 6f 72 2e 20 55 73 65 66 75 6c 20 66 6f 72  itor. Useful for
1b00: 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70 6f   debugging purpo
1b10: 73 65 73 2e 0a 0a 60 60 60 7b 63 6f 64 65 2d 62  ses...```{code-b
1b20: 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a 66  lock} html.---.f
1b30: 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a  orce: true.---..
1b40: 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 69 6d  @<.import cog.im
1b50: 70 6f 72 74 20 6f 73 0a 0a 6e 75 6d 62 65 72 20  port os..number 
1b60: 3d 20 22 22 22 0a 3c 6e 75 6d 62 65 72 3e 0a 20  = """.<number>. 
1b70: 20 20 20 3c 76 62 6f 78 3e 0a 20 20 20 20 20 20     <vbox>.      
1b80: 20 20 3c 64 69 76 20 20 63 6c 61 73 73 3d 22 6d    <div  class="m
1b90: 6c 2d 34 22 3e 0a 20 20 20 20 20 20 20 20 20 20  l-4">.          
1ba0: 20 20 3c 68 73 74 61 63 6b 3e 0a 20 20 20 20 20    <hstack>.     
1bb0: 20 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d 7b         <div id={
1bc0: 22 6e 75 6d 62 65 72 22 20 2b 20 70 72 6f 70 73  "number" + props
1bd0: 2e 74 69 7d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20  .ti}></div>.    
1be0: 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61          <div cla
1bf0: 73 73 3d 22 6d 74 2d 31 22 20 73 74 79 6c 65 3d  ss="mt-1" style=
1c00: 22 68 65 69 67 68 74 3a 20 32 32 70 78 22 20 69  "height: 22px" i
1c10: 64 3d 7b 22 6e 75 6d 62 65 72 2d 76 61 6c 75 65  d={"number-value
1c20: 22 20 2b 20 70 72 6f 70 73 2e 74 69 7d 3e 3c 2f  " + props.ti}></
1c30: 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20  div>.           
1c40: 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 63 75   <span class="cu
1c50: 72 73 6f 72 2d 70 6f 69 6e 74 65 72 22 20 6f 6e  rsor-pointer" on
1c60: 63 6c 69 63 6b 3d 7b 72 65 6d 6f 76 65 28 74 68  click={remove(th
1c70: 69 73 2e 70 72 6f 70 73 2e 74 69 20 2d 31 29 7d  is.props.ti -1)}
1c80: 3e 28 78 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20  >(x)</span>.    
1c90: 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 20 20      </hstack>.  
1ca0: 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20        </div>.   
1cb0: 20 3c 2f 76 62 6f 78 3e 0a 0a 20 20 20 20 3c 73   </vbox>..    <s
1cc0: 63 72 69 70 74 3e 0a 0a 74 68 69 73 2e 70 72 6f  cript>..this.pro
1cd0: 70 73 20 3d 20 6f 70 74 73 3b 0a 0a 20 20 20 20  ps = opts;..    
1ce0: 72 65 6d 6f 76 65 28 69 6e 64 65 78 29 20 7b 0a  remove(index) {.
1cf0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
1d00: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
1d10: 20 20 20 74 68 69 73 2e 70 72 6f 70 73 2e 72 6d     this.props.rm
1d20: 6e 75 6d 62 65 72 28 69 6e 64 65 78 29 3b 0a 20  number(index);. 
1d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
1d40: 74 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22 2c  this.on("mount",
1d50: 20 28 29 20 3d 3e 20 7b 0a 20 20 20 20 69 66 20   () => {.    if 
1d60: 28 6f 70 74 73 2e 76 29 20 7b 0a 0a 20 20 20 20  (opts.v) {..    
1d70: 20 20 20 20 4e 65 78 75 73 2e 63 6f 6c 6f 72 73      Nexus.colors
1d80: 2e 61 63 63 65 6e 74 20 3d 20 22 23 30 30 30 30  .accent = "#0000
1d90: 30 30 22 0a 20 20 20 20 20 20 20 20 4e 65 78 75  00".        Nexu
1da0: 73 2e 63 6f 6c 6f 72 73 2e 66 69 6c 6c 20 3d 20  s.colors.fill = 
1db0: 22 23 66 66 66 66 66 66 22 0a 0a 20 20 20 20 20  "#ffffff"..     
1dc0: 20 20 20 76 61 72 20 63 65 6c 6c 20 3d 20 77 69     var cell = wi
1dd0: 6e 64 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78  ndow.cellx.cellx
1de0: 28 30 29 0a 20 20 20 20 20 20 20 20 76 61 72 20  (0).        var 
1df0: 6e 75 6d 62 65 72 20 3d 20 6e 65 77 20 4e 65 78  number = new Nex
1e00: 75 73 2e 4e 75 6d 62 65 72 28 27 23 6e 75 6d 62  us.Number('#numb
1e10: 65 72 27 20 2b 20 74 68 69 73 2e 70 72 6f 70 73  er' + this.props
1e20: 2e 74 69 2c 20 7b 0a 20 20 20 20 20 20 20 20 20  .ti, {.         
1e30: 20 20 20 27 76 61 6c 75 65 27 3a 20 30 2c 0a 20     'value': 0,. 
1e40: 20 20 20 20 20 20 20 20 20 20 20 27 73 74 65 70             'step
1e50: 27 3a 20 30 2e 30 31 0a 20 20 20 20 20 20 20 20  ': 0.01.        
1e60: 7d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c  });.        cell
1e70: 2e 6f 6e 43 68 61 6e 67 65 28 65 76 74 20 3d 3e  .onChange(evt =>
1e80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
1e90: 66 20 28 65 76 74 2e 64 61 74 61 2e 70 72 65 76  f (evt.data.prev
1ea0: 56 61 6c 75 65 20 21 3d 3d 20 65 76 74 2e 64 61  Value !== evt.da
1eb0: 74 61 2e 76 61 6c 75 65 29 20 7b 0a 20 20 20 20  ta.value) {.    
1ec0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 62              numb
1ed0: 65 72 2e 76 61 6c 75 65 20 3d 20 65 76 74 2e 64  er.value = evt.d
1ee0: 61 74 61 2e 76 61 6c 75 65 3b 0a 20 20 20 20 20  ata.value;.     
1ef0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1f00: 20 7d 29 3b 0a 0a 20 20 20 20 20 20 20 20 74 68   });..        th
1f10: 69 73 2e 70 72 6f 70 73 2e 76 5b 22 76 22 5d 20  is.props.v["v"] 
1f20: 3d 20 63 65 6c 6c 3b 0a 20 20 20 20 7d 0a 7d 29  = cell;.    }.})
1f30: 3b 0a 20 20 20 3c 2f 73 63 72 69 70 74 3e 0a 0a  ;.   </script>..
1f40: 3c 2f 6e 75 6d 62 65 72 3e 0a 22 22 22 0a 0a 63  </number>."""..c
1f50: 6f 67 2e 6f 75 74 28 6e 75 6d 62 65 72 29 0a 6f  og.out(number).o
1f60: 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 70 75 62  s.system("rm pub
1f70: 6c 69 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 6e  lic/components/n
1f80: 75 6d 62 65 72 2e 74 61 67 22 29 0a 66 20 3d 20  umber.tag").f = 
1f90: 6f 70 65 6e 28 22 70 75 62 6c 69 63 2f 63 6f 6d  open("public/com
1fa0: 70 6f 6e 65 6e 74 73 2f 6e 75 6d 62 65 72 2e 74  ponents/number.t
1fb0: 61 67 22 2c 20 22 77 22 29 0a 66 2e 77 72 69 74  ag", "w").f.writ
1fc0: 65 28 6e 75 6d 62 65 72 29 0a 66 2e 63 6c 6f 73  e(number).f.clos
1fd0: 65 28 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a 23  e().@>.@@.```..#
1fe0: 23 20 41 75 74 6f 4b 6e 6f 62 0a 0a 41 75 74 6f  # AutoKnob..Auto
1ff0: 4b 6e 6f 62 20 65 6e 61 62 6c 65 73 20 70 72 6f  Knob enables pro
2000: 67 72 61 6d 6d 61 74 69 63 20 61 75 74 6f 6d 61  grammatic automa
2010: 74 69 6f 6e 20 69 6e 20 42 69 74 72 68 79 74 68  tion in Bitrhyth
2020: 6d 0a 0a 60 78 20 2d 3e 20 5b 31 2c 20 32 2e 35  m..`x -> [1, 2.5
2030: 2c 20 34 2c 20 33 2e 32 5d 20 7c 20 62 79 20 30  , 4, 3.2] | by 0
2040: 2e 33 60 0a 0a 78 20 77 69 6c 6c 20 67 6f 20 66  .3`..x will go f
2050: 72 6f 6d 20 31 20 74 6f 20 32 2e 35 20 74 6f 20  rom 1 to 2.5 to 
2060: 34 20 74 6f 20 33 2e 32 20 69 6e 20 69 6e 63 72  4 to 3.2 in incr
2070: 65 6d 65 6e 74 73 20 6f 66 20 30 2e 33 20 66 6f  ements of 0.3 fo
2080: 72 20 65 76 65 72 79 20 74 69 63 6b 2e 20 57 68  r every tick. Wh
2090: 69 6c 65 20 78 20 77 69 6c 6c 20 69 6e 63 72 65  ile x will incre
20a0: 61 73 65 20 74 69 6c 6c 20 34 20 2e 2e 2e 20 69  ase till 4 ... i
20b0: 74 20 77 69 6c 6c 20 64 65 63 72 65 61 73 65 20  t will decrease 
20c0: 6f 6e 63 65 20 69 74 20 72 65 61 63 68 65 73 20  once it reaches 
20d0: 34 20 61 6e 64 20 64 72 6f 70 20 64 6f 77 6e 20  4 and drop down 
20e0: 74 6f 20 33 2e 32 2e 20 41 66 74 65 72 20 72 65  to 3.2. After re
20f0: 61 63 68 69 6e 67 20 33 2e 32 20 79 6f 75 20 63  aching 3.2 you c
2100: 61 6e 20 73 74 61 79 20 74 68 65 72 65 20 6f 72  an stay there or
2110: 20 72 65 76 65 72 73 65 20 62 61 63 6b 2e 20 41   reverse back. A
2120: 74 20 61 6e 79 20 70 6f 69 6e 74 20 64 75 72 69  t any point duri
2130: 6e 67 20 6c 69 76 65 20 65 64 69 74 69 6e 67 2c  ng live editing,
2140: 20 79 6f 75 20 63 61 6e 20 61 64 64 20 61 6e 20   you can add an 
2150: 65 78 74 72 61 20 65 6c 65 6d 65 6e 74 20 74 6f  extra element to
2160: 20 74 68 65 20 61 72 72 61 79 2e 20 49 66 20 79   the array. If y
2170: 6f 75 20 61 64 64 20 35 20 66 6f 72 20 65 78 61  ou add 5 for exa
2180: 6d 70 6c 65 2c 20 74 68 65 20 6c 6f 6f 70 20 77  mple, the loop w
2190: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 66 72 6f  ill continue fro
21a0: 6d 20 33 2e 32 20 74 6f 20 35 2e 0a 0a 59 6f 75  m 3.2 to 5...You
21b0: 20 63 61 6e 20 74 68 69 6e 6b 20 6f 66 20 65 61   can think of ea
21c0: 63 68 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68  ch element in th
21d0: 65 20 61 72 72 61 79 20 61 73 20 74 68 65 20 22  e array as the "
21e0: 66 69 6e 61 6c 20 6b 6e 6f 62 20 70 6f 73 69 74  final knob posit
21f0: 69 6f 6e 22 20 61 6e 64 20 69 6e 20 65 61 63 68  ion" and in each
2200: 20 63 79 63 6c 65 20 77 65 20 61 72 65 20 6d 6f   cycle we are mo
2210: 76 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  ving to the next
2220: 20 6b 6e 6f 62 20 70 6f 73 69 74 69 6f 6e 20 69   knob position i
2230: 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20  n increments of 
2240: 30 2e 33 0a 0a 41 6e 20 61 6c 74 65 72 6e 61 74  0.3..An alternat
2250: 65 20 74 6f 20 41 75 74 6f 4b 6e 6f 62 20 69 73  e to AutoKnob is
2260: 20 74 6f 20 75 73 65 20 54 69 6d 65 64 4b 6e 6f   to use TimedKno
2270: 62 2e 20 49 6e 20 74 68 65 20 65 6e 64 6c 65 73  b. In the endles
2280: 73 20 61 63 69 64 20 62 61 6e 67 65 72 20 20 70  s acid banger  p
2290: 72 6f 6a 65 63 74 2c 20 74 68 65 20 62 61 73 69  roject, the basi
22a0: 63 20 63 6f 64 65 20 77 61 73 20 75 73 69 6e 67  c code was using
22b0: 20 61 20 73 69 6d 70 6c 65 20 74 69 6d 65 72 20   a simple timer 
22c0: 74 6f 20 72 61 6e 64 6f 6d 6c 79 20 6d 6f 76 65  to randomly move
22d0: 20 74 68 65 20 6b 6e 6f 62 20 70 6f 73 69 74 69   the knob positi
22e0: 6f 6e 20 61 6c 6f 6e 67 20 77 69 74 68 20 6e 6f  on along with no
22f0: 74 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 61  te collections a
2300: 6e 64 20 77 65 69 67 68 74 65 64 20 72 61 6e 64  nd weighted rand
2310: 6f 6d 20 63 68 6f 69 63 65 20 6f 6e 20 6e 6f 74  om choice on not
2320: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 66 6f  e collections fo
2330: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 68 79  r generating rhy
2340: 74 68 6d 73 2e 0a 0a 54 69 6d 65 64 4b 6e 6f 62  thms...TimedKnob
2350: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
2360: 20 61 64 64 20 73 6d 61 6c 6c 20 76 61 72 69 61   add small varia
2370: 74 69 6f 6e 73 20 69 6e 20 76 6f 6c 75 6d 65 20  tions in volume 
2380: 74 6f 20 6d 61 6b 65 20 74 68 65 20 64 72 75 6d  to make the drum
2390: 73 20 73 6f 75 6e 64 73 20 6d 6f 72 65 20 6e 61  s sounds more na
23a0: 74 75 72 61 6c 2e 0a 0a 60 60 60 7b 63 6f 64 65  tural...```{code
23b0: 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d 2d 0a 66  -block} js.---.f
23c0: 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a  orce: true.---..
23d0: 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 0a 6b  @<.import cog..k
23e0: 6e 6f 62 5f 63 6f 64 65 20 3d 20 22 22 22 0a 66  nob_code = """.f
23f0: 75 6e 63 74 69 6f 6e 20 6b 6e 6f 62 28 6f 70 74  unction knob(opt
2400: 69 6f 6e 73 29 20 7b 0a 20 20 20 20 6f 70 74 69  ions) {.    opti
2410: 6f 6e 73 20 3d 20 6f 70 74 69 6f 6e 73 20 7c 7c  ons = options ||
2420: 20 7b 7d 3b 0a 20 20 20 20 76 61 72 20 63 6f 6e   {};.    var con
2430: 74 65 78 74 20 3d 20 7b 7d 3b 0a 20 20 20 20 63  text = {};.    c
2440: 6f 6e 74 65 78 74 2e 72 61 6d 70 20 3d 20 6f 70  ontext.ramp = op
2450: 74 69 6f 6e 73 2e 72 61 6d 70 20 7c 7c 20 5b 30  tions.ramp || [0
2460: 20 2c 20 31 5d 3b 0a 20 20 20 20 63 6f 6e 74 65   , 1];.    conte
2470: 78 74 2e 63 6f 75 6e 74 5f 73 6b 69 70 20 3d 20  xt.count_skip = 
2480: 6f 70 74 69 6f 6e 73 2e 73 70 65 65 64 20 7c 7c  options.speed ||
2490: 20 34 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e   4;.    context.
24a0: 73 74 65 70 20 3d 20 6f 70 74 69 6f 6e 73 2e 73  step = options.s
24b0: 74 65 70 20 7c 7c 20 30 2e 30 31 3b 0a 20 20 20  tep || 0.01;.   
24c0: 20 63 6f 6e 74 65 78 74 2e 72 65 76 65 72 73 65   context.reverse
24d0: 20 3d 20 6f 70 74 69 6f 6e 73 2e 72 65 76 65 72   = options.rever
24e0: 73 65 20 7c 7c 20 74 72 75 65 3b 0a 20 20 20 20  se || true;.    
24f0: 63 6f 6e 74 65 78 74 2e 6e 75 6d 62 65 72 20 3d  context.number =
2500: 20 6f 70 74 69 6f 6e 73 2e 6e 75 6d 62 65 72 20   options.number 
2510: 7c 7c 20 6e 75 6c 6c 3b 0a 0a 20 20 20 20 63 6f  || null;..    co
2520: 6e 74 65 78 74 2e 63 75 72 72 65 6e 74 5f 63 6f  ntext.current_co
2530: 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f 6e  unt = 0;.    con
2540: 74 65 78 74 2e 69 6e 64 65 78 20 3d 20 30 3b 0a  text.index = 0;.
2550: 0a 20 20 20 20 2f 2f 20 53 6d 6f 6f 74 68 20 74  .    // Smooth t
2560: 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d 20 70  ransition from p
2570: 72 65 76 69 6f 75 73 20 6b 6e 6f 62 20 76 61 6c  revious knob val
2580: 75 65 73 0a 20 20 20 20 69 66 20 28 63 6f 6e 74  ues.    if (cont
2590: 65 78 74 2e 6e 75 6d 62 65 72 29 20 7b 0a 20 20  ext.number) {.  
25a0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 76 61        context.va
25b0: 6c 20 3d 20 77 69 6e 64 6f 77 2e 63 65 6c 6c 78  l = window.cellx
25c0: 2e 63 65 6c 6c 78 28 63 6f 6e 74 65 78 74 2e 6e  .cellx(context.n
25d0: 75 6d 62 65 72 28 29 29 0a 20 20 20 20 7d 20 65  umber()).    } e
25e0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 63 6f  lse {.        co
25f0: 6e 74 65 78 74 2e 76 61 6c 20 3d 20 77 69 6e 64  ntext.val = wind
2600: 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78 28 6f  ow.cellx.cellx(o
2610: 70 74 69 6f 6e 73 2e 69 6e 69 74 69 61 6c 20 7c  ptions.initial |
2620: 7c 20 30 2e 35 29 0a 20 20 20 20 7d 0a 0a 20 20  | 0.5).    }..  
2630: 20 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e 67    function chang
2640: 65 43 6f 6e 74 65 78 74 28 29 20 7b 0a 20 20 20  eContext() {.   
2650: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 6e 65 78       context.nex
2660: 74 5f 76 61 6c 20 3d 20 63 6f 6e 74 65 78 74 2e  t_val = context.
2670: 72 61 6d 70 5b 63 6f 6e 74 65 78 74 2e 69 6e 64  ramp[context.ind
2680: 65 78 20 2b 20 31 5d 3b 0a 0a 20 20 20 20 20 20  ex + 1];..      
2690: 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28 63 6f    context.val(co
26a0: 6e 74 65 78 74 2e 72 61 6d 70 5b 63 6f 6e 74 65  ntext.ramp[conte
26b0: 78 74 2e 69 6e 64 65 78 5d 29 3b 0a 20 20 20 20  xt.index]);.    
26c0: 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74 2e      if (context.
26d0: 76 61 6c 28 29 20 3e 20 63 6f 6e 74 65 78 74 2e  val() > context.
26e0: 6e 65 78 74 5f 76 61 6c 29 20 7b 0a 20 20 20 20  next_val) {.    
26f0: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e          context.
2700: 64 69 72 65 63 74 69 6f 6e 20 3d 20 2d 31 3b 0a  direction = -1;.
2710: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
2720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2730: 74 65 78 74 2e 64 69 72 65 63 74 69 6f 6e 20 3d  text.direction =
2740: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
2750: 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 67 65 43    }..    changeC
2760: 6f 6e 74 65 78 74 28 29 3b 0a 0a 20 20 20 20 72  ontext();..    r
2770: 65 74 75 72 6e 20 7b 0a 20 20 20 20 20 20 20 20  eturn {.        
2780: 22 63 65 6c 6c 22 3a 20 63 6f 6e 74 65 78 74 2e  "cell": context.
2790: 76 61 6c 2c 0a 20 20 20 20 20 20 20 20 22 70 75  val,.        "pu
27a0: 73 68 22 3a 20 66 75 6e 63 74 69 6f 6e 20 28 76  sh": function (v
27b0: 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  al) {.          
27c0: 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e 70    context.ramp.p
27d0: 75 73 68 28 76 61 6c 29 3b 0a 20 20 20 20 20 20  ush(val);.      
27e0: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 72 65    },.        "re
27f0: 70 6c 61 63 65 22 3a 20 66 75 6e 63 74 69 6f 6e  place": function
2800: 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20   (val) {.       
2810: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d       context.ram
2820: 70 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20 20  p = val;.       
2830: 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 73 70 65   },.        "spe
2840: 65 64 22 3a 20 66 75 6e 63 74 69 6f 6e 20 28 76  ed": function (v
2850: 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  al) {.          
2860: 20 20 63 6f 6e 74 65 78 74 2e 63 6f 75 6e 74 5f    context.count_
2870: 73 6b 69 70 20 3d 20 76 61 6c 3b 0a 20 20 20 20  skip = val;.    
2880: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22      },.        "
2890: 73 74 65 70 22 3a 20 66 75 6e 63 74 69 6f 6e 20  step": function 
28a0: 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  (val) {.        
28b0: 20 20 20 20 63 6f 6e 74 65 78 74 2e 73 74 65 70      context.step
28c0: 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20 20 20   = val;.        
28d0: 7d 2c 0a 20 20 20 20 20 20 20 20 22 75 70 22 3a  },.        "up":
28e0: 20 66 75 6e 63 74 69 6f 6e 20 28 76 61 6c 29 20   function (val) 
28f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  {.            va
2900: 6c 20 3d 20 76 61 6c 20 7c 7c 20 30 2e 31 3b 0a  l = val || 0.1;.
2910: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2920: 65 78 74 2e 72 61 6d 70 2e 70 75 73 68 28 63 6f  ext.ramp.push(co
2930: 6e 74 65 78 74 2e 72 61 6d 70 5b 63 6f 6e 74 65  ntext.ramp[conte
2940: 78 74 2e 72 61 6d 70 2e 6c 65 6e 67 74 68 20 2d  xt.ramp.length -
2950: 20 31 5d 20 2b 20 76 61 6c 29 3b 0a 20 20 20 20   1] + val);.    
2960: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22      },.        "
2970: 64 6f 77 6e 22 3a 20 66 75 6e 63 74 69 6f 6e 20  down": function 
2980: 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  (val) {.        
2990: 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 20 7c 7c      val = val ||
29a0: 20 2d 30 2e 31 3b 0a 20 20 20 20 20 20 20 20 20   -0.1;.         
29b0: 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e     context.ramp.
29c0: 70 75 73 68 28 63 6f 6e 74 65 78 74 2e 72 61 6d  push(context.ram
29d0: 70 5b 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e 6c  p[context.ramp.l
29e0: 65 6e 67 74 68 20 2d 20 31 5d 20 2b 20 76 61 6c  ength - 1] + val
29f0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 2c 0a 20 20  );.        },.  
2a00: 20 20 20 20 20 22 6d 6f 76 65 22 3a 20 66 75 6e       "move": fun
2a10: 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20  ction () {.     
2a20: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65         if (conte
2a30: 78 74 2e 63 75 72 72 65 6e 74 5f 63 6f 75 6e 74  xt.current_count
2a40: 20 3e 3d 20 63 6f 6e 74 65 78 74 2e 63 6f 75 6e   >= context.coun
2a50: 74 5f 73 6b 69 70 29 20 7b 0a 20 20 20 20 20 20  t_skip) {.      
2a60: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
2a70: 74 2e 63 75 72 72 65 6e 74 5f 63 6f 75 6e 74 20  t.current_count 
2a80: 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  = 1;..          
2a90: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78        if (contex
2aa0: 74 2e 64 69 72 65 63 74 69 6f 6e 20 3d 3d 20 31  t.direction == 1
2ab0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2ac0: 20 20 20 20 20 20 20 20 76 61 72 20 63 6d 70 20          var cmp 
2ad0: 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  = function () {.
2ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2af0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
2b00: 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20 3e 3d  context.val() >=
2b10: 20 63 6f 6e 74 65 78 74 2e 6e 65 78 74 5f 76 61   context.next_va
2b20: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  l);.            
2b30: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
2b40: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2b50: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2b60: 20 20 20 20 20 20 20 20 76 61 72 20 63 6d 70 20          var cmp 
2b70: 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  = function () {.
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
2ba0: 63 6f 6e 74 65 78 74 2e 6e 65 78 74 5f 76 61 6c  context.next_val
2bb0: 20 3e 3d 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28   >= context.val(
2bc0: 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ));.            
2bd0: 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20 20          };.     
2be0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
2bf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
2c00: 20 28 63 6d 70 28 29 29 20 7b 0a 20 20 20 20 20   (cmp()) {.     
2c10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2c20: 6f 6e 74 65 78 74 2e 76 61 6c 28 63 6f 6e 74 65  ontext.val(conte
2c30: 78 74 2e 6e 65 78 74 5f 76 61 6c 29 3b 0a 20 20  xt.next_val);.  
2c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2c50: 20 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65 78 20    context.index 
2c60: 3d 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65 78 20  = context.index 
2c70: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  + 1;.           
2c80: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
2c90: 74 65 78 74 2e 69 6e 64 65 78 20 3d 3d 3d 20 63  text.index === c
2ca0: 6f 6e 74 65 78 74 2e 72 61 6d 70 2e 6c 65 6e 67  ontext.ramp.leng
2cb0: 74 68 20 2d 31 29 20 7b 0a 20 20 20 20 20 20 20  th -1) {.       
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2cd0: 20 69 66 20 28 63 6f 6e 74 65 78 74 2e 72 65 76   if (context.rev
2ce0: 65 72 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20  erse) {.        
2cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d00: 20 20 20 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65      context.inde
2d10: 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20  x = 0;.         
2d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d30: 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 20     context.ramp 
2d40: 3d 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e 72  = context.ramp.r
2d50: 65 76 65 72 73 65 28 29 3b 0a 20 20 20 20 20 20  everse();.      
2d60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d70: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
2d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2d90: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 69         context.i
2da0: 6e 64 65 78 20 3d 20 63 6f 6e 74 65 78 74 2e 69  ndex = context.i
2db0: 6e 64 65 78 20 2d 20 31 3b 0a 20 20 20 20 20 20  ndex - 1;.      
2dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2dd0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2de0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2df0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 68                ch
2e00: 61 6e 67 65 43 6f 6e 74 65 78 74 28 29 3b 0a 20  angeContext();. 
2e10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2e20: 20 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28 63     context.val(c
2e30: 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20 2b 20 63  ontext.val() + c
2e40: 6f 6e 74 65 78 74 2e 73 74 65 70 20 2a 20 63 6f  ontext.step * co
2e50: 6e 74 65 78 74 2e 64 69 72 65 63 74 69 6f 6e 29  ntext.direction)
2e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
2e70: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78        if (contex
2e80: 74 2e 6e 75 6d 62 65 72 29 20 63 6f 6e 74 65 78  t.number) contex
2e90: 74 2e 6e 75 6d 62 65 72 28 63 6f 6e 74 65 78 74  t.number(context
2ea0: 2e 76 61 6c 28 29 29 3b 0a 20 20 20 20 20 20 20  .val());.       
2eb0: 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20           } else 
2ec0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2ed0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 76 61        context.va
2ee0: 6c 28 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20  l(context.val() 
2ef0: 2b 20 63 6f 6e 74 65 78 74 2e 73 74 65 70 20 2a  + context.step *
2f00: 20 63 6f 6e 74 65 78 74 2e 64 69 72 65 63 74 69   context.directi
2f10: 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  on);.           
2f20: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
2f30: 74 65 78 74 2e 6e 75 6d 62 65 72 29 20 63 6f 6e  text.number) con
2f40: 74 65 78 74 2e 6e 75 6d 62 65 72 28 63 6f 6e 74  text.number(cont
2f50: 65 78 74 2e 76 61 6c 28 29 29 3b 0a 20 20 20 20  ext.val());.    
2f60: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
2f70: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2f80: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2f90: 20 20 20 63 6f 6e 74 65 78 74 2e 63 75 72 72 65     context.curre
2fa0: 6e 74 5f 63 6f 75 6e 74 20 2b 3d 20 31 3b 0a 20  nt_count += 1;. 
2fb0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20             }..  
2fc0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2fd0: 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 3b 0a 20  context.val();. 
2fe0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d         }.    }.}
2ff0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 74 69 6d 65 64  ..function timed
3000: 4b 6e 6f 62 28 6f 70 74 69 6f 6e 73 29 20 7b 0a  Knob(options) {.
3010: 20 20 20 20 6f 70 74 69 6f 6e 73 20 3d 20 6f 70      options = op
3020: 74 69 6f 6e 73 20 7c 7c 20 7b 7d 3b 0a 20 20 20  tions || {};.   
3030: 20 76 61 72 20 63 6f 6e 74 65 78 74 20 3d 20 7b   var context = {
3040: 7d 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e 69  };.    context.i
3050: 6e 74 65 72 76 61 6c 20 3d 20 6f 70 74 69 6f 6e  nterval = option
3060: 73 2e 69 6e 74 65 72 76 61 6c 20 7c 7c 20 31 30  s.interval || 10
3070: 30 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e 6b  0;.    context.k
3080: 6e 6f 62 20 3d 20 6b 6e 6f 62 28 6f 70 74 69 6f  nob = knob(optio
3090: 6e 73 29 3b 0a 0a 20 20 20 20 63 6f 6e 74 65 78  ns);..    contex
30a0: 74 2e 74 69 6d 65 72 20 3d 20 73 65 74 49 6e 74  t.timer = setInt
30b0: 65 72 76 61 6c 28 66 75 6e 63 74 69 6f 6e 20 28  erval(function (
30c0: 29 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 74 65  ) {.       conte
30d0: 78 74 2e 6b 6e 6f 62 2e 6d 6f 76 65 28 29 3b 0a  xt.knob.move();.
30e0: 20 20 20 20 7d 2c 20 63 6f 6e 74 65 78 74 2e 69      }, context.i
30f0: 6e 74 65 72 76 61 6c 29 3b 0a 0a 20 20 20 20 63  nterval);..    c
3100: 6f 6e 74 65 78 74 2e 6b 6e 6f 62 5b 22 63 6c 65  ontext.knob["cle
3110: 61 72 22 5d 20 3d 20 66 75 6e 63 74 69 6f 6e 20  ar"] = function 
3120: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 63 6c 65  () {.        cle
3130: 61 72 49 6e 74 65 72 76 61 6c 28 63 6f 6e 74 65  arInterval(conte
3140: 78 74 2e 74 69 6d 65 72 29 3b 0a 20 20 20 20 7d  xt.timer);.    }
3150: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f 6e  ..    return con
3160: 74 65 78 74 2e 6b 6e 6f 62 3b 0a 7d 0a 22 22 22  text.knob;.}."""
3170: 0a 63 6f 67 2e 6f 75 74 28 6b 6e 6f 62 5f 63 6f  .cog.out(knob_co
3180: 64 65 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a 23  de).@>.@@.```..#
3190: 23 20 4d 61 69 6e 20 55 49 0a 0a 60 60 60 7b 63  # Main UI..```{c
31a0: 6f 64 65 2d 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a  ode-block} html.
31b0: 2d 2d 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a  ---.force: true.
31c0: 2d 2d 2d 0a 0a 40 3c 0a 69 6d 70 6f 72 74 20 63  ---..@<.import c
31d0: 6f 67 0a 69 6d 70 6f 72 74 20 6f 73 0a 0a 62 69  og.import os..bi
31e0: 74 72 68 79 74 68 6d 20 3d 20 22 22 22 0a 3c 62  trhythm = """.<b
31f0: 69 74 72 68 79 74 68 6d 3e 0a 0a 3c 64 69 76 3e  itrhythm>..<div>
3200: 0a 20 20 20 20 3c 76 73 74 61 63 6b 20 69 64 3d  .    <vstack id=
3210: 22 68 65 61 64 65 72 2d 70 6c 61 79 62 61 63 6b  "header-playback
3220: 22 3e 0a 20 20 20 20 20 20 20 20 3c 68 73 74 61  ">.        <hsta
3230: 63 6b 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck>.            
3240: 3c 64 69 76 20 63 6c 61 73 73 3d 22 6d 6c 2d 32  <div class="ml-2
3250: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ">.             
3260: 20 20 20 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d     <button type=
3270: 22 62 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22  "button" class="
3280: 62 74 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79 20  btn btn-primary 
3290: 77 2d 31 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d 31  w-1/10 ml-2 mt-1
32a0: 22 20 6f 6e 63 6c 69 63 6b 3d 7b 61 64 64 44 69  " onclick={addDi
32b0: 61 6c 7d 3e 2b 20 44 69 61 6c 3c 2f 62 75 74 74  al}>+ Dial</butt
32c0: 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  on>.            
32d0: 20 20 20 20 3c 62 75 74 74 6f 6e 20 74 79 70 65      <button type
32e0: 3d 22 62 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d  ="button" class=
32f0: 22 62 74 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79  "btn btn-primary
3300: 20 77 2d 31 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d   w-1/10 ml-2 mt-
3310: 31 22 20 6f 6e 63 6c 69 63 6b 3d 7b 61 64 64 4e  1" onclick={addN
3320: 75 6d 62 65 72 7d 3e 2b 20 4e 75 6d 62 65 72 3c  umber}>+ Number<
3330: 2f 62 75 74 74 6f 6e 3e 0a 20 20 20 20 20 20 20  /button>.       
3340: 20 20 20 20 20 20 20 20 20 3c 21 2d 2d 20 3c 62           <!-- <b
3350: 75 74 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74  utton type="butt
3360: 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74 6e 20 62  on" class="btn b
3370: 74 6e 2d 70 72 69 6d 61 72 79 20 77 2d 31 2f 31  tn-primary w-1/1
3380: 30 20 6d 6c 2d 32 20 6d 74 2d 31 22 20 6f 6e 63  0 ml-2 mt-1" onc
3390: 6c 69 63 6b 3d 7b 61 64 64 53 61 6d 70 6c 65 7d  lick={addSample}
33a0: 3e 2b 20 53 61 6d 70 6c 65 20 46 69 6c 65 3c 2f  >+ Sample File</
33b0: 62 75 74 74 6f 6e 3e 20 2d 2d 3e 0a 20 20 20 20  button> -->.    
33c0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 62 75 74              <but
33d0: 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74 6f 6e  ton type="button
33e0: 22 20 63 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e  " class="btn btn
33f0: 2d 70 72 69 6d 61 72 79 20 77 2d 31 2f 31 30 20  -primary w-1/10 
3400: 6d 6c 2d 32 20 6d 74 2d 31 22 20 6f 6e 63 6c 69  ml-2 mt-1" oncli
3410: 63 6b 3d 7b 61 64 64 53 61 6d 70 6c 65 55 52 4c  ck={addSampleURL
3420: 7d 3e 2b 20 53 61 6d 70 6c 65 20 55 52 4c 3c 2f  }>+ Sample URL</
3430: 62 75 74 74 6f 6e 3e 0a 20 20 20 20 20 20 20 20  button>.        
3440: 20 20 20 20 3c 2f 64 69 76 3e 0a 0a 20 20 20 20      </div>..    
3450: 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61          <div cla
3460: 73 73 3d 22 6d 6c 2d 32 22 20 3e 0a 20 20 20 20  ss="ml-2" >.    
3470: 20 20 20 20 20 20 20 20 20 20 20 20 3c 6c 61 62              <lab
3480: 65 6c 20 66 6f 72 3d 22 74 65 6d 70 6f 2d 76 61  el for="tempo-va
3490: 6c 75 65 22 3e 54 65 6d 70 6f 20 2f 20 54 69 63  lue">Tempo / Tic
34a0: 6b 73 3c 2f 6c 61 62 65 6c 3e 3c 62 72 3e 0a 20  ks</label><br>. 
34b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
34c0: 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65 78 74  input type="text
34d0: 22 20 69 64 3d 22 74 65 6d 70 6f 2d 76 61 6c 75  " id="tempo-valu
34e0: 65 22 20 76 61 6c 75 65 3d 7b 73 74 61 74 65 2e  e" value={state.
34f0: 74 65 6d 70 6f 7d 20 73 74 79 6c 65 3d 22 77 69  tempo} style="wi
3500: 64 74 68 3a 20 31 35 30 70 78 22 20 6f 6e 6b 65  dth: 150px" onke
3510: 79 75 70 3d 7b 20 65 64 69 74 54 65 6d 70 6f 20  yup={ editTempo 
3520: 7d 2f 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  }/>.            
3530: 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d      <input type=
3540: 22 74 65 78 74 22 20 20 63 6c 61 73 73 3d 22 6d  "text"  class="m
3550: 74 2d 32 22 20 69 64 3d 22 74 69 63 6b 2d 76 61  t-2" id="tick-va
3560: 6c 75 65 22 20 76 61 6c 75 65 3d 7b 73 74 61 74  lue" value={stat
3570: 65 2e 74 69 63 6b 73 7d 20 73 74 79 6c 65 3d 22  e.ticks} style="
3580: 77 69 64 74 68 3a 20 31 35 30 70 78 22 20 6f 6e  width: 150px" on
3590: 6b 65 79 75 70 3d 7b 65 64 69 74 54 69 63 6b 73  keyup={editTicks
35a0: 7d 2f 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  }/>.            
35b0: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20  </div>.         
35c0: 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 6d     <div class="m
35d0: 6c 2d 32 22 20 73 74 79 6c 65 3d 22 6d 69 6e 2d  l-2" style="min-
35e0: 77 69 64 74 68 3a 20 32 35 30 70 78 3b 22 3e 0a  width: 250px;">.
35f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3600: 3c 6c 61 62 65 6c 20 66 6f 72 3d 22 64 75 72 61  <label for="dura
3610: 74 69 6f 6e 22 3e 42 61 72 73 20 2f 20 54 69 63  tion">Bars / Tic
3620: 6b 73 20 2f 20 53 65 63 6f 6e 64 73 3c 2f 6c 61  ks / Seconds</la
3630: 62 65 6c 3e 3c 62 72 3e 0a 20 20 20 20 20 20 20  bel><br>.       
3640: 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 69 64           <div id
3650: 3d 22 64 75 72 61 74 69 6f 6e 22 20 3e 3c 2f 64  ="duration" ></d
3660: 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  iv>.            
3670: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 3c  </div>.        <
3680: 2f 68 73 74 61 63 6b 3e 0a 0a 20 20 20 20 20 20  /hstack>..      
3690: 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 6d 74    <div class="mt
36a0: 2d 32 20 6d 6c 2d 32 22 20 3e 0a 20 20 20 20 20  -2 ml-2" >.     
36b0: 20 20 20 20 20 20 20 3c 62 75 74 74 6f 6e 20 74         <button t
36c0: 79 70 65 3d 22 62 75 74 74 6f 6e 22 20 63 6c 61  ype="button" cla
36d0: 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70 72 69 6d  ss="btn btn-prim
36e0: 61 72 79 20 77 2d 31 2f 31 30 20 6d 6c 2d 32 20  ary w-1/10 ml-2 
36f0: 6d 74 2d 31 22 20 20 6f 6e 63 6c 69 63 6b 3d 7b  mt-1"  onclick={
3700: 70 6c 61 79 7d 3e 50 6c 61 79 3c 2f 62 75 74 74  play}>Play</butt
3710: 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  on>.            
3720: 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62 75  <button type="bu
3730: 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74 6e  tton" class="btn
3740: 20 62 74 6e 2d 70 72 69 6d 61 72 79 20 6d 6c 2d   btn-primary ml-
3750: 32 22 20 6f 6e 63 6c 69 63 6b 3d 7b 73 61 76 65  2" onclick={save
3760: 7d 3e 53 61 76 65 3c 2f 62 75 74 74 6f 6e 3e 0a  }>Save</button>.
3770: 20 20 20 20 20 20 20 20 20 20 20 20 3c 62 75 74              <but
3780: 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74 6f 6e  ton type="button
3790: 22 20 63 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e  " class="btn btn
37a0: 2d 70 72 69 6d 61 72 79 20 6d 6c 2d 32 22 20 6f  -primary ml-2" o
37b0: 6e 63 6c 69 63 6b 3d 7b 72 65 73 65 74 7d 3e 52  nclick={reset}>R
37c0: 65 73 65 74 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20  eset</button>.  
37d0: 20 20 20 20 20 20 20 20 20 20 3c 62 75 74 74 6f            <butto
37e0: 6e 20 74 79 70 65 3d 22 62 75 74 74 6f 6e 22 20  n type="button" 
37f0: 63 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70  class="btn btn-p
3800: 72 69 6d 61 72 79 20 6d 6c 2d 32 22 20 6f 6e 63  rimary ml-2" onc
3810: 6c 69 63 6b 3d 7b 72 65 6c 6f 61 64 7d 3e 57 69  lick={reload}>Wi
3820: 6e 64 6f 77 20 52 65 6c 6f 61 64 3c 2f 62 75 74  ndow Reload</but
3830: 74 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20  ton>.           
3840: 20 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62   <button type="b
3850: 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74  utton" class="bt
3860: 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79 20 6d 6c  n btn-primary ml
3870: 2d 32 22 20 6f 6e 63 6c 69 63 6b 3d 7b 64 6f 77  -2" onclick={dow
3880: 6e 6c 6f 61 64 7d 3e 53 61 76 65 20 46 69 6c 65  nload}>Save File
3890: 3c 2f 62 75 74 74 6f 6e 3e 0a 0a 20 20 20 20 20  </button>..     
38a0: 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20 63 6c         <input cl
38b0: 61 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d 65 3d  ass="ml-1" name=
38c0: 22 65 64 69 74 2d 6d 6f 64 65 22 20 69 64 3d 22  "edit-mode" id="
38d0: 65 64 69 74 2d 6d 6f 64 65 22 20 74 79 70 65 3d  edit-mode" type=
38e0: 22 63 68 65 63 6b 62 6f 78 22 2f 3e 0a 20 20 20  "checkbox"/>.   
38f0: 20 20 20 20 20 20 20 20 20 3c 6c 61 62 65 6c 20           <label 
3900: 66 6f 72 3d 22 65 64 69 74 2d 6d 6f 64 65 22 3e  for="edit-mode">
3910: 45 64 69 74 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20  Edit</label>.   
3920: 20 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20           <input 
3930: 63 6c 61 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d  class="ml-1" nam
3940: 65 3d 22 6c 6f 61 64 2d 6d 6f 64 65 22 20 69 64  e="load-mode" id
3950: 3d 22 6c 6f 61 64 2d 6d 6f 64 65 22 20 74 79 70  ="load-mode" typ
3960: 65 3d 22 63 68 65 63 6b 62 6f 78 22 2f 3e 0a 20  e="checkbox"/>. 
3970: 20 20 20 20 20 20 20 20 20 20 20 3c 6c 61 62 65             <labe
3980: 6c 20 66 6f 72 3d 22 6c 6f 61 64 2d 6d 6f 64 65  l for="load-mode
3990: 22 3e 45 78 65 63 75 74 65 20 54 72 61 6e 73 69  ">Execute Transi
39a0: 74 69 6f 6e 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20  tion</label>.   
39b0: 20 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20           <input 
39c0: 63 6c 61 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d  class="ml-1" nam
39d0: 65 3d 22 6c 6f 61 64 2d 6d 6f 64 65 22 20 69 64  e="load-mode" id
39e0: 3d 22 72 65 64 6f 22 20 74 79 70 65 3d 22 63 68  ="redo" type="ch
39f0: 65 63 6b 62 6f 78 22 2f 3e 0a 20 20 20 20 20 20  eckbox"/>.      
3a00: 20 20 20 20 20 20 3c 6c 61 62 65 6c 20 66 6f 72        <label for
3a10: 3d 22 72 65 64 6f 22 3e 52 65 64 6f 20 42 61 72  ="redo">Redo Bar
3a20: 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20 20  </label>.       
3a30: 20 3c 2f 64 69 76 3e 0a 0a 20 20 20 20 20 20 20   </div>..       
3a40: 20 3c 76 73 74 61 63 6b 20 69 64 3d 22 73 61 6d   <vstack id="sam
3a50: 70 6c 65 73 2d 62 6c 6f 63 6b 22 3e 0a 20 20 20  ples-block">.   
3a60: 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 65 61           <div ea
3a70: 63 68 3d 7b 20 6b 65 79 2c 20 69 6e 64 65 78 20  ch={ key, index 
3a80: 69 6e 20 73 74 61 74 65 2e 73 61 6d 70 6c 65 73  in state.samples
3a90: 7d 20 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  } >.            
3aa0: 20 20 20 20 3c 64 69 76 20 69 66 3d 7b 20 73 74      <div if={ st
3ab0: 61 74 65 2e 73 61 6d 70 6c 65 73 20 26 26 20 73  ate.samples && s
3ac0: 74 61 74 65 2e 73 61 6d 70 6c 65 73 5b 69 6e 64  tate.samples[ind
3ad0: 65 78 5d 20 7d 3e 0a 20 20 20 20 20 20 20 20 20  ex] }>.         
3ae0: 20 20 20 20 20 20 20 20 20 20 20 3c 73 61 6d 70             <samp
3af0: 6c 65 20 20 73 65 74 73 61 6d 70 6c 65 3d 7b 73  le  setsample={s
3b00: 65 74 53 61 6d 70 6c 65 7d 20 72 6d 73 61 6d 70  etSample} rmsamp
3b10: 6c 65 3d 7b 72 6d 53 61 6d 70 6c 65 7d 20 73 61  le={rmSample} sa
3b20: 6d 70 6c 65 73 3d 7b 73 74 61 74 65 2e 73 61 6d  mples={state.sam
3b30: 70 6c 65 73 7d 20 74 69 3d 7b 69 6e 64 65 78 20  ples} ti={index 
3b40: 2b 20 31 7d 3e 3c 2f 73 61 6d 70 6c 65 3e 0a 20  + 1}></sample>. 
3b50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
3b60: 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20  /div>.          
3b70: 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20    </div>.       
3b80: 20 3c 2f 76 73 74 61 63 6b 3e 0a 0a 20 20 20 20   </vstack>..    
3b90: 20 20 20 20 3c 68 73 74 61 63 6b 20 73 74 79 6c      <hstack styl
3ba0: 65 3d 22 6d 61 72 67 69 6e 2d 74 6f 70 3a 20 31  e="margin-top: 1
3bb0: 36 70 78 22 3e 0a 20 20 20 20 20 20 20 20 20 20  6px">.          
3bc0: 20 20 3c 64 69 76 20 65 61 63 68 3d 7b 20 6b 65    <div each={ ke
3bd0: 79 2c 20 69 6e 64 65 78 20 69 6e 20 73 74 61 74  y, index in stat
3be0: 65 2e 64 69 61 6c 73 7d 3e 0a 20 20 20 20 20 20  e.dials}>.      
3bf0: 20 20 20 20 20 20 20 20 20 20 3c 64 69 61 6c 20            <dial 
3c00: 72 6d 64 69 61 6c 3d 7b 72 6d 44 69 61 6c 7d 20  rmdial={rmDial} 
3c10: 20 76 3d 7b 73 74 61 74 65 2e 64 69 61 6c 73 5b   v={state.dials[
3c20: 69 6e 64 65 78 5d 7d 20 74 69 3d 7b 69 6e 64 65  index]} ti={inde
3c30: 78 20 2b 20 31 7d 3e 3c 2f 64 69 61 6c 3e 0a 20  x + 1}></dial>. 
3c40: 20 20 20 20 20 20 20 20 20 20 20 3c 2f 64 69 76             </div
3c50: 3e 0a 20 20 20 20 20 20 20 20 3c 2f 68 73 74 61  >.        </hsta
3c60: 63 6b 3e 0a 0a 20 20 20 20 20 20 20 20 3c 68 73  ck>..        <hs
3c70: 74 61 63 6b 3e 0a 20 20 20 20 20 20 20 20 20 20  tack>.          
3c80: 20 20 3c 64 69 76 20 65 61 63 68 3d 7b 20 6b 65    <div each={ ke
3c90: 79 2c 20 69 6e 64 65 78 20 69 6e 20 73 74 61 74  y, index in stat
3ca0: 65 2e 6e 75 6d 62 65 72 73 7d 3e 0a 20 20 20 20  e.numbers}>.    
3cb0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 6e 75 6d              <num
3cc0: 62 65 72 20 72 6d 6e 75 6d 62 65 72 3d 7b 72 6d  ber rmnumber={rm
3cd0: 4e 75 6d 62 65 72 7d 20 76 3d 7b 73 74 61 74 65  Number} v={state
3ce0: 2e 6e 75 6d 62 65 72 73 5b 69 6e 64 65 78 5d 7d  .numbers[index]}
3cf0: 20 74 69 3d 7b 69 6e 64 65 78 20 2b 20 31 7d 3e   ti={index + 1}>
3d00: 3c 2f 6e 75 6d 62 65 72 3e 0a 20 20 20 20 20 20  </number>.      
3d10: 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20        </div>.   
3d20: 20 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 0a       </hstack>..
3d30: 20 20 20 20 3c 2f 76 73 74 61 63 6b 3e 0a 0a 20      </vstack>.. 
3d40: 20 20 20 3c 64 69 76 20 69 64 3d 22 63 75 65 64     <div id="cued
3d50: 22 20 63 6c 61 73 73 3d 22 70 2d 32 22 20 73 74  " class="p-2" st
3d60: 79 6c 65 3d 22 63 6f 6c 6f 72 3a 20 77 68 69 74  yle="color: whit
3d70: 65 20 21 69 6d 70 6f 72 74 61 6e 74 3b 20 68 65  e !important; he
3d80: 69 67 68 74 3a 20 33 32 70 78 3b 20 66 6f 6e 74  ight: 32px; font
3d90: 2d 73 69 7a 65 3a 20 32 34 70 78 3b 22 3e 3c 2f  -size: 24px;"></
3da0: 64 69 76 3e 0a 20 20 20 20 3c 64 69 76 20 69 64  div>.    <div id
3db0: 3d 22 65 72 72 6f 72 22 20 63 6c 61 73 73 3d 22  ="error" class="
3dc0: 70 2d 32 22 20 73 74 79 6c 65 3d 22 63 6f 6c 6f  p-2" style="colo
3dd0: 72 3a 20 79 65 6c 6c 6f 77 20 21 69 6d 70 6f 72  r: yellow !impor
3de0: 74 61 6e 74 3b 20 68 65 69 67 68 74 3a 20 33 32  tant; height: 32
3df0: 70 78 3b 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 31  px; font-size: 1
3e00: 32 70 78 3b 22 3e 3c 2f 64 69 76 3e 0a 20 20 20  2px;"></div>.   
3e10: 20 3c 64 69 76 20 69 64 3d 22 63 61 6e 76 61 73   <div id="canvas
3e20: 2d 63 6f 6e 74 61 69 6e 65 72 22 20 73 74 79 6c  -container" styl
3e30: 65 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 72 65 6c  e="position: rel
3e40: 61 74 69 76 65 3b 22 3e 0a 20 20 20 20 20 20 20  ative;">.       
3e50: 20 3c 64 69 76 20 69 64 3d 22 70 35 22 20 73 74   <div id="p5" st
3e60: 79 6c 65 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 61  yle="position: a
3e70: 62 73 6f 6c 75 74 65 3b 20 77 69 64 74 68 3a 20  bsolute; width: 
3e80: 31 30 30 25 3b 20 62 61 63 6b 67 72 6f 75 6e 64  100%; background
3e90: 3a 20 62 6c 61 63 6b 22 3e 3c 2f 64 69 76 3e 0a  : black"></div>.
3ea0: 20 20 20 20 20 20 20 20 3c 63 61 6e 76 61 73 20          <canvas 
3eb0: 69 64 3d 22 76 69 73 75 61 6c 22 20 73 74 79 6c  id="visual" styl
3ec0: 65 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 61 62 73  e="position: abs
3ed0: 6f 6c 75 74 65 3b 20 77 69 64 74 68 3a 20 31 30  olute; width: 10
3ee0: 30 25 3b 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20  0%; background: 
3ef0: 62 6c 61 63 6b 3b 22 3e 3c 2f 63 61 6e 76 61 73  black;"></canvas
3f00: 3e 0a 20 20 20 20 20 20 20 20 3c 64 69 76 20 69  >.        <div i
3f10: 64 3d 22 63 6f 64 65 22 20 73 74 79 6c 65 3d 22  d="code" style="
3f20: 70 6f 73 69 74 69 6f 6e 3a 20 61 62 73 6f 6c 75  position: absolu
3f30: 74 65 3b 22 3e 3c 2f 64 69 76 3e 0a 20 20 20 20  te;"></div>.    
3f40: 3c 2f 64 69 76 3e 0a 20 20 20 20 0a 3c 2f 64 69  </div>.    .</di
3f50: 76 3e 0a 0a 3c 73 74 79 6c 65 3e 0a 3a 68 6f 73  v>..<style>.:hos
3f60: 74 20 7b 0a 20 20 20 20 6d 61 72 67 69 6e 2d 74  t {.    margin-t
3f70: 6f 70 3a 20 34 76 68 3b 0a 7d 0a 3c 2f 73 74 79  op: 4vh;.}.</sty
3f80: 6c 65 3e 0a 0a 3c 73 63 72 69 70 74 3e 0a 76 61  le>..<script>.va
3f90: 72 20 6f 6c 64 43 6f 64 65 20 3d 20 22 22 3b 0a  r oldCode = "";.
3fa0: 76 61 72 20 6f 6c 64 50 61 74 74 65 72 6e 73 20  var oldPatterns 
3fb0: 3d 20 5b 5d 3b 0a 0a 4d 6f 75 73 65 74 72 61 70  = [];..Mousetrap
3fc0: 2e 73 74 6f 70 43 61 6c 6c 62 61 63 6b 20 3d 20  .stopCallback = 
3fd0: 66 75 6e 63 74 69 6f 6e 28 65 2c 20 65 6c 65 6d  function(e, elem
3fe0: 65 6e 74 2c 20 63 6f 6d 62 6f 29 20 7b 0a 20 20  ent, combo) {.  
3ff0: 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a    return false;.
4000: 7d 0a 0a 4d 6f 75 73 65 74 72 61 70 2e 62 69 6e  }..Mousetrap.bin
4010: 64 28 5b 27 66 39 27 5d 2c 20 66 75 6e 63 74 69  d(['f9'], functi
4020: 6f 6e 28 65 29 20 7b 0a 20 20 20 20 69 66 20 28  on(e) {.    if (
4030: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
4040: 65 6e 74 42 79 49 64 28 27 65 64 69 74 2d 6d 6f  entById('edit-mo
4050: 64 65 27 29 2e 63 68 65 63 6b 65 64 29 20 7b 0a  de').checked) {.
4060: 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
4070: 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28  .getElementById(
4080: 27 65 64 69 74 2d 6d 6f 64 65 27 29 2e 63 68 65  'edit-mode').che
4090: 63 6b 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  cked = false;.  
40a0: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
40b0: 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45     document.getE
40c0: 6c 65 6d 65 6e 74 42 79 49 64 28 27 65 64 69 74  lementById('edit
40d0: 2d 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65 64 20  -mode').checked 
40e0: 3d 20 74 72 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  = true;.    }.. 
40f0: 20 20 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b     return false;
4100: 0a 7d 29 3b 0a 0a 4d 6f 75 73 65 74 72 61 70 2e  .});..Mousetrap.
4110: 62 69 6e 64 28 5b 27 63 74 72 6c 2b 31 27 5d 2c  bind(['ctrl+1'],
4120: 20 66 75 6e 63 74 69 6f 6e 28 65 29 20 7b 0a 0a   function(e) {..
4130: 20 20 20 20 69 66 20 28 64 6f 63 75 6d 65 6e 74      if (document
4140: 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28  .getElementById(
4150: 27 72 65 64 6f 27 29 2e 63 68 65 63 6b 65 64 29  'redo').checked)
4160: 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 63 75 6d   {.        docum
4170: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
4180: 49 64 28 27 72 65 64 6f 27 29 2e 63 68 65 63 6b  Id('redo').check
4190: 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  ed = false;.    
41a0: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20  } else {.       
41b0: 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65   document.getEle
41c0: 6d 65 6e 74 42 79 49 64 28 27 72 65 64 6f 27 29  mentById('redo')
41d0: 2e 63 68 65 63 6b 65 64 20 3d 20 74 72 75 65 3b  .checked = true;
41e0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74 75  .    }..    retu
41f0: 72 6e 20 66 61 6c 73 65 3b 0a 7d 29 3b 0a 0a 4d  rn false;.});..M
4200: 6f 75 73 65 74 72 61 70 2e 62 69 6e 64 28 5b 27  ousetrap.bind(['
4210: 66 31 30 27 5d 2c 20 66 75 6e 63 74 69 6f 6e 28  f10'], function(
4220: 65 29 20 7b 0a 20 20 20 20 69 66 20 28 64 6f 63  e) {.    if (doc
4230: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
4240: 42 79 49 64 28 27 6c 6f 61 64 2d 6d 6f 64 65 27  ById('load-mode'
4250: 29 2e 63 68 65 63 6b 65 64 29 20 7b 0a 20 20 20  ).checked) {.   
4260: 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65       document.ge
4270: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 6c 6f  tElementById('lo
4280: 61 64 2d 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65  ad-mode').checke
4290: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  d = false;.    }
42a0: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
42b0: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
42c0: 65 6e 74 42 79 49 64 28 27 6c 6f 61 64 2d 6d 6f  entById('load-mo
42d0: 64 65 27 29 2e 63 68 65 63 6b 65 64 20 3d 20 74  de').checked = t
42e0: 72 75 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  rue;.    }.    r
42f0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 29 3b  eturn false;.});
4300: 0a 0a 4d 6f 75 73 65 74 72 61 70 2e 62 69 6e 64  ..Mousetrap.bind
4310: 28 5b 27 63 74 72 6c 2b 30 27 5d 2c 20 66 75 6e  (['ctrl+0'], fun
4320: 63 74 69 6f 6e 28 65 29 20 7b 0a 20 20 20 20 24  ction(e) {.    $
4330: 28 22 23 73 61 6d 70 6c 65 73 2d 62 6c 6f 63 6b  ("#samples-block
4340: 22 29 2e 74 6f 67 67 6c 65 28 29 3b 0a 20 20 20  ").toggle();.   
4350: 20 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d   return false;.}
4360: 29 3b 0a 0a 0a 66 6f 72 20 28 6c 65 74 20 69 20  );...for (let i 
4370: 3d 20 31 3b 20 69 20 3c 3d 20 38 3b 20 69 2b 2b  = 1; i <= 8; i++
4380: 29 20 7b 0a 20 20 20 20 4d 6f 75 73 65 74 72 61  ) {.    Mousetra
4390: 70 2e 62 69 6e 64 28 5b 27 66 27 20 2b 20 69 5d  p.bind(['f' + i]
43a0: 2c 20 66 75 6e 63 74 69 6f 6e 28 65 29 20 7b 0a  , function(e) {.
43b0: 20 20 20 20 20 20 20 20 69 66 20 28 69 20 3c 3d          if (i <=
43c0: 20 73 61 6d 70 6c 65 73 2e 6c 65 6e 67 74 68 29   samples.length)
43d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   {.            p
43e0: 28 69 20 2d 20 31 29 3b 0a 20 20 20 20 20 20 20  (i - 1);.       
43f0: 20 7d 0a 20 20 20 20 20 20 20 20 72 65 74 75 72   }.        retur
4400: 6e 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 29 3b  n false;.    });
4410: 0a 7d 0a 0a 2f 2f 20 76 61 72 20 61 75 64 69 6f  .}..// var audio
4420: 20 3d 20 6e 65 77 20 41 75 64 69 6f 28 29 3b 0a   = new Audio();.
4430: 2f 2f 20 61 75 64 69 6f 2e 6c 6f 6f 70 20 3d 20  // audio.loop = 
4440: 74 72 75 65 3b 0a 63 6f 6e 73 74 20 61 63 74 78  true;.const actx
4450: 20 3d 20 54 6f 6e 65 2e 63 6f 6e 74 65 78 74 3b   = Tone.context;
4460: 0a 63 6f 6e 73 74 20 64 65 73 74 20 3d 20 61 63  .const dest = ac
4470: 74 78 2e 63 72 65 61 74 65 4d 65 64 69 61 53 74  tx.createMediaSt
4480: 72 65 61 6d 44 65 73 74 69 6e 61 74 69 6f 6e 28  reamDestination(
4490: 29 3b 0a 63 6f 6e 73 74 20 72 65 63 6f 72 64 65  );.const recorde
44a0: 72 20 3d 20 6e 65 77 20 4d 65 64 69 61 52 65 63  r = new MediaRec
44b0: 6f 72 64 65 72 28 64 65 73 74 2e 73 74 72 65 61  order(dest.strea
44c0: 6d 29 3b 0a 6c 65 74 20 63 68 75 6e 6b 73 20 3d  m);.let chunks =
44d0: 20 5b 5d 3b 0a 76 61 72 20 73 61 6d 70 6c 65 55   [];.var sampleU
44e0: 52 4c 20 3d 20 22 22 3b 0a 76 61 72 20 73 61 6d  RL = "";.var sam
44f0: 3b 0a 74 68 69 73 2e 70 72 6f 70 73 20 3d 20 6f  ;.this.props = o
4500: 70 74 73 3b 0a 0a 74 68 69 73 2e 73 74 61 74 65  pts;..this.state
4510: 20 3d 20 7b 0a 20 20 20 20 6d 65 6d 3a 20 7b 7d   = {.    mem: {}
4520: 2c 0a 20 20 20 20 64 69 61 6c 73 3a 20 5b 5d 2c  ,.    dials: [],
4530: 0a 20 20 20 20 6e 75 6d 62 65 72 73 3a 20 5b 5d  .    numbers: []
4540: 2c 0a 20 20 20 20 73 61 6d 70 6c 65 73 3a 20 5b  ,.    samples: [
4550: 5d 2c 0a 20 20 20 20 74 65 6d 70 6f 3a 20 31 32  ],.    tempo: 12
4560: 30 2c 0a 20 20 20 20 74 69 63 6b 73 3a 20 31 36  0,.    ticks: 16
4570: 2c 0a 7d 0a 0a 61 73 79 6e 63 20 66 75 6e 63 74  ,.}..async funct
4580: 69 6f 6e 20 63 6f 70 79 54 65 78 74 54 6f 43 6c  ion copyTextToCl
4590: 69 70 62 6f 61 72 64 28 74 65 78 74 29 20 7b 0a  ipboard(text) {.
45a0: 20 20 20 20 74 72 79 20 7b 20 61 77 61 69 74 20      try { await 
45b0: 6e 61 76 69 67 61 74 6f 72 2e 63 6c 69 70 62 6f  navigator.clipbo
45c0: 61 72 64 2e 77 72 69 74 65 54 65 78 74 28 74 65  ard.writeText(te
45d0: 78 74 29 3b 20 7d 0a 20 20 20 20 63 61 74 63 68  xt); }.    catch
45e0: 28 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20  (err) {.        
45f0: 61 6c 65 72 74 28 27 45 72 72 6f 72 20 69 6e 20  alert('Error in 
4600: 63 6f 70 79 69 6e 67 20 74 65 78 74 3a 20 27 2c  copying text: ',
4610: 20 65 72 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a   err);.    }.}..
4620: 73 68 6f 75 6c 64 55 70 64 61 74 65 28 64 61 74  shouldUpdate(dat
4630: 61 2c 20 6e 65 78 74 4f 70 74 73 29 20 7b 0a 20  a, nextOpts) {. 
4640: 20 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a     return true;.
4650: 7d 0a 0a 74 68 69 73 2e 6f 6e 28 27 6d 6f 75 6e  }..this.on('moun
4660: 74 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b  t', function() {
4670: 0a 20 20 20 20 76 61 72 20 73 65 6c 66 20 3d 20  .    var self = 
4680: 74 68 69 73 3b 0a 20 20 20 20 24 28 22 23 6c 6f  this;.    $("#lo
4690: 61 64 2d 6d 6f 64 65 22 29 2e 63 6c 69 63 6b 28  ad-mode").click(
46a0: 29 3b 0a 20 20 20 20 65 64 69 74 6f 72 20 3d 20  );.    editor = 
46b0: 43 6f 64 65 4d 69 72 72 6f 72 28 64 6f 63 75 6d  CodeMirror(docum
46c0: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
46d0: 49 64 28 22 63 6f 64 65 22 29 2c 20 7b 0a 20 20  Id("code"), {.  
46e0: 20 20 20 20 20 20 6d 6f 64 65 3a 20 22 6e 75 6c        mode: "nul
46f0: 6c 22 2c 0a 20 20 20 20 20 20 20 20 73 70 65 6c  l",.        spel
4700: 6c 63 68 65 63 6b 3a 20 66 61 6c 73 65 2c 0a 20  lcheck: false,. 
4710: 20 20 20 20 20 20 20 61 75 74 6f 63 6f 72 72 65         autocorre
4720: 63 74 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 20  ct: false,.     
4730: 20 20 20 73 63 72 6f 6c 6c 62 61 72 53 74 79 6c     scrollbarStyl
4740: 65 3a 20 22 6e 75 6c 6c 22 2c 0a 20 20 20 20 20  e: "null",.     
4750: 20 20 20 6c 69 6e 65 57 72 61 70 70 69 6e 67 3a     lineWrapping:
4760: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20   false,.        
4770: 6c 69 6e 65 4e 75 6d 62 65 72 73 3a 20 66 61 6c  lineNumbers: fal
4780: 73 65 2c 0a 20 20 20 20 20 20 20 20 73 74 79 6c  se,.        styl
4790: 65 41 63 74 69 76 65 4c 69 6e 65 3a 20 66 61 6c  eActiveLine: fal
47a0: 73 65 2c 0a 20 20 20 20 20 20 20 20 73 74 79 6c  se,.        styl
47b0: 65 53 65 6c 65 63 74 65 64 54 65 78 74 3a 20 74  eSelectedText: t
47c0: 72 75 65 2c 0a 20 20 20 20 20 20 20 20 6d 61 74  rue,.        mat
47d0: 63 68 42 72 61 63 6b 65 74 73 3a 20 66 61 6c 73  chBrackets: fals
47e0: 65 2c 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65  e,.        value
47f0: 3a 20 60 2f 2f 20 74 72 61 63 6b 5f 6e 6f 2c 20  : `// track_no, 
4800: 70 61 74 74 65 72 6e 2c 20 63 75 72 72 65 6e 74  pattern, current
4810: 5f 62 69 74 2c 20 73 61 6d 70 6c 65 73 2c 20 73  _bit, samples, s
4820: 61 6d 70 6c 65 20 61 6e 64 20 54 6f 6e 65 20 61  ample and Tone a
4830: 72 65 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20  re available as 
4840: 67 6c 6f 62 61 6c 73 60 0a 20 20 20 20 7d 29 3b  globals`.    });
4850: 0a 0a 20 20 20 20 65 64 69 74 6f 72 2e 73 65 74  ..    editor.set
4860: 53 69 7a 65 28 6e 75 6c 6c 2c 20 77 69 6e 64 6f  Size(null, windo
4870: 77 2e 69 6e 6e 65 72 48 65 69 67 68 74 20 2d 20  w.innerHeight - 
4880: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
4890: 65 6e 74 42 79 49 64 28 22 68 65 61 64 65 72 2d  entById("header-
48a0: 70 6c 61 79 62 61 63 6b 22 29 2e 63 6c 69 65 6e  playback").clien
48b0: 74 48 65 69 67 68 74 20 2d 20 31 36 30 29 3b 0a  tHeight - 160);.
48c0: 0a 20 20 20 20 69 66 20 28 74 68 69 73 2e 70 72  .    if (this.pr
48d0: 6f 70 73 2e 73 6f 6e 67 29 20 7b 0a 20 20 20 20  ops.song) {.    
48e0: 20 20 20 20 63 6f 6e 73 74 20 6c 69 62 20 3d 20      const lib = 
48f0: 77 69 6e 64 6f 77 2e 4a 73 6f 6e 55 72 6c 28 27  window.JsonUrl('
4900: 6c 7a 6d 61 27 29 3b 0a 20 20 20 20 20 20 20 20  lzma');.        
4910: 6c 69 62 2e 64 65 63 6f 6d 70 72 65 73 73 28 74  lib.decompress(t
4920: 68 69 73 2e 70 72 6f 70 73 2e 73 6f 6e 67 29 2e  his.props.song).
4930: 74 68 65 6e 28 64 61 74 61 20 3d 3e 20 7b 0a 20  then(data => {. 
4940: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20 73             var s
4950: 61 6d 70 6c 65 5f 6e 61 6d 65 73 20 3d 20 64 61  ample_names = da
4960: 74 61 5b 22 73 61 6d 70 6c 65 5f 6e 61 6d 65 73  ta["sample_names
4970: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
4980: 76 61 72 20 64 69 61 6c 5f 63 6f 75 6e 74 20 3d  var dial_count =
4990: 20 64 61 74 61 5b 22 64 69 61 6c 5f 63 6f 75 6e   data["dial_coun
49a0: 74 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t"];.           
49b0: 20 76 61 72 20 6e 75 6d 62 65 72 73 5f 63 6f 75   var numbers_cou
49c0: 6e 74 20 3d 20 64 61 74 61 5b 22 6e 75 6d 62 65  nt = data["numbe
49d0: 72 73 5f 63 6f 75 6e 74 22 5d 3b 0a 20 20 20 20  rs_count"];.    
49e0: 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20 64          delete d
49f0: 61 74 61 5b 22 73 61 6d 70 6c 65 5f 6e 61 6d 65  ata["sample_name
4a00: 73 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  s"];.           
4a10: 20 64 65 6c 65 74 65 20 64 61 74 61 5b 22 64 69   delete data["di
4a20: 61 6c 5f 63 6f 75 6e 74 22 5d 3b 0a 20 20 20 20  al_count"];.    
4a30: 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20 64          delete d
4a40: 61 74 61 5b 22 6e 75 6d 62 65 72 73 5f 63 6f 75  ata["numbers_cou
4a50: 6e 74 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20  nt"];.          
4a60: 20 20 74 68 69 73 2e 73 74 61 74 65 2e 74 65 6d    this.state.tem
4a70: 70 6f 20 3d 20 64 61 74 61 2e 74 65 6d 70 6f 3b  po = data.tempo;
4a80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69  .            thi
4a90: 73 2e 73 74 61 74 65 2e 74 69 63 6b 73 20 3d 20  s.state.ticks = 
4aa0: 64 61 74 61 2e 74 69 63 6b 73 3b 0a 20 20 20 20  data.ticks;.    
4ab0: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 74 61          this.sta
4ac0: 74 65 2e 63 6f 64 65 20 3d 20 64 61 74 61 2e 63  te.code = data.c
4ad0: 6f 64 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ode;.           
4ae0: 20 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 2e 6d 61   sample_names.ma
4af0: 70 28 66 75 6e 63 74 69 6f 6e 20 28 75 72 6c 29  p(function (url)
4b00: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
4b10: 20 20 20 73 65 6c 66 2e 61 64 64 55 52 4c 28 75     self.addURL(u
4b20: 72 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  rl);.           
4b30: 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   });.           
4b40: 20 66 6f 72 20 28 76 61 72 20 69 20 3d 20 30 3b   for (var i = 0;
4b50: 20 69 20 3c 20 64 69 61 6c 5f 63 6f 75 6e 74 3b   i < dial_count;
4b60: 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20   i++) {.        
4b70: 20 20 20 20 20 20 20 20 74 68 69 73 2e 73 74 61          this.sta
4b80: 74 65 2e 64 69 61 6c 73 2e 70 75 73 68 28 7b 7d  te.dials.push({}
4b90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
4ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72  .            for
4bb0: 20 28 76 61 72 20 69 20 3d 20 30 3b 20 69 20 3c   (var i = 0; i <
4bc0: 20 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74 3b 20   numbers_count; 
4bd0: 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20  i++) {.         
4be0: 20 20 20 20 20 20 20 74 68 69 73 2e 73 74 61 74         this.stat
4bf0: 65 2e 6e 75 6d 62 65 72 73 2e 70 75 73 68 28 7b  e.numbers.push({
4c00: 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  });.            
4c10: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 64  }.            ed
4c20: 69 74 6f 72 2e 73 65 74 56 61 6c 75 65 28 74 68  itor.setValue(th
4c30: 69 73 2e 73 74 61 74 65 2e 63 6f 64 65 29 3b 0a  is.state.code);.
4c40: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
4c50: 2e 75 70 64 61 74 65 28 29 3b 0a 20 20 20 20 20  .update();.     
4c60: 20 20 20 20 20 20 20 72 69 6f 74 2e 6d 6f 75 6e         riot.moun
4c70: 74 28 27 27 29 3b 0a 20 20 20 20 20 20 20 20 7d  t('');.        }
4c80: 29 0a 20 20 20 20 7d 0a 0a 0a 7d 29 3b 0a 0a 0a  ).    }...});...
4c90: 0a 0a 64 6f 77 6e 6c 6f 61 64 28 29 20 7b 0a 20  ..download() {. 
4ca0: 20 20 20 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e     .    function
4cb0: 20 64 6f 77 6e 6c 6f 61 64 28 64 61 74 61 2c 20   download(data, 
4cc0: 66 69 6c 65 6e 61 6d 65 20 3d 20 22 73 6f 6e 67  filename = "song
4cd0: 2e 74 78 74 22 2c 20 74 79 70 65 20 3d 20 22 74  .txt", type = "t
4ce0: 65 78 74 2f 70 6c 61 69 6e 22 29 20 7b 0a 20 20  ext/plain") {.  
4cf0: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 66 69            var fi
4d00: 6c 65 20 3d 20 6e 65 77 20 42 6c 6f 62 28 5b 64  le = new Blob([d
4d10: 61 74 61 5d 2c 20 7b 74 79 70 65 3a 20 74 79 70  ata], {type: typ
4d20: 65 7d 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  e});.           
4d30: 20 76 61 72 20 61 20 3d 20 64 6f 63 75 6d 65 6e   var a = documen
4d40: 74 2e 63 72 65 61 74 65 45 6c 65 6d 65 6e 74 28  t.createElement(
4d50: 22 61 22 29 2c 0a 20 20 20 20 20 20 20 20 20 20  "a"),.          
4d60: 20 20 20 20 20 20 20 20 20 20 75 72 6c 20 3d 20            url = 
4d70: 55 52 4c 2e 63 72 65 61 74 65 4f 62 6a 65 63 74  URL.createObject
4d80: 55 52 4c 28 66 69 6c 65 29 3b 0a 20 20 20 20 20  URL(file);.     
4d90: 20 20 20 20 20 20 20 61 2e 68 72 65 66 20 3d 20         a.href = 
4da0: 75 72 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  url;.           
4db0: 20 61 2e 64 6f 77 6e 6c 6f 61 64 20 3d 20 66 69   a.download = fi
4dc0: 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  lename;.        
4dd0: 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 62 6f 64      document.bod
4de0: 79 2e 61 70 70 65 6e 64 43 68 69 6c 64 28 61 29  y.appendChild(a)
4df0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 2e  ;.            a.
4e00: 63 6c 69 63 6b 28 29 3b 0a 20 20 20 20 20 20 20  click();.       
4e10: 20 20 20 20 20 73 65 74 54 69 6d 65 6f 75 74 28       setTimeout(
4e20: 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20  function() {.   
4e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63               doc
4e40: 75 6d 65 6e 74 2e 62 6f 64 79 2e 72 65 6d 6f 76  ument.body.remov
4e50: 65 43 68 69 6c 64 28 61 29 3b 0a 20 20 20 20 20  eChild(a);.     
4e60: 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f             windo
4e70: 77 2e 55 52 4c 2e 72 65 76 6f 6b 65 4f 62 6a 65  w.URL.revokeObje
4e80: 63 74 55 52 4c 28 75 72 6c 29 3b 20 20 0a 20 20  ctURL(url);  .  
4e90: 20 20 20 20 20 20 20 20 20 20 7d 2c 20 30 29 3b            }, 0);
4ea0: 20 0a 20 20 20 20 7d 0a 20 20 20 20 64 6f 77 6e   .    }.    down
4eb0: 6c 6f 61 64 28 65 64 69 74 6f 72 2e 67 65 74 56  load(editor.getV
4ec0: 61 6c 75 65 28 29 29 0a 7d 0a 0a 73 61 76 65 28  alue()).}..save(
4ed0: 29 20 7b 0a 20 20 20 20 74 68 69 73 2e 73 74 61  ) {.    this.sta
4ee0: 74 65 2e 63 6f 64 65 20 3d 20 65 64 69 74 6f 72  te.code = editor
4ef0: 2e 67 65 74 56 61 6c 75 65 28 29 3b 0a 20 20 20  .getValue();.   
4f00: 20 76 61 72 20 74 65 78 74 20 3d 20 7b 0a 20 20   var text = {.  
4f10: 20 20 20 20 20 20 74 65 6d 70 6f 3a 20 74 68 69        tempo: thi
4f20: 73 2e 73 74 61 74 65 2e 74 65 6d 70 6f 2c 0a 20  s.state.tempo,. 
4f30: 20 20 20 20 20 20 20 64 69 61 6c 5f 63 6f 75 6e         dial_coun
4f40: 74 3a 20 74 68 69 73 2e 73 74 61 74 65 2e 64 69  t: this.state.di
4f50: 61 6c 73 2e 6c 65 6e 67 74 68 2c 0a 20 20 20 20  als.length,.    
4f60: 20 20 20 20 6e 75 6d 62 65 72 73 5f 63 6f 75 6e      numbers_coun
4f70: 74 3a 20 74 68 69 73 2e 73 74 61 74 65 2e 6e 75  t: this.state.nu
4f80: 6d 62 65 72 73 2e 6c 65 6e 67 74 68 2c 0a 20 20  mbers.length,.  
4f90: 20 20 20 20 20 20 73 61 6d 70 6c 65 5f 6e 61 6d        sample_nam
4fa0: 65 73 3a 20 74 68 69 73 2e 73 74 61 74 65 2e 73  es: this.state.s
4fb0: 61 6d 70 6c 65 73 2e 6d 61 70 28 66 75 6e 63 74  amples.map(funct
4fc0: 69 6f 6e 20 28 69 74 65 6d 29 20 7b 72 65 74 75  ion (item) {retu
4fd0: 72 6e 20 69 74 65 6d 5b 22 5f 5f 75 72 6c 22 5d  rn item["__url"]
4fe0: 7d 29 2c 0a 20 20 20 20 20 20 20 20 74 69 63 6b  }),.        tick
4ff0: 73 3a 20 31 36 2c 0a 20 20 20 20 20 20 20 20 63  s: 16,.        c
5000: 6f 64 65 3a 20 74 68 69 73 2e 73 74 61 74 65 2e  ode: this.state.
5010: 63 6f 64 65 2c 0a 20 20 20 20 7d 3b 0a 20 20 20  code,.    };.   
5020: 20 63 6f 6e 73 74 20 6c 69 62 20 3d 20 77 69 6e   const lib = win
5030: 64 6f 77 2e 4a 73 6f 6e 55 72 6c 28 27 6c 7a 6d  dow.JsonUrl('lzm
5040: 61 27 29 3b 0a 09 6c 69 62 2e 63 6f 6d 70 72 65  a');..lib.compre
5050: 73 73 28 74 65 78 74 29 2e 74 68 65 6e 28 65 6e  ss(text).then(en
5060: 63 6f 64 65 64 44 61 74 61 20 3d 3e 20 7b 0a 20  codedData => {. 
5070: 20 20 20 20 20 20 20 76 61 72 20 6c 69 6e 6b 20         var link 
5080: 3d 20 22 2f 73 6f 6e 67 2f 22 20 2b 20 65 6e 63  = "/song/" + enc
5090: 6f 64 65 64 44 61 74 61 3b 0a 20 20 20 20 20 20  odedData;.      
50a0: 20 20 77 69 6e 64 6f 77 2e 68 69 73 74 6f 72 79    window.history
50b0: 2e 70 75 73 68 53 74 61 74 65 28 7b 7d 2c 20 27  .pushState({}, '
50c0: 42 69 74 72 68 79 74 68 6d 27 2c 20 6c 69 6e 6b  Bitrhythm', link
50d0: 29 3b 0a 20 20 20 20 20 20 20 20 2f 2f 77 69 6e  );.        //win
50e0: 64 6f 77 2e 6f 70 65 6e 28 6c 69 6e 6b 2c 20 22  dow.open(link, "
50f0: 5f 62 6c 61 6e 6b 22 29 3b 0a 20 20 20 20 7d 29  _blank");.    })
5100: 3b 0a 7d 0a 0a 72 65 6c 6f 61 64 28 29 20 7b 0a  ;.}..reload() {.
5110: 20 20 20 20 77 69 6e 64 6f 77 2e 6c 6f 63 61 74      window.locat
5120: 69 6f 6e 2e 72 65 70 6c 61 63 65 28 20 22 2f 2f  ion.replace( "//
5130: 22 20 2b 20 77 69 6e 64 6f 77 2e 6c 6f 63 61 74  " + window.locat
5140: 69 6f 6e 2e 68 6f 73 74 29 0a 7d 0a 0a 72 65 73  ion.host).}..res
5150: 65 74 28 29 20 7b 0a 0a 20 20 20 20 54 6f 6e 65  et() {..    Tone
5160: 2e 4d 61 73 74 65 72 2e 6d 75 74 65 20 3d 20 74  .Master.mute = t
5170: 72 75 65 3b 0a 20 20 20 20 54 6f 6e 65 2e 54 72  rue;.    Tone.Tr
5180: 61 6e 73 70 6f 72 74 2e 73 74 6f 70 28 29 3b 0a  ansport.stop();.
5190: 20 20 20 20 76 61 72 20 73 65 6c 66 20 3d 20 74      var self = t
51a0: 68 69 73 3b 0a 0a 20 20 20 20 69 66 20 28 73 65  his;..    if (se
51b0: 6c 66 2e 74 69 6d 65 72 29 20 7b 0a 20 20 20 20  lf.timer) {.    
51c0: 20 20 20 20 63 6c 65 61 72 49 6e 74 65 72 76 61      clearInterva
51d0: 6c 28 73 65 6c 66 2e 74 69 6d 65 72 29 3b 0a 20  l(self.timer);. 
51e0: 20 20 20 7d 0a 20 20 20 20 64 6f 63 75 6d 65 6e     }.    documen
51f0: 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64  t.getElementById
5200: 28 27 74 65 6d 70 6f 2d 76 61 6c 75 65 27 29 2e  ('tempo-value').
5210: 64 69 73 61 62 6c 65 64 20 3d 20 66 61 6c 73 65  disabled = false
5220: 3b 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67  ;.    document.g
5230: 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 74  etElementById('t
5240: 69 63 6b 2d 76 61 6c 75 65 27 29 2e 64 69 73 61  ick-value').disa
5250: 62 6c 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20  bled = false;.  
5260: 20 20 65 64 69 74 6f 72 2e 73 65 74 56 61 6c 75    editor.setValu
5270: 65 28 22 22 29 3b 0a 0a 20 20 20 20 74 68 69 73  e("");..    this
5280: 2e 73 74 61 74 65 20 3d 20 7b 0a 20 20 20 20 20  .state = {.     
5290: 20 20 20 6d 65 6d 3a 20 7b 7d 2c 0a 20 20 20 20     mem: {},.    
52a0: 20 20 20 20 64 69 61 6c 73 3a 20 5b 5d 2c 0a 20      dials: [],. 
52b0: 20 20 20 20 20 20 20 73 61 6d 70 6c 65 73 3a 20         samples: 
52c0: 5b 5d 2c 0a 20 20 20 20 20 20 20 20 74 65 6d 70  [],.        temp
52d0: 6f 3a 20 31 32 30 2c 0a 20 20 20 20 20 20 20 20  o: 120,.        
52e0: 74 69 63 6b 73 3a 20 31 36 2c 0a 20 20 20 20 7d  ticks: 16,.    }
52f0: 0a 0a 20 20 20 20 74 68 69 73 2e 75 70 64 61 74  ..    this.updat
5300: 65 28 29 3b 0a 20 20 20 20 72 69 6f 74 2e 6d 6f  e();.    riot.mo
5310: 75 6e 74 28 27 62 69 74 72 68 79 74 68 6d 27 2c  unt('bitrhythm',
5320: 20 7b 0a 20 20 20 20 20 20 20 20 73 6f 6e 67 3a   {.        song:
5330: 20 74 68 69 73 2e 70 72 6f 70 73 2e 73 6f 6e 67   this.props.song
5340: 0a 20 20 20 20 7d 29 0a 0a 0a 7d 0a 0a 65 64 69  .    })...}..edi
5350: 74 54 65 6d 70 6f 28 65 29 20 7b 0a 20 20 20 20  tTempo(e) {.    
5360: 74 68 69 73 2e 75 70 64 61 74 65 28 7b 0a 20 20  this.update({.  
5370: 20 20 20 20 20 20 73 74 61 74 65 3a 20 7b 0a 20        state: {. 
5380: 20 20 20 20 20 20 20 20 20 20 20 2e 2e 2e 74 68             ...th
5390: 69 73 2e 73 74 61 74 65 2c 0a 20 20 20 20 20 20  is.state,.      
53a0: 20 20 20 20 20 20 74 65 6d 70 6f 3a 20 70 61 72        tempo: par
53b0: 73 65 49 6e 74 28 65 2e 74 61 72 67 65 74 2e 76  seInt(e.target.v
53c0: 61 6c 75 65 29 0a 20 20 20 20 20 20 20 20 7d 0a  alue).        }.
53d0: 20 20 20 20 7d 29 0a 7d 0a 0a 65 64 69 74 54 69      }).}..editTi
53e0: 63 6b 73 28 65 29 20 7b 0a 20 20 20 20 74 68 69  cks(e) {.    thi
53f0: 73 2e 75 70 64 61 74 65 28 7b 0a 20 20 20 20 20  s.update({.     
5400: 20 20 20 73 74 61 74 65 3a 20 7b 0a 20 20 20 20     state: {.    
5410: 20 20 20 20 20 20 20 20 2e 2e 2e 74 68 69 73 2e          ...this.
5420: 73 74 61 74 65 2c 0a 20 20 20 20 20 20 20 20 20  state,.         
5430: 20 20 20 74 69 63 6b 73 3a 20 65 2e 74 61 72 67     ticks: e.targ
5440: 65 74 2e 76 61 6c 75 65 0a 20 20 20 20 20 20 20  et.value.       
5450: 20 7d 0a 20 20 20 20 7d 29 0a 7d 0a 0a 24 7b 63   }.    }).}..${c
5460: 6f 72 65 5f 6c 6f 6f 70 7d 0a 0a 73 74 61 72 74  ore_loop}..start
5470: 28 29 20 7b 0a 20 20 20 20 72 65 63 6f 72 64 65  () {.    recorde
5480: 72 2e 73 74 61 72 74 28 29 3b 0a 7d 0a 0a 73 74  r.start();.}..st
5490: 6f 70 28 29 20 7b 0a 20 20 20 20 72 65 63 6f 72  op() {.    recor
54a0: 64 65 72 2e 73 74 6f 70 28 29 3b 0a 7d 0a 0a 61  der.stop();.}..a
54b0: 64 64 44 69 61 6c 28 29 20 7b 0a 20 20 20 20 74  ddDial() {.    t
54c0: 68 69 73 2e 73 74 61 74 65 2e 64 69 61 6c 73 2e  his.state.dials.
54d0: 70 75 73 68 28 7b 7d 29 3b 0a 20 20 20 20 74 68  push({});.    th
54e0: 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a  is.update();.}..
54f0: 61 64 64 4e 75 6d 62 65 72 28 29 20 7b 0a 20 20  addNumber() {.  
5500: 20 20 74 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d    this.state.num
5510: 62 65 72 73 2e 70 75 73 68 28 7b 7d 29 3b 0a 20  bers.push({});. 
5520: 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28 29     this.update()
5530: 3b 0a 7d 0a 0a 61 64 64 55 52 4c 28 76 61 6c 75  ;.}..addURL(valu
5540: 65 29 20 7b 0a 20 20 20 20 76 61 72 20 73 65 6c  e) {.    var sel
5550: 66 20 3d 20 74 68 69 73 3b 0a 20 20 20 20 74 68  f = this;.    th
5560: 69 73 2e 73 74 61 74 65 2e 73 61 6d 70 6c 65 73  is.state.samples
5570: 2e 70 75 73 68 28 7b 22 5f 5f 6e 61 6d 65 22 3a  .push({"__name":
5580: 20 76 61 6c 75 65 7d 29 3b 0a 20 20 20 20 76 61   value});.    va
5590: 72 20 73 61 6d 3b 0a 20 20 20 20 73 61 6d 20 3d  r sam;.    sam =
55a0: 20 6e 65 77 20 54 6f 6e 65 2e 53 61 6d 70 6c 65   new Tone.Sample
55b0: 72 28 7b 0a 20 20 20 20 20 20 20 20 75 72 6c 73  r({.        urls
55c0: 3a 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  :  {.           
55d0: 20 22 43 33 22 3a 20 76 61 6c 75 65 2c 0a 20 20   "C3": value,.  
55e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 29 3b 0a        }.    });.
55f0: 20 20 20 20 73 61 6d 5b 22 5f 5f 6e 61 6d 65 22      sam["__name"
5600: 5d 20 3d 20 76 61 6c 75 65 3b 0a 20 20 20 20 73  ] = value;.    s
5610: 61 6d 5b 22 5f 5f 75 72 6c 22 5d 20 3d 20 76 61  am["__url"] = va
5620: 6c 75 65 3b 0a 20 20 20 20 73 65 6c 66 2e 73 65  lue;.    self.se
5630: 74 53 61 6d 70 6c 65 28 73 61 6d 2c 20 73 65 6c  tSample(sam, sel
5640: 66 2e 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 2e  f.state.samples.
5650: 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a 7d 0a 0a  length - 1);.}..
5660: 61 64 64 53 61 6d 70 6c 65 55 52 4c 28 29 20 7b  addSampleURL() {
5670: 0a 20 20 20 20 76 61 72 20 73 65 6c 66 20 3d 20  .    var self = 
5680: 74 68 69 73 3b 0a 20 20 20 20 61 6c 65 72 74 69  this;.    alerti
5690: 66 79 2e 70 72 6f 6d 70 74 28 20 27 45 6e 74 65  fy.prompt( 'Ente
56a0: 72 20 53 61 6d 70 6c 65 20 55 52 4c 27 2c 20 27  r Sample URL', '
56b0: 27 2c 20 27 27 0a 20 20 20 20 20 20 20 20 2c 20  ', ''.        , 
56c0: 66 75 6e 63 74 69 6f 6e 28 65 76 74 2c 20 76 61  function(evt, va
56d0: 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  lue) {.         
56e0: 20 20 20 73 65 6c 66 2e 61 64 64 55 52 4c 28 76     self.addURL(v
56f0: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
5700: 0a 20 20 20 20 20 20 20 20 2c 20 66 75 6e 63 74  .        , funct
5710: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ion() {.        
5720: 20 20 20 20 61 6c 65 72 74 69 66 79 2e 65 72 72      alertify.err
5730: 6f 72 28 27 43 61 6e 63 65 6c 27 29 0a 20 20 20  or('Cancel').   
5740: 20 20 20 20 20 7d 0a 20 20 20 20 29 3b 0a 7d 0a       }.    );.}.
5750: 0a 61 64 64 53 61 6d 70 6c 65 28 29 20 7b 0a 20  .addSample() {. 
5760: 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e 73 61     this.state.sa
5770: 6d 70 6c 65 73 2e 70 75 73 68 28 7b 7d 29 3b 0a  mples.push({});.
5780: 20 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28      this.update(
5790: 29 3b 0a 7d 0a 0a 72 6d 53 61 6d 70 6c 65 28 69  );.}..rmSample(i
57a0: 6e 64 65 78 29 20 7b 0a 20 20 20 74 68 69 73 2e  ndex) {.   this.
57b0: 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 2e 73 70  state.samples.sp
57c0: 6c 69 63 65 28 69 6e 64 65 78 2c 20 31 29 3b 0a  lice(index, 1);.
57d0: 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28 29     this.update()
57e0: 3b 0a 7d 0a 0a 72 6d 44 69 61 6c 28 69 6e 64 65  ;.}..rmDial(inde
57f0: 78 29 20 7b 0a 20 20 20 74 68 69 73 2e 73 74 61  x) {.   this.sta
5800: 74 65 2e 64 69 61 6c 73 2e 73 70 6c 69 63 65 28  te.dials.splice(
5810: 69 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 74 68  index, 1);.   th
5820: 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a  is.update();.}..
5830: 72 6d 4e 75 6d 62 65 72 28 69 6e 64 65 78 29 20  rmNumber(index) 
5840: 7b 0a 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e  {.   this.state.
5850: 6e 75 6d 62 65 72 73 2e 73 70 6c 69 63 65 28 69  numbers.splice(i
5860: 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 74 68 69  ndex, 1);.   thi
5870: 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a 73  s.update();.}..s
5880: 65 74 53 61 6d 70 6c 65 28 65 2c 20 69 29 20 7b  etSample(e, i) {
5890: 0a 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e  .    this.state.
58a0: 73 61 6d 70 6c 65 73 5b 69 5d 20 3d 20 65 3b 0a  samples[i] = e;.
58b0: 20 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28      this.update(
58c0: 29 3b 0a 7d 0a 0a 3c 2f 73 63 72 69 70 74 3e 0a  );.}..</script>.
58d0: 0a 3c 2f 62 69 74 72 68 79 74 68 6d 3e 0a 0a 22  .</bitrhythm>.."
58e0: 22 22 0a 66 72 6f 6d 20 6d 61 6b 6f 2e 74 65 6d  "".from mako.tem
58f0: 70 6c 61 74 65 20 69 6d 70 6f 72 74 20 54 65 6d  plate import Tem
5900: 70 6c 61 74 65 0a 0a 63 6f 64 65 20 3d 20 54 65  plate..code = Te
5910: 6d 70 6c 61 74 65 28 62 69 74 72 68 79 74 68 6d  mplate(bitrhythm
5920: 29 2e 72 65 6e 64 65 72 28 63 6f 72 65 5f 6c 6f  ).render(core_lo
5930: 6f 70 3d 63 6f 72 65 5f 6c 6f 6f 70 29 0a 63 6f  op=core_loop).co
5940: 67 2e 6f 75 74 28 62 69 74 72 68 79 74 68 6d 29  g.out(bitrhythm)
5950: 0a 6f 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 70  .os.system("rm p
5960: 75 62 6c 69 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73  ublic/components
5970: 2f 62 69 74 72 68 79 74 68 6d 2e 74 61 67 22 29  /bitrhythm.tag")
5980: 0a 66 20 3d 20 6f 70 65 6e 28 22 70 75 62 6c 69  .f = open("publi
5990: 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 62 69 74  c/components/bit
59a0: 72 68 79 74 68 6d 2e 74 61 67 22 2c 20 22 77 22  rhythm.tag", "w"
59b0: 29 0a 66 2e 77 72 69 74 65 28 63 6f 64 65 29 0a  ).f.write(code).
59c0: 66 2e 63 6c 6f 73 65 28 29 0a 40 3e 0a 40 40 0a  f.close().@>.@@.
59d0: 60 60 60 0a 0a 23 23 20 57 6f 72 6b 6c 65 74 0a  ```..## Worklet.
59e0: 0a 4d 6f 72 65 20 77 6f 72 6b 6c 65 74 20 69 6d  .More worklet im
59f0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 73 0a 0a 2d  plementations..-
5a00: 20 3c 68 74 74 70 73 3a 2f 2f 6d 69 6d 69 63 70   <https://mimicp
5a10: 72 6f 6a 65 63 74 2e 63 6f 6d 2f 67 75 69 64 65  roject.com/guide
5a20: 73 2f 6d 61 78 69 6d 4a 53 3e 20 20 0a 2d 20 47  s/maximJS>  .- G
5a30: 69 62 62 65 72 69 73 68 0a 0a 53 6f 6d 65 20 69  ibberish..Some i
5a40: 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6c 69  mplementation li
5a50: 6e 6b 73 0a 0a 3c 68 74 74 70 73 3a 2f 2f 73 74  nks..<https://st
5a60: 61 63 6b 6f 76 65 72 66 6c 6f 77 2e 63 6f 6d 2f  ackoverflow.com/
5a70: 71 75 65 73 74 69 6f 6e 73 2f 31 32 30 38 39 36  questions/120896
5a80: 36 32 2f 6d 69 78 69 6e 67 2d 31 36 2d 62 69 74  62/mixing-16-bit
5a90: 2d 6c 69 6e 65 61 72 2d 70 63 6d 2d 73 74 72 65  -linear-pcm-stre
5aa0: 61 6d 73 2d 61 6e 64 2d 61 76 6f 69 64 69 6e 67  ams-and-avoiding
5ab0: 2d 63 6c 69 70 70 69 6e 67 2d 6f 76 65 72 66 6c  -clipping-overfl
5ac0: 6f 77 3e 20 20 20 20 0a 3c 68 74 74 70 73 3a 2f  ow>    .<https:/
5ad0: 2f 77 77 77 2e 65 75 6d 75 73 2e 65 64 75 2e 75  /www.eumus.edu.u
5ae0: 79 2f 65 6d 65 2f 65 6e 73 65 6e 61 6e 7a 61 2f  y/eme/ensenanza/
5af0: 65 6c 65 63 74 69 76 61 73 2f 64 73 70 2f 70 72  electivas/dsp/pr
5b00: 65 73 65 6e 74 61 63 69 6f 6e 65 73 2f 50 68 61  esentaciones/Pha
5b10: 73 65 56 6f 63 6f 64 65 72 54 75 74 6f 72 69 61  seVocoderTutoria
5b20: 6c 2e 70 64 66 3e 20 20 20 0a 0a 60 60 60 7b 63  l.pdf>   ..```{c
5b30: 6f 64 65 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d  ode-block} js.--
5b40: 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d  -.force: true.--
5b50: 2d 0a 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67  -..@<.import cog
5b60: 0a 69 6d 70 6f 72 74 20 6f 73 0a 0a 73 61 6d 70  .import os..samp
5b70: 6c 65 72 20 3d 20 22 22 22 0a 63 6c 61 73 73 20  ler = """.class 
5b80: 53 61 6d 70 6c 65 72 20 65 78 74 65 6e 64 73 20  Sampler extends 
5b90: 41 75 64 69 6f 57 6f 72 6b 6c 65 74 50 72 6f 63  AudioWorkletProc
5ba0: 65 73 73 6f 72 20 7b 0a 20 20 66 69 6c 65 73 20  essor {.  files 
5bb0: 3d 20 5b 5d 0a 20 20 72 65 61 64 49 64 78 20 3d  = [].  readIdx =
5bc0: 20 7b 7d 0a 20 20 6c 6f 6f 70 53 74 61 72 74 49   {}.  loopStartI
5bd0: 64 78 20 3d 20 5b 5d 0a 0a 20 20 63 6f 6e 73 74  dx = []..  const
5be0: 72 75 63 74 6f 72 28 6f 70 74 69 6f 6e 73 29 20  ructor(options) 
5bf0: 7b 0a 20 20 20 20 73 75 70 65 72 28 29 0a 20 20  {.    super().  
5c00: 20 20 74 68 69 73 2e 70 6f 72 74 2e 6f 6e 6d 65    this.port.onme
5c10: 73 73 61 67 65 20 3d 20 28 7b 20 64 61 74 61 20  ssage = ({ data 
5c20: 7d 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 69 66  }) => {.      if
5c30: 20 28 64 61 74 61 2e 69 6e 69 74 29 20 7b 0a 20   (data.init) {. 
5c40: 20 20 20 20 20 20 20 74 68 69 73 2e 66 69 6c 65         this.file
5c50: 73 20 3d 20 64 61 74 61 2e 69 6e 69 74 0a 20 20  s = data.init.  
5c60: 20 20 20 20 20 20 74 68 69 73 2e 6c 6f 6f 70 53        this.loopS
5c70: 74 61 72 74 49 64 78 20 3d 20 74 68 69 73 2e 66  tartIdx = this.f
5c80: 69 6c 65 73 2e 6d 61 70 28 66 75 6e 63 74 69 6f  iles.map(functio
5c90: 6e 20 28 66 29 20 7b 0a 20 20 20 20 20 20 20 20  n (f) {.        
5ca0: 20 20 20 20 72 65 74 75 72 6e 20 30 0a 20 20 20      return 0.   
5cb0: 20 20 20 20 20 7d 29 0a 20 20 20 20 20 20 7d 0a       }).      }.
5cc0: 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 64        else if (d
5cd0: 61 74 61 2e 6e 6f 74 65 4f 6e 29 20 7b 0a 20 20  ata.noteOn) {.  
5ce0: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 72            this.r
5cf0: 65 61 64 49 64 78 5b 64 61 74 61 2e 73 61 6d 70  eadIdx[data.samp
5d00: 6c 65 5d 20 3d 20 74 68 69 73 2e 6c 6f 6f 70 53  le] = this.loopS
5d10: 74 61 72 74 49 64 78 5b 64 61 74 61 2e 73 61 6d  tartIdx[data.sam
5d20: 70 6c 65 5d 0a 20 20 20 20 20 20 7d 0a 20 20 20  ple].      }.   
5d30: 20 20 20 65 6c 73 65 20 69 66 20 28 64 61 74 61     else if (data
5d40: 2e 6e 6f 74 65 4f 66 66 29 20 7b 0a 20 20 20 20  .noteOff) {.    
5d50: 20 20 20 20 20 20 20 20 64 65 6c 65 74 65 20 74          delete t
5d60: 68 69 73 2e 72 65 61 64 49 64 78 5b 64 61 74 61  his.readIdx[data
5d70: 2e 73 61 6d 70 6c 65 5d 3b 0a 20 20 20 20 20 20  .sample];.      
5d80: 7d 0a 20 20 20 20 7d 3b 0a 20 20 7d 0a 0a 20 20  }.    };.  }..  
5d90: 70 72 6f 63 65 73 73 28 69 6e 70 75 74 73 2c 20  process(inputs, 
5da0: 6f 75 74 70 75 74 73 29 20 7b 0a 20 20 20 20 76  outputs) {.    v
5db0: 61 72 20 6f 75 74 4c 65 66 74 20 3d 20 6f 75 74  ar outLeft = out
5dc0: 70 75 74 73 5b 30 5d 5b 30 5d 0a 20 20 20 20 76  puts[0][0].    v
5dd0: 61 72 20 6f 75 74 52 69 67 68 74 20 3d 20 6f 75  ar outRight = ou
5de0: 74 70 75 74 73 5b 30 5d 5b 31 5d 0a 0a 20 20 20  tputs[0][1]..   
5df0: 20 4f 62 6a 65 63 74 2e 6b 65 79 73 28 74 68 69   Object.keys(thi
5e00: 73 2e 72 65 61 64 49 64 78 29 2e 6d 61 70 28 28  s.readIdx).map((
5e10: 73 61 6d 70 6c 65 29 20 3d 3e 20 7b 0a 20 20 20  sample) => {.   
5e20: 20 20 20 20 20 66 6f 72 20 28 6c 65 74 20 69 3d       for (let i=
5e30: 30 3b 20 69 20 3c 20 6f 75 74 4c 65 66 74 2e 6c  0; i < outLeft.l
5e40: 65 6e 67 74 68 3b 20 69 2b 2b 2c 20 74 68 69 73  ength; i++, this
5e50: 2e 72 65 61 64 49 64 78 5b 73 61 6d 70 6c 65 5d  .readIdx[sample]
5e60: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
5e70: 20 20 69 66 20 28 74 68 69 73 2e 72 65 61 64 49    if (this.readI
5e80: 64 78 5b 73 61 6d 70 6c 65 5d 20 3c 20 74 68 69  dx[sample] < thi
5e90: 73 2e 66 69 6c 65 73 5b 73 61 6d 70 6c 65 5d 2e  s.files[sample].
5ea0: 70 63 6d 4c 65 66 74 2e 6c 65 6e 67 74 68 29 20  pcmLeft.length) 
5eb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
5ec0: 20 20 6f 75 74 4c 65 66 74 5b 69 5d 20 2b 3d 20    outLeft[i] += 
5ed0: 74 68 69 73 2e 66 69 6c 65 73 5b 73 61 6d 70 6c  this.files[sampl
5ee0: 65 5d 2e 70 63 6d 4c 65 66 74 5b 74 68 69 73 2e  e].pcmLeft[this.
5ef0: 72 65 61 64 49 64 78 5b 73 61 6d 70 6c 65 5d 5d  readIdx[sample]]
5f00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
5f10: 20 6f 75 74 52 69 67 68 74 5b 69 5d 20 2b 3d 20   outRight[i] += 
5f20: 74 68 69 73 2e 66 69 6c 65 73 5b 73 61 6d 70 6c  this.files[sampl
5f30: 65 5d 2e 70 63 6d 52 69 67 68 74 5b 74 68 69 73  e].pcmRight[this
5f40: 2e 72 65 61 64 49 64 78 5b 73 61 6d 70 6c 65 5d  .readIdx[sample]
5f50: 5d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ].            }.
5f60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 29          }.    })
5f70: 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 74 72 75  ..    return tru
5f80: 65 0a 20 20 7d 0a 7d 0a 0a 72 65 67 69 73 74 65  e.  }.}..registe
5f90: 72 50 72 6f 63 65 73 73 6f 72 28 27 73 61 6d 70  rProcessor('samp
5fa0: 6c 65 72 27 2c 20 53 61 6d 70 6c 65 72 29 0a 22  ler', Sampler)."
5fb0: 22 22 0a 0a 63 6f 67 2e 6f 75 74 28 73 61 6d 70  ""..cog.out(samp
5fc0: 6c 65 72 29 0a 6f 73 2e 73 79 73 74 65 6d 28 22  ler).os.system("
5fd0: 72 6d 20 70 75 62 6c 69 63 2f 73 61 6d 70 6c 65  rm public/sample
5fe0: 72 2e 6a 73 22 29 0a 66 20 3d 20 6f 70 65 6e 28  r.js").f = open(
5ff0: 22 70 75 62 6c 69 63 2f 73 61 6d 70 6c 65 72 2e  "public/sampler.
6000: 6a 73 22 2c 20 22 77 22 29 0a 66 2e 77 72 69 74  js", "w").f.writ
6010: 65 28 73 61 6d 70 6c 65 72 29 0a 66 2e 63 6c 6f  e(sampler).f.clo
6020: 73 65 28 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a  se().@>.@@.```..
6030: 23 23 20 53 61 6d 70 6c 65 0a 0a 59 6f 75 20 63  ## Sample..You c
6040: 61 6e 20 61 64 64 20 73 61 6d 70 6c 65 73 20 75  an add samples u
6050: 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 70  sing the file up
6060: 6c 6f 61 64 2e 20 41 6c 6c 20 73 61 6d 70 6c 65  load. All sample
6070: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
6080: 61 73 20 61 6e 20 61 72 72 61 79 20 e2 80 93 20  as an array ... 
6090: 73 61 6d 70 6c 65 73 2e 20 49 6e 69 74 69 61 6c  samples. Initial
60a0: 69 73 65 20 73 61 6d 70 6c 65 73 2c 20 67 6c 6f  ise samples, glo
60b0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e  bal variables an
60c0: 64 20 73 79 6e 74 68 65 73 69 73 65 72 73 20 75  d synthesisers u
60d0: 73 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 74  sing the transit
60e0: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ion function and
60f0: 20 63 68 61 6e 67 65 20 74 68 65 20 73 61 6d 70   change the samp
6100: 6c 65 20 70 61 72 61 6d 65 74 65 72 73 20 75 73  le parameters us
6110: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 75 72  ing the same dur
6120: 69 6e 67 20 6c 69 76 65 20 63 6f 64 69 6e 67 2e  ing live coding.
6130: 0a 0a 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63 6b  ..```{code-block
6140: 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a 66 6f 72 63 65  } html.---.force
6150: 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a 40 3c 0a 69  : true.---..@<.i
6160: 6d 70 6f 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74  mport cog.import
6170: 20 6f 73 0a 0a 73 61 6d 70 6c 65 20 3d 20 22 22   os..sample = ""
6180: 22 0a 3c 73 61 6d 70 6c 65 3e 0a 20 20 20 20 3c  ".<sample>.    <
6190: 76 62 6f 78 20 63 6c 61 73 73 3d 22 6d 6c 2d 32  vbox class="ml-2
61a0: 22 3e 0a 20 20 20 20 20 20 20 20 3c 76 73 74 61  ">.        <vsta
61b0: 63 6b 20 63 6c 61 73 73 3d 22 6d 6c 2d 32 22 3e  ck class="ml-2">
61c0: 0a 20 20 20 20 20 20 20 20 3c 21 2d 2d 20 3c 69  .        <!-- <i
61d0: 6e 70 75 74 20 74 79 70 65 3d 22 66 69 6c 65 22  nput type="file"
61e0: 20 69 64 3d 7b 22 73 61 6d 70 6c 65 2d 66 69 6c   id={"sample-fil
61f0: 65 22 20 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e  e" + this.props.
6200: 74 69 7d 20 73 74 79 6c 65 3d 22 77 69 64 74 68  ti} style="width
6210: 3a 20 31 32 30 70 78 3b 22 2f 3e 20 2d 2d 3e 0a  : 120px;"/> -->.
6220: 20 20 20 20 20 20 20 20 3c 64 69 76 3e 0a 20 20          <div>.  
6230: 20 20 20 20 20 20 20 20 20 20 3c 73 70 61 6e 20            <span 
6240: 63 6c 61 73 73 3d 22 6d 61 78 2d 77 69 64 74 68  class="max-width
6250: 3a 20 31 32 30 70 78 3b 74 65 78 74 2d 6f 76 65  : 120px;text-ove
6260: 72 66 6c 6f 77 3a 20 65 6c 6c 69 70 73 69 73 3b  rflow: ellipsis;
6270: 20 77 68 69 74 65 2d 73 70 61 63 65 3a 20 6e 6f   white-space: no
6280: 77 72 61 70 3b 22 3e 7b 20 67 65 74 4c 61 73 74  wrap;">{ getLast
6290: 28 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 20 2d  (this.props.ti -
62a0: 31 29 7d 20 3c 2f 73 70 61 6e 3e 0a 20 20 20 20  1)} </span>.    
62b0: 20 20 20 20 20 20 20 20 3c 73 70 61 6e 20 63 6c          <span cl
62c0: 61 73 73 3d 22 63 75 72 73 6f 72 2d 70 6f 69 6e  ass="cursor-poin
62d0: 74 65 72 22 20 69 64 3d 7b 22 73 61 6d 70 6c 65  ter" id={"sample
62e0: 22 20 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e 74  " + this.props.t
62f0: 69 7d 20 6f 6e 63 6c 69 63 6b 3d 7b 72 65 6d 6f  i} onclick={remo
6300: 76 65 28 74 68 69 73 2e 70 72 6f 70 73 2e 74 69  ve(this.props.ti
6310: 20 2d 31 29 7d 3e 28 78 29 3c 2f 73 70 61 6e 3e   -1)}>(x)</span>
6320: 0a 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a  .        </div>.
6330: 20 20 20 20 20 20 20 20 3c 2f 76 73 74 61 63 6b          </vstack
6340: 3e 0a 20 20 20 20 3c 2f 76 62 6f 78 3e 0a 0a 20  >.    </vbox>.. 
6350: 20 20 20 3c 73 63 72 69 70 74 3e 0a 20 20 20 20     <script>.    
6360: 74 68 69 73 2e 70 72 6f 70 73 20 3d 20 6f 70 74  this.props = opt
6370: 73 3b 0a 0a 20 20 20 20 72 65 6d 6f 76 65 28 69  s;..    remove(i
6380: 6e 64 65 78 29 20 7b 0a 20 20 20 20 20 20 20 20  ndex) {.        
6390: 72 65 74 75 72 6e 20 28 29 20 3d 3e 20 7b 0a 20  return () => {. 
63a0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
63b0: 70 72 6f 70 73 2e 72 6d 73 61 6d 70 6c 65 28 69  props.rmsample(i
63c0: 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20 7d  ndex);.        }
63d0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65 74 4c  .    }..    getL
63e0: 61 73 74 20 28 69 6e 64 65 78 29 20 7b 0a 20 20  ast (index) {.  
63f0: 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e 70        if (this.p
6400: 72 6f 70 73 2e 73 61 6d 70 6c 65 73 20 26 26 20  rops.samples && 
6410: 74 68 69 73 2e 70 72 6f 70 73 2e 73 61 6d 70 6c  this.props.sampl
6420: 65 73 5b 69 6e 64 65 78 5d 20 26 26 20 74 68 69  es[index] && thi
6430: 73 2e 70 72 6f 70 73 2e 73 61 6d 70 6c 65 73 5b  s.props.samples[
6440: 69 6e 64 65 78 5d 5b 22 5f 5f 6e 61 6d 65 22 5d  index]["__name"]
6450: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
6460: 76 61 72 20 65 20 3d 20 74 68 69 73 2e 70 72 6f  var e = this.pro
6470: 70 73 2e 73 61 6d 70 6c 65 73 5b 69 6e 64 65 78  ps.samples[index
6480: 5d 5b 22 5f 5f 6e 61 6d 65 22 5d 3b 0a 20 20 20  ]["__name"];.   
6490: 20 20 20 20 20 20 20 20 20 76 61 72 20 65 6c 65           var ele
64a0: 6d 73 20 3d 20 65 2e 73 70 6c 69 74 28 22 2f 22  ms = e.split("/"
64b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
64c0: 61 72 20 6e 61 6d 65 20 3d 20 65 6c 65 6d 73 5b  ar name = elems[
64d0: 65 6c 65 6d 73 2e 6c 65 6e 67 74 68 20 2d 20 31  elems.length - 1
64e0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  ];.            r
64f0: 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 20 20 20 20  eturn name;.    
6500: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
6510: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c 65           console
6520: 2e 6c 6f 67 28 74 68 69 73 2e 70 72 6f 70 73 29  .log(this.props)
6530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
6540: 75 72 6e 20 22 22 3b 0a 20 20 20 20 20 20 20 20  urn "";.        
6550: 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 74 68  }.    }...    th
6560: 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22 2c 20 66  is.on("mount", f
6570: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
6580: 20 7d 29 3b 0a 20 20 20 3c 2f 73 63 72 69 70 74   });.   </script
6590: 3e 0a 3c 2f 73 61 6d 70 6c 65 3e 0a 22 22 22 0a  >.</sample>.""".
65a0: 0a 63 6f 67 2e 6f 75 74 28 73 61 6d 70 6c 65 29  .cog.out(sample)
65b0: 0a 6f 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 70  .os.system("rm p
65c0: 75 62 6c 69 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73  ublic/components
65d0: 2f 73 61 6d 70 6c 65 2e 74 61 67 22 29 0a 66 20  /sample.tag").f 
65e0: 3d 20 6f 70 65 6e 28 22 70 75 62 6c 69 63 2f 63  = open("public/c
65f0: 6f 6d 70 6f 6e 65 6e 74 73 2f 73 61 6d 70 6c 65  omponents/sample
6600: 2e 74 61 67 22 2c 20 22 77 22 29 0a 66 2e 77 72  .tag", "w").f.wr
6610: 69 74 65 28 73 61 6d 70 6c 65 29 0a 66 2e 63 6c  ite(sample).f.cl
6620: 6f 73 65 28 29 0a 40 3e 0a 40 40 0a 60 60 60 0a  ose().@>.@@.```.
6630: 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 69  .@<.import cog.i
6640: 6d 70 6f 72 74 20 6f 73 0a 0a 61 70 70 20 3d 20  mport os..app = 
6650: 22 22 22 0a 28 69 6d 70 6f 72 74 20 5b 73 61 6e  """.(import [san
6660: 69 63 20 5b 53 61 6e 69 63 20 72 65 73 70 6f 6e  ic [Sanic respon
6670: 73 65 5d 5d 29 0a 28 69 6d 70 6f 72 74 20 5b 73  se]]).(import [s
6680: 61 6e 69 63 2e 72 65 73 70 6f 6e 73 65 20 5b 6a  anic.response [j
6690: 73 6f 6e 20 74 65 78 74 5d 5d 29 0a 28 69 6d 70  son text]]).(imp
66a0: 6f 72 74 20 5b 73 61 6e 69 63 2e 65 78 63 65 70  ort [sanic.excep
66b0: 74 69 6f 6e 73 20 5b 4e 6f 74 46 6f 75 6e 64 20  tions [NotFound 
66c0: 61 62 6f 72 74 5d 5d 29 0a 28 69 6d 70 6f 72 74  abort]]).(import
66d0: 20 5b 6a 69 6e 6a 61 32 20 5b 45 6e 76 69 72 6f   [jinja2 [Enviro
66e0: 6e 6d 65 6e 74 20 46 69 6c 65 53 79 73 74 65 6d  nment FileSystem
66f0: 4c 6f 61 64 65 72 5d 5d 29 0a 28 69 6d 70 6f 72  Loader]]).(impor
6700: 74 20 72 65 29 0a 28 69 6d 70 6f 72 74 20 69 70  t re).(import ip
6710: 64 62 29 0a 28 69 6d 70 6f 72 74 20 73 79 73 29  db).(import sys)
6720: 0a 28 69 6d 70 6f 72 74 20 74 72 61 63 65 62 61  .(import traceba
6730: 63 6b 29 0a 28 69 6d 70 6f 72 74 20 6a 73 6f 6e  ck).(import json
6740: 29 0a 28 69 6d 70 6f 72 74 20 64 61 74 65 74 69  ).(import dateti
6750: 6d 65 29 0a 28 69 6d 70 6f 72 74 20 5b 65 6d 61  me).(import [ema
6760: 69 6c 2e 75 74 69 6c 73 20 5b 66 6f 72 6d 61 74  il.utils [format
6770: 5f 64 61 74 65 74 69 6d 65 5d 5d 29 0a 28 69 6d  _datetime]]).(im
6780: 70 6f 72 74 20 5b 75 72 6c 6c 69 62 2e 70 61 72  port [urllib.par
6790: 73 65 20 5b 75 72 6c 70 61 72 73 65 5d 5d 29 0a  se [urlparse]]).
67a0: 28 69 6d 70 6f 72 74 20 62 61 73 65 36 34 29 0a  (import base64).
67b0: 0a 28 73 65 74 76 20 66 69 6c 65 2d 6c 6f 61 64  .(setv file-load
67c0: 65 72 20 28 46 69 6c 65 53 79 73 74 65 6d 4c 6f  er (FileSystemLo
67d0: 61 64 65 72 20 22 74 65 6d 70 6c 61 74 65 73 22  ader "templates"
67e0: 29 29 0a 28 73 65 74 76 20 65 6e 76 20 28 45 6e  )).(setv env (En
67f0: 76 69 72 6f 6e 6d 65 6e 74 20 3a 6c 6f 61 64 65  vironment :loade
6800: 72 20 66 69 6c 65 2d 6c 6f 61 64 65 72 29 29 0a  r file-loader)).
6810: 0a 28 73 65 74 76 20 61 70 70 20 28 53 61 6e 69  .(setv app (Sani
6820: 63 20 22 42 69 74 72 68 79 74 68 6d 22 29 29 0a  c "Bitrhythm")).
6830: 0a 28 77 69 74 68 2d 64 65 63 6f 72 61 74 6f 72  .(with-decorator
6840: 0a 20 20 28 61 70 70 2e 65 78 63 65 70 74 69 6f  .  (app.exceptio
6850: 6e 20 4e 6f 74 46 6f 75 6e 64 29 0a 20 20 28 64  n NotFound).  (d
6860: 65 66 6e 2f 61 20 69 67 6e 6f 72 65 5f 34 30 34  efn/a ignore_404
6870: 73 20 5b 72 65 71 75 65 73 74 20 65 78 63 65 70  s [request excep
6880: 74 69 6f 6e 5d 0a 20 20 20 20 28 72 65 74 75 72  tion].    (retur
6890: 6e 20 28 74 65 78 74 20 28 2b 20 22 59 65 70 2c  n (text (+ "Yep,
68a0: 20 49 20 74 6f 74 61 6c 6c 79 20 66 6f 75 6e 64   I totally found
68b0: 20 74 68 65 20 70 61 67 65 20 22 20 72 65 71 75   the page " requ
68c0: 65 73 74 2e 75 72 6c 29 29 29 0a 20 20 29 0a 29  est.url))).  ).)
68d0: 0a 0a 28 77 69 74 68 2d 64 65 63 6f 72 61 74 6f  ..(with-decorato
68e0: 72 0a 20 20 28 61 70 70 2e 72 6f 75 74 65 20 22  r.  (app.route "
68f0: 2f 73 6f 6e 67 2f 3c 6e 61 6d 65 3e 22 29 0a 20  /song/<name>"). 
6900: 20 28 64 65 66 6e 2f 61 20 67 65 74 2d 69 6e 64   (defn/a get-ind
6910: 65 78 20 5b 72 65 71 75 65 73 74 20 6e 61 6d 65  ex [request name
6920: 5d 0a 20 20 20 20 28 73 65 74 76 20 74 65 6d 70  ].    (setv temp
6930: 6c 61 74 65 20 28 65 6e 76 2e 67 65 74 5f 74 65  late (env.get_te
6940: 6d 70 6c 61 74 65 20 22 69 6e 64 65 78 2e 68 74  mplate "index.ht
6950: 6d 6c 22 29 29 0a 20 20 20 20 28 72 65 74 75 72  ml")).    (retur
6960: 6e 20 28 72 65 73 70 6f 6e 73 65 2e 68 74 6d 6c  n (response.html
6970: 20 28 74 65 6d 70 6c 61 74 65 2e 72 65 6e 64 65   (template.rende
6980: 72 20 7b 22 64 61 74 61 22 20 6e 61 6d 65 7d 29  r {"data" name})
6990: 29 29 0a 20 20 29 0a 29 0a 0a 28 77 69 74 68 2d  )).  ).)..(with-
69a0: 64 65 63 6f 72 61 74 6f 72 0a 20 20 28 61 70 70  decorator.  (app
69b0: 2e 72 6f 75 74 65 20 22 2f 22 29 0a 20 20 28 64  .route "/").  (d
69c0: 65 66 6e 2f 61 20 67 65 74 2d 69 6e 64 65 78 20  efn/a get-index 
69d0: 5b 72 65 71 75 65 73 74 5d 0a 20 20 20 20 28 73  [request].    (s
69e0: 65 74 76 20 74 65 6d 70 6c 61 74 65 20 28 65 6e  etv template (en
69f0: 76 2e 67 65 74 5f 74 65 6d 70 6c 61 74 65 20 22  v.get_template "
6a00: 69 6e 64 65 78 2e 68 74 6d 6c 22 29 29 0a 20 20  index.html")).  
6a10: 20 20 28 72 65 74 75 72 6e 20 28 72 65 73 70 6f    (return (respo
6a20: 6e 73 65 2e 68 74 6d 6c 20 28 74 65 6d 70 6c 61  nse.html (templa
6a30: 74 65 2e 72 65 6e 64 65 72 20 7b 22 64 61 74 61  te.render {"data
6a40: 22 20 22 22 7d 29 29 29 0a 20 20 29 0a 29 0a 0a  " ""}))).  ).)..
6a50: 28 77 69 74 68 2d 64 65 63 6f 72 61 74 6f 72 0a  (with-decorator.
6a60: 20 20 28 61 70 70 2e 72 6f 75 74 65 20 22 2f 69    (app.route "/i
6a70: 73 73 75 65 22 29 0a 20 20 28 64 65 66 6e 2f 61  ssue").  (defn/a
6a80: 20 67 65 74 2d 69 6e 64 65 78 20 5b 72 65 71 75   get-index [requ
6a90: 65 73 74 5d 0a 20 20 20 20 28 73 65 74 76 20 74  est].    (setv t
6aa0: 65 6d 70 6c 61 74 65 20 28 65 6e 76 2e 67 65 74  emplate (env.get
6ab0: 5f 74 65 6d 70 6c 61 74 65 20 22 70 61 67 65 2e  _template "page.
6ac0: 68 74 6d 6c 22 29 29 0a 20 20 20 20 28 72 65 74  html")).    (ret
6ad0: 75 72 6e 20 28 72 65 73 70 6f 6e 73 65 2e 68 74  urn (response.ht
6ae0: 6d 6c 20 28 74 65 6d 70 6c 61 74 65 2e 72 65 6e  ml (template.ren
6af0: 64 65 72 29 29 29 0a 20 20 29 0a 29 0a 0a 28 61  der))).  ).)..(a
6b00: 70 70 2e 73 74 61 74 69 63 20 22 2f 22 20 22 2e  pp.static "/" ".
6b10: 2f 70 75 62 6c 69 63 22 29 0a 0a 28 64 65 66 6d  /public")..(defm
6b20: 61 69 6e 20 5b 26 72 65 73 74 20 61 72 67 73 5d  ain [&rest args]
6b30: 0a 20 20 20 20 28 61 70 70 2e 72 75 6e 20 3a 68  .    (app.run :h
6b40: 6f 73 74 20 22 30 2e 30 2e 30 2e 30 22 20 3a 70  ost "0.0.0.0" :p
6b50: 6f 72 74 20 38 30 31 35 29 0a 29 0a 22 22 22 0a  ort 8015).).""".
6b60: 0a 69 66 20 44 45 56 20 3d 3d 20 22 31 22 3a 0a  .if DEV == "1":.
6b70: 20 20 20 20 66 6f 72 5f 64 6f 63 73 20 3d 20 22      for_docs = "
6b80: 22 22 0a 23 23 20 41 70 70 0a 0a 60 60 60 7b 63  "".## App..```{c
6b90: 6f 64 65 2d 62 6c 6f 63 6b 7d 20 68 79 6c 61 6e  ode-block} hylan
6ba0: 67 0a 2d 2d 2d 0a 66 6f 72 63 65 3a 20 74 72 75  g.---.force: tru
6bb0: 65 0a 2d 2d 2d 0a 25 73 0a 60 60 60 0a 22 22 22  e.---.%s.```."""
6bc0: 0a 20 20 20 20 63 6f 67 2e 6f 75 74 28 66 6f 72  .    cog.out(for
6bd0: 5f 64 6f 63 73 20 25 20 28 61 70 70 2c 29 29 0a  _docs % (app,)).
6be0: 6f 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 62 69  os.system("rm bi
6bf0: 74 72 68 79 74 68 6d 2e 68 79 22 29 0a 66 20 3d  trhythm.hy").f =
6c00: 20 6f 70 65 6e 28 22 62 69 74 72 68 79 74 68 6d   open("bitrhythm
6c10: 2e 68 79 22 2c 20 22 77 22 29 0a 66 2e 77 72 69  .hy", "w").f.wri
6c20: 74 65 28 61 70 70 29 0a 66 2e 63 6c 6f 73 65 28  te(app).f.close(
6c30: 29 0a 40 3e 0a 40 40 0a 0a 40 3c 0a 69 6d 70 6f  ).@>.@@..@<.impo
6c40: 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74 20 6f 73  rt cog.import os
6c50: 0a 0a 69 6e 64 65 78 20 3d 20 22 22 22 0a 3c 21  ..index = """.<!
6c60: 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68  DOCTYPE html>.<h
6c70: 74 6d 6c 20 6c 61 6e 67 3d 22 65 6e 22 3e 0a 0a  tml lang="en">..
6c80: 20 20 20 20 3c 68 65 61 64 3e 0a 20 20 20 20 20      <head>.     
6c90: 20 20 20 3c 6d 65 74 61 20 63 68 61 72 73 65 74     <meta charset
6ca0: 3d 22 75 74 66 2d 38 22 3e 0a 0a 20 20 20 20 20  ="utf-8">..     
6cb0: 20 20 20 3c 74 69 74 6c 65 3e 42 69 74 72 68 79     <title>Bitrhy
6cc0: 74 68 6d 3c 2f 74 69 74 6c 65 3e 0a 0a 20 20 20  thm</title>..   
6cd0: 20 20 20 20 20 3c 6d 65 74 61 20 68 74 74 70 2d       <meta http-
6ce0: 65 71 75 69 76 3d 22 43 61 63 68 65 2d 43 6f 6e  equiv="Cache-Con
6cf0: 74 72 6f 6c 22 20 63 6f 6e 74 65 6e 74 3d 22 6e  trol" content="n
6d00: 6f 2d 63 61 63 68 65 2c 20 6e 6f 2d 73 74 6f 72  o-cache, no-stor
6d10: 65 2c 20 6d 75 73 74 2d 72 65 76 61 6c 69 64 61  e, must-revalida
6d20: 74 65 22 20 2f 3e 0a 20 20 20 20 20 20 20 20 3c  te" />.        <
6d30: 6d 65 74 61 20 68 74 74 70 2d 65 71 75 69 76 3d  meta http-equiv=
6d40: 22 50 72 61 67 6d 61 22 20 63 6f 6e 74 65 6e 74  "Pragma" content
6d50: 3d 22 6e 6f 2d 63 61 63 68 65 22 20 2f 3e 0a 20  ="no-cache" />. 
6d60: 20 20 20 20 20 20 20 3c 6d 65 74 61 20 68 74 74         <meta htt
6d70: 70 2d 65 71 75 69 76 3d 22 45 78 70 69 72 65 73  p-equiv="Expires
6d80: 22 20 63 6f 6e 74 65 6e 74 3d 22 30 22 20 2f 3e  " content="0" />
6d90: 0a 0a 20 20 20 20 20 20 20 20 3c 6d 65 74 61 20  ..        <meta 
6da0: 63 6f 6e 74 65 6e 74 3d 22 42 69 74 72 68 79 74  content="Bitrhyt
6db0: 68 6d 22 20 6e 61 6d 65 3d 22 64 65 73 63 72 69  hm" name="descri
6dc0: 70 74 69 6f 6e 22 20 78 6d 6c 3a 6c 61 6e 67 3d  ption" xml:lang=
6dd0: 22 65 6e 22 20 6c 61 6e 67 3d 22 65 6e 22 3e 0a  "en" lang="en">.
6de0: 20 20 20 20 20 20 20 20 3c 6d 65 74 61 20 63 6f          <meta co
6df0: 6e 74 65 6e 74 3d 22 6c 69 74 65 72 61 74 65 20  ntent="literate 
6e00: 70 72 6f 67 72 61 6d 6d 69 6e 67 2c 20 70 35 2c  programming, p5,
6e10: 20 6c 69 76 65 20 63 6f 64 69 6e 67 2c 20 61 6c   live coding, al
6e20: 67 6f 72 61 76 65 2c 20 64 65 6d 6f 73 63 65 6e  gorave, demoscen
6e30: 65 2c 20 63 72 65 61 74 69 76 65 20 70 72 6f 67  e, creative prog
6e40: 72 61 6d 6d 69 6e 67 2c 20 6d 75 73 69 63 2c 20  ramming, music, 
6e50: 74 65 63 68 6e 6f 2c 20 70 72 6f 67 72 61 6d 6d  techno, programm
6e60: 69 6e 67 2c 20 77 65 62 61 75 64 69 6f 2c 20 77  ing, webaudio, w
6e70: 65 62 67 6c 2c 20 70 35 2c 20 69 6d 70 72 6f 76  ebgl, p5, improv
6e80: 69 73 69 6e 67 22 3e 0a 0a 20 20 20 20 20 20 20  ising">..       
6e90: 24 7b 63 6f 6d 6d 6f 6e 5f 73 63 72 69 70 74 73  ${common_scripts
6ea0: 7d 0a 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e 6b  }..        <link
6eb0: 20 72 65 6c 3d 22 70 72 65 63 6f 6e 6e 65 63 74   rel="preconnect
6ec0: 22 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f  " href="https://
6ed0: 66 6f 6e 74 73 2e 67 73 74 61 74 69 63 2e 63 6f  fonts.gstatic.co
6ee0: 6d 22 3e 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e  m">.        <lin
6ef0: 6b 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f  k href="https://
6f00: 66 6f 6e 74 73 2e 67 6f 6f 67 6c 65 61 70 69 73  fonts.googleapis
6f10: 2e 63 6f 6d 2f 63 73 73 32 3f 66 61 6d 69 6c 79  .com/css2?family
6f20: 3d 52 6f 62 6f 74 6f 2b 4d 6f 6e 6f 3a 69 74 61  =Roboto+Mono:ita
6f30: 6c 2c 77 67 68 74 40 30 2c 31 30 30 3b 30 2c 32  l,wght@0,100;0,2
6f40: 30 30 3b 30 2c 33 30 30 3b 30 2c 34 30 30 3b 30  00;0,300;0,400;0
6f50: 2c 35 30 30 3b 30 2c 37 30 30 3b 31 2c 31 30 30  ,500;0,700;1,100
6f60: 3b 31 2c 32 30 30 3b 31 2c 33 30 30 3b 31 2c 34  ;1,200;1,300;1,4
6f70: 30 30 3b 31 2c 35 30 30 3b 31 2c 37 30 30 26 64  00;1,500;1,700&d
6f80: 69 73 70 6c 61 79 3d 73 77 61 70 22 20 72 65 6c  isplay=swap" rel
6f90: 3d 22 73 74 79 6c 65 73 68 65 65 74 22 3e 0a 20  ="stylesheet">. 
6fa0: 20 20 20 20 20 20 20 3c 6c 69 6e 6b 20 68 72 65         <link hre
6fb0: 66 3d 22 68 74 74 70 73 3a 2f 2f 66 6f 6e 74 73  f="https://fonts
6fc0: 2e 67 6f 6f 67 6c 65 61 70 69 73 2e 63 6f 6d 2f  .googleapis.com/
6fd0: 63 73 73 32 3f 66 61 6d 69 6c 79 3d 4d 61 6a 6f  css2?family=Majo
6fe0: 72 2b 4d 6f 6e 6f 2b 44 69 73 70 6c 61 79 26 66  r+Mono+Display&f
6ff0: 61 6d 69 6c 79 3d 52 6f 62 6f 74 6f 2b 4d 6f 6e  amily=Roboto+Mon
7000: 6f 3a 69 74 61 6c 2c 77 67 68 74 40 30 2c 31 30  o:ital,wght@0,10
7010: 30 3b 30 2c 32 30 30 3b 30 2c 33 30 30 3b 30 2c  0;0,200;0,300;0,
7020: 34 30 30 3b 30 2c 35 30 30 3b 30 2c 37 30 30 3b  400;0,500;0,700;
7030: 31 2c 31 30 30 3b 31 2c 32 30 30 3b 31 2c 33 30  1,100;1,200;1,30
7040: 30 3b 31 2c 34 30 30 3b 31 2c 35 30 30 3b 31 2c  0;1,400;1,500;1,
7050: 37 30 30 26 64 69 73 70 6c 61 79 3d 73 77 61 70  700&display=swap
7060: 22 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65  " rel="styleshee
7070: 74 22 3e 0a 0a 20 20 20 20 20 20 20 20 3c 73 63  t">..        <sc
7080: 72 69 70 74 20 73 72 63 3d 22 68 74 74 70 73 3a  ript src="https:
7090: 2f 2f 63 6f 64 65 2e 6a 71 75 65 72 79 2e 63 6f  //code.jquery.co
70a0: 6d 2f 75 69 2f 31 2e 31 32 2e 30 2f 6a 71 75 65  m/ui/1.12.0/jque
70b0: 72 79 2d 75 69 2e 6d 69 6e 2e 6a 73 22 3e 3c 2f  ry-ui.min.js"></
70c0: 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20  script>.        
70d0: 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73 74 79 6c 65  <link rel="style
70e0: 73 68 65 65 74 22 20 68 72 65 66 3d 22 68 74 74  sheet" href="htt
70f0: 70 73 3a 2f 2f 63 6f 64 65 2e 6a 71 75 65 72 79  ps://code.jquery
7100: 2e 63 6f 6d 2f 75 69 2f 31 2e 31 32 2e 30 2f 74  .com/ui/1.12.0/t
7110: 68 65 6d 65 73 2f 73 6d 6f 6f 74 68 6e 65 73 73  hemes/smoothness
7120: 2f 6a 71 75 65 72 79 2d 75 69 2e 63 73 73 22 3e  /jquery-ui.css">
7130: 0a 20 20 20 20 20 20 20 20 3c 73 63 72 69 70 74  .        <script
7140: 20 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f 63 64   src="https://cd
7150: 6e 6a 73 2e 63 6c 6f 75 64 66 6c 61 72 65 2e 63  njs.cloudflare.c
7160: 6f 6d 2f 61 6a 61 78 2f 6c 69 62 73 2f 6d 69 63  om/ajax/libs/mic
7170: 72 6f 6d 6f 64 61 6c 2f 30 2e 34 2e 36 2f 6d 69  romodal/0.4.6/mi
7180: 63 72 6f 6d 6f 64 61 6c 2e 6d 69 6e 2e 6a 73 22  cromodal.min.js"
7190: 20 69 6e 74 65 67 72 69 74 79 3d 22 73 68 61 35   integrity="sha5
71a0: 31 32 2d 52 4d 4d 68 2b 49 48 7a 66 5a 4c 73 56  12-RMMh+IHzfZLsV
71b0: 46 6f 31 72 58 39 50 42 6f 79 73 78 72 4a 4a 71  Fo1rX9PBoysxrJJq
71c0: 6a 79 4f 53 33 31 48 59 57 66 74 6f 62 57 74 76  jyOS31HYWftobWtv
71d0: 32 41 74 36 4b 42 54 71 4b 70 76 56 44 49 57 41  2At6KBTqKpvVDIWA
71e0: 6a 4c 35 61 69 56 2b 4c 6a 46 71 6b 51 36 65 35  jL5aiV+LjFqkQ6e5
71f0: 33 52 64 77 33 56 4f 42 67 3d 3d 22 20 63 72 6f  3Rdw3VOBg==" cro
7200: 73 73 6f 72 69 67 69 6e 3d 22 61 6e 6f 6e 79 6d  ssorigin="anonym
7210: 6f 75 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20  ous"></script>. 
7220: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73         <script s
7230: 72 63 3d 22 68 74 74 70 73 3a 2f 2f 63 64 6e 2e  rc="https://cdn.
7240: 6a 73 64 65 6c 69 76 72 2e 6e 65 74 2f 6e 70 6d  jsdelivr.net/npm
7250: 2f 77 68 65 6e 69 70 72 65 73 73 40 31 2e 38 2e  /whenipress@1.8.
7260: 30 2f 64 69 73 74 2f 77 68 65 6e 69 70 72 65 73  0/dist/whenipres
7270: 73 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a  s.js"></script>.
7280: 0a 20 20 20 20 20 20 20 20 3c 73 63 72 69 70 74  .        <script
7290: 20 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f 63 64   src="https://cd
72a0: 6e 6a 73 2e 63 6c 6f 75 64 66 6c 61 72 65 2e 63  njs.cloudflare.c
72b0: 6f 6d 2f 61 6a 61 78 2f 6c 69 62 73 2f 41 6c 65  om/ajax/libs/Ale
72c0: 72 74 69 66 79 4a 53 2f 31 2e 31 33 2e 31 2f 61  rtifyJS/1.13.1/a
72d0: 6c 65 72 74 69 66 79 2e 6d 69 6e 2e 6a 73 22 20  lertify.min.js" 
72e0: 69 6e 74 65 67 72 69 74 79 3d 22 73 68 61 35 31  integrity="sha51
72f0: 32 2d 4a 6e 6a 47 2b 57 74 35 33 47 73 70 55 51  2-JnjG+Wt53GspUQ
7300: 58 51 68 63 2b 63 34 6a 38 53 42 45 52 73 67 4a  XQhc+c4j8SBERsgJ
7310: 41 6f 48 65 65 68 61 67 4b 48 6c 78 51 4e 2b 4d  AoHeehagKHlxQN+M
7320: 74 43 43 6d 46 44 67 68 58 39 2f 41 63 62 6b 6b  tCCmFDghX9/Acbkk
7330: 4e 52 5a 70 74 79 5a 55 34 7a 43 38 75 74 4b 35  NRZptyZU4zC8utK5
7340: 39 4d 35 4c 34 35 49 77 3d 3d 22 20 63 72 6f 73  9M5L45Iw==" cros
7350: 73 6f 72 69 67 69 6e 3d 22 61 6e 6f 6e 79 6d 6f  sorigin="anonymo
7360: 75 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20  us"></script>.  
7370: 20 20 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c 3d        <link rel=
7380: 22 73 74 79 6c 65 73 68 65 65 74 22 20 68 72 65  "stylesheet" hre
7390: 66 3d 22 68 74 74 70 73 3a 2f 2f 63 64 6e 6a 73  f="https://cdnjs
73a0: 2e 63 6c 6f 75 64 66 6c 61 72 65 2e 63 6f 6d 2f  .cloudflare.com/
73b0: 61 6a 61 78 2f 6c 69 62 73 2f 41 6c 65 72 74 69  ajax/libs/Alerti
73c0: 66 79 4a 53 2f 31 2e 31 33 2e 31 2f 63 73 73 2f  fyJS/1.13.1/css/
73d0: 61 6c 65 72 74 69 66 79 2e 6d 69 6e 2e 63 73 73  alertify.min.css
73e0: 22 20 69 6e 74 65 67 72 69 74 79 3d 22 73 68 61  " integrity="sha
73f0: 35 31 32 2d 49 58 75 6f 71 31 61 46 64 32 77 58  512-IXuoq1aFd2wX
7400: 73 34 4e 71 47 73 6b 77 58 32 56 62 2b 49 38 55  s4NqGskwX2Vb+I8U
7410: 4a 2b 74 47 4a 45 75 2f 44 63 30 7a 77 4c 4e 4b  J+tGJEu/Dc0zwLNK
7420: 65 51 37 43 57 33 53 72 36 76 30 79 55 33 7a 35  eQ7CW3Sr6v0yU3z5
7430: 4f 51 57 65 33 65 53 63 56 49 6b 45 52 34 4a 39  OQWe3eScVIkER4J9
7440: 4c 37 62 79 72 67 52 2f 66 41 3d 3d 22 20 63 72  L7byrgR/fA==" cr
7450: 6f 73 73 6f 72 69 67 69 6e 3d 22 61 6e 6f 6e 79  ossorigin="anony
7460: 6d 6f 75 73 22 20 2f 3e 0a 20 20 20 20 20 20 20  mous" />.       
7470: 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73 74 79 6c   <link rel="styl
7480: 65 73 68 65 65 74 22 20 68 72 65 66 3d 22 68 74  esheet" href="ht
7490: 74 70 73 3a 2f 2f 63 64 6e 6a 73 2e 63 6c 6f 75  tps://cdnjs.clou
74a0: 64 66 6c 61 72 65 2e 63 6f 6d 2f 61 6a 61 78 2f  dflare.com/ajax/
74b0: 6c 69 62 73 2f 41 6c 65 72 74 69 66 79 4a 53 2f  libs/AlertifyJS/
74c0: 31 2e 31 33 2e 31 2f 63 73 73 2f 74 68 65 6d 65  1.13.1/css/theme
74d0: 73 2f 64 65 66 61 75 6c 74 2e 6d 69 6e 2e 63 73  s/default.min.cs
74e0: 73 22 20 69 6e 74 65 67 72 69 74 79 3d 22 73 68  s" integrity="sh
74f0: 61 35 31 32 2d 52 67 55 6a 44 70 77 6a 45 44 7a  a512-RgUjDpwjEDz
7500: 41 62 37 6e 6b 53 68 69 7a 43 43 4a 2b 51 54 53  Ab7nkShizCCJ+QTS
7510: 4c 49 69 4a 4f 31 6c 64 74 75 78 7a 73 30 55 49  LIiJO1ldtuxzs0UI
7520: 42 52 48 34 51 70 4f 6a 55 55 39 77 34 37 41 46  BRH4QpOjUU9w47AF
7530: 39 5a 6c 76 69 71 56 2f 64 4f 46 47 57 46 36 6f  9ZlviqV/dOFGWF6o
7540: 37 6c 33 6c 74 74 45 46 62 36 67 3d 3d 22 20 63  7l3lttEFb6g==" c
7550: 72 6f 73 73 6f 72 69 67 69 6e 3d 22 61 6e 6f 6e  rossorigin="anon
7560: 79 6d 6f 75 73 22 20 2f 3e 0a 0a 20 20 20 20 20  ymous" />..     
7570: 20 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22     <script src="
7580: 2f 6a 73 6f 6e 2d 75 72 6c 2d 6d 61 73 74 65 72  /json-url-master
7590: 2f 64 69 73 74 2f 62 72 6f 77 73 65 72 2f 6a 73  /dist/browser/js
75a0: 6f 6e 2d 75 72 6c 2e 6a 73 22 3e 3c 2f 73 63 72  on-url.js"></scr
75b0: 69 70 74 3e 0a 20 20 20 20 20 20 20 20 3c 73 63  ipt>.        <sc
75c0: 72 69 70 74 20 73 72 63 3d 22 2f 72 69 6f 74 2d  ript src="/riot-
75d0: 33 2e 31 33 2e 32 2f 72 69 6f 74 2b 63 6f 6d 70  3.13.2/riot+comp
75e0: 69 6c 65 72 2e 6a 73 22 3e 3c 2f 73 63 72 69 70  iler.js"></scrip
75f0: 74 3e 0a 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e  t>..        <lin
7600: 6b 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65  k rel="styleshee
7610: 74 22 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f  t" href="https:/
7620: 2f 63 64 6e 6a 73 2e 63 6c 6f 75 64 66 6c 61 72  /cdnjs.cloudflar
7630: 65 2e 63 6f 6d 2f 61 6a 61 78 2f 6c 69 62 73 2f  e.com/ajax/libs/
7640: 74 61 69 6c 77 69 6e 64 63 73 73 2f 32 2e 31 2e  tailwindcss/2.1.
7650: 32 2f 74 61 69 6c 77 69 6e 64 2e 6d 69 6e 2e 63  2/tailwind.min.c
7660: 73 73 22 20 69 6e 74 65 67 72 69 74 79 3d 22 73  ss" integrity="s
7670: 68 61 35 31 32 2d 52 6e 74 61 74 50 4f 68 45 63  ha512-RntatPOhEc
7680: 51 45 41 38 31 67 43 2f 65 73 59 6f 43 6b 47 6b  QEA81gC/esYoCkGk
7690: 4c 37 41 59 56 37 54 65 54 50 6f 55 2b 52 39 7a  L7AYV7TeTPoU+R9z
76a0: 45 34 34 2f 79 57 78 56 76 4c 49 42 66 42 53 61  E44/yWxVvLIBfBSa
76b0: 4d 75 37 38 72 68 6f 44 64 37 33 5a 65 52 48 58  Mu78rhoDd73ZeRHX
76c0: 52 4a 4e 35 2b 61 50 45 4b 35 33 51 3d 3d 22 20  RJN5+aPEK53Q==" 
76d0: 63 72 6f 73 73 6f 72 69 67 69 6e 3d 22 61 6e 6f  crossorigin="ano
76e0: 6e 79 6d 6f 75 73 22 20 2f 3e 0a 20 20 20 20 20  nymous" />.     
76f0: 20 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22     <script src="
7700: 68 74 74 70 73 3a 2f 2f 73 74 61 63 6b 70 61 74  https://stackpat
7710: 68 2e 62 6f 6f 74 73 74 72 61 70 63 64 6e 2e 63  h.bootstrapcdn.c
7720: 6f 6d 2f 62 6f 6f 74 73 74 72 61 70 2f 34 2e 33  om/bootstrap/4.3
7730: 2e 31 2f 6a 73 2f 62 6f 6f 74 73 74 72 61 70 2e  .1/js/bootstrap.
7740: 6d 69 6e 2e 6a 73 22 20 69 6e 74 65 67 72 69 74  min.js" integrit
7750: 79 3d 22 73 68 61 33 38 34 2d 4a 6a 53 6d 56 67  y="sha384-JjSmVg
7760: 79 64 30 70 33 70 58 42 31 72 52 69 62 5a 55 41  yd0p3pXB1rRibZUA
7770: 59 6f 49 49 79 36 4f 72 51 36 56 72 6a 49 45 61  YoIIy6OrQ6VrjIEa
7780: 46 66 2f 6e 4a 47 7a 49 78 46 44 73 66 34 78 30  Ff/nJGzIxFDsf4x0
7790: 78 49 4d 2b 42 30 37 6a 52 4d 22 20 63 72 6f 73  xIM+B07jRM" cros
77a0: 73 6f 72 69 67 69 6e 3d 22 61 6e 6f 6e 79 6d 6f  sorigin="anonymo
77b0: 75 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 0a 20  us"></script>.. 
77c0: 20 20 20 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c         <link rel
77d0: 3d 22 73 74 79 6c 65 73 68 65 65 74 22 20 68 72  ="stylesheet" hr
77e0: 65 66 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69 72  ef="https://esir
77f0: 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63  onal.github.io/c
7800: 6d 74 6f 75 63 68 2f 6c 69 62 2f 63 6f 64 65 6d  mtouch/lib/codem
7810: 69 72 72 6f 72 2e 63 73 73 22 3e 0a 20 20 20 20  irror.css">.    
7820: 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73      <link rel="s
7830: 74 79 6c 65 73 68 65 65 74 22 20 68 72 65 66 3d  tylesheet" href=
7840: 22 68 74 74 70 73 3a 2f 2f 65 73 69 72 6f 6e 61  "https://esirona
7850: 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63 6d 74 6f  l.github.io/cmto
7860: 75 63 68 2f 61 64 64 6f 6e 2f 68 69 6e 74 2f 73  uch/addon/hint/s
7870: 68 6f 77 2d 68 69 6e 74 2e 63 73 73 22 3e 0a 20  how-hint.css">. 
7880: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73         <script s
7890: 72 63 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69 72  rc="https://esir
78a0: 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63  onal.github.io/c
78b0: 6d 74 6f 75 63 68 2f 6c 69 62 2f 63 6f 64 65 6d  mtouch/lib/codem
78c0: 69 72 72 6f 72 2e 6a 73 22 3e 3c 2f 73 63 72 69  irror.js"></scri
78d0: 70 74 3e 0a 0a 20 20 20 20 20 20 20 20 3c 73 63  pt>..        <sc
78e0: 72 69 70 74 20 73 72 63 3d 22 68 74 74 70 73 3a  ript src="https:
78f0: 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75  //esironal.githu
7900: 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f 61 64 64  b.io/cmtouch/add
7910: 6f 6e 2f 68 69 6e 74 2f 73 68 6f 77 2d 68 69 6e  on/hint/show-hin
7920: 74 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a  t.js"></script>.
7930: 20 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20          <script 
7940: 73 72 63 3d 22 68 74 74 70 3a 2f 2f 65 73 69 72  src="http://esir
7950: 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63  onal.github.io/c
7960: 6d 74 6f 75 63 68 2f 61 64 64 6f 6e 2f 68 69 6e  mtouch/addon/hin
7970: 74 2f 78 6d 6c 2d 68 69 6e 74 2e 6a 73 22 3e 3c  t/xml-hint.js"><
7980: 2f 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20  /script>.       
7990: 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68 74   <script src="ht
79a0: 74 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67  tps://esironal.g
79b0: 69 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68  ithub.io/cmtouch
79c0: 2f 61 64 64 6f 6e 2f 68 69 6e 74 2f 68 74 6d 6c  /addon/hint/html
79d0: 2d 68 69 6e 74 2e 6a 73 22 3e 3c 2f 73 63 72 69  -hint.js"></scri
79e0: 70 74 3e 0a 20 20 20 20 20 20 20 20 3c 73 63 72  pt>.        <scr
79f0: 69 70 74 20 73 72 63 3d 22 68 74 74 70 73 3a 2f  ipt src="https:/
7a00: 2f 65 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75 62  /esironal.github
7a10: 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f 6d 6f 64 65  .io/cmtouch/mode
7a20: 2f 78 6d 6c 2f 78 6d 6c 2e 6a 73 22 3e 3c 2f 73  /xml/xml.js"></s
7a30: 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20 3c  cript>.        <
7a40: 73 63 72 69 70 74 20 73 72 63 3d 22 68 74 74 70  script src="http
7a50: 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69 74  s://esironal.git
7a60: 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f 6d  hub.io/cmtouch/m
7a70: 6f 64 65 2f 6a 61 76 61 73 63 72 69 70 74 2f 6a  ode/javascript/j
7a80: 61 76 61 73 63 72 69 70 74 2e 6a 73 22 3e 3c 2f  avascript.js"></
7a90: 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20  script>.        
7aa0: 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68 74 74  <script src="htt
7ab0: 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69  ps://esironal.gi
7ac0: 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f  thub.io/cmtouch/
7ad0: 6d 6f 64 65 2f 63 73 73 2f 63 73 73 2e 6a 73 22  mode/css/css.js"
7ae0: 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20 20 20  ></script>.     
7af0: 20 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22     <script src="
7b00: 68 74 74 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c  https://esironal
7b10: 2e 67 69 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75  .github.io/cmtou
7b20: 63 68 2f 6d 6f 64 65 2f 68 74 6d 6c 6d 69 78 65  ch/mode/htmlmixe
7b30: 64 2f 68 74 6d 6c 6d 69 78 65 64 2e 6a 73 22 3e  d/htmlmixed.js">
7b40: 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20  </script>.      
7b50: 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68    <script src="h
7b60: 74 74 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e  ttps://esironal.
7b70: 67 69 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63  github.io/cmtouc
7b80: 68 2f 61 64 64 6f 6e 2f 73 65 6c 65 63 74 69 6f  h/addon/selectio
7b90: 6e 2f 61 63 74 69 76 65 2d 6c 69 6e 65 2e 6a 73  n/active-line.js
7ba0: 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20 20  "></script>.    
7bb0: 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68 74 74  <script src="htt
7bc0: 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69  ps://esironal.gi
7bd0: 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f  thub.io/cmtouch/
7be0: 61 64 64 6f 6e 2f 73 65 6c 65 63 74 69 6f 6e 2f  addon/selection/
7bf0: 6d 61 72 6b 2d 73 65 6c 65 63 74 69 6f 6e 2e 6a  mark-selection.j
7c00: 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 0a 20 20  s"></script>..  
7c10: 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73 72        <script sr
7c20: 63 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69 72 6f  c="https://esiro
7c30: 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63 6d  nal.github.io/cm
7c40: 74 6f 75 63 68 2f 61 64 64 6f 6e 2f 65 64 69 74  touch/addon/edit
7c50: 2f 6d 61 74 63 68 62 72 61 63 6b 65 74 73 2e 6a  /matchbrackets.j
7c60: 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20  s"></script>.   
7c70: 20 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22       <link rel="
7c80: 73 74 79 6c 65 73 68 65 65 74 22 20 68 72 65 66  stylesheet" href
7c90: 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69 72 6f 6e  ="https://esiron
7ca0: 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63 6d 74  al.github.io/cmt
7cb0: 6f 75 63 68 2f 74 68 65 6d 65 2f 6e 65 6f 6e 73  ouch/theme/neons
7cc0: 79 6e 74 61 78 2e 63 73 73 22 3e 0a 20 20 20 20  yntax.css">.    
7cd0: 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73      <link rel="s
7ce0: 74 79 6c 65 73 68 65 65 74 22 20 68 72 65 66 3d  tylesheet" href=
7cf0: 22 68 74 74 70 73 3a 2f 2f 75 6e 70 6b 67 2e 63  "https://unpkg.c
7d00: 6f 6d 2f 70 79 6c 6f 6e 63 73 73 40 6c 61 74 65  om/pyloncss@late
7d10: 73 74 2f 63 73 73 2f 70 79 6c 6f 6e 2e 63 73 73  st/css/pylon.css
7d20: 22 2f 3e 0a 0a 0a 20 20 20 20 20 20 20 20 3c 73  "/>...        <s
7d30: 63 72 69 70 74 20 73 72 63 3d 22 2f 74 75 6e 65  cript src="/tune
7d40: 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20  .js"></script>. 
7d50: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73         <script s
7d60: 72 63 3d 22 2f 6d 69 73 63 2e 6a 73 22 3e 3c 2f  rc="/misc.js"></
7d70: 73 63 72 69 70 74 3e 0a 0a 20 20 20 20 20 20 20  script>..       
7d80: 20 3c 73 74 79 6c 65 20 74 79 70 65 3d 22 74 65   <style type="te
7d90: 78 74 2f 63 73 73 22 3e 0a 62 6f 64 79 20 7b 0a  xt/css">.body {.
7da0: 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20      background: 
7db0: 62 6c 61 63 6b 3b 0a 20 20 20 20 63 6f 6c 6f 72  black;.    color
7dc0: 3a 20 77 68 69 74 65 3b 0a 20 20 20 20 66 6f 6e  : white;.    fon
7dd0: 74 2d 66 61 6d 69 6c 79 3a 20 27 52 6f 62 6f 74  t-family: 'Robot
7de0: 6f 20 4d 6f 6e 6f 27 2c 20 6d 6f 6e 6f 73 70 61  o Mono', monospa
7df0: 63 65 3b 0a 20 20 20 20 6f 76 65 72 66 6c 6f 77  ce;.    overflow
7e00: 2d 78 3a 20 68 69 64 64 65 6e 3b 0a 7d 0a 0a 61  -x: hidden;.}..a
7e10: 20 7b 0a 20 20 20 20 63 6f 6c 6f 72 3a 20 77 68   {.    color: wh
7e20: 69 74 65 3b 0a 7d 0a 0a 69 6e 70 75 74 20 7b 0a  ite;.}..input {.
7e30: 20 20 20 20 63 6f 6c 6f 72 3a 20 62 6c 61 63 6b      color: black
7e40: 3b 0a 7d 0a 0a 2e 62 74 6e 20 7b 0a 20 20 20 20  ;.}...btn {.    
7e50: 62 61 63 6b 67 72 6f 75 6e 64 3a 20 77 68 69 74  background: whit
7e60: 65 3b 0a 20 20 20 20 63 6f 6c 6f 72 3a 20 62 6c  e;.    color: bl
7e70: 61 63 6b 3b 0a 20 20 20 20 70 61 64 64 69 6e 67  ack;.    padding
7e80: 3a 20 34 70 78 3b 0a 7d 0a 0a 2e 43 6f 64 65 4d  : 4px;.}...CodeM
7e90: 69 72 72 6f 72 2d 73 65 6c 65 63 74 65 64 20 20  irror-selected  
7ea0: 7b 20 62 61 63 6b 67 72 6f 75 6e 64 2d 63 6f 6c  { background-col
7eb0: 6f 72 3a 20 74 72 61 6e 73 70 61 72 65 6e 74 20  or: transparent 
7ec0: 21 69 6d 70 6f 72 74 61 6e 74 3b 20 20 20 7a 2d  !important;   z-
7ed0: 69 6e 64 65 78 3a 20 32 30 20 21 69 6d 70 6f 72  index: 20 !impor
7ee0: 74 61 6e 74 3b 20 7d 0a 0a 2e 43 6f 64 65 4d 69  tant; }...CodeMi
7ef0: 72 72 6f 72 2d 73 65 6c 65 63 74 65 64 74 65 78  rror-selectedtex
7f00: 74 20 7b 0a 20 20 20 20 63 6f 6c 6f 72 3a 20 72  t {.    color: r
7f10: 65 64 20 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 20  ed !important;. 
7f20: 20 20 20 20 7a 2d 69 6e 64 65 78 3a 20 32 35 20      z-index: 25 
7f30: 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a 2e  !important;.}...
7f40: 43 6f 64 65 4d 69 72 72 6f 72 20 70 72 65 20 7b  CodeMirror pre {
7f50: 0a 20 20 7a 2d 69 6e 64 65 78 3a 20 35 3b 0a 20  .  z-index: 5;. 
7f60: 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 62 6c 61   background: bla
7f70: 63 6b 3b 0a 20 20 70 61 64 64 69 6e 67 3a 20 32  ck;.  padding: 2
7f80: 70 78 3b 0a 7d 0a 0a 2e 43 6f 64 65 4d 69 72 72  px;.}...CodeMirr
7f90: 6f 72 2d 63 75 72 73 6f 72 20 7b 0a 20 20 62 6f  or-cursor {.  bo
7fa0: 72 64 65 72 2d 6c 65 66 74 3a 20 32 70 78 20 73  rder-left: 2px s
7fb0: 6f 6c 69 64 20 77 68 69 74 65 20 21 69 6d 70 6f  olid white !impo
7fc0: 72 74 61 6e 74 3b 0a 20 20 7a 2d 69 6e 64 65 78  rtant;.  z-index
7fd0: 3a 20 31 30 20 21 69 6d 70 6f 72 74 61 6e 74 3b  : 10 !important;
7fe0: 0a 20 20 63 6f 6c 6f 72 3a 20 77 68 69 74 65 20  .  color: white 
7ff0: 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 20 20 62 61  !important;.  ba
8000: 63 6b 67 72 6f 75 6e 64 3a 20 77 68 69 74 65 20  ckground: white 
8010: 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a 2e  !important;.}...
8020: 43 6f 64 65 4d 69 72 72 6f 72 2d 6c 69 6e 65 20  CodeMirror-line 
8030: 73 70 61 6e 20 7b 0a 20 20 63 6f 6c 6f 72 3a 20  span {.  color: 
8040: 77 68 69 74 65 20 21 69 6d 70 6f 72 74 61 6e 74  white !important
8050: 3b 0a 7d 0a 0a 2e 43 6f 64 65 4d 69 72 72 6f 72  ;.}...CodeMirror
8060: 2d 6c 69 6e 65 20 3e 20 73 70 61 6e 20 7b 0a 20  -line > span {. 
8070: 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 62 6c 61   background: bla
8080: 63 6b 3b 0a 20 20 70 61 64 64 69 6e 67 3a 20 30  ck;.  padding: 0
8090: 20 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a   !important;.}..
80a0: 2e 43 6f 64 65 4d 69 72 72 6f 72 2d 6c 69 6e 65  .CodeMirror-line
80b0: 73 20 7b 0a 20 20 70 61 64 64 69 6e 67 3a 20 30  s {.  padding: 0
80c0: 20 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a   !important;.}..
80d0: 0a 2e 43 6f 64 65 4d 69 72 72 6f 72 20 7b 0a 20  ..CodeMirror {. 
80e0: 20 20 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 31 32     font-size: 12
80f0: 70 78 3b 0a 20 20 20 20 77 69 64 74 68 3a 20 31  px;.    width: 1
8100: 30 30 25 3b 0a 20 20 20 20 70 61 64 64 69 6e 67  00%;.    padding
8110: 2d 6c 65 66 74 3a 20 34 70 78 3b 0a 20 20 20 20  -left: 4px;.    
8120: 6c 69 6e 65 2d 68 65 69 67 68 74 3a 20 31 3b 0a  line-height: 1;.
8130: 20 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20      background: 
8140: 74 72 61 6e 73 70 61 72 65 6e 74 20 21 69 6d 70  transparent !imp
8150: 6f 72 74 61 6e 74 3b 0a 20 20 20 20 63 6f 6c 6f  ortant;.    colo
8160: 72 3a 20 77 68 69 74 65 20 21 69 6d 70 6f 72 74  r: white !import
8170: 61 6e 74 3b 0a 20 20 20 20 66 6f 6e 74 2d 66 61  ant;.    font-fa
8180: 6d 69 6c 79 3a 20 27 52 6f 62 6f 74 6f 20 4d 6f  mily: 'Roboto Mo
8190: 6e 6f 27 2c 20 6d 6f 6e 6f 73 70 61 63 65 20 21  no', monospace !
81a0: 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a 2e 43  important;.}...C
81b0: 6f 64 65 4d 69 72 72 6f 72 2d 76 73 63 72 6f 6c  odeMirror-vscrol
81c0: 6c 62 61 72 2c 20 2e 43 6f 64 65 4d 69 72 72 6f  lbar, .CodeMirro
81d0: 72 2d 68 73 63 72 6f 6c 6c 62 61 72 20 7b 0a 20  r-hscrollbar {. 
81e0: 20 20 20 6f 76 65 72 66 6c 6f 77 2d 78 3a 20 68     overflow-x: h
81f0: 69 64 64 65 6e 20 21 69 6d 70 6f 72 74 61 6e 74  idden !important
8200: 3b 0a 20 20 20 20 6f 76 65 72 66 6c 6f 77 2d 79  ;.    overflow-y
8210: 3a 20 68 69 64 64 65 6e 20 21 69 6d 70 6f 72 74  : hidden !import
8220: 61 6e 74 3b 0a 7d 0a 0a 2e 43 6f 64 65 4d 69 72  ant;.}...CodeMir
8230: 72 6f 72 2d 63 75 72 73 6f 72 20 7b 0a 20 20 62  ror-cursor {.  b
8240: 6f 72 64 65 72 2d 6c 65 66 74 3a 20 32 70 78 20  order-left: 2px 
8250: 73 6f 6c 69 64 20 77 68 69 74 65 20 21 69 6d 70  solid white !imp
8260: 6f 72 74 61 6e 74 3b 0a 7d 0a 0a 0a 0a 20 20 20  ortant;.}....   
8270: 20 20 20 20 20 3c 2f 73 74 79 6c 65 3e 0a 0a 20       </style>.. 
8280: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 74         <script t
8290: 79 70 65 3d 22 72 69 6f 74 2f 74 61 67 22 20 73  ype="riot/tag" s
82a0: 72 63 3d 22 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f  rc="/components/
82b0: 62 69 74 72 68 79 74 68 6d 2e 74 61 67 22 3e 3c  bitrhythm.tag"><
82c0: 2f 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20  /script>.       
82d0: 20 3c 73 63 72 69 70 74 20 74 79 70 65 3d 22 72   <script type="r
82e0: 69 6f 74 2f 74 61 67 22 20 73 72 63 3d 22 2f 63  iot/tag" src="/c
82f0: 6f 6d 70 6f 6e 65 6e 74 73 2f 64 69 61 6c 2e 74  omponents/dial.t
8300: 61 67 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20  ag"></script>.  
8310: 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 74 79        <script ty
8320: 70 65 3d 22 72 69 6f 74 2f 74 61 67 22 20 73 72  pe="riot/tag" sr
8330: 63 3d 22 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 73  c="/components/s
8340: 61 6d 70 6c 65 2e 74 61 67 22 20 3e 3c 2f 73 63  ample.tag" ></sc
8350: 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20 3c 73  ript>.        <s
8360: 63 72 69 70 74 20 74 79 70 65 3d 22 72 69 6f 74  cript type="riot
8370: 2f 74 61 67 22 20 73 72 63 3d 22 2f 63 6f 6d 70  /tag" src="/comp
8380: 6f 6e 65 6e 74 73 2f 6e 75 6d 62 65 72 2e 74 61  onents/number.ta
8390: 67 22 20 3e 3c 2f 73 63 72 69 70 74 3e 0a 0a 20  g" ></script>.. 
83a0: 20 20 20 3c 73 63 72 69 70 74 20 74 79 70 65 3d     <script type=
83b0: 22 74 65 78 74 2f 6a 61 76 61 73 63 72 69 70 74  "text/javascript
83c0: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  ">.            v
83d0: 61 72 20 5f 70 61 71 20 3d 20 77 69 6e 64 6f 77  ar _paq = window
83e0: 2e 5f 70 61 71 20 3d 20 77 69 6e 64 6f 77 2e 5f  ._paq = window._
83f0: 70 61 71 20 7c 7c 20 5b 5d 3b 0a 20 20 20 20 5f  paq || [];.    _
8400: 70 61 71 2e 70 75 73 68 28 5b 27 74 72 61 63 6b  paq.push(['track
8410: 50 61 67 65 56 69 65 77 27 5d 29 3b 5f 70 61 71  PageView']);_paq
8420: 2e 70 75 73 68 28 5b 27 65 6e 61 62 6c 65 4c 69  .push(['enableLi
8430: 6e 6b 54 72 61 63 6b 69 6e 67 27 5d 29 3b 5f 70  nkTracking']);_p
8440: 61 71 2e 70 75 73 68 28 5b 27 61 6c 77 61 79 73  aq.push(['always
8450: 55 73 65 53 65 6e 64 42 65 61 63 6f 6e 27 5d 29  UseSendBeacon'])
8460: 3b 5f 70 61 71 2e 70 75 73 68 28 5b 27 73 65 74  ;_paq.push(['set
8470: 54 72 61 63 6b 65 72 55 72 6c 27 2c 20 22 5c 2f  TrackerUrl', "\/
8480: 5c 2f 62 6c 6f 67 2e 78 79 7a 7a 79 61 70 70 73  \/blog.xyzzyapps
8490: 2e 6c 69 6e 6b 5c 2f 6f 77 6f 61 6d 69 6d 73 5c  .link\/owoamims\
84a0: 2f 6d 61 74 6f 6d 6f 5c 2f 61 70 70 5c 2f 6d 61  /matomo\/app\/ma
84b0: 74 6f 6d 6f 2e 70 68 70 22 5d 29 3b 5f 70 61 71  tomo.php"]);_paq
84c0: 2e 70 75 73 68 28 5b 27 73 65 74 53 69 74 65 49  .push(['setSiteI
84d0: 64 27 2c 20 27 31 27 5d 29 3b 76 61 72 20 64 3d  d', '1']);var d=
84e0: 64 6f 63 75 6d 65 6e 74 2c 20 67 3d 64 2e 63 72  document, g=d.cr
84f0: 65 61 74 65 45 6c 65 6d 65 6e 74 28 27 73 63 72  eateElement('scr
8500: 69 70 74 27 29 2c 20 73 3d 64 2e 67 65 74 45 6c  ipt'), s=d.getEl
8510: 65 6d 65 6e 74 73 42 79 54 61 67 4e 61 6d 65 28  ementsByTagName(
8520: 27 73 63 72 69 70 74 27 29 5b 30 5d 3b 0a 20 20  'script')[0];.  
8530: 20 20 67 2e 74 79 70 65 3d 27 74 65 78 74 2f 6a    g.type='text/j
8540: 61 76 61 73 63 72 69 70 74 27 3b 20 67 2e 61 73  avascript'; g.as
8550: 79 6e 63 3d 74 72 75 65 3b 20 67 2e 73 72 63 3d  ync=true; g.src=
8560: 22 5c 2f 5c 2f 62 6c 6f 67 2e 78 79 7a 7a 79 61  "\/\/blog.xyzzya
8570: 70 70 73 2e 6c 69 6e 6b 5c 2f 6f 6f 7a 6f 74 63  pps.link\/oozotc
8580: 68 65 5c 2f 6d 61 74 6f 6d 6f 5c 2f 6d 61 74 6f  he\/matomo\/mato
8590: 6d 6f 2e 6a 73 22 3b 20 73 2e 70 61 72 65 6e 74  mo.js"; s.parent
85a0: 4e 6f 64 65 2e 69 6e 73 65 72 74 42 65 66 6f 72  Node.insertBefor
85b0: 65 28 67 2c 73 29 3b 0a 20 20 20 20 3c 2f 73 63  e(g,s);.    </sc
85c0: 72 69 70 74 3e 0a 0a 20 20 20 20 3c 2f 68 65 61  ript>..    </hea
85d0: 64 3e 0a 0a 20 20 20 20 3c 62 6f 64 79 3e 0a 20  d>..    <body>. 
85e0: 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61 73         <div clas
85f0: 73 3d 22 63 6f 6e 74 61 69 6e 65 72 61 2d 66 75  s="containera-fu
8600: 6c 6c 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20  ll">.           
8610: 20 3c 68 73 74 61 63 6b 20 63 6c 61 73 73 3d 22   <hstack class="
8620: 6d 62 2d 32 22 3e 0a 20 20 20 20 20 20 20 20 20  mb-2">.         
8630: 20 20 20 20 20 20 20 3c 68 35 20 63 6c 61 73 73         <h5 class
8640: 3d 22 6d 6c 2d 34 22 3e 3c 61 20 68 72 65 66 3d  ="ml-4"><a href=
8650: 22 2f 64 6f 63 73 2f 69 6e 64 65 78 2e 68 74 6d  "/docs/index.htm
8660: 6c 22 20 74 61 72 67 65 74 3d 22 5f 62 6c 61 6e  l" target="_blan
8670: 6b 22 3e 64 6f 63 73 3c 2f 61 3e 3c 2f 68 35 3e  k">docs</a></h5>
8680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
8690: 20 3c 68 35 20 63 6c 61 73 73 3d 22 6d 6c 2d 34   <h5 class="ml-4
86a0: 22 3e 3c 61 20 20 68 72 65 66 3d 22 2f 73 6f 6e  "><a  href="/son
86b0: 67 2f 58 51 41 41 41 41 4a 77 46 41 41 41 41 41  g/XQAAAAJwFAAAAA
86c0: 41 41 41 41 42 44 4b 55 71 47 55 35 76 49 38 45  AAAABDKUqGU5vI8E
86d0: 79 67 76 38 56 4c 63 36 48 31 4e 46 49 7a 64 59  ygv8VLc6H1NFIzdY
86e0: 51 65 35 6d 54 2d 37 39 42 54 4b 6f 73 48 36 58  Qe5mT-79BTKosH6X
86f0: 6a 65 32 49 59 6e 4e 52 67 45 4f 70 65 75 68 67  je2IYnNRgEOpeuhg
8700: 39 4e 54 66 49 54 2d 5f 75 45 67 2d 6e 70 47 58  9NTfIT-_uEg-npGX
8710: 30 79 39 43 6d 7a 79 79 56 70 77 67 61 4f 55 72  0y9CmzyyVpwgaOUr
8720: 4b 4e 6c 46 2d 70 7a 56 58 66 33 59 6e 51 32 67  KNlF-pzVXf3YnQ2g
8730: 53 66 70 7a 59 33 7a 6c 59 4c 75 6a 61 76 51 52  SfpzY3zlYLujavQR
8740: 71 37 33 68 53 45 4d 2d 52 61 47 78 54 78 75 75  q73hSEM-RaGxTxuu
8750: 64 39 6e 61 75 47 5f 56 64 58 43 6d 45 5f 6c 76  d9nauG_VdXCmE_lv
8760: 5a 38 38 58 76 55 48 4f 49 47 6a 4f 6b 43 55 4b  Z88XvUHOIGjOkCUK
8770: 56 2d 31 6f 74 33 69 39 66 78 35 4e 50 2d 55 73  V-1ot3i9fx5NP-Us
8780: 55 6d 56 70 6e 6a 55 44 6e 71 5f 39 65 55 4a 66  UmVpnjUDnq_9eUJf
8790: 6f 6e 78 35 42 5f 6f 47 34 63 33 47 76 4c 69 74  onx5B_oG4c3GvLit
87a0: 4e 52 45 6c 5f 4f 39 65 6d 55 38 43 53 54 30 76  NREl_O9emU8CST0v
87b0: 35 52 56 71 48 53 75 64 71 5a 71 73 72 6f 72 74  5RVqHSudqZqsrort
87c0: 70 44 6a 64 4d 6c 65 6b 68 51 32 79 37 5a 6c 4e  pDjdMlekhQ2y7ZlN
87d0: 63 55 44 6a 47 6f 54 72 48 34 76 46 4d 72 4c 56  cUDjGoTrH4vFMrLV
87e0: 49 36 30 77 49 4e 6f 75 66 53 30 69 4f 36 6f 75  I60wINoufS0iO6ou
87f0: 72 78 69 7a 53 31 49 66 76 5f 69 69 72 6b 64 50  rxizS1Ifv_iirkdP
8800: 30 55 30 5a 70 32 31 72 48 48 4b 58 6c 77 68 57  0U0Zp21rHHKXlwhW
8810: 47 30 68 6d 54 43 78 59 6f 38 5a 49 66 30 43 6d  G0hmTCxYo8ZIf0Cm
8820: 62 69 75 32 32 47 69 46 46 6d 52 66 49 63 75 57  biu22GiFFmRfIcuW
8830: 62 63 71 2d 5f 53 57 64 79 4d 4a 30 73 57 49 73  bcq-_SWdyMJ0sWIs
8840: 6c 68 4b 70 47 46 45 61 70 4e 36 30 34 65 4e 62  lhKpGFEapN604eNb
8850: 6c 70 79 35 69 6d 32 50 73 49 74 6a 57 53 63 75  lpy5im2PsItjWScu
8860: 2d 63 53 30 4a 49 33 7a 65 48 62 38 4a 4d 4e 7a  -cS0JI3zeHb8JMNz
8870: 57 66 6c 71 30 2d 58 57 48 47 35 57 4c 73 6d 50  Wflq0-XWHG5WLsmP
8880: 71 43 62 6e 33 47 67 66 52 36 42 69 41 78 31 41  qCbn3GgfR6BiAx1A
8890: 70 6d 54 75 69 38 34 57 58 67 58 36 53 75 4a 50  pmTui84WXgX6SuJP
88a0: 6b 58 52 71 48 45 4f 4b 70 42 5a 34 64 4b 45 50  kXRqHEOKpBZ4dKEP
88b0: 72 35 50 5f 2d 44 44 70 77 7a 30 4c 37 69 38 58  r5P_-DDpwz0L7i8X
88c0: 5f 46 48 45 2d 4c 42 4d 61 63 74 44 42 6f 4b 67  _FHE-LBMactDBoKg
88d0: 49 62 49 6f 79 56 6e 52 65 36 44 4a 39 73 35 41  IbIoyVnRe6DJ9s5A
88e0: 5a 4c 4a 6a 55 72 57 47 47 56 43 4c 63 70 35 62  ZLJjUrWGGVCLcp5b
88f0: 45 4b 4f 6e 48 5f 33 48 66 5a 75 44 71 39 55 6c  EKOnH_3HfZuDq9Ul
8900: 4f 76 5a 52 56 6b 7a 33 42 77 70 55 65 61 6a 4c  OvZRVkz3BwpUeajL
8910: 65 55 4a 63 41 59 78 44 6d 55 32 4a 62 4e 55 61  eUJcAYxDmU2JbNUa
8920: 69 70 4d 4a 4e 37 4c 46 39 59 41 58 32 4c 61 54  ipMJN7LF9YAX2LaT
8930: 34 34 4c 41 43 77 32 41 37 49 73 2d 70 51 5f 45  44LACw2A7Is-pQ_E
8940: 47 7a 6e 6a 68 45 6f 37 53 53 37 4a 75 73 51 50  GznjhEo7SS7JusQP
8950: 4e 36 47 34 33 67 34 4f 55 5a 53 55 59 35 57 4e  N6G43g4OUZSUY5WN
8960: 6c 50 55 43 57 66 58 53 65 57 4e 55 30 58 78 5f  lPUCWfXSeWNU0Xx_
8970: 2d 62 34 72 36 74 34 48 48 51 53 32 50 32 73 74  -b4r6t4HHQS2P2st
8980: 49 51 4f 53 39 36 4a 71 4c 7a 58 72 78 2d 51 36  IQOS96JqLzXrx-Q6
8990: 32 59 38 52 53 52 49 76 69 65 45 37 36 6a 5f 2d  2Y8RSRIvieE76j_-
89a0: 64 77 34 69 63 54 44 69 41 54 66 78 38 64 6f 4c  dw4icTDiATfx8doL
89b0: 6b 53 7a 58 67 4f 7a 4e 54 63 5a 59 75 6d 65 32  kSzXgOzNTcZYume2
89c0: 63 48 4c 45 47 2d 30 54 62 67 52 31 4d 36 57 43  cHLEG-0TbgR1M6WC
89d0: 50 69 48 34 70 76 48 49 52 66 63 54 78 45 44 5a  PiH4pvHIRfcTxEDZ
89e0: 4b 35 62 37 69 71 49 68 59 30 4d 4e 57 38 4b 6b  K5b7iqIhY0MNW8Kk
89f0: 79 6e 37 4b 46 56 71 51 66 5f 35 64 5f 6d 73 69  yn7KFVqQf_5d_msi
8a00: 76 35 37 44 57 49 48 67 36 51 69 36 63 6d 42 64  v57DWIHg6Qi6cmBd
8a10: 4f 46 30 4c 69 5f 43 59 38 6b 46 42 56 34 42 57  OF0Li_CY8kFBV4BW
8a20: 4c 73 4f 6c 61 6e 4e 36 5f 68 65 68 49 52 45 56  LsOlanN6_hehIREV
8a30: 55 38 57 67 57 62 4d 39 72 64 72 4b 63 71 7a 68  U8WgWbM9rdrKcqzh
8a40: 48 44 38 46 70 35 71 54 6d 62 79 69 56 6e 6a 44  HD8Fp5qTmbyiVnjD
8a50: 38 33 42 44 68 4b 59 35 7a 77 46 38 78 46 4d 31  83BDhKY5zwF8xFM1
8a60: 70 37 5a 6d 45 6a 6c 49 46 31 61 67 36 32 42 44  p7ZmEjlIF1ag62BD
8a70: 52 74 35 6a 5f 4d 5a 39 71 35 43 4f 73 58 39 67  Rt5j_MZ9q5COsX9g
8a80: 70 56 36 44 66 41 30 46 61 44 77 79 4f 6d 6b 4d  pV6DfA0FaDwyOmkM
8a90: 73 4f 46 69 47 65 55 4e 49 72 38 42 5f 45 4e 59  sOFiGeUNIr8B_ENY
8aa0: 47 2d 45 70 59 62 68 55 48 5a 75 6b 76 2d 51 74  G-EpYbhUHZukv-Qt
8ab0: 74 63 6a 46 77 52 79 70 46 31 65 53 4e 33 44 4d  tcjFwRypF1eSN3DM
8ac0: 72 47 55 6d 31 65 42 36 32 50 57 33 73 2d 2d 58  rGUm1eB62PW3s--X
8ad0: 63 75 67 77 54 35 47 4a 51 52 61 36 36 57 5a 46  cugwT5GJQRa66WZF
8ae0: 34 44 5a 7a 50 50 54 4b 45 5a 68 74 4e 4c 32 38  4DZzPPTKEZhtNL28
8af0: 4b 67 42 63 48 6d 33 44 65 75 53 66 4e 5f 48 52  KgBcHm3DeuSfN_HR
8b00: 73 67 42 57 31 6f 32 59 44 70 4d 31 51 50 2d 4b  sgBW1o2YDpM1QP-K
8b10: 30 61 65 64 4b 42 5f 75 6d 6c 57 68 64 42 7a 65  0aedKB_umlWhdBze
8b20: 37 47 73 37 32 2d 76 44 66 6a 42 36 4c 47 49 5f  7Gs72-vDfjB6LGI_
8b30: 5f 74 6e 63 4c 4e 53 33 47 61 71 59 61 6c 74 46  _tncLNS3GaqYaltF
8b40: 6e 7a 63 36 34 45 4f 56 2d 6d 7a 31 78 76 6c 79  nzc64EOV-mz1xvly
8b50: 41 75 46 53 6a 2d 54 38 72 38 65 35 65 62 4a 6b  AuFSj-T8r8e5ebJk
8b60: 79 37 6f 36 50 5a 58 50 54 76 76 43 4c 65 54 4c  y7o6PZXPTvvCLeTL
8b70: 30 35 36 54 70 70 2d 47 68 2d 57 67 78 6d 79 4d  056Tpp-Gh-WgxmyM
8b80: 49 53 49 68 6b 62 35 6b 4b 50 6a 32 33 35 48 37  ISIhkb5kKPj235H7
8b90: 4f 59 2d 4a 41 6f 54 32 38 56 56 72 41 30 31 57  OY-JAoT28VVrA01W
8ba0: 70 58 6f 41 72 4f 4a 61 45 32 69 6a 42 74 32 6f  pXoArOJaE2ijBt2o
8bb0: 4c 4f 59 58 77 57 69 4f 31 68 55 49 33 4e 74 54  LOYXwWiO1hUI3NtT
8bc0: 4f 32 76 49 5f 5f 73 6c 6c 78 48 4e 48 53 36 45  O2vI__sllxHNHS6E
8bd0: 69 48 58 50 79 4c 6a 38 5f 50 47 46 34 37 52 55  iHXPyLj8_PGF47RU
8be0: 71 37 6f 63 2d 39 69 62 69 46 39 46 55 75 6f 6f  q7oc-9ibiF9FUuoo
8bf0: 6e 4d 4c 45 30 50 77 79 47 4f 55 4a 36 4c 55 39  nMLE0PwyGOUJ6LU9
8c00: 53 44 62 34 46 4c 50 77 6b 30 67 4a 42 50 34 47  SDb4FLPwk0gJBP4G
8c10: 69 57 4c 66 74 76 66 45 72 72 58 44 4e 63 6b 39  iWLftvfErrXDNck9
8c20: 4f 36 5f 4a 5a 76 70 4a 5f 39 4f 35 71 6d 4e 44  O6_JZvpJ_9O5qmND
8c30: 55 67 65 35 79 44 59 62 4f 5f 5f 76 4a 65 6a 78  Uge5yDYbO__vJejx
8c40: 30 62 6f 6d 55 37 65 47 32 6b 75 76 50 41 6d 47  0bomU7eG2kuvPAmG
8c50: 74 69 57 72 59 6f 38 42 5f 33 4a 6f 45 41 4f 4d  tiWrYo8B_3JoEAOM
8c60: 67 56 61 39 53 78 45 34 6b 5a 2d 69 6a 64 68 2d  gVa9SxE4kZ-ijdh-
8c70: 67 6c 49 4b 72 65 64 6c 4d 43 55 47 35 65 59 4a  glIKredlMCUG5eYJ
8c80: 63 2d 36 48 5f 39 34 70 74 65 79 4f 2d 6f 63 42  c-6H_94pteyO-ocB
8c90: 38 72 72 6c 66 53 47 72 36 4d 32 72 39 78 6c 62  8rrlfSGr6M2r9xlb
8ca0: 65 4d 65 63 43 76 4a 54 52 6a 6d 77 4d 62 42 31  eMecCvJTRjmwMbB1
8cb0: 32 44 57 47 62 44 71 35 53 78 6e 38 74 67 58 39  2DWGbDq5Sxn8tgX9
8cc0: 38 4f 39 6c 54 2d 35 31 5f 6f 61 6a 71 4b 56 4d  8O9lT-51_oajqKVM
8cd0: 6d 6f 78 33 66 37 6b 58 68 73 4a 50 78 79 49 4d  mox3f7kXhsJPxyIM
8ce0: 73 55 61 56 56 46 52 6d 70 50 4a 76 4d 74 35 6e  sUaVVFRmpPJvMt5n
8cf0: 74 39 2d 69 31 56 67 6d 75 78 34 61 33 74 37 61  t9-i1Vgmux4a3t7a
8d00: 31 6f 56 50 64 4e 33 35 50 4f 4f 6a 75 6e 36 33  1oVPdN35POOjun63
8d10: 4e 6b 79 4f 44 4b 68 54 55 48 6d 6a 64 43 37 68  NkyODKhTUHmjdC7h
8d20: 39 74 76 36 5a 49 38 57 50 66 32 47 68 39 5f 5f  9tv6ZI8WPf2Gh9__
8d30: 6b 36 71 66 35 78 70 33 75 33 4f 6a 7a 6b 49 53  k6qf5xp3u3OjzkIS
8d40: 6a 37 61 69 6e 48 6f 6f 6a 69 5f 33 43 6e 6a 6d  j7ainHooji_3Cnjm
8d50: 33 54 33 30 65 36 70 6d 33 4d 68 6c 69 4a 67 31  3T30e6pm3MhliJg1
8d60: 65 7a 46 69 38 4e 65 74 55 77 77 59 5a 7a 36 55  ezFi8NetUwwYZz6U
8d70: 4e 43 4d 4f 54 55 61 57 41 71 4a 35 42 6d 46 32  NCMOTUaWAqJ5BmF2
8d80: 68 41 68 35 53 64 73 6f 67 39 33 6f 72 52 76 72  hAh5Sdsog93orRvr
8d90: 4f 75 50 54 4e 68 52 41 31 57 6c 79 6a 72 73 79  OuPTNhRA1Wlyjrsy
8da0: 38 7a 56 57 33 57 6c 4f 34 63 68 63 4b 56 59 41  8zVW3WlO4chcKVYA
8db0: 30 4f 73 48 31 5a 77 6a 6f 37 6b 6f 58 62 66 58  0OsH1Zwjo7koXbfX
8dc0: 37 45 52 72 50 6e 41 62 5a 73 57 66 6b 50 65 50  7ERrPnAbZsWfkPeP
8dd0: 77 49 34 74 6f 2d 4b 75 50 46 31 76 30 55 34 6a  wI4to-KuPF1v0U4j
8de0: 77 46 65 6c 7a 77 6e 33 6e 34 43 31 45 32 42 6b  wFelzwn3n4C1E2Bk
8df0: 71 50 66 4e 63 76 6e 56 6c 46 44 6d 50 48 6c 79  qPfNcvnVlFDmPHly
8e00: 4f 43 5a 48 72 66 73 72 47 39 47 55 50 73 43 72  OCZHrfsrG9GUPsCr
8e10: 5a 64 72 58 32 45 48 69 57 48 5f 62 52 6b 58 56  ZdrX2EHiWH_bRkXV
8e20: 4a 77 6b 48 54 4c 69 72 38 64 5f 63 6a 49 30 44  JwkHTLir8d_cjI0D
8e30: 49 72 56 59 6a 69 34 58 42 49 44 58 39 50 6d 74  IrVYji4XBIDX9Pmt
8e40: 2d 30 79 6c 72 30 46 65 48 4c 58 56 48 4e 62 34  -0ylr0FeHLXVHNb4
8e50: 51 37 56 2d 2d 33 64 34 2d 6d 4a 32 7a 58 73 5a  Q7V--3d4-mJ2zXsZ
8e60: 44 52 39 37 4d 5f 69 6b 61 51 56 48 5a 42 57 63  DR97M_ikaQVHZBWc
8e70: 4b 6e 79 57 6d 78 5f 61 50 6f 57 4b 6e 46 59 6b  KnyWmx_aPoWKnFYk
8e80: 6b 5f 36 50 62 52 32 34 36 59 55 33 66 56 69 41  k_6PbR246YU3fViA
8e90: 39 50 64 5a 4b 54 59 72 4e 32 42 33 4b 6d 63 72  9PdZKTYrN2B3Kmcr
8ea0: 6c 69 48 32 54 32 59 52 63 52 64 57 51 47 78 58  liH2T2YRcRdWQGxX
8eb0: 6c 58 5a 68 33 42 73 64 35 50 74 4f 43 31 45 75  lXZh3Bsd5PtOC1Eu
8ec0: 56 37 2d 44 48 6c 6b 49 36 37 44 36 56 2d 41 46  V7-DHlkI67D6V-AF
8ed0: 53 63 4a 66 64 6a 36 34 50 76 31 77 4b 77 47 51  ScJfdj64Pv1wKwGQ
8ee0: 5a 37 6c 45 5a 74 72 6d 76 5f 56 56 52 6d 6b 57  Z7lEZtrmv_VVRmkW
8ef0: 59 57 46 74 62 42 6a 35 48 48 6e 74 68 31 73 4b  YWFtbBj5HHnth1sK
8f00: 68 42 6a 56 67 47 49 56 48 37 34 79 39 62 30 68  hBjVgGIVH74y9b0h
8f10: 48 6a 70 6f 35 6b 77 2d 31 5f 33 6a 4e 5a 31 6f  Hjpo5kw-1_3jNZ1o
8f20: 6f 78 70 2d 79 38 46 54 48 62 6c 6d 53 6b 53 6f  oxp-y8FTHblmSkSo
8f30: 51 65 38 62 65 79 39 58 51 37 42 78 47 62 55 50  Qe8bey9XQ7BxGbUP
8f40: 73 47 30 58 35 4c 66 54 38 46 70 5a 48 33 36 41  sG0X5LfT8FpZH36A
8f50: 36 56 7a 36 6e 65 64 46 45 76 75 6f 51 43 79 56  6Vz6nedFEvuoQCyV
8f60: 35 35 71 63 6e 44 44 35 49 4b 73 4a 65 79 4b 5a  55qcnDD5IKsJeyKZ
8f70: 7a 31 75 67 72 59 47 6f 5a 49 66 4a 4d 72 31 58  z1ugrYGoZIfJMr1X
8f80: 54 69 75 6c 57 55 69 61 78 65 61 74 37 51 36 58  TiulWUiaxeat7Q6X
8f90: 71 31 59 58 4f 6a 76 57 56 37 6b 69 5f 77 34 6d  q1YXOjvWV7ki_w4m
8fa0: 5f 5f 2d 77 56 50 35 67 22 3e 74 65 63 68 6e 6f  __-wVP5g">techno
8fb0: 3c 2f 61 3e 3c 2f 68 35 3e 0a 20 20 20 20 20 20  </a></h5>.      
8fc0: 20 20 20 20 20 20 20 20 20 20 0a 20 20 20 20 20            .     
8fd0: 20 20 20 20 20 20 20 20 20 20 20 3c 68 35 20 63             <h5 c
8fe0: 6c 61 73 73 3d 22 6d 6c 2d 34 22 3e 3c 61 20 20  lass="ml-4"><a  
8ff0: 68 72 65 66 3d 22 2f 73 6f 6e 67 2f 58 51 41 41  href="/song/XQAA
9000: 41 41 49 62 43 41 41 41 41 41 41 41 41 41 42 44  AAIbCAAAAAAAAABD
9010: 4b 55 71 47 55 35 76 49 38 45 79 67 76 38 56 4c  KUqGU5vI8Eygv8VL
9020: 63 36 48 31 4e 46 49 7a 64 59 51 65 35 6d 54 2d  c6H1NFIzdYQe5mT-
9030: 37 39 42 54 4b 6f 73 48 36 58 6a 65 32 49 59 6e  79BTKosH6Xje2IYn
9040: 4e 52 67 45 4f 70 65 75 68 67 39 4f 54 42 37 59  NRgEOpeuhg9OTB7Y
9050: 33 34 63 5a 6d 65 4c 62 35 4d 4b 5a 69 63 37 62  34cZmeLb5MKZic7b
9060: 58 4d 4f 37 76 57 72 6a 48 79 66 63 32 46 76 49  XMO7vWrjHyfc2FvI
9070: 50 30 76 31 47 70 2d 2d 4e 59 35 74 55 73 59 37  P0v1Gp--NY5tUsY7
9080: 73 51 37 31 5a 7a 70 68 35 57 6d 4b 55 5a 32 6f  sQ71Zzph5WmKUZ2o
9090: 4e 74 6e 78 7a 38 2d 48 61 56 70 4b 31 53 47 51  Ntnxz8-HaVpK1SGQ
90a0: 7a 45 4f 71 33 2d 6c 57 6b 65 4a 37 36 61 32 4a  zEOq3-lWkeJ76a2J
90b0: 38 4e 67 32 4f 45 5a 78 4f 4d 4e 41 6b 36 56 54  8Ng2OEZxOMNAk6VT
90c0: 6e 75 38 66 52 52 54 54 6f 4d 6c 6f 77 44 65 33  nu8fRRTToMlowDe3
90d0: 77 6a 73 38 44 6f 72 73 78 64 6e 57 34 39 54 68  wjs8DorsxdnW49Th
90e0: 46 68 47 62 4f 65 6b 34 51 41 77 7a 50 6e 65 61  FhGbOek4QAwzPnea
90f0: 70 44 6d 6a 75 44 4b 52 71 69 71 4e 33 62 74 67  pDmjuDKRqiqN3btg
9100: 6e 66 5a 44 7a 6f 6b 65 4f 54 68 36 43 7a 77 41  nfZDzokeOTh6CzwA
9110: 49 32 72 42 62 4c 30 37 59 55 42 45 46 61 4d 7a  I2rBbL07YUBEFaMz
9120: 69 4f 4a 5f 32 58 35 39 66 59 42 50 4d 33 65 43  iOJ_2X59fYBPM3eC
9130: 6e 4c 37 47 6c 4f 43 6b 32 75 36 5f 32 32 57 6e  nL7GlOCk2u6_22Wn
9140: 59 67 5a 50 62 63 33 52 75 4a 4c 66 38 4a 4c 41  YgZPbc3RuJLf8JLA
9150: 68 62 44 72 58 76 5a 48 79 59 65 6b 72 50 75 47  hbDrXvZHyYekrPuG
9160: 6f 5f 52 36 56 32 42 43 50 45 31 34 72 5a 46 46  o_R6V2BCPE14rZFF
9170: 77 4a 51 57 45 71 79 5f 4b 44 74 48 5f 59 50 4d  wJQWEqy_KDtH_YPM
9180: 68 6a 31 54 50 53 36 32 71 63 50 72 36 71 41 57  hj1TPS62qcPr6qAW
9190: 72 49 39 6e 73 6e 64 70 52 72 63 7a 77 42 46 43  rI9nsndpRrczwBFC
91a0: 68 48 53 50 4b 69 5a 58 6a 43 5a 4a 5a 4b 48 31  hHSPKiZXjCZJZKH1
91b0: 4b 68 31 39 41 34 2d 76 70 58 77 62 72 31 42 43  Kh19A4-vpXwbr1BC
91c0: 69 4e 64 4f 54 51 38 39 4b 4b 76 30 4f 58 70 49  iNdOTQ89KKv0OXpI
91d0: 46 55 4d 77 78 35 51 64 35 6a 73 72 62 32 63 2d  FUMwx5Qd5jsrb2c-
91e0: 68 79 77 4d 36 38 38 43 6c 5a 38 36 41 35 6f 34  hywM688ClZ86A5o4
91f0: 4b 7a 72 45 32 78 6a 47 34 56 62 63 65 78 6d 50  KzrE2xjG4VbcexmP
9200: 64 4f 58 53 2d 4b 36 50 52 55 34 63 36 64 4a 4f  dOXS-K6PRU4c6dJO
9210: 55 43 6c 4f 4c 4e 5a 70 62 6d 5a 76 4c 38 42 6f  UClOLNZpbmZvL8Bo
9220: 34 65 70 36 37 77 4c 30 62 46 45 4f 4d 71 68 4e  4ep67wL0bFEOMqhN
9230: 33 30 70 4c 47 6d 5a 6c 6e 66 64 35 6d 67 48 38  30pLGmZlnfd5mgH8
9240: 4a 39 64 50 72 47 73 45 67 6c 4b 4c 47 73 6b 51  J9dPrGsEglKLGskQ
9250: 5f 67 32 76 45 65 52 39 43 7a 4f 73 74 7a 63 74  _g2vEeR9CzOstzct
9260: 6a 43 4b 74 4c 31 4f 38 6f 4e 6b 53 75 43 6e 58  jCKtL1O8oNkSuCnX
9270: 53 47 45 30 75 59 35 72 78 47 6d 42 75 37 41 57  SGE0uY5rxGmBu7AW
9280: 39 39 74 52 78 30 69 38 68 4e 7a 42 34 6c 31 53  99tRx0i8hNzB4l1S
9290: 31 6d 78 6e 7a 6b 4c 65 66 69 39 56 4d 36 59 59  1mxnzkLefi9VM6YY
92a0: 5a 72 61 58 37 54 32 6b 47 6e 52 67 44 35 48 4f  ZraX7T2kGnRgD5HO
92b0: 67 30 57 48 32 4c 65 55 73 56 75 57 70 6e 70 31  g0WH2LeUsVuWpnp1
92c0: 38 39 50 68 5f 4f 73 39 35 5f 58 55 56 42 63 36  89Ph_Os95_XUVBc6
92d0: 37 54 77 55 38 49 57 62 7a 61 74 31 64 65 63 43  7TwU8IWbzat1decC
92e0: 74 30 6a 4b 4b 50 31 33 4c 37 61 30 4f 43 4f 31  t0jKKP13L7a0OCO1
92f0: 38 46 71 32 44 56 72 39 76 65 48 71 32 6d 52 65  8Fq2DVr9veHq2mRe
9300: 70 69 4f 62 57 47 73 59 63 71 6a 58 6b 55 4e 6a  piObWGsYcqjXkUNj
9310: 61 78 6f 49 74 67 5f 70 57 64 4b 36 67 79 76 65  axoItg_pWdK6gyve
9320: 56 58 6a 66 73 33 50 61 4a 34 37 37 55 62 70 69  VXjfs3PaJ477Ubpi
9330: 5a 42 57 78 6f 63 2d 45 62 6e 38 46 5a 75 36 62  ZBWxoc-Ebn8FZu6b
9340: 5a 5a 34 67 4f 5a 45 2d 4d 6f 4a 48 55 44 69 51  ZZ4gOZE-MoJHUDiQ
9350: 5a 67 6f 33 2d 6c 69 72 58 54 76 70 63 70 73 67  Zgo3-lirXTvpcpsg
9360: 73 61 49 55 45 53 44 41 63 47 55 4e 45 34 61 49  saIUESDAcGUNE4aI
9370: 4b 36 77 49 46 47 6e 45 61 45 46 59 6f 34 76 65  K6wIFGnEaEFYo4ve
9380: 51 71 54 4c 65 69 63 34 4e 68 50 74 55 70 54 64  QqTLeic4NhPtUpTd
9390: 66 52 71 64 4e 54 4b 4f 61 56 53 55 45 5f 4b 47  fRqdNTKOaVSUE_KG
93a0: 58 4b 58 61 5a 6c 30 45 6e 69 31 44 42 6d 45 47  XKXaZl0Eni1DBmEG
93b0: 79 6b 6d 6c 34 75 78 48 73 57 42 45 45 34 34 4b  ykml4uxHsWBEE44K
93c0: 75 33 34 59 49 62 36 4b 5a 55 63 43 75 32 44 75  u34YIb6KZUcCu2Du
93d0: 58 44 69 58 63 62 61 62 73 57 6b 41 2d 63 7a 58  XDiXcbabsWkA-czX
93e0: 57 42 74 52 6e 7a 57 4a 36 69 62 34 73 63 6e 79  WBtRnzWJ6ib4scny
93f0: 31 6f 36 43 73 56 6e 75 67 55 6a 45 39 77 76 38  1o6CsVnugUjE9wv8
9400: 34 62 7a 32 22 3e 63 68 69 70 74 75 6e 65 3c 2f  4bz2">chiptune</
9410: 61 3e 3c 2f 68 35 3e 0a 0a 20 20 20 20 20 20 20  a></h5>..       
9420: 20 20 20 20 20 20 20 20 20 3c 68 35 20 63 6c 61           <h5 cla
9430: 73 73 3d 22 6d 6c 2d 34 22 3e 3c 61 20 20 68 72  ss="ml-4"><a  hr
9440: 65 66 3d 22 2f 73 6f 6e 67 2f 58 51 41 41 41 41  ef="/song/XQAAAA
9450: 4b 4a 43 41 41 41 41 41 41 41 41 41 42 44 4b 55  KJCAAAAAAAAABDKU
9460: 71 47 55 35 76 49 38 45 79 67 76 38 56 4c 63 36  qGU5vI8Eygv8VLc6
9470: 48 31 4e 46 49 7a 64 59 51 46 67 6d 54 2d 37 39  H1NFIzdYQFgmT-79
9480: 42 54 4b 6f 73 48 36 58 6a 65 32 49 59 6e 4e 52  BTKosH6Xje2IYnNR
9490: 67 45 4f 70 65 75 68 67 38 6a 61 68 4f 45 64 33  gEOpeuhg8jahOEd3
94a0: 79 4d 43 5f 50 58 46 71 2d 69 5f 43 6c 76 4c 38  yMC_PXFq-i_ClvL8
94b0: 43 74 33 57 67 66 36 75 4a 62 35 64 6d 44 59 77  Ct3Wgf6uJb5dmDYw
94c0: 74 55 48 6b 64 64 4c 33 44 4c 45 63 41 30 41 6f  tUHkddL3DLEcA0Ao
94d0: 44 33 72 50 5f 5a 79 41 31 6c 44 75 69 4f 4f 51  D3rP_ZyA1lDuiOOQ
94e0: 4a 53 4a 49 65 44 79 6c 7a 38 61 6a 67 5f 79 4e  JSJIeDylz8ajg_yN
94f0: 73 52 38 31 31 39 53 74 4b 37 53 45 31 2d 51 4f  sR8119StK7SE1-QO
9500: 6d 35 4f 5a 75 73 37 49 53 73 33 2d 55 71 6a 73  m5OZus7ISs3-Uqjs
9510: 58 31 57 30 56 53 5a 65 6f 46 31 65 62 48 38 68  X1W0VSZeoF1ebH8h
9520: 67 44 46 69 73 53 76 6a 79 6b 6d 66 57 32 5f 6f  gDFisSvjykmfW2_o
9530: 44 4c 72 36 61 78 51 4c 35 6d 65 55 56 76 45 53  DLr6axQL5meUVvES
9540: 5a 42 51 68 65 34 6c 45 37 38 69 79 74 78 72 50  ZBQhe4lE78iytxrP
9550: 72 62 68 6a 64 78 35 76 34 71 77 4b 57 62 44 47  rbhjdx5v4qwKWbDG
9560: 6d 32 70 53 64 65 75 7a 39 46 4d 47 71 36 33 44  m2pSdeuz9FMGq63D
9570: 66 70 6e 62 41 79 2d 52 48 56 59 33 64 43 44 43  fpnbAy-RHVY3dCDC
9580: 5a 49 59 7a 4f 76 77 66 4f 4f 52 31 51 56 30 4d  ZIYzOvwfOOR1QV0M
9590: 63 45 58 49 71 62 47 70 4c 7a 52 63 76 49 4f 65  cEXIqbGpLzRcvIOe
95a0: 35 54 55 6e 61 47 4b 6d 37 71 61 51 71 48 68 44  5TUnaGKm7qaQqHhD
95b0: 79 6a 74 35 72 4c 30 6a 46 78 69 6f 52 35 79 4b  yjt5rL0jFxioR5yK
95c0: 6e 55 41 70 30 67 4c 36 7a 79 35 54 4c 71 52 53  nUAp0gL6zy5TLqRS
95d0: 38 30 43 49 69 7a 30 64 6a 30 4e 61 36 33 55 78  80CIiz0dj0Na63Ux
95e0: 59 74 50 4c 70 66 34 76 57 71 4f 4a 46 58 36 56  YtPLpf4vWqOJFX6V
95f0: 5a 70 54 46 52 43 37 6f 31 57 38 54 6d 65 68 65  ZpTFRC7o1W8Tmehe
9600: 45 72 5f 55 67 70 58 62 6c 48 56 49 64 67 38 7a  Er_UgpXblHVIdg8z
9610: 55 50 36 39 58 41 43 4b 6f 5f 58 37 4d 4a 2d 67  UP69XACKo_X7MJ-g
9620: 39 2d 73 35 65 6a 58 78 65 43 57 74 35 59 5a 2d  9-s5ejXxeCWt5YZ-
9630: 54 38 2d 6b 46 62 44 58 2d 62 46 51 73 6f 76 30  T8-kFbDX-bFQsov0
9640: 43 35 6b 32 53 4d 64 73 54 46 35 49 7a 42 75 6c  C5k2SMdsTF5IzBul
9650: 43 33 61 4c 36 2d 32 4d 61 7a 66 35 77 56 55 31  C3aL6-2Mazf5wVU1
9660: 36 76 2d 72 39 74 36 2d 55 30 69 61 51 43 71 4c  6v-r9t6-U0iaQCqL
9670: 38 55 59 58 55 6c 72 39 61 62 4a 53 58 4f 59 6b  8UYXUlr9abJSXOYk
9680: 7a 53 61 78 35 36 50 7a 5a 69 50 7a 52 7a 44 76  zSax56PzZiPzRzDv
9690: 31 53 6a 38 51 68 73 5a 33 78 64 46 58 66 58 4e  1Sj8QhsZ3xdFXfXN
96a0: 65 2d 33 46 35 6f 34 59 6a 58 5a 39 4a 77 70 74  e-3F5o4YjXZ9Jwpt
96b0: 56 77 51 4c 61 6a 33 55 63 50 76 6b 42 34 5f 45  VwQLaj3UcPvkB4_E
96c0: 6f 77 33 4a 43 37 6d 50 53 74 63 74 6a 32 52 6f  ow3JC7mPStctj2Ro
96d0: 6f 53 65 66 36 33 74 62 4d 6c 70 5f 37 59 42 7a  oSef63tbMlp_7YBz
96e0: 61 49 6a 52 6e 6a 4a 70 32 6e 39 6d 31 31 5f 36  aIjRnjJp2n9m11_6
96f0: 30 36 58 47 61 59 6e 31 4a 70 58 4d 71 32 47 61  06XGaYn1JpXMq2Ga
9700: 72 7a 33 46 55 59 55 43 58 6b 4e 7a 69 49 4c 4a  rz3FUYUCXkNziILJ
9710: 6c 4d 61 4b 42 50 71 68 38 47 64 48 64 52 30 31  lMaKBPqh8GdHdR01
9720: 62 4e 33 47 32 41 63 6d 4a 54 4b 66 70 70 76 72  bN3G2AcmJTKfppvr
9730: 59 34 2d 54 4a 71 7a 77 63 51 6f 64 45 55 37 61  Y4-TJqzwcQodEU7a
9740: 69 56 6d 69 4d 77 62 57 30 47 6a 39 4a 52 63 41  iVmiMwbW0Gj9JRcA
9750: 33 74 4c 4f 5a 36 45 62 7a 73 61 47 78 71 42 5f  3tLOZ6EbzsaGxqB_
9760: 7a 34 67 43 4d 6e 5a 37 61 59 7a 61 47 58 4c 49  z4gCMnZ7aYzaGXLI
9770: 37 52 35 41 43 53 43 38 7a 6e 6e 65 69 4e 5a 48  7R5ACSC8znneiNZH
9780: 35 5f 6b 33 6b 6d 48 42 36 35 5f 38 2d 53 54 61  5_k3kmHB65_8-STa
9790: 6d 35 42 6e 62 52 42 61 4f 30 45 44 53 5a 4c 6c  m5BnbRBaO0EDSZLl
97a0: 4d 48 34 45 65 41 35 54 55 51 62 66 78 77 42 59  MH4EeA5TUQbfxwBY
97b0: 58 76 62 4e 58 32 51 57 71 46 35 63 77 48 67 31  XvbNX2QWqF5cwHg1
97c0: 53 37 69 39 52 50 72 5f 56 42 41 6b 43 35 57 5a  S7i9RPr_VBAkC5WZ
97d0: 4e 54 59 5a 6c 4e 6d 49 31 78 57 6b 59 79 6c 69  NTYZlNmI1xWkYyli
97e0: 5f 70 73 74 4e 57 42 78 72 6d 6a 34 75 6a 7a 74  _pstNWBxrmj4ujzt
97f0: 63 61 30 46 67 38 52 53 63 6f 63 41 50 33 59 41  ca0Fg8RScocAP3YA
9800: 44 71 4d 58 74 37 33 45 45 4d 58 79 71 50 5f 79  DqMXt73EEMXyqP_y
9810: 35 34 55 77 41 22 3e 62 6c 61 6e 6b 3c 2f 61 3e  54UwA">blank</a>
9820: 3c 2f 68 35 3e 0a 0a 20 20 20 20 20 20 20 20 20  </h5>..         
9830: 20 20 20 20 20 20 20 3c 68 35 20 63 6c 61 73 73         <h5 class
9840: 3d 22 6d 6c 2d 34 22 3e 3c 61 20 20 68 72 65 66  ="ml-4"><a  href
9850: 3d 22 2f 73 6f 6e 67 2f 58 51 41 41 41 41 4c 36  ="/song/XQAAAAL6
9860: 44 77 41 41 41 41 41 41 41 41 42 44 4b 55 71 47  DwAAAAAAAABDKUqG
9870: 55 35 76 49 38 4e 75 76 32 70 78 71 65 49 79 62  U5vI8Nuv2pxqeIyb
9880: 47 71 74 4a 30 78 49 72 53 69 6f 62 72 39 38 73  GqtJ0xIrSiobr98s
9890: 64 45 37 61 66 6a 34 41 72 34 6a 4a 71 2d 38 71  dE7afj4Ar4jJq-8q
98a0: 6c 5f 57 31 5f 37 38 61 31 5f 47 58 59 55 33 33  l_W1_78a1_GXYU33
98b0: 51 78 69 54 74 41 56 37 53 48 52 59 64 48 36 7a  QxiTtAV7SHRYdH6z
98c0: 70 30 43 55 4c 5a 6a 43 41 6e 38 30 55 72 4c 5f  p0CULZjCAn80UrL_
98d0: 63 62 6b 36 43 38 53 73 4f 7a 67 71 4d 7a 56 36  cbk6C8SsOzgqMzV6
98e0: 7a 59 6b 4f 4c 76 47 2d 66 6a 5a 4c 69 38 4c 57  zYkOLvG-fjZLi8LW
98f0: 43 39 6d 46 32 47 31 50 66 4a 61 5a 32 32 4d 6d  C9mF2G1PfJaZ22Mm
9900: 4d 47 43 37 58 5a 69 52 4d 76 75 47 67 67 39 49  MGC7XZiRMvuGgg9I
9910: 58 64 36 54 59 4b 38 79 6d 79 4a 53 45 4e 38 58  Xd6TYK8ymyJSEN8X
9920: 6f 67 30 67 53 36 65 73 75 5a 2d 73 56 36 57 65  og0gS6esuZ-sV6We
9930: 57 50 79 4d 6b 5f 38 30 66 6f 78 69 67 62 6e 68  WPyMk_80foxigbnh
9940: 48 4f 65 57 4e 6a 71 54 44 33 4d 48 53 4b 56 68  HOeWNjqTD3MHSKVh
9950: 6f 6f 44 70 4f 64 6c 68 48 44 45 39 59 6d 31 6c  ooDpOdlhHDE9Ym1l
9960: 66 31 6f 58 4b 4a 79 64 31 6e 7a 49 72 6f 70 69  f1oXKJyd1nzIropi
9970: 43 70 6e 7a 51 68 52 78 34 56 4c 4f 76 70 74 70  CpnzQhRx4VLOvptp
9980: 55 58 39 53 50 49 38 4a 66 6e 4f 74 74 5a 6f 4b  UX9SPI8JfnOttZoK
9990: 37 2d 61 2d 6c 62 76 56 7a 67 42 52 4d 72 71 7a  7-a-lbvVzgBRMrqz
99a0: 78 4d 4e 4f 5f 54 64 2d 48 4e 53 2d 74 6d 67 33  xMNO_Td-HNS-tmg3
99b0: 45 68 74 4a 66 70 4d 48 4b 76 78 46 4d 61 50 6b  EhtJfpMHKvxFMaPk
99c0: 67 30 45 75 73 4c 52 79 50 2d 46 41 50 6b 6c 30  g0EusLRyP-FAPkl0
99d0: 4e 33 41 62 75 30 2d 6e 79 55 31 34 41 79 6e 69  N3Abu0-nyU14Ayni
99e0: 77 31 75 45 44 69 34 74 43 77 59 76 47 51 6a 45  w1uEDi4tCwYvGQjE
99f0: 35 46 44 78 63 4f 45 41 71 30 67 6d 33 4e 68 69  5FDxcOEAq0gm3Nhi
9a00: 6b 63 47 6b 49 6e 6a 6b 4b 44 37 58 68 69 39 53  kcGkInjkKD7Xhi9S
9a10: 4b 42 73 68 58 61 70 51 30 37 5a 63 79 6b 42 57  KBshXapQ07ZcykBW
9a20: 4f 55 4e 57 69 54 51 41 57 54 79 4d 77 46 34 69  OUNWiTQAWTyMwF4i
9a30: 51 32 51 51 50 6c 67 56 31 70 77 4f 53 53 56 70  Q2QQPlgV1pwOSSVp
9a40: 2d 73 58 4a 49 77 62 73 51 46 78 6e 6c 56 5f 77  -sXJIwbsQFxnlV_w
9a50: 45 64 4d 5a 55 46 36 61 38 4a 61 66 6a 4f 58 7a  EdMZUF6a8JafjOXz
9a60: 6b 68 59 77 44 56 6f 44 56 41 6f 61 37 54 41 5a  khYwDVoDVAoa7TAZ
9a70: 64 6a 78 74 49 51 66 37 5a 49 63 72 30 65 69 6e  djxtIQf7ZIcr0ein
9a80: 6b 6b 72 37 39 58 6b 66 6b 59 72 32 42 65 33 38  kkr79XkfkYr2Be38
9a90: 62 41 79 47 2d 4b 46 50 52 4c 31 4c 39 4f 63 34  bAyG-KFPRL1L9Oc4
9aa0: 31 67 45 33 36 57 64 36 4c 33 6f 45 4b 75 45 49  1gE36Wd6L3oEKuEI
9ab0: 2d 6f 4d 59 58 70 35 49 57 6c 43 43 5f 73 41 79  -oMYXp5IWlCC_sAy
9ac0: 75 4f 42 4e 51 73 48 59 6f 5a 6b 38 76 78 42 79  uOBNQsHYoZk8vxBy
9ad0: 51 38 55 4e 62 4c 4c 4f 4a 37 34 47 73 59 44 45  Q8UNbLLOJ74GsYDE
9ae0: 66 47 63 63 4d 35 54 48 74 68 6e 46 4f 4a 6d 47  fGccM5THthnFOJmG
9af0: 7a 33 68 30 65 4f 41 76 78 52 6b 54 58 4b 31 4b  z3h0eOAvxRkTXK1K
9b00: 37 76 72 37 5a 41 53 61 31 69 6a 4e 61 74 6b 66  7vr7ZASa1ijNatkf
9b10: 49 32 46 47 72 41 45 4a 38 55 4e 31 61 43 62 59  I2FGrAEJ8UN1aCbY
9b20: 7a 39 59 51 62 49 51 4d 66 62 4c 77 35 67 7a 51  z9YQbIQMfbLw5gzQ
9b30: 43 75 37 67 55 74 7a 63 61 49 78 30 59 75 54 54  Cu7gUtzcaIx0YuTT
9b40: 4a 33 41 6a 44 77 36 68 6b 6c 6d 4e 6d 4f 50 38  J3AjDw6hklmNmOP8
9b50: 4f 65 66 6a 2d 65 4a 6f 34 6e 34 61 4f 6b 36 56  Oefj-eJo4n4aOk6V
9b60: 33 70 42 37 6e 32 58 63 32 53 30 35 2d 46 78 4f  3pB7n2Xc2S05-FxO
9b70: 41 33 69 50 75 6a 73 61 37 72 39 51 52 4a 37 52  A3iPujsa7r9QRJ7R
9b80: 6d 31 6b 66 7a 67 49 68 77 31 56 6f 43 4a 6a 46  m1kfzgIhw1VoCJjF
9b90: 61 37 47 53 47 66 77 63 63 46 39 46 69 51 74 61  a7GSGfwccF9FiQta
9ba0: 4e 4f 75 55 57 79 6b 6d 66 37 4e 63 65 32 7a 46  NOuUWykmf7Nce2zF
9bb0: 6f 6b 6b 51 47 78 53 55 61 33 58 6d 39 71 33 36  okkQGxSUa3Xm9q36
9bc0: 4c 35 7a 73 4f 4d 2d 51 58 46 44 75 51 46 57 57  L5zsOM-QXFDuQFWW
9bd0: 31 59 42 50 6b 2d 65 77 38 75 6f 73 4d 6f 72 41  1YBPk-ew8uosMorA
9be0: 6b 49 53 45 33 56 47 34 36 56 71 64 6b 75 4d 47  kISE3VG46VqdkuMG
9bf0: 68 6b 47 6a 71 57 4b 71 76 34 58 42 37 64 6a 4f  hkGjqWKqv4XB7djO
9c00: 4a 58 61 51 5a 52 59 49 45 67 49 70 67 35 64 36  JXaQZRYIEgIpg5d6
9c10: 4c 58 59 70 46 77 36 4f 7a 6a 4a 5a 65 73 33 73  LXYpFw6OzjJZes3s
9c20: 53 34 43 44 34 68 4d 64 7a 4e 55 35 4f 6d 79 55  S4CD4hMdzNU5OmyU
9c30: 6d 70 67 69 39 4b 4d 64 39 6a 34 61 47 57 48 38  mpgi9KMd9j4aGWH8
9c40: 44 6b 75 38 62 62 77 34 39 55 7a 38 55 54 6c 68  Dku8bbw49Uz8UTlh
9c50: 47 69 42 70 75 48 6c 78 7a 48 56 5f 67 36 73 47  GiBpuHlxzHV_g6sG
9c60: 6e 77 2d 49 64 4a 33 52 41 31 79 6c 56 4f 63 55  nw-IdJ3RA1ylVOcU
9c70: 35 75 77 58 49 4a 35 31 34 34 69 58 6d 4b 61 32  5uwXIJ5144iXmKa2
9c80: 4c 42 35 55 68 50 65 70 47 31 76 63 6c 63 6d 37  LB5UhPepG1vclcm7
9c90: 6c 49 57 66 45 42 33 68 4f 78 70 62 62 71 53 2d  lIWfEB3hOxpbbqS-
9ca0: 39 65 70 47 4c 57 73 59 48 4a 38 78 37 30 67 52  9epGLWsYHJ8x70gR
9cb0: 4e 5a 49 64 77 6d 32 48 68 64 4b 70 66 6c 2d 38  NZIdwm2HhdKpfl-8
9cc0: 68 2d 75 58 72 73 53 66 62 79 79 51 67 63 61 57  h-uXrsSfbyyQgcaW
9cd0: 52 4a 6f 56 59 70 6a 71 59 77 6b 6c 64 38 34 35  RJoVYpjqYwkld845
9ce0: 35 31 44 77 69 59 45 57 4e 67 50 4d 6c 71 42 48  51DwiYEWNgPMlqBH
9cf0: 6a 6f 37 55 67 37 52 30 4e 79 51 65 32 44 63 51  jo7Ug7R0NyQe2DcQ
9d00: 38 55 69 57 54 44 76 41 73 65 56 54 4b 71 56 66  8UiWTDvAseVTKqVf
9d10: 51 77 76 31 64 42 48 6b 4a 56 47 75 63 44 72 64  Qwv1dBHkJVGucDrd
9d20: 76 42 66 6f 48 6d 36 5f 4a 79 76 43 65 42 4c 64  vBfoHm6_JyvCeBLd
9d30: 4e 78 52 50 32 46 4a 45 42 51 5f 6b 6f 77 35 5f  NxRP2FJEBQ_kow5_
9d40: 72 37 45 53 46 7a 51 5a 38 42 6b 37 76 72 37 34  r7ESFzQZ8Bk7vr74
9d50: 64 6b 78 44 42 58 64 6b 53 6a 72 39 72 56 36 45  dkxDBXdkSjr9rV6E
9d60: 6c 53 30 73 5f 74 53 31 4e 77 72 6e 69 48 75 49  lS0s_tS1NwrniHuI
9d70: 39 53 6c 51 69 72 55 45 37 37 35 62 33 56 38 57  9SlQirUE775b3V8W
9d80: 6a 6e 74 2d 53 4d 64 77 52 52 70 4d 5a 48 49 42  jnt-SMdwRRpMZHIB
9d90: 48 6e 74 62 5f 58 44 75 4a 66 52 59 59 6b 61 5f  Hntb_XDuJfRYYka_
9da0: 63 43 41 31 50 4e 6e 50 39 39 52 31 56 79 4b 50  cCA1PNnP99R1VyKP
9db0: 79 70 67 55 72 61 5a 68 71 54 5f 4c 77 46 37 56  ypgUraZhqT_LwF7V
9dc0: 51 47 6e 45 57 6c 69 69 43 52 42 68 4a 6b 68 34  QGnEWliiCRBhJkh4
9dd0: 4e 70 7a 75 33 6c 54 48 46 51 37 68 31 74 64 75  Npzu3lTHFQ7h1tdu
9de0: 48 33 78 31 32 45 55 65 48 41 76 69 59 67 33 47  H3x12EUeHAviYg3G
9df0: 53 75 53 47 37 74 32 67 58 64 5f 58 6b 54 54 4a  SuSG7t2gXd_XkTTJ
9e00: 36 45 75 67 4f 74 32 70 30 59 31 5f 43 47 38 76  6EugOt2p0Y1_CG8v
9e10: 47 39 34 73 37 6b 33 44 56 4a 46 57 65 4d 48 51  G94s7k3DVJFWeMHQ
9e20: 4d 57 5f 6e 61 53 62 46 4a 73 34 7a 79 46 44 72  MW_naSbFJs4zyFDr
9e30: 37 58 38 72 66 55 35 6e 4a 31 4b 41 42 4e 48 5f  7X8rfU5nJ1KABNH_
9e40: 77 6b 72 52 32 63 4c 52 78 43 43 71 39 35 6b 7a  wkrR2cLRxCCq95kz
9e50: 45 34 67 61 68 5a 79 66 4f 54 4b 74 66 70 2d 75  E4gahZyfOTKtfp-u
9e60: 6e 31 54 4d 46 54 6d 4a 30 50 57 64 62 53 36 37  n1TMFTmJ0PWdbS67
9e70: 68 78 46 54 4f 68 52 72 43 59 4b 6f 4b 73 67 36  hxFTOhRrCYKoKsg6
9e80: 32 52 31 34 4f 4a 36 52 5f 4e 62 6d 68 46 69 6e  2R14OJ6R_NbmhFin
9e90: 38 6d 6a 77 68 46 42 4c 51 4b 2d 6e 38 5f 42 75  8mjwhFBLQK-n8_Bu
9ea0: 46 77 59 54 72 55 53 59 42 68 33 6b 5f 67 46 31  FwYTrUSYBh3k_gF1
9eb0: 5a 50 36 38 5f 30 4b 79 66 32 64 37 6f 31 39 30  ZP68_0Kyf2d7o190
9ec0: 64 4b 31 4e 36 6d 35 51 6b 2d 4b 63 4e 75 6a 71  dK1N6m5Qk-KcNujq
9ed0: 69 49 67 66 7a 79 30 4e 65 52 63 41 4c 4c 31 6f  iIgfzy0NeRcALL1o
9ee0: 57 39 37 54 37 50 32 39 66 4f 70 45 45 4c 58 77  W97T7P29fOpEELXw
9ef0: 56 78 75 42 59 38 39 79 47 69 35 54 4f 5f 52 37  VxuBY89yGi5TO_R7
9f00: 44 55 58 45 69 43 6d 45 42 46 41 6d 4f 42 34 45  DUXEiCmEBFAmOB4E
9f10: 4a 4d 69 67 56 57 36 55 4a 77 53 4d 52 30 35 67  JMigVW6UJwSMR05g
9f20: 4f 42 61 61 6f 76 31 48 42 45 6d 41 44 66 34 4d  OBaaov1HBEmADf4M
9f30: 56 4d 35 34 62 38 48 31 45 56 58 41 4d 7a 7a 77  VM54b8H1EVXAMzzw
9f40: 73 7a 56 4b 42 50 70 6c 62 36 5a 62 45 6b 61 64  szVKBPplb6ZbEkad
9f50: 31 4a 59 75 7a 46 39 57 63 32 6c 30 37 76 73 4d  1JYuzF9Wc2l07vsM
9f60: 4c 41 7a 79 6d 6d 33 59 32 67 6b 6a 76 39 47 5a  LAzymm3Y2gkjv9GZ
9f70: 6f 39 62 69 43 44 53 4c 62 46 70 61 63 42 4a 66  o9biCDSLbFpacBJf
9f80: 71 4a 46 33 78 76 72 5f 2d 39 38 42 73 35 2d 66  qJF3xvr_-98Bs5-f
9f90: 6e 76 65 71 58 66 33 49 62 41 45 56 58 5a 33 58  nveqXf3IbAEVXZ3X
9fa0: 5f 32 53 6a 6f 58 50 6d 6c 67 30 6d 5f 39 75 73  _2SjoXPmlg0m_9us
9fb0: 69 57 39 35 68 62 4f 4d 64 37 70 78 4e 4b 6c 61  iW95hbOMd7pxNKla
9fc0: 38 75 38 6e 4f 75 38 72 39 76 6b 4c 71 71 4b 67  8u8nOu8r9vkLqqKg
9fd0: 5f 79 42 48 64 6e 54 62 48 54 68 71 45 67 47 52  _yBHdnTbHThqEgGR
9fe0: 50 6d 70 63 56 42 38 78 33 50 35 44 5a 35 73 48  PmpcVB8x3P5DZ5sH
9ff0: 41 57 67 32 6b 31 6d 75 62 55 75 75 49 39 61 79  AWg2k1mubUuuI9ay
a000: 63 43 2d 62 31 71 4d 4f 50 75 35 79 38 5f 62 50  cC-b1qMOPu5y8_bP
a010: 76 58 4b 35 75 47 70 45 70 6d 6f 58 71 62 52 53  vXK5uGpEpmoXqbRS
a020: 6c 71 4d 4c 78 55 72 70 52 50 49 6a 4f 6f 54 50  lqMLxUrpRPIjOoTP
a030: 6a 42 63 38 42 63 69 41 52 41 6b 6a 31 79 58 59  jBc8BciARAkj1yXY
a040: 57 66 4a 35 75 6d 4f 33 32 4c 4d 72 43 61 4a 53  WfJ5umO32LMrCaJS
a050: 69 33 41 4f 35 76 5f 4b 39 35 46 56 4b 54 33 77  i3AO5v_K95FVKT3w
a060: 6e 45 34 78 33 52 61 31 79 55 33 43 63 75 58 4b  nE4x3Ra1yU3CcuXK
a070: 6c 46 72 57 72 55 6c 57 57 58 47 48 59 53 37 74  lFrWrUlWWXGHYS7t
a080: 58 63 37 59 4c 37 49 6b 35 6a 76 49 38 67 33 6f  Xc7YL7Ik5jvI8g3o
a090: 4a 65 53 34 4c 61 46 4d 63 35 57 78 79 7a 7a 67  JeS4LaFMc5Wxyzzg
a0a0: 75 45 55 61 4f 2d 46 78 52 7a 56 55 36 6b 67 4e  uEUaO-FxRzVU6kgN
a0b0: 5f 39 59 64 64 72 67 22 3e 73 74 6f 63 68 61 73  _9Yddrg">stochas
a0c0: 74 69 63 3c 2f 61 3e 3c 2f 68 35 3e 0a 0a 20 20  tic</a></h5>..  
a0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 68                <h
a0e0: 35 20 63 6c 61 73 73 3d 22 6d 6c 2d 34 22 20 3e  5 class="ml-4" >
a0f0: 3c 61 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f  <a href="https:/
a100: 2f 78 79 7a 7a 79 61 70 70 73 2e 6c 69 6e 6b 2f  /xyzzyapps.link/
a110: 73 61 6d 70 6c 65 73 2f 22 20 74 61 72 67 65 74  samples/" target
a120: 3d 22 5f 62 6c 61 6e 6b 22 3e 73 61 6d 70 6c 65  ="_blank">sample
a130: 20 62 72 6f 77 73 65 72 3c 2f 61 3e 3c 2f 68 35   browser</a></h5
a140: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f  >.            </
a150: 68 73 74 61 63 6b 3e 0a 0a 20 20 20 20 20 20 20  hstack>..       
a160: 20 20 20 20 20 3c 62 69 74 72 68 79 74 68 6d 20       <bitrhythm 
a170: 73 6f 6e 67 3d 22 7b 7b 64 61 74 61 7d 7d 22 3e  song="{{data}}">
a180: 3c 2f 62 69 74 72 68 79 74 68 6d 3e 0a 20 20 20  </bitrhythm>.   
a190: 20 20 20 20 20 3c 2f 64 69 76 3e 0a 0a 20 20 20       </div>..   
a1a0: 20 3c 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20   <script>.      
a1b0: 20 20 72 69 6f 74 2e 63 6f 6d 70 69 6c 65 28 66    riot.compile(f
a1c0: 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20  unction() {.    
a1d0: 20 20 20 20 20 20 20 20 76 61 72 20 62 69 74 72          var bitr
a1e0: 68 79 74 68 6d 20 3d 20 72 69 6f 74 2e 6d 6f 75  hythm = riot.mou
a1f0: 6e 74 28 27 62 69 74 72 68 79 74 68 6d 27 29 3b  nt('bitrhythm');
a200: 0a 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e  .            win
a210: 64 6f 77 2e 62 69 74 72 68 79 74 68 6d 20 3d 20  dow.bitrhythm = 
a220: 62 69 74 72 68 79 74 68 6d 5b 30 5d 3b 0a 20 20  bitrhythm[0];.  
a230: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 64 69            var di
a240: 61 6c 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28  al = riot.mount(
a250: 27 64 69 61 6c 27 29 3b 0a 20 20 20 20 20 20 20  'dial');.       
a260: 20 20 20 20 20 76 61 72 20 6e 75 6d 62 65 72 20       var number 
a270: 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 6e 75  = riot.mount('nu
a280: 6d 62 65 72 27 29 3b 0a 20 20 20 20 20 20 20 20  mber');.        
a290: 20 20 20 20 76 61 72 20 73 61 6d 70 6c 65 20 3d      var sample =
a2a0: 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27 73 61 6d   riot.mount('sam
a2b0: 70 6c 65 27 29 3b 0a 20 20 20 20 20 20 20 20 7d  ple');.        }
a2c0: 29 0a 20 20 20 20 3c 2f 73 63 72 69 70 74 3e 0a  ).    </script>.
a2d0: 0a 0a 20 20 20 20 3c 2f 62 6f 64 79 3e 0a 0a 3c  ..    </body>..<
a2e0: 2f 68 74 6d 6c 3e 0a 0a 22 22 22 0a 0a 66 72 6f  /html>.."""..fro
a2f0: 6d 20 6d 61 6b 6f 2e 74 65 6d 70 6c 61 74 65 20  m mako.template 
a300: 69 6d 70 6f 72 74 20 54 65 6d 70 6c 61 74 65 0a  import Template.
a310: 69 6d 70 6f 72 74 20 63 6f 6d 6d 6f 6e 0a 63 6f  import common.co
a320: 64 65 20 3d 20 54 65 6d 70 6c 61 74 65 28 69 6e  de = Template(in
a330: 64 65 78 29 2e 72 65 6e 64 65 72 28 63 6f 6d 6d  dex).render(comm
a340: 6f 6e 5f 73 63 72 69 70 74 73 3d 63 6f 6d 6d 6f  on_scripts=commo
a350: 6e 2e 65 78 74 65 72 6e 61 6c 5f 6c 69 62 72 61  n.external_libra
a360: 72 69 65 73 29 0a 0a 69 66 20 44 45 56 20 3d 3d  ries)..if DEV ==
a370: 20 22 31 22 3a 0a 20 20 20 20 66 6f 72 5f 64 6f   "1":.    for_do
a380: 63 73 20 3d 20 22 22 22 0a 23 23 20 49 6e 64 65  cs = """.## Inde
a390: 78 0a 0a 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63  x..```{code-bloc
a3a0: 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a 66 6f 72 63  k} html.---.forc
a3b0: 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 25 73 0a 60  e: true.---.%s.`
a3c0: 60 60 0a 20 20 20 20 22 22 22 0a 20 20 20 20 63  ``.    """.    c
a3d0: 6f 67 2e 6f 75 74 28 66 6f 72 5f 64 6f 63 73 20  og.out(for_docs 
a3e0: 25 20 28 69 6e 64 65 78 2c 29 29 0a 0a 6f 73 2e  % (index,))..os.
a3f0: 73 79 73 74 65 6d 28 22 72 6d 20 74 65 6d 70 6c  system("rm templ
a400: 61 74 65 73 2f 69 6e 64 65 78 2e 68 74 6d 6c 22  ates/index.html"
a410: 29 0a 66 20 3d 20 6f 70 65 6e 28 22 74 65 6d 70  ).f = open("temp
a420: 6c 61 74 65 73 2f 69 6e 64 65 78 2e 68 74 6d 6c  lates/index.html
a430: 22 2c 20 22 77 22 29 0a 66 2e 77 72 69 74 65 28  ", "w").f.write(
a440: 63 6f 64 65 29 0a 66 2e 63 6c 6f 73 65 28 29 0a  code).f.close().
a450: 40 3e 0a 40 40 0a 0a 0a 40 3c 0a 69 6d 70 6f 72  @>.@@...@<.impor
a460: 74 20 63 6f 67 0a 69 6d 70 6f 72 74 20 6f 73 0a  t cog.import os.
a470: 0a 70 61 67 65 20 3d 20 22 22 22 0a 3c 21 44 4f  .page = """.<!DO
a480: 43 54 59 50 45 20 68 74 6d 6c 3e 0a 3c 68 74 6d  CTYPE html>.<htm
a490: 6c 20 6c 61 6e 67 3d 22 65 6e 22 3e 0a 20 20 20  l lang="en">.   
a4a0: 20 3c 68 65 61 64 3e 0a 20 20 20 20 20 20 20 20   <head>.        
a4b0: 3c 6d 65 74 61 20 63 68 61 72 73 65 74 3d 22 75  <meta charset="u
a4c0: 74 66 2d 38 22 3e 0a 20 20 20 20 20 20 20 20 3c  tf-8">.        <
a4d0: 6d 65 74 61 20 6e 61 6d 65 3d 22 76 69 65 77 70  meta name="viewp
a4e0: 6f 72 74 22 20 63 6f 6e 74 65 6e 74 3d 22 77 69  ort" content="wi
a4f0: 64 74 68 3d 64 65 76 69 63 65 2d 77 69 64 74 68  dth=device-width
a500: 2c 20 69 6e 69 74 69 61 6c 2d 73 63 61 6c 65 3d  , initial-scale=
a510: 31 22 3e 0a 20 20 20 20 20 20 20 20 3c 6d 65 74  1">.        <met
a520: 61 20 68 74 74 70 2d 65 71 75 69 76 3d 22 43 61  a http-equiv="Ca
a530: 63 68 65 2d 43 6f 6e 74 72 6f 6c 22 20 63 6f 6e  che-Control" con
a540: 74 65 6e 74 3d 22 6e 6f 2d 63 61 63 68 65 2c 20  tent="no-cache, 
a550: 6e 6f 2d 73 74 6f 72 65 2c 20 6d 75 73 74 2d 72  no-store, must-r
a560: 65 76 61 6c 69 64 61 74 65 22 20 2f 3e 0a 20 20  evalidate" />.  
a570: 20 20 20 20 20 20 3c 6d 65 74 61 20 68 74 74 70        <meta http
a580: 2d 65 71 75 69 76 3d 22 50 72 61 67 6d 61 22 20  -equiv="Pragma" 
a590: 63 6f 6e 74 65 6e 74 3d 22 6e 6f 2d 63 61 63 68  content="no-cach
a5a0: 65 22 20 2f 3e 0a 20 20 20 20 20 20 20 20 3c 6d  e" />.        <m
a5b0: 65 74 61 20 68 74 74 70 2d 65 71 75 69 76 3d 22  eta http-equiv="
a5c0: 45 78 70 69 72 65 73 22 20 63 6f 6e 74 65 6e 74  Expires" content
a5d0: 3d 22 30 22 20 2f 3e 0a 20 20 20 20 20 20 20 20  ="0" />.        
a5e0: 3c 74 69 74 6c 65 3e 41 62 6f 75 74 20 62 69 72  <title>About bir
a5f0: 74 68 79 74 68 6d 3c 2f 74 69 74 6c 65 3e 0a 20  thythm</title>. 
a600: 20 20 20 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c         <link rel
a610: 3d 22 69 63 6f 6e 22 20 68 72 65 66 3d 22 66 61  ="icon" href="fa
a620: 76 69 63 6f 6e 2e 69 63 6f 22 3e 0a 20 20 20 20  vicon.ico">.    
a630: 20 20 20 20 3c 73 74 79 6c 65 3e 0a 20 20 20 20      <style>.    
a640: 20 20 20 20 68 74 6d 6c 2c 20 62 6f 64 79 20 7b      html, body {
a650: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 61 72  .            mar
a660: 67 69 6e 3a 20 30 3b 0a 20 20 20 20 20 20 20 20  gin: 0;.        
a670: 20 20 20 20 77 69 64 74 68 3a 20 31 30 30 25 3b      width: 100%;
a680: 0a 20 20 20 20 20 20 20 20 20 20 20 20 68 65 69  .            hei
a690: 67 68 74 3a 20 31 30 30 25 3b 0a 20 20 20 20 20  ght: 100%;.     
a6a0: 20 20 20 20 20 20 20 70 61 64 64 69 6e 67 3a 20         padding: 
a6b0: 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  0;.        }.   
a6c0: 20 20 20 20 20 69 66 72 61 6d 65 20 7b 0a 20 20       iframe {.  
a6d0: 20 20 20 20 20 20 20 20 20 20 70 6f 73 69 74 69            positi
a6e0: 6f 6e 3a 66 69 78 65 64 3b 0a 20 20 20 20 20 20  on:fixed;.      
a6f0: 20 20 20 20 20 20 74 6f 70 3a 30 3b 0a 20 20 20        top:0;.   
a700: 20 20 20 20 20 20 20 20 20 6c 65 66 74 3a 30 3b           left:0;
a710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 74  .            bot
a720: 74 6f 6d 3a 30 3b 0a 20 20 20 20 20 20 20 20 20  tom:0;.         
a730: 20 20 20 72 69 67 68 74 3a 30 3b 0a 20 20 20 20     right:0;.    
a740: 20 20 20 20 20 20 20 20 77 69 64 74 68 3a 31 30          width:10
a750: 30 25 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0%;.            
a760: 68 65 69 67 68 74 3a 31 30 30 25 3b 0a 20 20 20  height:100%;.   
a770: 20 20 20 20 20 20 20 20 20 62 6f 72 64 65 72 3a           border:
a780: 6e 6f 6e 65 3b 0a 20 20 20 20 20 20 20 20 20 20  none;.          
a790: 20 20 6d 61 72 67 69 6e 3a 30 3b 0a 20 20 20 20    margin:0;.    
a7a0: 20 20 20 20 20 20 20 20 70 61 64 64 69 6e 67 3a          padding:
a7b0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  0;.            o
a7c0: 76 65 72 66 6c 6f 77 3a 68 69 64 64 65 6e 3b 0a  verflow:hidden;.
a7d0: 20 20 20 20 20 20 20 20 20 20 20 20 7a 2d 69 6e              z-in
a7e0: 64 65 78 3a 39 39 39 39 39 39 3b 0a 20 20 20 20  dex:999999;.    
a7f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 3c 2f      }.        </
a800: 73 74 79 6c 65 3e 0a 20 20 20 20 20 20 20 20 3c  style>.        <
a810: 6c 69 6e 6b 20 68 72 65 66 3d 22 68 74 74 70 73  link href="https
a820: 3a 2f 2f 75 6e 70 6b 67 2e 63 6f 6d 2f 74 61 69  ://unpkg.com/tai
a830: 6c 77 69 6e 64 63 73 73 40 5e 32 2f 64 69 73 74  lwindcss@^2/dist
a840: 2f 74 61 69 6c 77 69 6e 64 2e 6d 69 6e 2e 63 73  /tailwind.min.cs
a850: 73 22 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65  s" rel="styleshe
a860: 65 74 22 3e 0a 20 20 20 20 20 20 20 20 3c 73 63  et">.        <sc
a870: 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20 20 20  ript>.          
a880: 20 20 77 69 6e 64 6f 77 2e 67 6f 61 74 63 6f 75    window.goatcou
a890: 6e 74 65 72 20 3d 20 7b 0a 20 20 20 20 20 20 20  nter = {.       
a8a0: 20 20 20 20 20 20 20 20 20 70 61 74 68 3a 20 66           path: f
a8b0: 75 6e 63 74 69 6f 6e 28 70 29 20 7b 20 72 65 74  unction(p) { ret
a8c0: 75 72 6e 20 6c 6f 63 61 74 69 6f 6e 2e 68 6f 73  urn location.hos
a8d0: 74 20 2b 20 70 20 7d 0a 20 20 20 20 20 20 20 20  t + p }.        
a8e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 3c 2f      }.        </
a8f0: 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20  script>.        
a900: 3c 73 63 72 69 70 74 20 64 61 74 61 2d 67 6f 61  <script data-goa
a910: 74 63 6f 75 6e 74 65 72 3d 22 68 74 74 70 73 3a  tcounter="https:
a920: 2f 2f 61 6e 61 6c 79 74 69 63 73 2e 78 79 7a 7a  //analytics.xyzz
a930: 79 61 70 70 73 2e 6c 69 6e 6b 2f 63 6f 75 6e 74  yapps.link/count
a940: 22 20 61 73 79 6e 63 20 73 72 63 3d 22 2f 2f 61  " async src="//a
a950: 6e 61 6c 79 74 69 63 73 2e 78 79 7a 7a 79 61 70  nalytics.xyzzyap
a960: 70 73 2e 6c 69 6e 6b 2f 63 6f 75 6e 74 2e 6a 73  ps.link/count.js
a970: 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20 20  "></script>.    
a980: 3c 2f 68 65 61 64 3e 0a 20 20 20 20 3c 62 6f 64  </head>.    <bod
a990: 79 3e 0a 20 20 20 20 20 20 20 20 3c 69 66 72 61  y>.        <ifra
a9a0: 6d 65 20 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f  me src="https://
a9b0: 62 6c 6f 67 2e 78 79 7a 7a 79 61 70 70 73 2e 6c  blog.xyzzyapps.l
a9c0: 69 6e 6b 2f 62 69 74 72 68 79 74 68 6d 2d 73 75  ink/bitrhythm-su
a9d0: 62 6d 69 74 2d 69 73 73 75 65 2d 66 65 65 64 62  bmit-issue-feedb
a9e0: 61 63 6b 22 20 66 72 61 6d 65 62 6f 72 64 65 72  ack" frameborder
a9f0: 3d 22 30 22 3e 3c 2f 69 66 72 61 6d 65 3e 0a 20  ="0"></iframe>. 
aa00: 20 20 20 3c 2f 62 6f 64 79 3e 0a 3c 2f 68 74 6d     </body>.</htm
aa10: 6c 3e 0a 22 22 22 0a 0a 69 66 20 44 45 56 20 3d  l>."""..if DEV =
aa20: 3d 20 22 31 22 3a 0a 20 20 20 20 66 6f 72 5f 64  = "1":.    for_d
aa30: 6f 63 73 20 3d 20 22 22 22 0a 23 23 20 50 61 67  ocs = """.## Pag
aa40: 65 0a 0a 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63  e..```{code-bloc
aa50: 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a 66 6f 72 63  k} html.---.forc
aa60: 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 25 73 0a 60  e: true.---.%s.`
aa70: 60 60 0a 20 20 20 20 22 22 22 0a 20 20 20 20 63  ``.    """.    c
aa80: 6f 67 2e 6f 75 74 28 66 6f 72 5f 64 6f 63 73 20  og.out(for_docs 
aa90: 25 20 28 70 61 67 65 2c 29 29 0a 0a 6f 73 2e 73  % (page,))..os.s
aaa0: 79 73 74 65 6d 28 22 72 6d 20 74 65 6d 70 6c 61  ystem("rm templa
aab0: 74 65 73 2f 70 61 67 65 2e 68 74 6d 6c 22 29 0a  tes/page.html").
aac0: 66 20 3d 20 6f 70 65 6e 28 22 74 65 6d 70 6c 61  f = open("templa
aad0: 74 65 73 2f 70 61 67 65 2e 68 74 6d 6c 22 2c 20  tes/page.html", 
aae0: 22 77 22 29 0a 66 2e 77 72 69 74 65 28 70 61 67  "w").f.write(pag
aaf0: 65 29 0a 66 2e 63 6c 6f 73 65 28 29 0a 40 3e 0a  e).f.close().@>.
ab00: 40 40 0a 0a 23 23 20 4a 61 76 61 73 63 72 69 70  @@..## Javascrip
ab10: 74 0a 0a 54 68 69 73 20 69 6e 63 6c 75 64 65 73  t..This includes
ab20: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 75   the functions u
ab30: 73 65 64 20 66 6f 72 20 70 61 72 73 69 6e 67 20  sed for parsing 
ab40: 74 68 65 20 70 61 74 74 65 72 6e 20 61 6e 64 20  the pattern and 
ab50: 69 6e 69 74 69 61 6c 69 73 69 6e 67 20 74 68 65  initialising the
ab60: 20 73 61 6d 70 6c 65 73 2e 20 0a 41 20 70 72 65   samples. .A pre
ab70: 6c 69 6d 6e 61 72 79 20 73 61 6d 70 6c 65 72 20  limnary sampler 
ab80: 69 6d 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 68  implementation h
ab90: 61 73 20 62 65 65 6e 20 64 6f 6e 65 20 77 69 74  as been done wit
aba0: 68 20 41 75 64 69 6f 57 6f 72 6b 6c 65 74 20 73  h AudioWorklet s
abb0: 75 70 70 6f 72 74 2c 20 61 6c 74 68 6f 75 67 68  upport, although
abc0: 20 74 68 65 72 65 20 64 6f 65 73 6e 27 74 20 73   there doesn't s
abd0: 65 65 6d 20 74 6f 20 6d 75 63 68 20 69 6d 70 72  eem to much impr
abe0: 6f 76 65 6d 65 6e 74 20 69 6e 20 74 68 65 20 70  ovement in the p
abf0: 65 72 66 6f 72 6d 61 6e 63 65 2e 0a 0a 60 60 60  erformance...```
ac00: 7b 63 6f 64 65 2d 62 6c 6f 63 6b 7d 20 6a 73 0a  {code-block} js.
ac10: 2d 2d 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a  ---.force: true.
ac20: 2d 2d 2d 0a 0a 40 3c 0a 69 6d 70 6f 72 74 20 63  ---..@<.import c
ac30: 6f 67 0a 69 6d 70 6f 72 74 20 6f 73 0a 0a 6d 69  og.import os..mi
ac40: 73 63 5f 6a 73 20 3d 20 22 22 22 0a 66 75 6e 63  sc_js = """.func
ac50: 74 69 6f 6e 20 67 65 74 52 61 6e 64 6f 6d 49 6e  tion getRandomIn
ac60: 74 28 6d 61 78 29 20 7b 0a 20 20 72 65 74 75 72  t(max) {.  retur
ac70: 6e 20 4d 61 74 68 2e 66 6c 6f 6f 72 28 4d 61 74  n Math.floor(Mat
ac80: 68 2e 72 61 6e 64 6f 6d 28 29 20 2a 20 6d 61 78  h.random() * max
ac90: 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 69  );.}..function i
aca0: 6e 69 74 57 69 6e 61 6d 70 28 70 72 65 73 65 74  nitWinamp(preset
acb0: 29 20 7b 0a 20 20 20 20 76 61 72 20 63 61 6e 20  ) {.    var can 
acc0: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
acd0: 65 6d 65 6e 74 42 79 49 64 28 22 76 69 73 75 61  ementById("visua
ace0: 6c 22 29 3b 0a 20 20 20 20 63 61 6e 2e 68 65 69  l");.    can.hei
acf0: 67 68 74 20 3d 20 77 69 6e 64 6f 77 2e 69 6e 6e  ght = window.inn
ad00: 65 72 48 65 69 67 68 74 20 2d 20 28 64 6f 63 75  erHeight - (docu
ad10: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
ad20: 79 49 64 28 22 68 65 61 64 65 72 2d 70 6c 61 79  yId("header-play
ad30: 62 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48 65 69  back").clientHei
ad40: 67 68 74 20 2f 20 32 29 3b 0a 20 20 20 20 63 61  ght / 2);.    ca
ad50: 6e 2e 77 69 64 74 68 20 3d 20 77 69 6e 64 6f 77  n.width = window
ad60: 2e 69 6e 6e 65 72 57 69 64 74 68 3b 0a 20 20 20  .innerWidth;.   
ad70: 20 76 61 72 20 63 61 6e 5f 63 6f 6e 74 61 69 6e   var can_contain
ad80: 65 72 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65  er = document.ge
ad90: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 63 61  tElementById("ca
ada0: 6e 76 61 73 2d 63 6f 6e 74 61 69 6e 65 72 22 29  nvas-container")
adb0: 3b 0a 20 20 20 20 63 61 6e 5f 63 6f 6e 74 61 69  ;.    can_contai
adc0: 6e 65 72 2e 77 69 64 74 68 20 3d 20 77 69 6e 64  ner.width = wind
add0: 6f 77 2e 69 6e 6e 65 72 57 69 64 74 68 3b 0a 20  ow.innerWidth;. 
ade0: 20 20 20 76 61 72 20 76 69 73 75 61 6c 69 7a 65     var visualize
adf0: 72 20 3d 20 77 69 6e 64 6f 77 2e 62 75 74 74 65  r = window.butte
ae00: 72 63 68 75 72 6e 2e 64 65 66 61 75 6c 74 2e 63  rchurn.default.c
ae10: 72 65 61 74 65 56 69 73 75 61 6c 69 7a 65 72 28  reateVisualizer(
ae20: 54 6f 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74 28  Tone.getContext(
ae30: 29 2e 72 61 77 43 6f 6e 74 65 78 74 2c 20 63 61  ).rawContext, ca
ae40: 6e 2c 20 7b 0a 20 20 20 20 20 20 20 20 68 65 69  n, {.        hei
ae50: 67 68 74 3a 20 77 69 6e 64 6f 77 2e 69 6e 6e 65  ght: window.inne
ae60: 72 48 65 69 67 68 74 20 2d 20 28 64 6f 63 75 6d  rHeight - (docum
ae70: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
ae80: 49 64 28 22 68 65 61 64 65 72 2d 70 6c 61 79 62  Id("header-playb
ae90: 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48 65 69 67  ack").clientHeig
aea0: 68 74 20 2f 20 32 29 2c 0a 20 20 20 20 20 20 20  ht / 2),.       
aeb0: 20 77 69 64 74 68 3a 20 77 69 6e 64 6f 77 2e 69   width: window.i
aec0: 6e 6e 65 72 57 69 64 74 68 2c 0a 20 20 20 20 20  nnerWidth,.     
aed0: 20 20 20 6d 65 73 68 57 69 64 74 68 3a 20 32 34     meshWidth: 24
aee0: 2c 0a 20 20 20 20 20 20 20 20 6d 65 73 68 48 65  ,.        meshHe
aef0: 69 67 68 74 3a 20 31 38 2c 0a 20 20 20 20 7d 29  ight: 18,.    })
af00: 3b 0a 20 20 20 20 76 69 73 75 61 6c 69 7a 65 72  ;.    visualizer
af10: 2e 63 6f 6e 6e 65 63 74 41 75 64 69 6f 28 54 6f  .connectAudio(To
af20: 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74 28 29 2e  ne.getContext().
af30: 64 65 73 74 69 6e 61 74 69 6f 6e 29 3b 0a 20 20  destination);.  
af40: 20 20 63 6f 6e 73 74 20 70 72 65 73 65 74 73 20    const presets 
af50: 3d 20 77 69 6e 64 6f 77 2e 62 75 74 74 65 72 63  = window.butterc
af60: 68 75 72 6e 50 72 65 73 65 74 73 2e 67 65 74 50  hurnPresets.getP
af70: 72 65 73 65 74 73 28 29 3b 0a 20 20 20 20 63 6f  resets();.    co
af80: 6e 73 74 20 70 72 65 73 65 74 50 61 72 61 6d 20  nst presetParam 
af90: 3d 20 70 72 65 73 65 74 73 5b 70 72 65 73 65 74  = presets[preset
afa0: 5d 3b 0a 20 20 20 20 76 69 73 75 61 6c 69 7a 65  ];.    visualize
afb0: 72 2e 6c 6f 61 64 50 72 65 73 65 74 28 70 72 65  r.loadPreset(pre
afc0: 73 65 74 50 61 72 61 6d 2c 20 30 2e 30 29 3b 20  setParam, 0.0); 
afd0: 2f 2f 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  // 2nd argument 
afe0: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
aff0: 20 73 65 63 6f 6e 64 73 20 74 6f 20 62 6c 65 6e   seconds to blen
b000: 64 20 70 72 65 73 65 74 73 0a 20 20 20 20 72 65  d presets.    re
b010: 74 75 72 6e 20 76 69 73 75 61 6c 69 7a 65 72 3b  turn visualizer;
b020: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 75 61  .}..function gua
b030: 72 64 28 72 61 6e 67 65 29 20 7b 0a 20 20 20 20  rd(range) {.    
b040: 76 61 72 20 73 74 61 74 65 20 3d 20 6e 75 6c 6c  var state = null
b050: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 75 6e  ;.    return fun
b060: 63 74 69 6f 6e 20 28 76 61 6c 29 20 7b 0a 20 20  ction (val) {.  
b070: 20 20 20 20 20 20 69 66 20 28 28 76 61 6c 20 3e        if ((val >
b080: 3d 20 72 61 6e 67 65 5b 30 5d 29 20 26 26 20 28  = range[0]) && (
b090: 76 61 6c 20 3c 3d 20 72 61 6e 67 65 5b 31 5d 29  val <= range[1])
b0a0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
b0b0: 73 74 61 74 65 20 3d 20 76 61 6c 3b 0a 20 20 20  state = val;.   
b0c0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
b0d0: 76 61 6c 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  val;.        } e
b0e0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
b0f0: 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a    return state;.
b100: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
b110: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 72 6f 6d 61  }..function roma
b120: 6e 74 6f 67 79 70 73 79 28 68 65 78 29 20 7b 0a  ntogypsy(hex) {.
b130: 20 20 20 20 76 61 72 20 6c 65 74 74 65 72 73 20      var letters 
b140: 3d 20 68 65 78 2e 72 65 70 6c 61 63 65 28 27 60  = hex.replace('`
b150: 30 27 2c 27 61 27 29 3b 0a 20 20 20 20 6c 65 74  0','a');.    let
b160: 74 65 72 73 20 3d 20 6c 65 74 74 65 72 73 2e 72  ters = letters.r
b170: 65 70 6c 61 63 65 28 27 60 31 27 2c 27 62 27 29  eplace('`1','b')
b180: 3b 0a 20 20 20 20 6c 65 74 74 65 72 73 20 3d 20  ;.    letters = 
b190: 6c 65 74 74 65 72 73 2e 72 65 70 6c 61 63 65 28  letters.replace(
b1a0: 27 60 32 27 2c 27 63 27 29 3b 0a 20 20 20 20 6c  '`2','c');.    l
b1b0: 65 74 74 65 72 73 20 3d 20 6c 65 74 74 65 72 73  etters = letters
b1c0: 2e 72 65 70 6c 61 63 65 28 27 60 33 27 2c 27 64  .replace('`3','d
b1d0: 27 29 3b 0a 20 20 20 20 6c 65 74 74 65 72 73 20  ');.    letters 
b1e0: 3d 20 6c 65 74 74 65 72 73 2e 72 65 70 6c 61 63  = letters.replac
b1f0: 65 28 27 60 34 27 2c 27 65 27 29 3b 0a 20 20 20  e('`4','e');.   
b200: 20 6c 65 74 74 65 72 73 20 3d 20 6c 65 74 74 65   letters = lette
b210: 72 73 2e 72 65 70 6c 61 63 65 28 27 60 35 27 2c  rs.replace('`5',
b220: 27 66 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  'f');.    return
b230: 20 6c 65 74 74 65 72 73 3b 0a 7d 0a 0a 66 75 6e   letters;.}..fun
b240: 63 74 69 6f 6e 20 6c 65 74 74 65 72 74 6f 64 65  ction lettertode
b250: 63 28 6c 65 74 74 65 72 29 20 7b 0a 20 20 20 20  c(letter) {.    
b260: 76 61 72 20 62 69 6e 20 3d 20 22 22 3b 0a 20 20  var bin = "";.  
b270: 20 20 69 66 20 28 6c 65 74 74 65 72 2e 6d 61 74    if (letter.mat
b280: 63 68 28 2f 5c 64 2f 29 29 20 7b 0a 20 20 20 20  ch(/\d/)) {.    
b290: 20 20 20 20 6e 6f 20 3d 20 70 61 72 73 65 49 6e      no = parseIn
b2a0: 74 28 6c 65 74 74 65 72 29 3b 0a 20 20 20 20 7d  t(letter);.    }
b2b0: 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65  .    else if (le
b2c0: 74 74 65 72 20 3d 3d 20 22 61 22 29 20 7b 0a 20  tter == "a") {. 
b2d0: 20 20 20 20 20 20 20 6e 6f 20 3d 20 31 30 3b 0a         no = 10;.
b2e0: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
b2f0: 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 62 22  f (letter == "b"
b300: 29 20 7b 0a 20 20 20 20 20 20 20 20 6e 6f 20 3d  ) {.        no =
b310: 20 31 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   11;.    }.    e
b320: 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d  lse if (letter =
b330: 3d 20 22 63 22 29 20 7b 0a 20 20 20 20 20 20 20  = "c") {.       
b340: 20 6e 6f 20 3d 20 31 32 3b 0a 20 20 20 20 7d 0a   no = 12;.    }.
b350: 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74      else if (let
b360: 74 65 72 20 3d 3d 20 22 64 22 29 20 7b 0a 20 20  ter == "d") {.  
b370: 20 20 20 20 20 20 6e 6f 20 3d 20 31 33 3b 0a 20        no = 13;. 
b380: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
b390: 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 65 22 29   (letter == "e")
b3a0: 20 7b 0a 20 20 20 20 20 20 20 20 6e 6f 20 3d 20   {.        no = 
b3b0: 31 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  14;.    }.    el
b3c0: 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d  se if (letter ==
b3d0: 20 22 66 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "f") {.        
b3e0: 6e 6f 20 3d 20 31 35 3b 0a 20 20 20 20 7d 0a 20  no = 15;.    }. 
b3f0: 20 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69     for (i = 1; i
b400: 20 3c 3d 20 6e 6f 3b 20 69 2b 2b 29 20 7b 0a 20   <= no; i++) {. 
b410: 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30         bin += "0
b420: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ";.    }.    ret
b430: 75 72 6e 20 62 69 6e 3b 0a 7d 0a 0a 66 75 6e 63  urn bin;.}..func
b440: 74 69 6f 6e 20 6c 65 74 74 65 72 74 6f 62 69 6e  tion lettertobin
b450: 28 6c 65 74 74 65 72 29 20 7b 0a 20 20 20 20 76  (letter) {.    v
b460: 61 72 20 62 69 6e 20 3d 20 22 22 3b 0a 20 20 20  ar bin = "";.   
b470: 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22   if (letter == "
b480: 30 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69  0") {.        bi
b490: 6e 20 2b 3d 20 22 30 30 30 30 22 3b 0a 20 20 20  n += "0000";.   
b4a0: 20 7d 0a 20 20 20 20 69 66 20 28 6c 65 74 74 65   }.    if (lette
b4b0: 72 20 3d 3d 20 22 31 22 29 20 7b 0a 20 20 20 20  r == "1") {.    
b4c0: 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 30 30 31      bin += "0001
b4d0: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ";.    }.    els
b4e0: 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20  e if (letter == 
b4f0: 22 32 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62  "2") {.        b
b500: 69 6e 20 2b 3d 20 22 30 30 31 30 22 3b 0a 20 20  in += "0010";.  
b510: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
b520: 28 6c 65 74 74 65 72 20 3d 3d 20 22 33 22 29 20  (letter == "3") 
b530: 7b 0a 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d  {.        bin +=
b540: 20 22 30 30 31 31 22 3b 0a 20 20 20 20 7d 0a 20   "0011";.    }. 
b550: 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74     else if (lett
b560: 65 72 20 3d 3d 20 22 34 22 29 20 7b 0a 20 20 20  er == "4") {.   
b570: 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 31 30       bin += "010
b580: 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  0";.    }.    el
b590: 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d  se if (letter ==
b5a0: 20 22 35 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "5") {.        
b5b0: 62 69 6e 20 2b 3d 20 22 30 31 30 31 22 3b 0a 20  bin += "0101";. 
b5c0: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
b5d0: 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 36 22 29   (letter == "6")
b5e0: 20 7b 0a 20 20 20 20 20 20 20 20 62 69 6e 20 2b   {.        bin +
b5f0: 3d 20 22 30 31 31 30 22 3b 0a 20 20 20 20 7d 0a  = "0110";.    }.
b600: 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74      else if (let
b610: 74 65 72 20 3d 3d 20 22 37 22 29 20 7b 0a 20 20  ter == "7") {.  
b620: 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 31        bin += "01
b630: 31 31 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  11";.    }.    e
b640: 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d  lse if (letter =
b650: 3d 20 22 38 22 29 20 7b 0a 20 20 20 20 20 20 20  = "8") {.       
b660: 20 62 69 6e 20 2b 3d 20 22 31 30 30 30 22 3b 0a   bin += "1000";.
b670: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
b680: 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 39 22  f (letter == "9"
b690: 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69 6e 20  ) {.        bin 
b6a0: 2b 3d 20 22 31 30 30 31 22 3b 0a 20 20 20 20 7d  += "1001";.    }
b6b0: 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65  .    else if (le
b6c0: 74 74 65 72 20 3d 3d 20 22 61 22 29 20 7b 0a 20  tter == "a") {. 
b6d0: 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 31         bin += "1
b6e0: 30 31 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  010";.    }.    
b6f0: 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20  else if (letter 
b700: 3d 3d 20 22 62 22 29 20 7b 0a 20 20 20 20 20 20  == "b") {.      
b710: 20 20 62 69 6e 20 2b 3d 20 22 31 30 31 31 22 3b    bin += "1011";
b720: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
b730: 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 63  if (letter == "c
b740: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69 6e  ") {.        bin
b750: 20 2b 3d 20 22 31 31 30 30 22 3b 0a 20 20 20 20   += "1100";.    
b760: 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c  }.    else if (l
b770: 65 74 74 65 72 20 3d 3d 20 22 64 22 29 20 7b 0a  etter == "d") {.
b780: 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22          bin += "
b790: 31 31 30 31 22 3b 0a 20 20 20 20 7d 0a 20 20 20  1101";.    }.   
b7a0: 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72   else if (letter
b7b0: 20 3d 3d 20 22 65 22 29 20 7b 0a 20 20 20 20 20   == "e") {.     
b7c0: 20 20 20 62 69 6e 20 2b 3d 20 22 31 31 31 30 22     bin += "1110"
b7d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
b7e0: 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22   if (letter == "
b7f0: 66 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69  f") {.        bi
b800: 6e 20 2b 3d 20 22 31 31 31 31 22 3b 0a 20 20 20  n += "1111";.   
b810: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 62 69   }.    return bi
b820: 6e 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 68  n;.}..function h
b830: 65 78 32 62 69 6e 28 68 65 78 29 20 7b 0a 20 20  ex2bin(hex) {.  
b840: 20 20 76 61 72 20 6c 65 74 74 65 72 73 20 3d 20    var letters = 
b850: 72 6f 6d 61 6e 74 6f 67 79 70 73 79 28 68 65 78  romantogypsy(hex
b860: 29 0a 20 20 20 20 6c 65 74 74 65 72 73 20 3d 20  ).    letters = 
b870: 6c 65 74 74 65 72 73 2e 73 70 6c 69 74 28 27 27  letters.split(''
b880: 29 3b 0a 20 20 20 20 76 61 72 20 62 69 6e 20 3d  );.    var bin =
b890: 20 22 22 3b 0a 20 20 20 20 6c 65 74 74 65 72 73   "";.    letters
b8a0: 2e 6d 61 70 28 66 75 6e 63 74 69 6f 6e 28 6c 65  .map(function(le
b8b0: 74 74 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  tter) {.        
b8c0: 62 69 6e 20 2b 3d 20 6c 65 74 74 65 72 74 6f 62  bin += lettertob
b8d0: 69 6e 28 6c 65 74 74 65 72 29 0a 20 20 20 20 7d  in(letter).    }
b8e0: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 62 69 6e  ).    return bin
b8f0: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65  ;.}..function ge
b900: 74 5f 63 68 61 72 28 73 74 72 2c 20 69 6e 64 65  t_char(str, inde
b910: 78 29 20 7b 0a 20 20 20 20 69 66 20 28 28 69 6e  x) {.    if ((in
b920: 64 65 78 20 3e 20 30 29 20 26 26 20 28 69 6e 64  dex > 0) && (ind
b930: 65 78 20 3c 20 73 74 72 2e 6c 65 6e 67 74 68 29  ex < str.length)
b940: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
b950: 72 6e 20 73 74 72 5b 69 6e 64 65 78 5d 3b 0a 20  rn str[index];. 
b960: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
b970: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 0a      return null.
b980: 20 20 20 20 7d 0a 7d 0a 0a 66 75 6e 63 74 69 6f      }.}..functio
b990: 6e 20 70 61 74 74 65 72 6e 5f 6d 65 74 61 28 70  n pattern_meta(p
b9a0: 29 20 7b 0a 20 20 20 20 69 66 20 28 21 70 29 20  ) {.    if (!p) 
b9b0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
b9c0: 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20   null;.    }.   
b9d0: 20 70 20 3d 20 70 2e 72 65 70 6c 61 63 65 28 2f   p = p.replace(/
b9e0: 20 2f 67 2c 20 22 22 29 3b 0a 20 20 20 20 76 61   /g, "");.    va
b9f0: 72 20 66 63 20 3d 20 70 2e 73 70 6c 69 74 28 27  r fc = p.split('
ba00: 27 29 5b 30 5d 3b 0a 20 20 20 20 69 66 20 28 66  ')[0];.    if (f
ba10: 63 3d 3d 20 22 70 22 29 20 7b 0a 20 20 20 20 20  c== "p") {.     
ba20: 20 20 20 76 61 72 20 70 74 79 70 65 20 3d 20 22     var ptype = "
ba30: 78 6f 22 3b 0a 20 20 20 20 20 20 20 20 76 61 72  xo";.        var
ba40: 20 6c 20 3d 20 28 70 2e 6c 65 6e 67 74 68 20 2d   l = (p.length -
ba50: 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   1);.    }..    
ba60: 69 66 20 28 70 74 79 70 65 20 3d 3d 20 22 78 6f  if (ptype == "xo
ba70: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72  ") {.        var
ba80: 20 66 70 20 3d 20 70 2e 73 75 62 73 74 72 28 31   fp = p.substr(1
ba90: 29 3b 0a 20 20 20 20 20 20 20 20 66 70 20 3d 20  );.        fp = 
baa0: 66 70 2e 72 65 70 6c 61 63 65 28 2f 78 2f 67 2c  fp.replace(/x/g,
bab0: 20 22 31 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   "1");.    }..  
bac0: 20 20 69 66 20 28 21 66 70 29 20 7b 0a 20 20 20    if (!fp) {.   
bad0: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
bae0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 76 61 72  ;.    }..    var
baf0: 20 64 6f 6e 65 20 3d 20 66 61 6c 73 65 3b 0a 20   done = false;. 
bb00: 20 20 20 76 61 72 20 69 6e 64 65 78 20 3d 20 30     var index = 0
bb10: 3b 0a 20 20 20 20 76 61 72 20 6d 65 74 61 20 3d  ;.    var meta =
bb20: 20 7b 7d 0a 20 20 20 20 76 61 72 20 6f 6e 65 5f   {}.    var one_
bb30: 69 6e 64 65 78 20 3d 20 31 3b 0a 0a 20 20 20 20  index = 1;..    
bb40: 77 68 69 6c 65 28 31 29 20 7b 0a 20 20 20 20 20  while(1) {.     
bb50: 20 20 20 69 66 20 28 69 6e 64 65 78 20 3e 20 66     if (index > f
bb60: 70 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20  p.length) {.    
bb70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
bb80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bb90: 20 76 61 72 20 63 75 72 72 65 6e 74 5f 6d 65 74   var current_met
bba0: 61 20 3d 20 7b 7d 0a 20 20 20 20 20 20 20 20 76  a = {}.        v
bbb0: 61 72 20 63 75 72 72 65 6e 74 5f 6c 65 74 74 65  ar current_lette
bbc0: 72 20 3d 20 66 70 5b 69 6e 64 65 78 5d 0a 20 20  r = fp[index].  
bbd0: 20 20 20 20 20 20 69 66 20 28 63 75 72 72 65 6e        if (curren
bbe0: 74 5f 6c 65 74 74 65 72 20 3d 3d 20 22 5f 22 29  t_letter == "_")
bbf0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
bc00: 65 74 61 5b 6f 6e 65 5f 69 6e 64 65 78 20 2d 31  eta[one_index -1
bc10: 5d 20 3d 20 7b 22 76 6f 6c 75 6d 65 22 3a 20 22  ] = {"volume": "
bc20: 6f 66 66 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  off" };.        
bc30: 20 20 20 20 69 6e 64 65 78 20 2b 3d 20 32 3b 0a      index += 2;.
bc40: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 5f              one_
bc50: 69 6e 64 65 78 20 2b 3d 20 32 3b 0a 20 20 20 20  index += 2;.    
bc60: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
bc70: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
bc80: 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 75 72      else if (cur
bc90: 72 65 6e 74 5f 6c 65 74 74 65 72 20 3d 3d 20 22  rent_letter == "
bca0: 31 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1") {.          
bcb0: 20 20 76 61 72 20 6e 65 78 74 5f 6c 65 74 74 65    var next_lette
bcc0: 72 20 3d 20 67 65 74 5f 63 68 61 72 28 66 70 2c  r = get_char(fp,
bcd0: 69 6e 64 65 78 20 2b 20 31 29 3b 0a 20 20 20 20  index + 1);.    
bce0: 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 78 74          if (next
bcf0: 5f 6c 65 74 74 65 72 20 3d 3d 20 22 5b 22 29 20  _letter == "[") 
bd00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bd10: 20 20 76 61 72 20 6a 75 6d 70 5f 69 6e 64 65 78    var jump_index
bd20: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
bd30: 20 20 20 20 20 20 76 61 72 20 62 75 66 66 65 72        var buffer
bd40: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   = "";.         
bd50: 20 20 20 20 20 20 20 77 68 69 6c 65 28 31 29 20         while(1) 
bd60: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
bd70: 20 20 20 20 20 20 69 66 20 28 28 28 69 6e 64 65        if (((inde
bd80: 78 20 2b 20 31 29 20 2b 20 6a 75 6d 70 5f 69 6e  x + 1) + jump_in
bd90: 64 65 78 29 20 3e 20 66 70 2e 6c 65 6e 67 74 68  dex) > fp.length
bda0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
bdb0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
bdc0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
bdd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bde0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
bdf0: 20 62 5f 6e 65 78 74 5f 6c 65 74 74 65 72 20 3d   b_next_letter =
be00: 20 67 65 74 5f 63 68 61 72 28 66 70 2c 20 28 28   get_char(fp, ((
be10: 69 6e 64 65 78 20 2b 20 31 29 20 2b 20 6a 75 6d  index + 1) + jum
be20: 70 5f 69 6e 64 65 78 29 29 3b 0a 0a 20 20 20 20  p_index));..    
be30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be40: 69 66 20 28 62 5f 6e 65 78 74 5f 6c 65 74 74 65  if (b_next_lette
be50: 72 20 3d 3d 20 22 5d 22 29 20 7b 0a 20 20 20 20  r == "]") {.    
be60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
be70: 20 20 20 20 6a 75 6d 70 5f 69 6e 64 65 78 20 2b      jump_index +
be80: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
be90: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
bea0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
beb0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
bec0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bed0: 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72 20           buffer 
bee0: 2b 3d 20 62 5f 6e 65 78 74 5f 6c 65 74 74 65 72  += b_next_letter
bef0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
bf00: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 5f 69            jump_i
bf10: 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20  ndex += 1;.     
bf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
bf30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
bf40: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
bf50: 20 20 20 76 61 72 20 69 6e 64 69 76 69 64 75 61     var individua
bf60: 6c 5f 6d 65 74 61 20 3d 20 62 75 66 66 65 72 2e  l_meta = buffer.
bf70: 73 70 6c 69 74 28 22 3b 22 29 0a 20 20 20 20 20  split(";").     
bf80: 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 76             indiv
bf90: 69 64 75 61 6c 5f 6d 65 74 61 2e 6d 61 70 28 66  idual_meta.map(f
bfa0: 75 6e 63 74 69 6f 6e 20 28 65 29 20 7b 0a 20 20  unction (e) {.  
bfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bfc0: 20 20 69 66 20 28 65 2e 73 74 61 72 74 73 57 69    if (e.startsWi
bfd0: 74 68 28 22 5f 22 29 29 20 7b 0a 20 20 20 20 20  th("_")) {.     
bfe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bff0: 20 20 20 63 75 72 72 65 6e 74 5f 6d 65 74 61 5b     current_meta[
c000: 22 70 61 6e 22 5d 20 3d 20 65 2e 73 75 62 73 74  "pan"] = e.subst
c010: 72 69 6e 67 28 31 29 0a 20 20 20 20 20 20 20 20  ring(1).        
c020: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
c030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c040: 20 20 69 66 20 28 65 2e 73 74 61 72 74 73 57 69    if (e.startsWi
c050: 74 68 28 22 5e 22 29 29 20 7b 0a 20 20 20 20 20  th("^")) {.     
c060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c070: 20 20 20 63 75 72 72 65 6e 74 5f 6d 65 74 61 5b     current_meta[
c080: 22 70 69 74 63 68 22 5d 20 3d 20 65 2e 73 75 62  "pitch"] = e.sub
c090: 73 74 72 69 6e 67 28 31 29 0a 20 20 20 20 20 20  string(1).      
c0a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
c0b0: 65 6c 73 65 20 69 66 20 28 65 2e 73 74 61 72 74  else if (e.start
c0c0: 73 57 69 74 68 28 22 2b 22 29 29 20 7b 0a 20 20  sWith("+")) {.  
c0d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c0e0: 20 20 20 20 20 20 63 75 72 72 65 6e 74 5f 6d 65        current_me
c0f0: 74 61 5b 22 64 65 6c 61 79 22 5d 20 3d 20 65 0a  ta["delay"] = e.
c100: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c110: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
c120: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c130: 20 20 20 20 20 63 75 72 72 65 6e 74 5f 6d 65 74       current_met
c140: 61 5b 22 76 6f 6c 75 6d 65 22 5d 20 3d 20 65 0a  a["volume"] = e.
c150: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c160: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
c170: 20 20 20 20 20 20 7d 29 0a 20 20 20 20 20 20 20        }).       
c180: 20 20 20 20 20 20 20 20 20 6d 65 74 61 5b 6f 6e           meta[on
c190: 65 5f 69 6e 64 65 78 20 2d 31 5d 20 3d 20 63 75  e_index -1] = cu
c1a0: 72 72 65 6e 74 5f 6d 65 74 61 0a 20 20 20 20 20  rrent_meta.     
c1b0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 78             index
c1c0: 20 2b 3d 20 6a 75 6d 70 5f 69 6e 64 65 78 3b 0a   += jump_index;.
c1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c1e0: 6f 6e 65 5f 69 6e 64 65 78 20 2b 3d 20 31 3b 0a  one_index += 1;.
c1f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c200: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c210: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
c220: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
c230: 65 74 61 5b 6f 6e 65 5f 69 6e 64 65 78 20 2d 31  eta[one_index -1
c240: 5d 20 3d 20 63 75 72 72 65 6e 74 5f 6d 65 74 61  ] = current_meta
c250: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c260: 20 6f 6e 65 5f 69 6e 64 65 78 20 2b 3d 20 31 3b   one_index += 1;
c270: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c280: 20 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20   index += 1;.   
c290: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
c2a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c2b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
c2c0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
c2d0: 20 20 69 66 20 28 63 75 72 72 65 6e 74 5f 6c 65    if (current_le
c2e0: 74 74 65 72 20 3d 3d 20 22 2a 22 29 20 7b 0a 20  tter == "*") {. 
c2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
c300: 61 72 20 6e 65 78 74 5f 6c 65 74 74 65 72 20 3d  ar next_letter =
c310: 20 67 65 74 5f 63 68 61 72 28 66 70 2c 69 6e 64   get_char(fp,ind
c320: 65 78 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20  ex + 1);.       
c330: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 78           if (nex
c340: 74 5f 6c 65 74 74 65 72 20 3d 3d 20 22 60 22 29  t_letter == "`")
c350: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
c360: 20 20 20 20 20 20 20 69 6e 64 65 78 20 2b 3d 20         index += 
c370: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3;.             
c380: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
c390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3a0: 69 6e 64 65 78 20 2b 3d 20 32 3b 0a 20 20 20 20  index += 2;.    
c3b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c3c0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
c3d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
c3e0: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
c3f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
c400: 20 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20   index += 1;.   
c410: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65               one
c420: 5f 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20  _index += 1;.   
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
c440: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
c450: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
c460: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
c470: 6d 65 74 61 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 2e  meta;.}..window.
c480: 70 61 74 74 65 72 6e 5f 6d 65 74 61 20 3d 20 70  pattern_meta = p
c490: 61 74 74 65 72 6e 5f 6d 65 74 61 3b 0a 0a 0a 66  attern_meta;...f
c4a0: 75 6e 63 74 69 6f 6e 20 63 75 65 28 68 74 6d 6c  unction cue(html
c4b0: 2c 20 73 65 63 6f 6e 64 73 20 3d 20 35 29 20 7b  , seconds = 5) {
c4c0: 0a 20 20 20 20 20 20 20 20 24 28 22 23 63 75 65  .        $("#cue
c4d0: 64 22 29 2e 68 74 6d 6c 28 68 74 6d 6c 29 3b 0a  d").html(html);.
c4e0: 20 20 20 20 20 20 20 20 73 65 74 54 69 6d 65 6f          setTimeo
c4f0: 75 74 28 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  ut(function () {
c500: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 28 22  .            $("
c510: 23 63 75 65 64 22 29 2e 68 74 6d 6c 28 22 22 29  #cued").html("")
c520: 3b 0a 20 20 20 20 20 20 20 20 7d 2c 20 73 65 63  ;.        }, sec
c530: 6f 6e 64 73 20 2a 20 31 30 30 30 29 0a 7d 0a 0a  onds * 1000).}..
c540: 77 69 6e 64 6f 77 2e 63 75 65 20 3d 20 63 75 65  window.cue = cue
c550: 3b 0a 0a 61 73 79 6e 63 20 66 75 6e 63 74 69 6f  ;..async functio
c560: 6e 20 6c 6f 61 64 53 61 6d 70 6c 65 73 54 6f 57  n loadSamplesToW
c570: 6f 72 6b 6c 65 74 28 75 72 6c 73 29 20 7b 0a 20  orklet(urls) {. 
c580: 20 20 20 76 61 72 20 63 6f 6e 74 65 78 74 20 3d     var context =
c590: 20 54 6f 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74   Tone.getContext
c5a0: 28 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 2e 63  ();.    window.c
c5b0: 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74  ontext = context
c5c0: 3b 0a 20 20 20 20 61 77 61 69 74 20 63 6f 6e 74  ;.    await cont
c5d0: 65 78 74 2e 61 64 64 41 75 64 69 6f 57 6f 72 6b  ext.addAudioWork
c5e0: 6c 65 74 4d 6f 64 75 6c 65 28 27 2f 73 61 6d 70  letModule('/samp
c5f0: 6c 65 72 2e 6a 73 27 2c 20 27 73 61 6d 70 6c 65  ler.js', 'sample
c600: 72 27 29 3b 0a 20 20 20 20 76 61 72 20 73 61 6d  r');.    var sam
c610: 70 6c 65 72 20 3d 20 61 77 61 69 74 20 63 6f 6e  pler = await con
c620: 74 65 78 74 2e 63 72 65 61 74 65 41 75 64 69 6f  text.createAudio
c630: 57 6f 72 6b 6c 65 74 4e 6f 64 65 28 27 73 61 6d  WorkletNode('sam
c640: 70 6c 65 72 27 2c 20 7b 0a 20 20 20 20 20 20 20  pler', {.       
c650: 20 6f 75 74 70 75 74 43 68 61 6e 6e 65 6c 43 6f   outputChannelCo
c660: 75 6e 74 3a 20 5b 32 5d 2c 20 20 2f 2f 20 73 74  unt: [2],  // st
c670: 65 72 65 6f 0a 20 20 20 20 7d 29 3b 0a 20 20 20  ereo.    });.   
c680: 20 77 69 6e 64 6f 77 2e 73 61 6d 70 6c 65 72 20   window.sampler 
c690: 3d 20 73 61 6d 70 6c 65 72 3b 0a 20 20 20 20 76  = sampler;.    v
c6a0: 61 72 20 66 69 6c 65 73 20 3d 20 5b 5d 0a 20 20  ar files = [].  
c6b0: 20 20 66 6f 72 20 28 76 61 72 20 69 20 3d 20 30    for (var i = 0
c6c0: 3b 20 69 20 3c 20 75 72 6c 73 2e 6c 65 6e 67 74  ; i < urls.lengt
c6d0: 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  h; i++) {.      
c6e0: 20 20 76 61 72 20 75 72 6c 20 3d 20 75 72 6c 73    var url = urls
c6f0: 5b 69 5d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  [i].        cons
c700: 74 20 73 6f 75 72 63 65 20 3d 20 63 6f 6e 74 65  t source = conte
c710: 78 74 2e 63 72 65 61 74 65 42 75 66 66 65 72 53  xt.createBufferS
c720: 6f 75 72 63 65 28 29 3b 0a 20 20 20 20 20 20 20  ource();.       
c730: 20 63 6f 6e 73 74 20 61 75 64 69 6f 42 75 66 66   const audioBuff
c740: 65 72 20 3d 20 61 77 61 69 74 20 66 65 74 63 68  er = await fetch
c750: 28 75 72 6c 29 0a 20 20 20 20 20 20 20 20 20 20  (url).          
c760: 20 20 2e 74 68 65 6e 28 72 65 73 20 3d 3e 20 72    .then(res => r
c770: 65 73 2e 61 72 72 61 79 42 75 66 66 65 72 28 29  es.arrayBuffer()
c780: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 74  ).            .t
c790: 68 65 6e 28 41 72 72 61 79 42 75 66 66 65 72 20  hen(ArrayBuffer 
c7a0: 3d 3e 20 63 6f 6e 74 65 78 74 2e 64 65 63 6f 64  => context.decod
c7b0: 65 41 75 64 69 6f 44 61 74 61 28 41 72 72 61 79  eAudioData(Array
c7c0: 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 20  Buffer));..     
c7d0: 20 20 20 63 6f 6e 73 74 20 70 63 6d 4c 65 66 74     const pcmLeft
c7e0: 20 3d 20 20 61 75 64 69 6f 42 75 66 66 65 72 2e   =  audioBuffer.
c7f0: 67 65 74 43 68 61 6e 6e 65 6c 44 61 74 61 28 30  getChannelData(0
c800: 29 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ).        const 
c810: 70 63 6d 52 69 67 68 74 20 3d 20 61 75 64 69 6f  pcmRight = audio
c820: 42 75 66 66 65 72 2e 67 65 74 43 68 61 6e 6e 65  Buffer.getChanne
c830: 6c 44 61 74 61 28 31 29 0a 20 20 20 20 20 20 20  lData(1).       
c840: 20 66 69 6c 65 73 2e 70 75 73 68 28 7b 20 70 63   files.push({ pc
c850: 6d 4c 65 66 74 2c 20 70 63 6d 52 69 67 68 74 20  mLeft, pcmRight 
c860: 7d 29 0a 20 20 20 20 7d 0a 20 20 20 20 73 61 6d  }).    }.    sam
c870: 70 6c 65 72 2e 70 6f 72 74 2e 70 6f 73 74 4d 65  pler.port.postMe
c880: 73 73 61 67 65 28 7b 20 69 6e 69 74 3a 20 20 66  ssage({ init:  f
c890: 69 6c 65 73 20 7d 29 0a 20 20 20 20 63 6f 6e 74  iles }).    cont
c8a0: 65 78 74 2e 72 61 77 43 6f 6e 74 65 78 74 2e 72  ext.rawContext.r
c8b0: 65 73 75 6d 65 28 29 3b 0a 20 20 20 20 73 61 6d  esume();.    sam
c8c0: 70 6c 65 72 2e 63 6f 6e 6e 65 63 74 28 54 6f 6e  pler.connect(Ton
c8d0: 65 2e 67 65 74 43 6f 6e 74 65 78 74 28 29 2e 72  e.getContext().r
c8e0: 61 77 43 6f 6e 74 65 78 74 2e 64 65 73 74 69 6e  awContext.destin
c8f0: 61 74 69 6f 6e 29 3b 0a 7d 0a 0a 66 75 6e 63 74  ation);.}..funct
c900: 69 6f 6e 20 53 61 6d 70 6c 65 28 6e 61 6d 65 2c  ion Sample(name,
c910: 20 6e 6f 2c 20 66 69 6c 74 65 72 2c 20 76 6f 6c   no, filter, vol
c920: 75 6d 65 29 20 7b 0a 20 20 20 20 6e 61 6d 65 20  ume) {.    name 
c930: 3d 20 6e 61 6d 65 0a 20 20 20 20 66 69 6c 74 65  = name.    filte
c940: 72 20 3d 20 66 69 6c 74 65 72 20 7c 7c 20 31 30  r = filter || 10
c950: 30 30 30 0a 20 20 20 20 76 6f 6c 75 6d 65 20 3d  000.    volume =
c960: 20 76 6f 6c 75 6d 65 20 7c 7c 20 30 0a 20 20 20   volume || 0.   
c970: 20 6d 65 6d 5b 6e 61 6d 65 20 2b 20 22 5f 66 69   mem[name + "_fi
c980: 6c 74 65 72 22 5d 20 3d 20 6e 65 77 20 54 6f 6e  lter"] = new Ton
c990: 65 2e 46 69 6c 74 65 72 28 66 69 6c 74 65 72 2c  e.Filter(filter,
c9a0: 20 27 6c 6f 77 70 61 73 73 27 2c 20 2d 39 36 29   'lowpass', -96)
c9b0: 3b 0a 20 20 20 20 6d 65 6d 5b 6e 61 6d 65 20 2b  ;.    mem[name +
c9c0: 20 22 5f 63 68 61 6e 6e 65 6c 22 5d 20 3d 20 6e   "_channel"] = n
c9d0: 65 77 20 54 6f 6e 65 2e 43 68 61 6e 6e 65 6c 28  ew Tone.Channel(
c9e0: 7b 63 68 61 6e 6e 65 6c 43 6f 75 6e 74 3a 20 32  {channelCount: 2
c9f0: 2c 20 76 6f 6c 75 6d 65 3a 20 76 6f 6c 75 6d 65  , volume: volume
ca00: 7d 29 2e 63 68 61 69 6e 28 6d 65 6d 5b 6e 61 6d  }).chain(mem[nam
ca10: 65 20 2b 20 22 5f 66 69 6c 74 65 72 22 5d 2c 20  e + "_filter"], 
ca20: 6d 65 6d 2e 6d 61 73 74 65 72 29 0a 20 20 20 20  mem.master).    
ca30: 73 61 6d 70 6c 65 73 5b 6e 6f 5d 2e 63 6f 6e 6e  samples[no].conn
ca40: 65 63 74 28 6d 65 6d 5b 6e 61 6d 65 20 2b 20 22  ect(mem[name + "
ca50: 5f 63 68 61 6e 6e 65 6c 22 5d 29 3b 0a 20 20 20  _channel"]);.   
ca60: 20 68 69 74 5f 6d 61 70 5b 6e 61 6d 65 5d 20 3d   hit_map[name] =
ca70: 20 6e 6f 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 2e 53   no;.}..window.S
ca80: 61 6d 70 6c 65 20 3d 20 53 61 6d 70 6c 65 3b 0a  ample = Sample;.
ca90: 0a 66 75 6e 63 74 69 6f 6e 20 70 77 28 73 2c 20  .function pw(s, 
caa0: 76 6f 6c 2c 20 6e 6f 74 65 2c 20 6c 65 6e 2c 20  vol, note, len, 
cab0: 64 65 6c 61 79 2c 20 70 61 6e 3d 30 29 20 7b 0a  delay, pan=0) {.
cac0: 20 20 20 20 77 69 6e 64 6f 77 2e 73 61 6d 70 6c      window.sampl
cad0: 65 72 2e 70 6f 72 74 2e 70 6f 73 74 4d 65 73 73  er.port.postMess
cae0: 61 67 65 28 7b 20 6e 6f 74 65 4f 6e 3a 20 74 72  age({ noteOn: tr
caf0: 75 65 2c 20 73 61 6d 70 6c 65 3a 20 73 2c 20 76  ue, sample: s, v
cb00: 6f 6c 75 6d 65 3a 20 76 6f 6c 7d 29 3b 0a 7d 0a  olume: vol});.}.
cb10: 0a 77 69 6e 64 6f 77 2e 70 77 20 3d 20 70 77 3b  .window.pw = pw;
cb20: 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 28 73 2c 20  ..function p(s, 
cb30: 76 6f 6c 2c 20 6e 6f 74 65 2c 20 6c 65 6e 2c 20  vol, note, len, 
cb40: 64 65 6c 61 79 2c 20 70 61 6e 3d 30 29 20 7b 0a  delay, pan=0) {.
cb50: 20 20 20 20 6e 6f 74 65 20 3d 20 6e 6f 74 65 20      note = note 
cb60: 7c 7c 20 22 43 33 22 0a 20 20 20 20 6c 65 6e 20  || "C3".    len 
cb70: 3d 20 6c 65 6e 20 7c 7c 20 22 31 36 6e 22 0a 20  = len || "16n". 
cb80: 20 20 20 76 6f 6c 20 3d 20 76 6f 6c 20 7c 7c 20     vol = vol || 
cb90: 31 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  1.    delay = de
cba0: 6c 61 79 20 7c 7c 20 22 2b 30 22 3b 0a 20 20 20  lay || "+0";.   
cbb0: 20 66 6f 72 20 28 63 6f 6e 73 74 20 5b 6b 65 79   for (const [key
cbc0: 2c 20 76 61 6c 75 65 5d 20 6f 66 20 4f 62 6a 65  , value] of Obje
cbd0: 63 74 2e 65 6e 74 72 69 65 73 28 68 69 74 5f 6d  ct.entries(hit_m
cbe0: 61 70 29 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ap)) {.        i
cbf0: 66 20 28 76 61 6c 75 65 20 3d 3d 20 73 29 20 7b  f (value == s) {
cc00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
cc10: 5b 6b 65 79 20 2b 20 22 5f 6c 61 73 74 22 5d 20  [key + "_last"] 
cc20: 3d 20 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  = count.        
cc30: 20 20 20 20 6d 65 6d 5b 6b 65 79 20 2b 20 22 5f      mem[key + "_
cc40: 63 68 61 6e 6e 65 6c 22 5d 2e 70 61 6e 2e 76 61  channel"].pan.va
cc50: 6c 75 65 20 3d 20 70 61 6e 0a 20 20 20 20 20 20  lue = pan.      
cc60: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 61    }.    }.    sa
cc70: 6d 70 6c 65 73 5b 73 5d 2e 74 72 69 67 67 65 72  mples[s].trigger
cc80: 41 74 74 61 63 6b 52 65 6c 65 61 73 65 28 6e 6f  AttackRelease(no
cc90: 74 65 2c 20 6c 65 6e 2c 20 64 65 6c 61 79 2c 20  te, len, delay, 
cca0: 76 6f 6c 29 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 2e  vol);.}..window.
ccb0: 70 20 3d 20 70 3b 0a 0a 66 75 6e 63 74 69 6f 6e  p = p;..function
ccc0: 20 70 31 28 73 2c 20 76 6f 6c 2c 20 6e 6f 74 65   p1(s, vol, note
ccd0: 2c 20 6c 65 6e 2c 20 64 65 6c 61 79 2c 20 70 61  , len, delay, pa
cce0: 6e 3d 30 29 20 7b 0a 20 20 20 20 6e 6f 74 65 20  n=0) {.    note 
ccf0: 3d 20 6e 6f 74 65 20 7c 7c 20 22 43 33 22 0a 20  = note || "C3". 
cd00: 20 20 20 6c 65 6e 20 3d 20 6c 65 6e 20 7c 7c 20     len = len || 
cd10: 22 31 36 6e 22 0a 20 20 20 20 76 6f 6c 20 3d 20  "16n".    vol = 
cd20: 76 6f 6c 20 7c 7c 20 31 0a 20 20 20 20 64 65 6c  vol || 1.    del
cd30: 61 79 20 3d 20 64 65 6c 61 79 20 7c 7c 20 22 2b  ay = delay || "+
cd40: 30 22 3b 0a 0a 20 20 20 66 6f 72 20 28 63 6f 6e  0";..   for (con
cd50: 73 74 20 5b 6b 65 79 2c 20 76 61 6c 75 65 5d 20  st [key, value] 
cd60: 6f 66 20 4f 62 6a 65 63 74 2e 65 6e 74 72 69 65  of Object.entrie
cd70: 73 28 68 69 74 5f 6d 61 70 29 29 20 7b 0a 20 20  s(hit_map)) {.  
cd80: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
cd90: 3d 3d 20 28 73 20 2d 20 31 29 29 20 7b 0a 20 20  == (s - 1)) {.  
cda0: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 5b 6b 65            mem[ke
cdb0: 79 20 2b 20 22 5f 6c 61 73 74 22 5d 20 3d 20 63  y + "_last"] = c
cdc0: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ount.           
cdd0: 20 6d 65 6d 5b 6b 65 79 20 2b 20 22 5f 63 68 61   mem[key + "_cha
cde0: 6e 6e 65 6c 22 5d 2e 70 61 6e 2e 76 61 6c 75 65  nnel"].pan.value
cdf0: 20 3d 20 70 61 6e 0a 0a 20 20 20 20 20 20 20 20   = pan..        
ce00: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 61 6d 70  }.    }.    samp
ce10: 6c 65 73 5b 73 20 2d 20 31 5d 2e 74 72 69 67 67  les[s - 1].trigg
ce20: 65 72 41 74 74 61 63 6b 52 65 6c 65 61 73 65 28  erAttackRelease(
ce30: 6e 6f 74 65 2c 20 6c 65 6e 2c 20 64 65 6c 61 79  note, len, delay
ce40: 2c 20 76 6f 6c 29 3b 0a 20 0a 7d 0a 0a 77 69 6e  , vol);. .}..win
ce50: 64 6f 77 2e 70 31 20 3d 20 70 31 3b 0a 0a 66 75  dow.p1 = p1;..fu
ce60: 6e 63 74 69 6f 6e 20 70 6e 28 73 2c 20 76 6f 6c  nction pn(s, vol
ce70: 2c 20 6e 6f 74 65 2c 20 6c 65 6e 2c 20 64 65 6c  , note, len, del
ce80: 61 79 2c 20 70 61 6e 3d 30 29 20 7b 0a 20 20 20  ay, pan=0) {.   
ce90: 20 73 61 6d 70 6c 65 5f 6e 6f 20 3d 20 68 69 74   sample_no = hit
cea0: 5f 6d 61 70 5b 73 5d 0a 20 20 20 20 6e 6f 74 65  _map[s].    note
ceb0: 20 3d 20 6e 6f 74 65 20 7c 7c 20 22 43 33 22 0a   = note || "C3".
cec0: 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6e 20 7c 7c      len = len ||
ced0: 20 22 31 36 6e 22 0a 20 20 20 20 76 6f 6c 20 3d   "16n".    vol =
cee0: 20 76 6f 6c 20 7c 7c 20 31 0a 20 20 20 20 64 65   vol || 1.    de
cef0: 6c 61 79 20 3d 20 64 65 6c 61 79 20 7c 7c 20 22  lay = delay || "
cf00: 2b 30 22 3b 0a 0a 20 20 20 20 0a 20 20 20 20 66  +0";..    .    f
cf10: 6f 72 20 28 63 6f 6e 73 74 20 5b 6b 65 79 2c 20  or (const [key, 
cf20: 76 61 6c 75 65 5d 20 6f 66 20 4f 62 6a 65 63 74  value] of Object
cf30: 2e 65 6e 74 72 69 65 73 28 68 69 74 5f 6d 61 70  .entries(hit_map
cf40: 29 29 20 7b 0a 20 20 20 20 09 69 66 20 28 76 61  )) {.    .if (va
cf50: 6c 75 65 20 3d 3d 20 73 61 6d 70 6c 65 5f 6e 6f  lue == sample_no
cf60: 29 20 7b 0a 09 20 20 20 20 09 6d 65 6d 5b 6b 65  ) {..    .mem[ke
cf70: 79 20 2b 20 22 5f 6c 61 73 74 22 5d 20 3d 20 63  y + "_last"] = c
cf80: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ount.           
cf90: 20 6d 65 6d 5b 6b 65 79 20 2b 20 22 5f 63 68 61   mem[key + "_cha
cfa0: 6e 6e 65 6c 22 5d 2e 70 61 6e 2e 76 61 6c 75 65  nnel"].pan.value
cfb0: 20 3d 20 70 61 6e 0a 0a 09 20 20 20 20 7d 0a 20   = pan...    }. 
cfc0: 20 09 7d 0a 20 20 20 20 0a 20 20 20 20 73 61 6d   .}.    .    sam
cfd0: 70 6c 65 73 5b 73 61 6d 70 6c 65 5f 6e 6f 5d 2e  ples[sample_no].
cfe0: 74 72 69 67 67 65 72 41 74 74 61 63 6b 52 65 6c  triggerAttackRel
cff0: 65 61 73 65 28 6e 6f 74 65 2c 20 6c 65 6e 2c 20  ease(note, len, 
d000: 64 65 6c 61 79 2c 20 76 6f 6c 29 3b 0a 0a 7d 0a  delay, vol);..}.
d010: 0a 77 69 6e 64 6f 77 2e 70 6e 20 3d 20 70 6e 3b  .window.pn = pn;
d020: 0a 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 61 74  ....function pat
d030: 74 65 72 6e 5f 70 61 72 73 65 28 70 29 20 7b 0a  tern_parse(p) {.
d040: 20 20 20 20 69 66 20 28 21 70 29 20 7b 0a 20 20      if (!p) {.  
d050: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b        return "";
d060: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
d070: 2e 72 65 70 6c 61 63 65 28 2f 20 2f 67 2c 20 22  .replace(/ /g, "
d080: 22 29 3b 0a 20 20 20 20 70 20 3d 20 70 2e 72 65  ");.    p = p.re
d090: 70 6c 61 63 65 28 2f 5c 5b 2e 2b 3f 5c 5d 2f 67  place(/\[.+?\]/g
d0a0: 2c 20 22 22 29 3b 0a 20 20 20 20 76 61 72 20 66  , "");.    var f
d0b0: 63 20 3d 20 70 2e 73 70 6c 69 74 28 27 27 29 5b  c = p.split('')[
d0c0: 30 5d 3b 0a 20 20 20 20 69 66 20 28 66 63 3d 3d  0];.    if (fc==
d0d0: 20 22 70 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "p") {.        
d0e0: 76 61 72 20 70 74 79 70 65 20 3d 20 22 78 6f 22  var ptype = "xo"
d0f0: 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20 6c 20  ;.        var l 
d100: 3d 20 28 70 2e 6c 65 6e 67 74 68 20 2d 20 31 29  = (p.length - 1)
d110: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
d120: 20 20 20 20 20 20 20 76 61 72 20 70 74 79 70 65         var ptype
d130: 20 3d 20 22 68 65 78 22 3b 0a 20 20 20 20 20 20   = "hex";.      
d140: 20 20 76 61 72 20 6c 20 3d 20 28 70 2e 6c 65 6e    var l = (p.len
d150: 67 74 68 29 20 2a 20 34 3b 0a 20 20 20 20 7d 0a  gth) * 4;.    }.
d160: 0a 20 20 20 20 69 66 20 28 70 74 79 70 65 20 3d  .    if (ptype =
d170: 3d 20 22 78 6f 22 29 20 7b 0a 20 20 20 20 20 20  = "xo") {.      
d180: 20 20 76 61 72 20 66 70 20 3d 20 70 2e 73 75 62    var fp = p.sub
d190: 73 74 72 28 31 29 3b 0a 20 20 20 20 20 20 20 20  str(1);.        
d1a0: 66 70 20 3d 20 66 70 2e 72 65 70 6c 61 63 65 28  fp = fp.replace(
d1b0: 2f 78 2f 67 2c 20 22 31 22 29 3b 0a 20 20 20 20  /x/g, "1");.    
d1c0: 7d 0a 0a 20 20 20 20 69 66 20 28 70 74 79 70 65  }..    if (ptype
d1d0: 20 3d 3d 20 22 78 6f 22 29 20 7b 0a 20 20 20 20   == "xo") {.    
d1e0: 20 20 20 20 76 61 72 20 66 69 6e 20 3d 20 22 22      var fin = ""
d1f0: 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20 64 6f  ;.        var do
d200: 6e 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  ne = false;.    
d210: 20 20 20 20 76 61 72 20 69 6e 64 65 78 20 3d 20      var index = 
d220: 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
d230: 28 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (1) {.          
d240: 20 20 69 66 20 28 64 6f 6e 65 29 20 7b 0a 20 20    if (done) {.  
d250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
d260: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
d270: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
d280: 66 20 28 69 6e 64 65 78 20 3e 3d 20 66 70 2e 6c  f (index >= fp.l
d290: 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20  ength) {.       
d2a0: 20 20 20 20 20 20 20 20 20 64 6f 6e 65 20 3d 20           done = 
d2b0: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
d2c0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
d2d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
d2e0: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 63 75            var cu
d2f0: 72 72 65 6e 74 5f 6c 65 74 74 65 72 20 3d 20 66  rrent_letter = f
d300: 70 5b 69 6e 64 65 78 20 2d 20 31 5d 0a 20 20 20  p[index - 1].   
d310: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 75 72           if (cur
d320: 72 65 6e 74 5f 6c 65 74 74 65 72 29 20 7b 0a 20  rent_letter) {. 
d330: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
d340: 75 72 72 65 6e 74 5f 6c 65 74 74 65 72 20 3d 3d  urrent_letter ==
d350: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
d360: 20 20 20 20 20 20 20 20 76 61 72 20 6e 65 78 74          var next
d370: 5f 6c 65 74 74 65 72 20 3d 20 67 65 74 5f 63 68  _letter = get_ch
d380: 61 72 28 66 70 2c 69 6e 64 65 78 29 3b 0a 20 20  ar(fp,index);.  
d390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
d3a0: 20 28 6e 65 78 74 5f 6c 65 74 74 65 72 20 3d 3d   (next_letter ==
d3b0: 20 22 60 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "`") {.        
d3c0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
d3d0: 6e 65 78 74 5f 6e 65 78 74 5f 6c 65 74 74 65 72  next_next_letter
d3e0: 20 3d 20 67 65 74 5f 63 68 61 72 28 66 70 2c 69   = get_char(fp,i
d3f0: 6e 64 65 78 20 2b 20 31 29 3b 0a 20 20 20 20 20  ndex + 1);.     
d400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
d410: 69 6e 20 2b 3d 20 20 6c 65 74 74 65 72 74 6f 64  in +=  lettertod
d420: 65 63 28 72 6f 6d 61 6e 74 6f 67 79 70 73 79 28  ec(romantogypsy(
d430: 6e 65 78 74 5f 6c 65 74 74 65 72 20 2b 20 6e 65  next_letter + ne
d440: 78 74 5f 6e 65 78 74 5f 6c 65 74 74 65 72 29 29  xt_next_letter))
d450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d460: 20 20 20 20 20 20 69 6e 64 65 78 20 2b 3d 20 33        index += 3
d470: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
d480: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
d490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
d4a0: 69 6e 20 2b 3d 20 6c 65 74 74 65 72 74 6f 64 65  in += lettertode
d4b0: 63 28 6e 65 78 74 5f 6c 65 74 74 65 72 29 3b 0a  c(next_letter);.
d4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4d0: 20 20 20 20 69 6e 64 65 78 20 2b 3d 20 32 3b 0a      index += 2;.
d4e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d4f0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  }.            } 
d500: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
d510: 20 20 20 20 20 20 20 66 69 6e 20 2b 3d 20 63 75         fin += cu
d520: 72 72 65 6e 74 5f 6c 65 74 74 65 72 3b 0a 20 20  rrent_letter;.  
d530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
d540: 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20  dex += 1;.      
d550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
d560: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
d570: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
d580: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  in;.    }.    el
d590: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72  se {.        var
d5a0: 20 66 70 20 3d 20 68 65 78 32 62 69 6e 28 70 29   fp = hex2bin(p)
d5b0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
d5c0: 75 72 6e 20 66 70 3b 0a 7d 0a 0a 77 69 6e 64 6f  urn fp;.}..windo
d5d0: 77 2e 70 61 74 74 65 72 6e 5f 70 61 72 73 65 20  w.pattern_parse 
d5e0: 3d 20 70 61 74 74 65 72 6e 5f 70 61 72 73 65 3b  = pattern_parse;
d5f0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 64 6f 77 6e 6c  ..function downl
d600: 6f 61 64 28 64 61 74 61 2c 20 66 69 6c 65 6e 61  oad(data, filena
d610: 6d 65 2c 20 74 79 70 65 29 20 7b 0a 20 20 20 20  me, type) {.    
d620: 76 61 72 20 66 69 6c 65 20 3d 20 6e 65 77 20 42  var file = new B
d630: 6c 6f 62 28 5b 64 61 74 61 5d 2c 20 7b 20 74 79  lob([data], { ty
d640: 70 65 3a 20 74 79 70 65 20 7d 29 3b 0a 20 20 20  pe: type });.   
d650: 20 69 66 20 28 77 69 6e 64 6f 77 2e 6e 61 76 69   if (window.navi
d660: 67 61 74 6f 72 2e 6d 73 53 61 76 65 4f 72 4f 70  gator.msSaveOrOp
d670: 65 6e 42 6c 6f 62 29 20 2f 2f 20 49 45 31 30 2b  enBlob) // IE10+
d680: 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 2e  .        window.
d690: 6e 61 76 69 67 61 74 6f 72 2e 6d 73 53 61 76 65  navigator.msSave
d6a0: 4f 72 4f 70 65 6e 42 6c 6f 62 28 66 69 6c 65 2c  OrOpenBlob(file,
d6b0: 20 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20   filename);.    
d6c0: 65 6c 73 65 20 7b 20 2f 2f 20 4f 74 68 65 72 73  else { // Others
d6d0: 0a 20 20 20 20 20 20 20 20 76 61 72 20 61 20 3d  .        var a =
d6e0: 20 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74 65   document.create
d6f0: 45 6c 65 6d 65 6e 74 28 22 61 22 29 2c 0a 20 20  Element("a"),.  
d700: 20 20 20 20 20 20 20 20 20 20 75 72 6c 20 3d 20            url = 
d710: 55 52 4c 2e 63 72 65 61 74 65 4f 62 6a 65 63 74  URL.createObject
d720: 55 52 4c 28 66 69 6c 65 29 3b 0a 20 20 20 20 20  URL(file);.     
d730: 20 20 20 61 2e 68 72 65 66 20 3d 20 75 72 6c 3b     a.href = url;
d740: 0a 20 20 20 20 20 20 20 20 61 2e 64 6f 77 6e 6c  .        a.downl
d750: 6f 61 64 20 3d 20 66 69 6c 65 6e 61 6d 65 3b 0a  oad = filename;.
d760: 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
d770: 2e 62 6f 64 79 2e 61 70 70 65 6e 64 43 68 69 6c  .body.appendChil
d780: 64 28 61 29 3b 0a 20 20 20 20 20 20 20 20 61 2e  d(a);.        a.
d790: 63 6c 69 63 6b 28 29 3b 0a 20 20 20 20 20 20 20  click();.       
d7a0: 20 73 65 74 54 69 6d 65 6f 75 74 28 66 75 6e 63   setTimeout(func
d7b0: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
d7c0: 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 62        document.b
d7d0: 6f 64 79 2e 72 65 6d 6f 76 65 43 68 69 6c 64 28  ody.removeChild(
d7e0: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
d7f0: 77 69 6e 64 6f 77 2e 55 52 4c 2e 72 65 76 6f 6b  window.URL.revok
d800: 65 4f 62 6a 65 63 74 55 52 4c 28 75 72 6c 29 3b  eObjectURL(url);
d810: 0a 20 20 20 20 20 20 20 20 7d 2c 20 30 29 3b 0a  .        }, 0);.
d820: 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 20 68 74 74 70      }.}..// http
d830: 73 3a 2f 2f 73 74 61 63 6b 6f 76 65 72 66 6c 6f  s://stackoverflo
d840: 77 2e 63 6f 6d 2f 71 75 65 73 74 69 6f 6e 73 2f  w.com/questions/
d850: 31 35 37 36 32 37 36 38 2f 6a 61 76 61 73 63 72  15762768/javascr
d860: 69 70 74 2d 6d 61 74 68 2d 72 6f 75 6e 64 2d 74  ipt-math-round-t
d870: 6f 2d 74 77 6f 2d 64 65 63 69 6d 61 6c 2d 70 6c  o-two-decimal-pl
d880: 61 63 65 73 0a 66 75 6e 63 74 69 6f 6e 20 72 6f  aces.function ro
d890: 75 6e 64 54 6f 28 6e 2c 20 64 69 67 69 74 73 29  undTo(n, digits)
d8a0: 20 7b 0a 20 20 20 20 76 61 72 20 6e 65 67 61 74   {.    var negat
d8b0: 69 76 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  ive = false;.   
d8c0: 20 69 66 20 28 64 69 67 69 74 73 20 3d 3d 3d 20   if (digits === 
d8d0: 75 6e 64 65 66 69 6e 65 64 29 20 7b 0a 20 20 20  undefined) {.   
d8e0: 20 20 20 20 20 64 69 67 69 74 73 20 3d 20 30 3b       digits = 0;
d8f0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e  .    }.    if (n
d900: 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   < 0) {.        
d910: 6e 65 67 61 74 69 76 65 20 3d 20 74 72 75 65 3b  negative = true;
d920: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 20 2a  .        n = n *
d930: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76   -1;.    }.    v
d940: 61 72 20 6d 75 6c 74 69 70 6c 69 63 61 74 6f 72  ar multiplicator
d950: 20 3d 20 4d 61 74 68 2e 70 6f 77 28 31 30 2c 20   = Math.pow(10, 
d960: 64 69 67 69 74 73 29 3b 0a 20 20 20 20 6e 20 3d  digits);.    n =
d970: 20 70 61 72 73 65 46 6c 6f 61 74 28 28 6e 20 2a   parseFloat((n *
d980: 20 6d 75 6c 74 69 70 6c 69 63 61 74 6f 72 29 2e   multiplicator).
d990: 74 6f 46 69 78 65 64 28 31 31 29 29 3b 0a 20 20  toFixed(11));.  
d9a0: 20 20 6e 20 3d 20 28 4d 61 74 68 2e 72 6f 75 6e    n = (Math.roun
d9b0: 64 28 6e 29 20 2f 20 6d 75 6c 74 69 70 6c 69 63  d(n) / multiplic
d9c0: 61 74 6f 72 29 2e 74 6f 46 69 78 65 64 28 64 69  ator).toFixed(di
d9d0: 67 69 74 73 29 3b 0a 20 20 20 20 69 66 20 28 6e  gits);.    if (n
d9e0: 65 67 61 74 69 76 65 29 20 7b 0a 20 20 20 20 20  egative) {.     
d9f0: 20 20 20 6e 20 3d 20 28 6e 20 2a 20 2d 31 29 2e     n = (n * -1).
da00: 74 6f 46 69 78 65 64 28 64 69 67 69 74 73 29 3b  toFixed(digits);
da10: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
da20: 6e 20 6e 3b 0a 7d 0a 0a 24 7b 6b 6e 6f 62 5f 63  n n;.}..${knob_c
da30: 6f 64 65 7d 0a 22 22 22 0a 66 72 6f 6d 20 6d 61  ode}.""".from ma
da40: 6b 6f 2e 74 65 6d 70 6c 61 74 65 20 69 6d 70 6f  ko.template impo
da50: 72 74 20 54 65 6d 70 6c 61 74 65 0a 0a 63 6f 64  rt Template..cod
da60: 65 20 3d 20 54 65 6d 70 6c 61 74 65 28 6d 69 73  e = Template(mis
da70: 63 5f 6a 73 29 2e 72 65 6e 64 65 72 28 6b 6e 6f  c_js).render(kno
da80: 62 5f 63 6f 64 65 3d 6b 6e 6f 62 5f 63 6f 64 65  b_code=knob_code
da90: 29 0a 63 6f 67 2e 6f 75 74 28 6d 69 73 63 5f 6a  ).cog.out(misc_j
daa0: 73 29 0a 0a 6f 73 2e 73 79 73 74 65 6d 28 22 72  s)..os.system("r
dab0: 6d 20 70 75 62 6c 69 63 2f 6d 69 73 63 2e 6a 73  m public/misc.js
dac0: 22 29 0a 66 20 3d 20 6f 70 65 6e 28 22 70 75 62  ").f = open("pub
dad0: 6c 69 63 2f 6d 69 73 63 2e 6a 73 22 2c 20 22 77  lic/misc.js", "w
dae0: 22 29 0a 66 2e 77 72 69 74 65 28 63 6f 64 65 29  ").f.write(code)
daf0: 0a 66 2e 63 6c 6f 73 65 28 29 0a 40 3e 0a 40 40  .f.close().@>.@@
db00: 0a 60 60 60 0a 0a 23 23 20 33 30 33 0a 0a 54 61  .```..## 303..Ta
db10: 6b 65 6e 20 66 72 6f 6d 20 5b 65 6e 64 6c 65 73  ken from [endles
db20: 73 20 61 63 69 64 20 62 61 6e 67 65 72 5d 28 68  s acid banger](h
db30: 74 74 70 73 3a 2f 2f 77 77 77 2e 76 69 74 6c 69  ttps://www.vitli
db40: 6e 67 2e 78 79 7a 2f 74 6f 79 73 2f 61 63 69 64  ng.xyz/toys/acid
db50: 2d 62 61 6e 67 65 72 2f 29 2e 0a 0a 60 60 60 6a  -banger/)...```j
db60: 73 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 6d 6d  s.@<.import comm
db70: 6f 6e 0a 63 6f 67 2e 6f 75 74 28 63 6f 6d 6d 6f  on.cog.out(commo
db80: 6e 2e 74 68 72 65 65 4f 68 29 0a 40 3e 0a 40 40  n.threeOh).@>.@@
db90: 0a 60 60 60 0a 0a 23 23 20 41 75 74 6f 63 6f 6d  .```..## Autocom
dba0: 6d 69 74 0a 0a 3c 68 74 74 70 73 3a 2f 2f 78 69  mit..<https://xi
dbb0: 61 6f 6f 75 77 61 6e 67 2e 6d 65 64 69 75 6d 2e  aoouwang.medium.
dbc0: 63 6f 6d 2f 74 75 74 6f 72 69 61 6c 2d 61 64 76  com/tutorial-adv
dbd0: 61 6e 63 65 64 2d 75 73 65 2d 6f 66 2d 77 61 74  anced-use-of-wat
dbe0: 63 68 64 6f 67 2d 69 6e 2d 70 79 74 68 6f 6e 2d  chdog-in-python-
dbf0: 65 78 63 6c 75 64 69 6e 67 2d 66 69 6c 65 73 2d  excluding-files-
dc00: 61 2d 67 69 74 2d 61 75 74 6f 2d 63 6f 6d 6d 69  a-git-auto-commi
dc10: 74 2d 65 78 61 6d 70 6c 65 2d 70 61 72 74 2d 37  t-example-part-7
dc20: 30 32 34 39 31 33 61 64 35 61 38 3e 20 20 0a 3c  024913ad5a8>  .<
dc30: 68 74 74 70 73 3a 2f 2f 67 69 74 68 75 62 2e 63  https://github.c
dc40: 6f 6d 2f 67 69 74 77 61 74 63 68 2f 67 69 74 77  om/gitwatch/gitw
dc50: 61 74 63 68 3e 20 20 0a 0a 60 60 60 70 79 74 68  atch>  ..```pyth
dc60: 6f 6e 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 6d  on.@<.import com
dc70: 6d 6f 6e 0a 63 6f 67 2e 6f 75 74 28 63 6f 6d 6d  mon.cog.out(comm
dc80: 6f 6e 2e 61 75 74 6f 5f 63 6f 6d 6d 69 74 29 0a  on.auto_commit).
dc90: 40 3e 0a 40 40 0a 60 60 60 0a 0a                 @>.@@.```..