⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact 4353af3768459026bf950c061f9f9b4a6878ccde577e52bf40b9066b7ac3372a:

  • File source/main.cog — part of check-in [12a9bb700d] at 2021-08-11 18:56:04 on branch trunk — Import from git Added a changelog (user: dev size: 41248)

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 6e 63 65 70 74 73 20 61  @@..# Concepts a
00a0: 6e 64 20 43 6f 64 65 20 57 61 6c 6b 74 68 72 6f  nd Code Walkthro
00b0: 75 67 68 0a 0a 40 3c 0a 69 6d 70 6f 72 74 20 63  ugh..@<.import c
00c0: 6f 67 0a 69 6d 70 6f 72 74 20 6f 73 0a 0a 69 66  og.import os..if
00d0: 20 44 45 56 20 3d 3d 20 22 31 22 3a 0a 20 20 20   DEV == "1":.   
00e0: 20 73 74 75 66 66 20 3d 20 22 22 22 0a 23 23 20   stuff = """.## 
00f0: 52 75 6e 6e 69 6e 67 0a 0a 6c 73 20 73 6f 75 72  Running..ls sour
0100: 63 65 2f 6d 61 69 6e 2e 63 6f 67 20 7c 20 65 6e  ce/main.cog | en
0110: 74 72 20 2d 72 20 72 75 6e 73 65 72 76 65 72 2e  tr -r runserver.
0120: 73 68 20 2d 62 0a 22 22 22 0a 20 20 20 20 63 6f  sh -b.""".    co
0130: 67 2e 6f 75 74 28 73 74 75 66 66 29 0a 40 3e 0a  g.out(stuff).@>.
0140: 40 40 0a 0a 23 23 20 43 6f 72 65 20 54 72 61 63  @@..## Core Trac
0150: 6b 65 72 20 4c 6f 6f 70 0a 0a 49 6e 20 62 69 74  ker Loop..In bit
0160: 72 68 79 74 68 6d 20 63 6f 64 65 20 69 73 20 65  rhythm code is e
0170: 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 76 65  valuated for eve
0180: 72 79 20 63 79 63 6c 65 2e 0a 0a 31 20 62 65 61  ry cycle...1 bea
0190: 74 20 3d 20 36 30 20 2f 20 74 65 6d 70 6f 0a 31  t = 60 / tempo.1
01a0: 20 63 79 63 6c 65 20 3d 20 31 20 62 65 61 74 20   cycle = 1 beat 
01b0: 2f 20 74 69 63 6b 73 0a 0a 46 6f 72 20 65 76 65  / ticks..For eve
01c0: 72 79 20 63 79 63 6c 65 20 76 69 73 75 61 6c 20  ry cycle visual 
01d0: 61 6e 64 20 61 75 64 69 6f 20 63 6f 64 65 20 69  and audio code i
01e0: 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 0a 54 68  s evaluated...Th
01f0: 65 20 65 64 69 74 20 63 68 65 63 6b 62 6f 78 20  e edit checkbox 
0200: 61 6c 6c 6f 77 73 20 79 6f 75 20 74 6f 20 70 65  allows you to pe
0210: 72 66 6f 72 6d 20 6c 6f 6e 67 20 65 64 69 74 73  rform long edits
0220: 2c 20 77 68 65 72 65 20 6f 6e 6c 79 20 6f 6c 64  , where only old
0230: 20 63 6f 64 65 20 69 73 20 65 76 61 6c 75 61 74   code is evaluat
0240: 65 64 2e 20 4f 6e 63 65 20 79 6f 75 20 64 69 73  ed. Once you dis
0250: 61 62 6c 65 20 69 74 2c 20 61 6c 6c 20 74 68 65  able it, all the
0260: 20 6e 65 77 20 65 64 69 74 20 63 68 61 6e 67 65   new edit change
0270: 73 20 61 72 65 20 61 70 70 6c 69 65 64 20 69 6e  s are applied in
0280: 20 74 68 65 20 6e 65 78 74 20 63 79 63 6c 65 2e   the next cycle.
0290: 0a 0a 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  ..If there is an
02a0: 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2c 20  y syntax error, 
02b0: 70 72 65 76 69 6f 75 73 20 77 6f 72 6b 69 6e 67  previous working
02c0: 20 63 6f 64 65 20 69 73 20 75 73 65 64 2e 0a 0a   code is used...
02d0: 49 66 20 74 68 65 20 63 6c 69 63 6b 20 74 68 65  If the click the
02e0: 20 60 65 78 65 63 75 74 65 20 74 72 61 6e 73 69   `execute transi
02f0: 74 69 6f 6e 60 20 69 73 20 73 65 6c 65 63 74 65  tion` is selecte
0300: 64 2c 20 74 68 65 20 74 72 61 6e 73 69 74 69 6f  d, the transitio
0310: 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72 75  n function is ru
0320: 6e 2e 20 55 73 65 20 74 68 69 73 20 70 72 6f 67  n. Use this prog
0330: 72 65 73 73 69 6e 67 20 74 68 65 20 73 6f 6e 67  ressing the song
0340: 20 66 72 6f 6d 20 69 6e 69 74 69 61 6c 69 7a 69   from initializi
0350: 6e 67 20 74 6f 20 74 77 65 61 6b 69 6e 67 2e 0a  ng to tweaking..
0360: 0a 0a 50 61 74 74 65 72 6e 73 20 69 73 20 61 6e  ..Patterns is an
0370: 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e 67   array of string
0380: 73 2c 20 65 61 63 68 20 73 74 72 69 6e 67 20 63  s, each string c
0390: 61 6e 20 62 65 20 68 65 78 61 64 65 63 69 6d 61  an be hexadecima
03a0: 6c 2c 20 64 65 63 69 6d 61 6c 20 6f 72 20 73 6f  l, decimal or so
03b0: 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 e2 80 9c  mething like ...
03c0: 78 30 30 30 20 78 30 30 30 20 78 30 30 30 20 78  x000 x000 x000 x
03d0: 30 30 30 e2 80 9d 2e 0a 69 73 48 69 74 20 61 6e  000.....isHit an
03e0: 64 20 74 72 61 63 6b 5f 6e 6f 20 63 61 6e 20 62  d track_no can b
03f0: 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74 69  e used to identi
0400: 66 79 20 74 68 65 20 6c 61 79 65 72 20 69 6e 20  fy the layer in 
0410: 74 68 65 20 6c 69 76 65 20 65 64 69 74 6f 72 2e  the live editor.
0420: 20 48 65 78 61 64 65 63 69 6d 61 6c 20 75 73 65   Hexadecimal use
0430: 73 20 5c 60 30 20 5c 60 31 20 5c 60 32 20 5c 60  s \`0 \`1 \`2 \`
0440: 33 20 5c 60 34 20 5c 60 35 20 69 6e 73 74 65 61  3 \`4 \`5 instea
0450: 64 20 6f 66 20 74 68 65 20 52 6f 6d 61 6e 20 6e  d of the Roman n
0460: 75 6d 65 72 61 6c 73 20 61 62 63 64 65 20 66 6f  umerals abcde fo
0470: 72 20 31 30 2c 20 31 31 2c 20 31 32 20 2e 2e 2e  r 10, 11, 12 ...
0480: 0a 0a 53 63 68 65 64 75 6c 65 64 20 54 69 6d 65  ..Scheduled Time
0490: 20 61 73 20 73 69 67 6e 69 66 69 65 64 20 62 79   as signified by
04a0: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 74 69   the variable ti
04b0: 6d 65 20 69 73 20 63 72 75 63 69 61 6c 20 77 68  me is crucial wh
04c0: 65 6e 20 63 61 6c 6c 69 6e 67 20 6e 6f 74 65 20  en calling note 
04d0: 74 72 69 67 67 65 72 73 2e 20 54 68 69 73 20 69  triggers. This i
04e0: 73 20 75 73 65 64 20 62 79 20 54 6f 6e 65 2e 6a  s used by Tone.j
04f0: 73 20 74 6f 20 73 63 68 65 64 75 6c 65 20 6e 6f  s to schedule no
0500: 74 65 73 20 74 6f 20 70 6c 61 79 20 69 6e 20 74  tes to play in t
0510: 68 65 20 66 75 74 75 72 65 2e 0a 0a 23 23 23 20  he future...### 
0520: 4f 62 73 65 72 76 65 72 73 0a 0a 53 69 64 65 63  Observers..Sidec
0530: 68 61 69 6e 20 63 6f 6d 70 72 65 73 73 69 6f 6e  hain compression
0540: 20 69 73 20 61 20 73 69 6d 70 6c 65 20 61 6c 67   is a simple alg
0550: 6f 72 69 74 68 6d 20 77 68 69 63 68 20 6f 62 73  orithm which obs
0560: 65 72 76 65 73 20 61 6d 70 6c 69 74 75 64 65 20  erves amplitude 
0570: 6f 66 20 61 6e 6f 74 68 65 72 20 69 6e 73 74 72  of another instr
0580: 75 6d 65 6e 74 20 62 75 74 20 79 6f 75 20 63 61  ument but you ca
0590: 6e 20 67 65 6e 65 72 61 6c 69 73 65 20 69 74 20  n generalise it 
05a0: 74 6f 20 61 6e 79 74 68 69 6e 67 2e 20 42 79 20  to anything. By 
05b0: 61 74 74 61 63 68 69 6e 67 20 6f 62 73 65 72 76  attaching observ
05c0: 65 72 73 20 20 74 6f 20 74 69 6d 65 20 6f 72 20  ers  to time or 
05d0: 6f 74 68 65 72 20 69 6e 73 74 72 75 6d 65 6e 74  other instrument
05e0: 73 20 79 6f 75 20 63 61 6e 20 63 72 65 61 74 65  s you can create
05f0: 20 73 65 63 74 69 6f 6e 73 20 77 69 74 68 69 6e   sections within
0600: 20 74 68 65 20 73 6f 6e 67 20 74 68 61 74 20 63   the song that c
0610: 61 6e 20 74 72 69 67 67 65 72 20 6f 74 68 65 72  an trigger other
0620: 73 20 77 69 74 68 20 63 6f 6e 64 69 74 69 6f 6e  s with condition
0630: 61 6c 20 6c 6f 67 69 63 2e 20 54 68 69 73 20 69  al logic. This i
0640: 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 75 72  s similar to pur
0650: 65 20 64 61 74 61 27 73 20 62 61 6e 67 73 20 2d  e data's bangs -
0660: 20 5b 73 65 65 20 74 68 69 73 5d 28 68 74 74 70   [see this](http
0670: 73 3a 2f 2f 77 77 77 2e 79 6f 75 74 75 62 65 2e  s://www.youtube.
0680: 63 6f 6d 2f 77 61 74 63 68 3f 76 3d 6e 54 54 5a  com/watch?v=nTTZ
0690: 5a 79 44 34 78 6c 45 29 2e 20 49 6e 20 66 75 74  ZyD4xlE). In fut
06a0: 75 72 65 20 74 68 69 73 20 77 69 6c 6c 20 62 65  ure this will be
06b0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 61 73 20   referred to as 
06c0: 73 69 64 65 20 65 76 65 6e 74 73 2e 20 59 6f 75  side events. You
06d0: 20 63 6f 75 6c 64 20 64 65 63 72 65 61 73 65 20   could decrease 
06e0: 74 68 65 20 76 6f 6c 75 6d 65 20 6f 66 20 74 68  the volume of th
06f0: 65 20 64 72 75 6d 73 20 74 6f 20 68 61 76 65 20  e drums to have 
0700: 74 68 65 20 73 6e 61 72 65 73 20 64 72 6f 70 20  the snares drop 
0710: 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66 6f  automatically fo
0720: 72 20 65 78 61 6d 70 6c 65 2e 0a 0a 54 68 69 73  r example...This
0730: 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74 68   is something th
0740: 61 74 20 79 6f 75 20 63 61 6e 27 74 20 64 6f 20  at you can't do 
0750: 69 6e 20 44 41 57 73 2e 0a 0a 60 60 60 7b 63 6f  in DAWs...```{co
0760: 64 65 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d 2d  de-block} js.---
0770: 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d  .force: true.---
0780: 0a 0a 40 3c 0a 63 6f 72 65 5f 6c 6f 6f 70 20 3d  ..@<.core_loop =
0790: 20 22 22 22 0a 0a 61 73 79 6e 63 20 70 6c 61 79   """..async play
07a0: 28 29 20 7b 0a 20 20 20 20 76 61 72 20 73 65 6c  () {.    var sel
07b0: 66 20 3d 20 74 68 69 73 3b 0a 20 20 20 20 76 61  f = this;.    va
07c0: 72 20 63 65 6c 6c 78 20 3d 20 77 69 6e 64 6f 77  r cellx = window
07d0: 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78 3b 0a 0a 20  .cellx.cellx;.. 
07e0: 20 20 20 61 77 61 69 74 20 54 6f 6e 65 2e 73 74     await Tone.st
07f0: 61 72 74 28 29 3b 0a 20 20 20 20 54 6f 6e 65 2e  art();.    Tone.
0800: 54 72 61 6e 73 70 6f 72 74 2e 73 74 61 72 74 28  Transport.start(
0810: 29 3b 0a 20 20 20 20 54 6f 6e 65 2e 54 72 61 6e  );.    Tone.Tran
0820: 73 70 6f 72 74 2e 62 70 6d 2e 76 61 6c 75 65 20  sport.bpm.value 
0830: 3d 20 74 68 69 73 2e 73 74 61 74 65 2e 74 65 6d  = this.state.tem
0840: 70 6f 3b 0a 20 20 20 20 54 6f 6e 65 2e 54 72 61  po;.    Tone.Tra
0850: 6e 73 70 6f 72 74 2e 73 77 69 6e 67 2e 76 61 6c  nsport.swing.val
0860: 75 65 20 3d 20 30 3b 0a 0a 20 20 20 20 76 61 72  ue = 0;..    var
0870: 20 74 72 61 6e 73 69 74 69 6f 6e 20 3d 20 66 75   transition = fu
0880: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
0890: 7d 0a 0a 20 20 20 20 76 61 72 20 61 6c 77 61 79  }..    var alway
08a0: 73 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  s = function () 
08b0: 7b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 76 61  {.    }...    va
08c0: 72 20 72 65 6e 64 65 72 5f 6c 6f 6f 70 20 3d 20  r render_loop = 
08d0: 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20  function () {.  
08e0: 20 20 7d 0a 0a 20 20 20 20 76 61 72 20 61 6e 69    }..    var ani
08f0: 6d 61 74 69 6f 6e 20 3d 20 66 75 6e 63 74 69 6f  mation = functio
0900: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 72  n () {.        r
0910: 65 6e 64 65 72 5f 6c 6f 6f 70 28 29 3b 0a 20 20  ender_loop();.  
0920: 20 20 20 20 20 20 77 69 6e 64 6f 77 2e 72 65 71        window.req
0930: 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e 46 72 61  uestAnimationFra
0940: 6d 65 28 61 6e 69 6d 61 74 69 6f 6e 29 0a 20 20  me(animation).  
0950: 20 20 7d 0a 0a 20 20 20 20 54 6f 6e 65 2e 4d 61    }..    Tone.Ma
0960: 73 74 65 72 2e 6d 75 74 65 20 3d 20 66 61 6c 73  ster.mute = fals
0970: 65 3b 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e  e;.    document.
0980: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27  getElementById('
0990: 74 65 6d 70 6f 2d 76 61 6c 75 65 27 29 2e 64 69  tempo-value').di
09a0: 73 61 62 6c 65 64 20 3d 20 74 72 75 65 3b 0a 20  sabled = true;. 
09b0: 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45     document.getE
09c0: 6c 65 6d 65 6e 74 42 79 49 64 28 27 74 69 63 6b  lementById('tick
09d0: 2d 76 61 6c 75 65 27 29 2e 64 69 73 61 62 6c 65  -value').disable
09e0: 64 20 3d 20 74 72 75 65 3b 0a 0a 20 20 20 20 76  d = true;..    v
09f0: 61 72 20 6d 65 6d 20 3d 20 73 65 6c 66 2e 73 74  ar mem = self.st
0a00: 61 74 65 2e 6d 65 6d 3b 0a 20 20 20 20 76 61 72  ate.mem;.    var
0a10: 20 68 61 6e 64 6c 65 72 73 20 3d 20 7b 7d 3b 0a   handlers = {};.
0a20: 20 20 20 20 76 61 72 20 63 6f 75 6e 74 20 3d 20      var count = 
0a30: 2d 31 3b 0a 0a 20 20 20 20 76 61 72 20 74 65 78  -1;..    var tex
0a40: 74 20 3d 20 65 64 69 74 6f 72 2e 67 65 74 56 61  t = editor.getVa
0a50: 6c 75 65 28 29 3b 0a 20 20 20 20 65 64 69 74 6f  lue();.    edito
0a60: 72 2e 6f 6e 28 22 63 68 61 6e 67 65 22 2c 20 66  r.on("change", f
0a70: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
0a80: 20 20 20 20 20 20 20 20 20 74 65 78 74 20 3d 20           text = 
0a90: 65 64 69 74 6f 72 2e 67 65 74 56 61 6c 75 65 28  editor.getValue(
0aa0: 29 3b 0a 20 20 20 20 7d 29 3b 0a 0a 20 20 20 20  );.    });..    
0ab0: 76 61 72 20 70 61 74 74 65 72 6e 73 20 3d 20 5b  var patterns = [
0ac0: 20 63 65 6c 6c 78 28 22 30 30 30 30 22 29 20 5d   cellx("0000") ]
0ad0: 3b 20 2f 2f 20 6e 65 65 64 20 74 68 69 73 20 66  ; // need this f
0ae0: 6f 72 20 66 69 72 73 74 20 65 76 61 6c 0a 0a 20  or first eval.. 
0af0: 20 20 20 76 61 72 20 62 61 72 73 20 3d 20 30 3b     var bars = 0;
0b00: 0a 20 20 20 20 76 61 72 20 74 69 63 6b 20 3d 20  .    var tick = 
0b10: 30 3b 0a 0a 20 20 20 20 6c 6f 6f 70 20 3d 20 6e  0;..    loop = n
0b20: 65 77 20 54 6f 6e 65 2e 54 6f 6e 65 45 76 65 6e  ew Tone.ToneEven
0b30: 74 28 28 74 69 6d 65 2c 20 63 68 6f 72 64 29 20  t((time, chord) 
0b40: 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 63 6f 75  => {.        cou
0b50: 6e 74 20 3d 20 63 6f 75 6e 74 20 2b 20 31 3b 0a  nt = count + 1;.
0b60: 20 20 20 20 20 20 20 20 74 69 63 6b 20 3d 20 28          tick = (
0b70: 63 6f 75 6e 74 20 25 20 74 68 69 73 2e 73 74 61  count % this.sta
0b80: 74 65 2e 74 69 63 6b 73 29 3b 0a 20 20 20 20 20  te.ticks);.     
0b90: 20 20 20 69 66 20 28 74 69 63 6b 20 3d 3d 3d 20     if (tick === 
0ba0: 30 29 20 2b 2b 62 61 72 73 3b 0a 0a 20 20 20 20  0) ++bars;..    
0bb0: 20 20 20 20 24 28 22 23 64 75 72 61 74 69 6f 6e      $("#duration
0bc0: 22 29 2e 68 74 6d 6c 28 22 22 20 2b 20 62 61 72  ").html("" + bar
0bd0: 73 20 2b 20 22 2e 22 20 2b 20 74 69 63 6b 20 2b  s + "." + tick +
0be0: 20 22 20 2f 20 22 20 2b 20 63 6f 75 6e 74 20 2b   " / " + count +
0bf0: 20 22 20 2f 20 22 20 2b 20 77 69 6e 64 6f 77 2e   " / " + window.
0c00: 72 6f 75 6e 64 54 6f 28 54 6f 6e 65 2e 54 72 61  roundTo(Tone.Tra
0c10: 6e 73 70 6f 72 74 2e 73 65 63 6f 6e 64 73 2c 20  nsport.seconds, 
0c20: 32 29 29 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f  2));..        fo
0c30: 72 20 28 76 61 72 20 69 20 3d 20 30 3b 20 69 20  r (var i = 0; i 
0c40: 3c 20 70 61 74 74 65 72 6e 73 2e 6c 65 6e 67 74  < patterns.lengt
0c50: 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  h; i++) {.      
0c60: 20 20 20 20 20 20 76 61 72 20 73 61 6d 70 6c 65        var sample
0c70: 73 20 3d 20 74 68 69 73 2e 73 74 61 74 65 2e 73  s = this.state.s
0c80: 61 6d 70 6c 65 73 3b 0a 20 20 20 20 20 20 20 20  amples;.        
0c90: 20 20 20 20 76 61 72 20 64 69 61 6c 73 20 3d 20      var dials = 
0ca0: 73 65 6c 66 2e 73 74 61 74 65 2e 64 69 61 6c 73  self.state.dials
0cb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ;.            va
0cc0: 72 20 6e 75 6d 62 65 72 73 20 3d 20 73 65 6c 66  r numbers = self
0cd0: 2e 73 74 61 74 65 2e 6e 75 6d 62 65 72 73 3b 0a  .state.numbers;.
0ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0cf0: 28 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65  (document.getEle
0d00: 6d 65 6e 74 42 79 49 64 28 27 65 64 69 74 2d 6d  mentById('edit-m
0d10: 6f 64 65 27 29 2e 63 68 65 63 6b 65 64 29 20 7b  ode').checked) {
0d20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
0d30: 20 70 20 3d 20 6f 6c 64 50 61 74 74 65 72 6e 73   p = oldPatterns
0d40: 5b 69 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  [i];.           
0d50: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0d60: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 70 20            var p 
0d70: 3d 20 70 61 74 74 65 72 6e 73 5b 69 5d 3b 0a 20  = patterns[i];. 
0d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f                 o
0d90: 6c 64 50 61 74 74 65 72 6e 73 5b 69 5d 20 3d 20  ldPatterns[i] = 
0da0: 70 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  p;.            }
0db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20  .            if 
0dc0: 28 70 20 26 26 20 70 2e 6c 65 6e 67 74 68 20 21  (p && p.length !
0dd0: 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20  == 0) {.        
0de0: 20 20 20 20 20 20 20 20 76 61 72 20 74 72 61 63          var trac
0df0: 6b 5f 6e 6f 20 3d 20 69 20 2b 20 31 3b 0a 20 20  k_no = i + 1;.  
0e00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76 61                va
0e10: 72 20 70 61 74 74 65 72 6e 20 3d 20 70 61 74 74  r pattern = patt
0e20: 65 72 6e 5f 63 6c 65 61 6e 28 70 28 29 29 3b 0a  ern_clean(p());.
0e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0e40: 76 61 72 20 69 73 48 69 74 20 3d 20 28 70 61 74  var isHit = (pat
0e50: 74 65 72 6e 2e 73 70 6c 69 74 28 27 27 29 5b 74  tern.split('')[t
0e60: 69 63 6b 5d 20 3d 3d 20 22 31 22 29 20 3f 20 74  ick] == "1") ? t
0e70: 72 75 65 20 3a 20 66 61 6c 73 65 3b 0a 0a 20 20  rue : false;..  
0e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
0e90: 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  y {.            
0ea0: 20 20 20 20 20 20 20 20 69 66 20 28 64 6f 63 75          if (docu
0eb0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
0ec0: 79 49 64 28 27 65 64 69 74 2d 6d 6f 64 65 27 29  yId('edit-mode')
0ed0: 2e 63 68 65 63 6b 65 64 29 20 7b 0a 20 20 20 20  .checked) {.    
0ee0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0ef0: 20 20 20 20 65 76 61 6c 28 6f 6c 64 43 6f 64 65      eval(oldCode
0f00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0f10: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
0f20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0f30: 20 20 20 20 20 20 20 20 65 76 61 6c 28 74 65 78          eval(tex
0f40: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  t);.            
0f50: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28              if (
0f60: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
0f70: 65 6e 74 42 79 49 64 28 27 6c 6f 61 64 2d 6d 6f  entById('load-mo
0f80: 64 65 27 29 2e 63 68 65 63 6b 65 64 29 20 7b 0a  de').checked) {.
0f90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
0fa0: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 75              docu
0fb0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
0fc0: 79 49 64 28 27 6c 6f 61 64 2d 6d 6f 64 65 27 29  yId('load-mode')
0fd0: 2e 63 68 65 63 6b 65 64 20 3d 20 66 61 6c 73 65  .checked = false
0fe0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
0ff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 72                tr
1000: 61 6e 73 69 74 69 6f 6e 28 29 3b 0a 20 20 20 20  ansition();.    
1010: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1020: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
1030: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6c                ol
1040: 64 43 6f 64 65 20 3d 20 74 65 78 74 3b 0a 20 20  dCode = text;.  
1050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1060: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
1070: 20 20 20 20 20 20 20 20 24 28 22 23 65 72 72 6f          $("#erro
1080: 72 22 29 2e 68 74 6d 6c 28 22 22 29 3b 0a 20 20  r").html("");.  
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
10a0: 63 61 74 63 68 20 28 65 78 29 20 7b 0a 20 20 20  catch (ex) {.   
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10c0: 20 24 28 22 23 65 72 72 6f 72 22 29 2e 68 74 6d   $("#error").htm
10d0: 6c 28 65 78 29 3b 0a 20 20 20 20 20 20 20 20 20  l(ex);.         
10e0: 20 20 20 20 20 20 20 20 20 20 20 65 76 61 6c 28             eval(
10f0: 6f 6c 64 43 6f 64 65 29 3b 0a 20 20 20 20 20 20  oldCode);.      
1100: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
1110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1120: 20 20 7d 0a 20 20 20 20 7d 2c 20 5b 5d 29 3b 0a    }.    }, []);.
1130: 20 20 20 20 6c 6f 6f 70 2e 6c 6f 6f 70 20 3d 20      loop.loop = 
1140: 74 72 75 65 3b 0a 20 20 20 20 6c 6f 6f 70 2e 6c  true;.    loop.l
1150: 6f 6f 70 45 6e 64 20 3d 20 74 68 69 73 2e 73 74  oopEnd = this.st
1160: 61 74 65 2e 74 69 63 6b 73 20 2b 20 22 6e 22 3b  ate.ticks + "n";
1170: 0a 20 20 20 20 6c 6f 6f 70 2e 73 74 61 72 74 28  .    loop.start(
1180: 29 3b 0a 0a 20 20 20 77 69 6e 64 6f 77 2e 72 65  );..   window.re
1190: 71 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e 46 72  questAnimationFr
11a0: 61 6d 65 28 61 6e 69 6d 61 74 69 6f 6e 29 0a 0a  ame(animation)..
11b0: 7d 0a 22 22 22 0a 63 6f 67 2e 6f 75 74 28 63 6f  }.""".cog.out(co
11c0: 72 65 5f 6c 6f 6f 70 29 0a 40 3e 0a 40 40 0a 60  re_loop).@>.@@.`
11d0: 60 60 0a 0a 23 23 20 44 69 61 6c 73 0a 0a 42 69  ``..## Dials..Bi
11e0: 74 72 68 79 74 68 6d 20 70 72 6f 76 69 64 65 73  trhythm provides
11f0: 20 63 75 73 74 6f 6d 20 64 69 61 6c 73 2e 20 54   custom dials. T
1200: 68 65 73 65 20 64 69 61 6c 73 20 63 61 6e 20 62  hese dials can b
1210: 65 20 6d 61 70 70 65 64 20 74 6f 20 61 6e 79 20  e mapped to any 
1220: 61 73 70 65 63 74 73 20 6f 66 20 54 6f 6e 65 2e  aspects of Tone.
1230: 6a 73 2e 20 41 6c 6c 20 64 69 61 6c 73 20 61 72  js. All dials ar
1240: 65 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61  e available as a
1250: 6e 20 61 72 72 61 79 20 64 69 61 6c 73 20 69 6e  n array dials in
1260: 20 74 68 65 20 6c 69 76 65 20 63 6f 64 65 20 65   the live code e
1270: 64 69 74 6f 72 2e 0a 0a 60 60 60 7b 63 6f 64 65  ditor...```{code
1280: 2d 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d  -block} html.---
1290: 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d  .force: true.---
12a0: 0a 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a  ..@<.import cog.
12b0: 69 6d 70 6f 72 74 20 6f 73 0a 0a 64 69 61 6c 20  import os..dial 
12c0: 3d 20 22 22 22 0a 3c 64 69 61 6c 3e 0a 20 20 20  = """.<dial>.   
12d0: 20 3c 76 62 6f 78 3e 0a 20 20 20 20 20 20 20 20   <vbox>.        
12e0: 3c 64 69 76 20 63 6c 61 73 73 3d 22 6d 6c 2d 34  <div class="ml-4
12f0: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  ">.            <
1300: 68 73 74 61 63 6b 3e 0a 20 20 20 20 20 20 20 20  hstack>.        
1310: 20 20 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d          <div id=
1320: 7b 22 6b 6e 6f 62 22 20 2b 20 70 72 6f 70 73 2e  {"knob" + props.
1330: 74 69 7d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 20  ti}></div>.     
1340: 20 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20             <div 
1350: 63 6c 61 73 73 3d 22 6d 74 2d 31 22 20 73 74 79  class="mt-1" sty
1360: 6c 65 3d 22 68 65 69 67 68 74 3a 20 32 32 70 78  le="height: 22px
1370: 22 20 69 64 3d 7b 22 6b 6e 6f 62 2d 76 61 6c 75  " id={"knob-valu
1380: 65 22 20 2b 20 70 72 6f 70 73 2e 74 69 7d 3e 3c  e" + props.ti}><
1390: 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20  /div>.          
13a0: 20 20 20 20 20 20 3c 73 70 61 6e 20 63 6c 61 73        <span clas
13b0: 73 3d 22 63 75 72 73 6f 72 2d 70 6f 69 6e 74 65  s="cursor-pointe
13c0: 72 22 20 69 64 3d 7b 22 73 61 6d 70 6c 65 22 20  r" id={"sample" 
13d0: 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 7d  + this.props.ti}
13e0: 20 6f 6e 63 6c 69 63 6b 3d 7b 72 65 6d 6f 76 65   onclick={remove
13f0: 28 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 20 2d  (this.props.ti -
1400: 31 29 7d 3e 28 78 29 3c 2f 73 70 61 6e 3e 0a 20  1)}>(x)</span>. 
1410: 20 20 20 20 20 20 20 20 20 20 20 3c 2f 68 73 74             </hst
1420: 61 63 6b 3e 0a 20 20 20 20 20 20 20 20 3c 2f 64  ack>.        </d
1430: 69 76 3e 0a 20 20 20 20 3c 2f 76 62 6f 78 3e 0a  iv>.    </vbox>.
1440: 0a 20 20 20 20 3c 73 63 72 69 70 74 3e 0a 0a 74  .    <script>..t
1450: 68 69 73 2e 70 72 6f 70 73 20 3d 20 6f 70 74 73  his.props = opts
1460: 3b 0a 0a 72 65 6d 6f 76 65 28 69 6e 64 65 78 29  ;..remove(index)
1470: 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 29   {.    return ()
1480: 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 74 68   => {.        th
1490: 69 73 2e 70 72 6f 70 73 2e 72 6d 64 69 61 6c 28  is.props.rmdial(
14a0: 69 6e 64 65 78 29 3b 0a 20 20 20 20 7d 0a 7d 0a  index);.    }.}.
14b0: 0a 74 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22  .this.on("mount"
14c0: 2c 20 28 29 20 3d 3e 20 7b 0a 20 20 20 20 69 66  , () => {.    if
14d0: 20 28 6f 70 74 73 2e 76 29 20 7b 0a 0a 20 20 20   (opts.v) {..   
14e0: 20 20 20 20 20 4e 65 78 75 73 2e 63 6f 6c 6f 72       Nexus.color
14f0: 73 2e 61 63 63 65 6e 74 20 3d 20 22 23 30 30 30  s.accent = "#000
1500: 30 30 30 22 0a 20 20 20 20 20 20 20 20 4e 65 78  000".        Nex
1510: 75 73 2e 63 6f 6c 6f 72 73 2e 66 69 6c 6c 20 3d  us.colors.fill =
1520: 20 22 23 66 66 66 66 66 66 22 0a 0a 20 20 20 20   "#ffffff"..    
1530: 20 20 20 20 76 61 72 20 63 65 6c 6c 20 3d 20 77      var cell = w
1540: 69 6e 64 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c  indow.cellx.cell
1550: 78 28 30 2e 35 29 3b 0a 20 20 20 20 20 20 20 20  x(0.5);.        
1560: 76 61 72 20 64 69 61 6c 20 3d 20 6e 65 77 20 4e  var dial = new N
1570: 65 78 75 73 2e 44 69 61 6c 28 27 23 6b 6e 6f 62  exus.Dial('#knob
1580: 27 20 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e 74  ' + this.props.t
1590: 69 2c 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  i, {.           
15a0: 20 27 73 69 7a 65 27 3a 20 5b 34 35 2c 20 34 35   'size': [45, 45
15b0: 5d 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 27  ],.            '
15c0: 76 61 6c 75 65 27 3a 20 30 2e 35 0a 20 20 20 20  value': 0.5.    
15d0: 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20 20      });.        
15e0: 63 65 6c 6c 2e 6f 6e 43 68 61 6e 67 65 28 65 76  cell.onChange(ev
15f0: 74 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  t => {.         
1600: 20 20 20 69 66 20 28 65 76 74 2e 64 61 74 61 2e     if (evt.data.
1610: 70 72 65 76 56 61 6c 75 65 20 21 3d 3d 20 65 76  prevValue !== ev
1620: 74 2e 64 61 74 61 2e 76 61 6c 75 65 29 20 7b 0a  t.data.value) {.
1630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1640: 64 69 61 6c 2e 76 61 6c 75 65 20 3d 20 65 76 74  dial.value = evt
1650: 2e 64 61 74 61 2e 76 61 6c 75 65 3b 0a 20 20 20  .data.value;.   
1660: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1670: 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 64     });.        d
1680: 69 61 6c 2e 63 6f 6c 6f 72 69 7a 65 28 22 61 63  ial.colorize("ac
1690: 63 65 6e 74 22 2c 22 23 30 30 30 22 29 0a 20 20  cent","#000").  
16a0: 20 20 20 20 20 20 64 69 61 6c 2e 6f 6e 28 27 63        dial.on('c
16b0: 68 61 6e 67 65 27 2c 20 28 76 61 6c 29 20 3d 3e  hange', (val) =>
16c0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76   {.            v
16d0: 61 6c 20 3d 20 77 69 6e 64 6f 77 2e 72 6f 75 6e  al = window.roun
16e0: 64 54 6f 28 76 61 6c 2c 20 34 29 3b 0a 20 20 20  dTo(val, 4);.   
16f0: 20 20 20 20 20 20 20 20 20 24 28 27 23 6b 6e 6f           $('#kno
1700: 62 2d 76 61 6c 75 65 27 20 2b 20 74 68 69 73 2e  b-value' + this.
1710: 70 72 6f 70 73 2e 74 69 29 2e 68 74 6d 6c 28 76  props.ti).html(v
1720: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
1730: 20 63 65 6c 6c 28 76 61 6c 29 3b 0a 20 20 20 20   cell(val);.    
1740: 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20 20 74      });.       t
1750: 68 69 73 2e 70 72 6f 70 73 2e 76 5b 22 63 65 6c  his.props.v["cel
1760: 6c 22 5d 20 3d 20 63 65 6c 6c 3b 0a 20 20 20 20  l"] = cell;.    
1770: 7d 0a 7d 29 3b 0a 20 20 20 3c 2f 73 63 72 69 70  }.});.   </scrip
1780: 74 3e 0a 0a 3c 2f 64 69 61 6c 3e 0a 22 22 22 0a  t>..</dial>.""".
1790: 0a 63 6f 67 2e 6f 75 74 28 64 69 61 6c 29 0a 6f  .cog.out(dial).o
17a0: 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 70 75 62  s.system("rm pub
17b0: 6c 69 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 64  lic/components/d
17c0: 69 61 6c 2e 74 61 67 22 29 0a 66 20 3d 20 6f 70  ial.tag").f = op
17d0: 65 6e 28 22 70 75 62 6c 69 63 2f 63 6f 6d 70 6f  en("public/compo
17e0: 6e 65 6e 74 73 2f 64 69 61 6c 2e 74 61 67 22 2c  nents/dial.tag",
17f0: 20 22 77 22 29 0a 66 2e 77 72 69 74 65 28 64 69   "w").f.write(di
1800: 61 6c 29 0a 66 2e 63 6c 6f 73 65 28 29 0a 40 3e  al).f.close().@>
1810: 0a 40 40 0a 60 60 60 0a 0a 23 23 20 4e 75 6d 62  .@@.```..## Numb
1820: 65 72 73 0a 0a 54 68 65 73 65 20 6e 75 6d 62 65  ers..These numbe
1830: 72 73 20 63 61 6e 20 62 65 20 6d 61 70 70 65 64  rs can be mapped
1840: 20 74 6f 20 61 6e 79 20 61 73 70 65 63 74 20 6f   to any aspect o
1850: 66 20 54 6f 6e 65 2e 6a 73 2e 20 41 6c 6c 20 6e  f Tone.js. All n
1860: 75 6d 62 65 72 20 62 6f 78 65 73 20 61 72 65 20  umber boxes are 
1870: 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 6e 20  available as an 
1880: 61 72 72 61 79 20 6e 75 6d 62 65 72 73 20 69 6e  array numbers in
1890: 20 74 68 65 20 6c 69 76 65 20 63 6f 64 65 20 65   the live code e
18a0: 64 69 74 6f 72 2e 20 55 73 65 66 75 6c 20 66 6f  ditor. Useful fo
18b0: 72 20 64 65 62 75 67 67 69 6e 67 20 70 75 72 70  r debugging purp
18c0: 6f 73 65 73 2e 0a 0a 60 60 60 7b 63 6f 64 65 2d  oses...```{code-
18d0: 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a  block} html.---.
18e0: 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a  force: true.---.
18f0: 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 69  .@<.import cog.i
1900: 6d 70 6f 72 74 20 6f 73 0a 0a 6e 75 6d 62 65 72  mport os..number
1910: 20 3d 20 22 22 22 0a 3c 6e 75 6d 62 65 72 3e 0a   = """.<number>.
1920: 20 20 20 20 3c 76 62 6f 78 3e 0a 20 20 20 20 20      <vbox>.     
1930: 20 20 20 3c 64 69 76 20 20 63 6c 61 73 73 3d 22     <div  class="
1940: 6d 6c 2d 34 22 3e 0a 20 20 20 20 20 20 20 20 20  ml-4">.         
1950: 20 20 20 3c 68 73 74 61 63 6b 3e 0a 20 20 20 20     <hstack>.    
1960: 20 20 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d          <div id=
1970: 7b 22 6e 75 6d 62 65 72 22 20 2b 20 70 72 6f 70  {"number" + prop
1980: 73 2e 74 69 7d 3e 3c 2f 64 69 76 3e 0a 20 20 20  s.ti}></div>.   
1990: 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c           <div cl
19a0: 61 73 73 3d 22 6d 74 2d 31 22 20 73 74 79 6c 65  ass="mt-1" style
19b0: 3d 22 68 65 69 67 68 74 3a 20 32 32 70 78 22 20  ="height: 22px" 
19c0: 69 64 3d 7b 22 6e 75 6d 62 65 72 2d 76 61 6c 75  id={"number-valu
19d0: 65 22 20 2b 20 70 72 6f 70 73 2e 74 69 7d 3e 3c  e" + props.ti}><
19e0: 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20  /div>.          
19f0: 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 63    <span class="c
1a00: 75 72 73 6f 72 2d 70 6f 69 6e 74 65 72 22 20 6f  ursor-pointer" o
1a10: 6e 63 6c 69 63 6b 3d 7b 72 65 6d 6f 76 65 28 74  nclick={remove(t
1a20: 68 69 73 2e 70 72 6f 70 73 2e 74 69 20 2d 31 29  his.props.ti -1)
1a30: 7d 3e 28 78 29 3c 2f 73 70 61 6e 3e 0a 20 20 20  }>(x)</span>.   
1a40: 20 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 20       </hstack>. 
1a50: 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20         </div>.  
1a60: 20 20 3c 2f 76 62 6f 78 3e 0a 0a 20 20 20 20 3c    </vbox>..    <
1a70: 73 63 72 69 70 74 3e 0a 0a 74 68 69 73 2e 70 72  script>..this.pr
1a80: 6f 70 73 20 3d 20 6f 70 74 73 3b 0a 0a 20 20 20  ops = opts;..   
1a90: 20 72 65 6d 6f 76 65 28 69 6e 64 65 78 29 20 7b   remove(index) {
1aa0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1ab0: 28 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20  () => {.        
1ac0: 20 20 20 20 74 68 69 73 2e 70 72 6f 70 73 2e 72      this.props.r
1ad0: 6d 6e 75 6d 62 65 72 28 69 6e 64 65 78 29 3b 0a  mnumber(index);.
1ae0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
1af0: 0a 74 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22  .this.on("mount"
1b00: 2c 20 28 29 20 3d 3e 20 7b 0a 20 20 20 20 69 66  , () => {.    if
1b10: 20 28 6f 70 74 73 2e 76 29 20 7b 0a 0a 20 20 20   (opts.v) {..   
1b20: 20 20 20 20 20 4e 65 78 75 73 2e 63 6f 6c 6f 72       Nexus.color
1b30: 73 2e 61 63 63 65 6e 74 20 3d 20 22 23 30 30 30  s.accent = "#000
1b40: 30 30 30 22 0a 20 20 20 20 20 20 20 20 4e 65 78  000".        Nex
1b50: 75 73 2e 63 6f 6c 6f 72 73 2e 66 69 6c 6c 20 3d  us.colors.fill =
1b60: 20 22 23 66 66 66 66 66 66 22 0a 0a 20 20 20 20   "#ffffff"..    
1b70: 20 20 20 20 76 61 72 20 63 65 6c 6c 20 3d 20 77      var cell = w
1b80: 69 6e 64 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c  indow.cellx.cell
1b90: 78 28 30 29 0a 20 20 20 20 20 20 20 20 76 61 72  x(0).        var
1ba0: 20 6e 75 6d 62 65 72 20 3d 20 6e 65 77 20 4e 65   number = new Ne
1bb0: 78 75 73 2e 4e 75 6d 62 65 72 28 27 23 6e 75 6d  xus.Number('#num
1bc0: 62 65 72 27 20 2b 20 74 68 69 73 2e 70 72 6f 70  ber' + this.prop
1bd0: 73 2e 74 69 2c 20 7b 0a 20 20 20 20 20 20 20 20  s.ti, {.        
1be0: 20 20 20 20 27 76 61 6c 75 65 27 3a 20 30 2c 0a      'value': 0,.
1bf0: 20 20 20 20 20 20 20 20 20 20 20 20 27 73 74 65              'ste
1c00: 70 27 3a 20 30 2e 30 31 0a 20 20 20 20 20 20 20  p': 0.01.       
1c10: 20 7d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c   });.        cel
1c20: 6c 2e 6f 6e 43 68 61 6e 67 65 28 65 76 74 20 3d  l.onChange(evt =
1c30: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
1c40: 69 66 20 28 65 76 74 2e 64 61 74 61 2e 70 72 65  if (evt.data.pre
1c50: 76 56 61 6c 75 65 20 21 3d 3d 20 65 76 74 2e 64  vValue !== evt.d
1c60: 61 74 61 2e 76 61 6c 75 65 29 20 7b 0a 20 20 20  ata.value) {.   
1c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d               num
1c80: 62 65 72 2e 76 61 6c 75 65 20 3d 20 65 76 74 2e  ber.value = evt.
1c90: 64 61 74 61 2e 76 61 6c 75 65 3b 0a 20 20 20 20  data.value;.    
1ca0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1cb0: 20 20 7d 29 3b 0a 0a 20 20 20 20 20 20 20 20 74    });..        t
1cc0: 68 69 73 2e 70 72 6f 70 73 2e 76 5b 22 76 22 5d  his.props.v["v"]
1cd0: 20 3d 20 63 65 6c 6c 3b 0a 20 20 20 20 7d 0a 7d   = cell;.    }.}
1ce0: 29 3b 0a 20 20 20 3c 2f 73 63 72 69 70 74 3e 0a  );.   </script>.
1cf0: 0a 3c 2f 6e 75 6d 62 65 72 3e 0a 22 22 22 0a 0a  .</number>."""..
1d00: 63 6f 67 2e 6f 75 74 28 6e 75 6d 62 65 72 29 0a  cog.out(number).
1d10: 6f 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 70 75  os.system("rm pu
1d20: 62 6c 69 63 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f  blic/components/
1d30: 6e 75 6d 62 65 72 2e 74 61 67 22 29 0a 66 20 3d  number.tag").f =
1d40: 20 6f 70 65 6e 28 22 70 75 62 6c 69 63 2f 63 6f   open("public/co
1d50: 6d 70 6f 6e 65 6e 74 73 2f 6e 75 6d 62 65 72 2e  mponents/number.
1d60: 74 61 67 22 2c 20 22 77 22 29 0a 66 2e 77 72 69  tag", "w").f.wri
1d70: 74 65 28 6e 75 6d 62 65 72 29 0a 66 2e 63 6c 6f  te(number).f.clo
1d80: 73 65 28 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a  se().@>.@@.```..
1d90: 23 23 20 41 75 74 6f 4b 6e 6f 62 0a 0a 41 75 74  ## AutoKnob..Aut
1da0: 6f 4b 6e 6f 62 20 65 6e 61 62 6c 65 73 20 70 72  oKnob enables pr
1db0: 6f 67 72 61 6d 6d 61 74 69 63 20 61 75 74 6f 6d  ogrammatic autom
1dc0: 61 74 69 6f 6e 20 69 6e 20 42 69 74 72 68 79 74  ation in Bitrhyt
1dd0: 68 6d 0a 0a 60 78 20 2d 3e 20 5b 31 2c 20 32 2e  hm..`x -> [1, 2.
1de0: 35 2c 20 34 2c 20 33 2e 32 5d 20 7c 20 62 79 20  5, 4, 3.2] | by 
1df0: 30 2e 33 60 0a 0a 78 20 77 69 6c 6c 20 67 6f 20  0.3`..x will go 
1e00: 66 72 6f 6d 20 31 20 74 6f 20 32 2e 35 20 74 6f  from 1 to 2.5 to
1e10: 20 34 20 74 6f 20 33 2e 32 20 69 6e 20 69 6e 63   4 to 3.2 in inc
1e20: 72 65 6d 65 6e 74 73 20 6f 66 20 30 2e 33 20 66  rements of 0.3 f
1e30: 6f 72 20 65 76 65 72 79 20 74 69 63 6b 2e 20 57  or every tick. W
1e40: 68 69 6c 65 20 78 20 77 69 6c 6c 20 69 6e 63 72  hile x will incr
1e50: 65 61 73 65 20 74 69 6c 6c 20 34 20 2e 2e 2e 20  ease till 4 ... 
1e60: 69 74 20 77 69 6c 6c 20 64 65 63 72 65 61 73 65  it will decrease
1e70: 20 6f 6e 63 65 20 69 74 20 72 65 61 63 68 65 73   once it reaches
1e80: 20 34 20 61 6e 64 20 64 72 6f 70 20 64 6f 77 6e   4 and drop down
1e90: 20 74 6f 20 33 2e 32 2e 20 41 66 74 65 72 20 72   to 3.2. After r
1ea0: 65 61 63 68 69 6e 67 20 33 2e 32 20 79 6f 75 20  eaching 3.2 you 
1eb0: 63 61 6e 20 73 74 61 79 20 74 68 65 72 65 20 6f  can stay there o
1ec0: 72 20 72 65 76 65 72 73 65 20 62 61 63 6b 2e 20  r reverse back. 
1ed0: 41 74 20 61 6e 79 20 70 6f 69 6e 74 20 64 75 72  At any point dur
1ee0: 69 6e 67 20 6c 69 76 65 20 65 64 69 74 69 6e 67  ing live editing
1ef0: 2c 20 79 6f 75 20 63 61 6e 20 61 64 64 20 61 6e  , you can add an
1f00: 20 65 78 74 72 61 20 65 6c 65 6d 65 6e 74 20 74   extra element t
1f10: 6f 20 74 68 65 20 61 72 72 61 79 2e 20 49 66 20  o the array. If 
1f20: 79 6f 75 20 61 64 64 20 35 20 66 6f 72 20 65 78  you add 5 for ex
1f30: 61 6d 70 6c 65 2c 20 74 68 65 20 6c 6f 6f 70 20  ample, the loop 
1f40: 77 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 66 72  will continue fr
1f50: 6f 6d 20 33 2e 32 20 74 6f 20 35 2e 0a 0a 59 6f  om 3.2 to 5...Yo
1f60: 75 20 63 61 6e 20 74 68 69 6e 6b 20 6f 66 20 65  u can think of e
1f70: 61 63 68 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74  ach element in t
1f80: 68 65 20 61 72 72 61 79 20 61 73 20 74 68 65 20  he array as the 
1f90: 22 66 69 6e 61 6c 20 6b 6e 6f 62 20 70 6f 73 69  "final knob posi
1fa0: 74 69 6f 6e 22 20 61 6e 64 20 69 6e 20 65 61 63  tion" and in eac
1fb0: 68 20 63 79 63 6c 65 20 77 65 20 61 72 65 20 6d  h cycle we are m
1fc0: 6f 76 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78  oving to the nex
1fd0: 74 20 6b 6e 6f 62 20 70 6f 73 69 74 69 6f 6e 20  t knob position 
1fe0: 69 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66  in increments of
1ff0: 20 30 2e 33 0a 0a 41 6e 20 61 6c 74 65 72 6e 61   0.3..An alterna
2000: 74 65 20 74 6f 20 41 75 74 6f 4b 6e 6f 62 20 69  te to AutoKnob i
2010: 73 20 74 6f 20 75 73 65 20 54 69 6d 65 64 4b 6e  s to use TimedKn
2020: 6f 62 2e 20 49 6e 20 74 68 65 20 65 6e 64 6c 65  ob. In the endle
2030: 73 73 20 61 63 69 64 20 62 61 6e 67 65 72 20 20  ss acid banger  
2040: 70 72 6f 6a 65 63 74 2c 20 74 68 65 20 62 61 73  project, the bas
2050: 69 63 20 63 6f 64 65 20 77 61 73 20 75 73 69 6e  ic code was usin
2060: 67 20 61 20 73 69 6d 70 6c 65 20 74 69 6d 65 72  g a simple timer
2070: 20 74 6f 20 72 61 6e 64 6f 6d 6c 79 20 6d 6f 76   to randomly mov
2080: 65 20 74 68 65 20 6b 6e 6f 62 20 70 6f 73 69 74  e the knob posit
2090: 69 6f 6e 20 61 6c 6f 6e 67 20 77 69 74 68 20 6e  ion along with n
20a0: 6f 74 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20  ote collections 
20b0: 61 6e 64 20 77 65 69 67 68 74 65 64 20 72 61 6e  and weighted ran
20c0: 64 6f 6d 20 63 68 6f 69 63 65 20 6f 6e 20 6e 6f  dom choice on no
20d0: 74 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 66  te collections f
20e0: 6f 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 68  or generating rh
20f0: 79 74 68 6d 73 2e 0a 0a 54 69 6d 65 64 4b 6e 6f  ythms...TimedKno
2100: 62 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74  bs can be used t
2110: 6f 20 61 64 64 20 73 6d 61 6c 6c 20 76 61 72 69  o add small vari
2120: 61 74 69 6f 6e 73 20 69 6e 20 76 6f 6c 75 6d 65  ations in volume
2130: 20 74 6f 20 6d 61 6b 65 20 74 68 65 20 64 72 75   to make the dru
2140: 6d 73 20 73 6f 75 6e 64 73 20 6d 6f 72 65 20 6e  ms sounds more n
2150: 61 74 75 72 61 6c 2e 0a 0a 60 60 60 7b 63 6f 64  atural...```{cod
2160: 65 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d 2d 0a  e-block} js.---.
2170: 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a  force: true.---.
2180: 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 0a  .@<.import cog..
2190: 6b 6e 6f 62 5f 63 6f 64 65 20 3d 20 22 22 22 0a  knob_code = """.
21a0: 66 75 6e 63 74 69 6f 6e 20 6b 6e 6f 62 28 6f 70  function knob(op
21b0: 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20 6f 70 74  tions) {.    opt
21c0: 69 6f 6e 73 20 3d 20 6f 70 74 69 6f 6e 73 20 7c  ions = options |
21d0: 7c 20 7b 7d 3b 0a 20 20 20 20 76 61 72 20 63 6f  | {};.    var co
21e0: 6e 74 65 78 74 20 3d 20 7b 7d 3b 0a 20 20 20 20  ntext = {};.    
21f0: 63 6f 6e 74 65 78 74 2e 72 61 6d 70 20 3d 20 6f  context.ramp = o
2200: 70 74 69 6f 6e 73 2e 72 61 6d 70 20 7c 7c 20 5b  ptions.ramp || [
2210: 30 20 2c 20 31 5d 3b 0a 20 20 20 20 63 6f 6e 74  0 , 1];.    cont
2220: 65 78 74 2e 63 6f 75 6e 74 5f 73 6b 69 70 20 3d  ext.count_skip =
2230: 20 6f 70 74 69 6f 6e 73 2e 73 70 65 65 64 20 7c   options.speed |
2240: 7c 20 34 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74  | 4;.    context
2250: 2e 73 74 65 70 20 3d 20 6f 70 74 69 6f 6e 73 2e  .step = options.
2260: 73 74 65 70 20 7c 7c 20 30 2e 30 31 3b 0a 20 20  step || 0.01;.  
2270: 20 20 63 6f 6e 74 65 78 74 2e 72 65 76 65 72 73    context.revers
2280: 65 20 3d 20 6f 70 74 69 6f 6e 73 2e 72 65 76 65  e = options.reve
2290: 72 73 65 20 7c 7c 20 74 72 75 65 3b 0a 20 20 20  rse || true;.   
22a0: 20 63 6f 6e 74 65 78 74 2e 6e 75 6d 62 65 72 20   context.number 
22b0: 3d 20 6f 70 74 69 6f 6e 73 2e 6e 75 6d 62 65 72  = options.number
22c0: 20 7c 7c 20 6e 75 6c 6c 3b 0a 0a 20 20 20 20 63   || null;..    c
22d0: 6f 6e 74 65 78 74 2e 63 75 72 72 65 6e 74 5f 63  ontext.current_c
22e0: 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 63 6f  ount = 0;.    co
22f0: 6e 74 65 78 74 2e 69 6e 64 65 78 20 3d 20 30 3b  ntext.index = 0;
2300: 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c  .    context.val
2310: 20 3d 20 77 69 6e 64 6f 77 2e 63 65 6c 6c 78 2e   = window.cellx.
2320: 63 65 6c 6c 78 28 6f 70 74 69 6f 6e 73 2e 69 6e  cellx(options.in
2330: 69 74 69 61 6c 20 7c 7c 20 30 2e 35 29 0a 0a 20  itial || 0.5).. 
2340: 20 20 20 66 75 6e 63 74 69 6f 6e 20 63 68 61 6e     function chan
2350: 67 65 43 6f 6e 74 65 78 74 28 29 20 7b 0a 20 20  geContext() {.  
2360: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 6e 65        context.ne
2370: 78 74 5f 76 61 6c 20 3d 20 63 6f 6e 74 65 78 74  xt_val = context
2380: 2e 72 61 6d 70 5b 63 6f 6e 74 65 78 74 2e 69 6e  .ramp[context.in
2390: 64 65 78 20 2b 20 31 5d 3b 0a 0a 20 20 20 20 20  dex + 1];..     
23a0: 20 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28 63     context.val(c
23b0: 6f 6e 74 65 78 74 2e 72 61 6d 70 5b 63 6f 6e 74  ontext.ramp[cont
23c0: 65 78 74 2e 69 6e 64 65 78 5d 29 3b 0a 20 20 20  ext.index]);.   
23d0: 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74       if (context
23e0: 2e 76 61 6c 28 29 20 3e 20 63 6f 6e 74 65 78 74  .val() > context
23f0: 2e 6e 65 78 74 5f 76 61 6c 29 20 7b 0a 20 20 20  .next_val) {.   
2400: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74           context
2410: 2e 64 69 72 65 63 74 69 6f 6e 20 3d 20 2d 31 3b  .direction = -1;
2420: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
2430: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
2440: 6e 74 65 78 74 2e 64 69 72 65 63 74 69 6f 6e 20  ntext.direction 
2450: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 1;.        }. 
2460: 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 67 65     }..    change
2470: 43 6f 6e 74 65 78 74 28 29 3b 0a 0a 20 20 20 20  Context();..    
2480: 72 65 74 75 72 6e 20 7b 0a 20 20 20 20 20 20 20  return {.       
2490: 20 22 63 65 6c 6c 22 3a 20 63 6f 6e 74 65 78 74   "cell": context
24a0: 2e 76 61 6c 2c 0a 20 20 20 20 20 20 20 20 22 70  .val,.        "p
24b0: 75 73 68 22 3a 20 66 75 6e 63 74 69 6f 6e 20 28  ush": function (
24c0: 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  val) {.         
24d0: 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e     context.ramp.
24e0: 70 75 73 68 28 76 61 6c 29 3b 0a 20 20 20 20 20  push(val);.     
24f0: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 72     },.        "r
2500: 65 70 6c 61 63 65 22 3a 20 66 75 6e 63 74 69 6f  eplace": functio
2510: 6e 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20  n (val) {.      
2520: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61        context.ra
2530: 6d 70 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20  mp = val;.      
2540: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 73 70    },.        "sp
2550: 65 65 64 22 3a 20 66 75 6e 63 74 69 6f 6e 20 28  eed": function (
2560: 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20 20  val) {.         
2570: 20 20 20 63 6f 6e 74 65 78 74 2e 63 6f 75 6e 74     context.count
2580: 5f 73 6b 69 70 20 3d 20 76 61 6c 3b 0a 20 20 20  _skip = val;.   
2590: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
25a0: 22 73 74 65 70 22 3a 20 66 75 6e 63 74 69 6f 6e  "step": function
25b0: 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20   (val) {.       
25c0: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 73 74 65       context.ste
25d0: 70 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20 20  p = val;.       
25e0: 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 75 70 22   },.        "up"
25f0: 3a 20 66 75 6e 63 74 69 6f 6e 20 28 76 61 6c 29  : function (val)
2600: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76   {.            v
2610: 61 6c 20 3d 20 76 61 6c 20 7c 7c 20 30 2e 31 3b  al = val || 0.1;
2620: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
2630: 74 65 78 74 2e 72 61 6d 70 2e 70 75 73 68 28 63  text.ramp.push(c
2640: 6f 6e 74 65 78 74 2e 72 61 6d 70 5b 63 6f 6e 74  ontext.ramp[cont
2650: 65 78 74 2e 72 61 6d 70 2e 6c 65 6e 67 74 68 20  ext.ramp.length 
2660: 2d 20 31 5d 20 2b 20 76 61 6c 29 3b 0a 20 20 20  - 1] + val);.   
2670: 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20       },.        
2680: 22 64 6f 77 6e 22 3a 20 66 75 6e 63 74 69 6f 6e  "down": function
2690: 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20   (val) {.       
26a0: 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 20 7c       val = val |
26b0: 7c 20 2d 30 2e 31 3b 0a 20 20 20 20 20 20 20 20  | -0.1;.        
26c0: 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70      context.ramp
26d0: 2e 70 75 73 68 28 63 6f 6e 74 65 78 74 2e 72 61  .push(context.ra
26e0: 6d 70 5b 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e  mp[context.ramp.
26f0: 6c 65 6e 67 74 68 20 2d 20 31 5d 20 2b 20 76 61  length - 1] + va
2700: 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 2c 0a 20  l);.        },. 
2710: 20 20 20 20 20 20 22 6d 6f 76 65 22 3a 20 66 75        "move": fu
2720: 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20  nction () {.    
2730: 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74          if (cont
2740: 65 78 74 2e 63 75 72 72 65 6e 74 5f 63 6f 75 6e  ext.current_coun
2750: 74 20 3e 3d 20 63 6f 6e 74 65 78 74 2e 63 6f 75  t >= context.cou
2760: 6e 74 5f 73 6b 69 70 29 20 7b 0a 20 20 20 20 20  nt_skip) {.     
2770: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65             conte
2780: 78 74 2e 63 75 72 72 65 6e 74 5f 63 6f 75 6e 74  xt.current_count
2790: 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20 20   = 1;..         
27a0: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65         if (conte
27b0: 78 74 2e 64 69 72 65 63 74 69 6f 6e 20 3d 3d 20  xt.direction == 
27c0: 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1) {.           
27d0: 20 20 20 20 20 20 20 20 20 76 61 72 20 63 6d 70           var cmp
27e0: 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b   = function () {
27f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2800: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
2810: 28 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20 3e  (context.val() >
2820: 3d 20 63 6f 6e 74 65 78 74 2e 6e 65 78 74 5f 76  = context.next_v
2830: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  al);.           
2840: 20 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20           };.    
2850: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
2860: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2870: 20 20 20 20 20 20 20 20 20 76 61 72 20 63 6d 70           var cmp
2880: 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b   = function () {
2890: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
28a0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
28b0: 28 63 6f 6e 74 65 78 74 2e 6e 65 78 74 5f 76 61  (context.next_va
28c0: 6c 20 3e 3d 20 63 6f 6e 74 65 78 74 2e 76 61 6c  l >= context.val
28d0: 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ());.           
28e0: 20 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20 20           };.    
28f0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
2910: 66 20 28 63 6d 70 28 29 29 20 7b 0a 20 20 20 20  f (cmp()) {.    
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 63 6f 6e 74 65 78 74 2e 76 61 6c 28 63 6f 6e 74  context.val(cont
2940: 65 78 74 2e 6e 65 78 74 5f 76 61 6c 29 3b 0a 20  ext.next_val);. 
2950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2960: 20 20 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65 78     context.index
2970: 20 3d 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65 78   = context.index
2980: 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   + 1;.          
2990: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f            if (co
29a0: 6e 74 65 78 74 2e 69 6e 64 65 78 20 3d 3d 3d 20  ntext.index === 
29b0: 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e 6c 65 6e  context.ramp.len
29c0: 67 74 68 20 2d 31 29 20 7b 0a 20 20 20 20 20 20  gth -1) {.      
29d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
29e0: 20 20 69 66 20 28 63 6f 6e 74 65 78 74 2e 72 65    if (context.re
29f0: 76 65 72 73 65 29 20 7b 0a 20 20 20 20 20 20 20  verse) {.       
2a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a10: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 69 6e 64       context.ind
2a20: 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ex = 0;.        
2a30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a40: 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70      context.ramp
2a50: 20 3d 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e   = context.ramp.
2a60: 72 65 76 65 72 73 65 28 29 3b 0a 20 20 20 20 20  reverse();.     
2a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a80: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e          context.
2ab0: 69 6e 64 65 78 20 3d 20 63 6f 6e 74 65 78 74 2e  index = context.
2ac0: 69 6e 64 65 78 20 2d 20 31 3b 0a 20 20 20 20 20  index - 1;.     
2ad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ae0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
2af0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
2b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63                 c
2b10: 68 61 6e 67 65 43 6f 6e 74 65 78 74 28 29 3b 0a  hangeContext();.
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 20 20 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28      context.val(
2b40: 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20 2b 20  context.val() + 
2b50: 63 6f 6e 74 65 78 74 2e 73 74 65 70 20 2a 20 63  context.step * c
2b60: 6f 6e 74 65 78 74 2e 64 69 72 65 63 74 69 6f 6e  ontext.direction
2b70: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2b80: 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65         if (conte
2b90: 78 74 2e 6e 75 6d 62 65 72 29 20 63 6f 6e 74 65  xt.number) conte
2ba0: 78 74 2e 6e 75 6d 62 65 72 28 63 6f 6e 74 65 78  xt.number(contex
2bb0: 74 2e 76 61 6c 28 29 29 3b 0a 20 20 20 20 20 20  t.val());.      
2bc0: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
2bd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
2be0: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 76         context.v
2bf0: 61 6c 28 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29  al(context.val()
2c00: 20 2b 20 63 6f 6e 74 65 78 74 2e 73 74 65 70 20   + context.step 
2c10: 2a 20 63 6f 6e 74 65 78 74 2e 64 69 72 65 63 74  * context.direct
2c20: 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ion);.          
2c30: 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f            if (co
2c40: 6e 74 65 78 74 2e 6e 75 6d 62 65 72 29 20 63 6f  ntext.number) co
2c50: 6e 74 65 78 74 2e 6e 75 6d 62 65 72 28 63 6f 6e  ntext.number(con
2c60: 74 65 78 74 2e 76 61 6c 28 29 29 3b 0a 20 20 20  text.val());.   
2c70: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
2c80: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2c90: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2ca0: 20 20 20 20 63 6f 6e 74 65 78 74 2e 63 75 72 72      context.curr
2cb0: 65 6e 74 5f 63 6f 75 6e 74 20 2b 3d 20 31 3b 0a  ent_count += 1;.
2cc0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20              }.. 
2cd0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2ce0: 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 3b 0a   context.val();.
2cf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
2d00: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 74 69 6d 65  }..function time
2d10: 64 4b 6e 6f 62 28 6f 70 74 69 6f 6e 73 29 20 7b  dKnob(options) {
2d20: 0a 20 20 20 20 6f 70 74 69 6f 6e 73 20 3d 20 6f  .    options = o
2d30: 70 74 69 6f 6e 73 20 7c 7c 20 7b 7d 3b 0a 20 20  ptions || {};.  
2d40: 20 20 76 61 72 20 63 6f 6e 74 65 78 74 20 3d 20    var context = 
2d50: 7b 7d 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e  {};.    context.
2d60: 69 6e 74 65 72 76 61 6c 20 3d 20 6f 70 74 69 6f  interval = optio
2d70: 6e 73 2e 69 6e 74 65 72 76 61 6c 20 7c 7c 20 31  ns.interval || 1
2d80: 30 30 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74 2e  00;.    context.
2d90: 6b 6e 6f 62 20 3d 20 6b 6e 6f 62 28 6f 70 74 69  knob = knob(opti
2da0: 6f 6e 73 29 3b 0a 0a 20 20 20 20 63 6f 6e 74 65  ons);..    conte
2db0: 78 74 2e 74 69 6d 65 72 20 3d 20 73 65 74 49 6e  xt.timer = setIn
2dc0: 74 65 72 76 61 6c 28 66 75 6e 63 74 69 6f 6e 20  terval(function 
2dd0: 28 29 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e 74  () {.       cont
2de0: 65 78 74 2e 6b 6e 6f 62 2e 6d 6f 76 65 28 29 3b  ext.knob.move();
2df0: 0a 20 20 20 20 7d 2c 20 63 6f 6e 74 65 78 74 2e  .    }, context.
2e00: 69 6e 74 65 72 76 61 6c 29 3b 0a 0a 20 20 20 20  interval);..    
2e10: 63 6f 6e 74 65 78 74 2e 6b 6e 6f 62 5b 22 63 6c  context.knob["cl
2e20: 65 61 72 22 5d 20 3d 20 66 75 6e 63 74 69 6f 6e  ear"] = function
2e30: 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 63 6c   () {.        cl
2e40: 65 61 72 49 6e 74 65 72 76 61 6c 28 63 6f 6e 74  earInterval(cont
2e50: 65 78 74 2e 74 69 6d 65 72 29 3b 0a 20 20 20 20  ext.timer);.    
2e60: 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63 6f  }..    return co
2e70: 6e 74 65 78 74 2e 6b 6e 6f 62 3b 0a 7d 0a 22 22  ntext.knob;.}.""
2e80: 22 0a 63 6f 67 2e 6f 75 74 28 6b 6e 6f 62 5f 63  ".cog.out(knob_c
2e90: 6f 64 65 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a  ode).@>.@@.```..
2ea0: 23 23 20 4d 61 69 6e 20 55 49 0a 0a 40 3c 0a 69  ## Main UI..@<.i
2eb0: 6d 70 6f 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74  mport cog.import
2ec0: 20 6f 73 0a 0a 69 66 20 44 45 56 20 3d 3d 20 22   os..if DEV == "
2ed0: 31 22 3a 0a 20 20 20 20 73 74 75 66 66 20 3d 20  1":.    stuff = 
2ee0: 22 22 22 0a 60 60 60 0a 2f 2f 20 4e 6f 74 20 77  """.```.// Not w
2ef0: 6f 72 6b 69 6e 67 0a 0a 2e 43 6f 64 65 4d 69 72  orking...CodeMir
2f00: 72 6f 72 2d 73 65 6c 65 63 74 65 64 2c 0a 2e 43  ror-selected,..C
2f10: 6f 64 65 4d 69 72 72 6f 72 2d 66 6f 63 75 73 65  odeMirror-focuse
2f20: 64 2c 0a 2e 43 6f 64 65 4d 69 72 72 6f 72 2d 61  d,..CodeMirror-a
2f30: 63 74 69 76 65 6c 69 6e 65 2c 0a 2e 43 6f 64 65  ctiveline,..Code
2f40: 4d 69 72 72 6f 72 2d 61 63 74 69 76 65 6c 69 6e  Mirror-activelin
2f50: 65 2d 62 61 63 6b 67 72 6f 75 6e 64 20 7b 0a 20  e-background {. 
2f60: 20 20 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 74     background: t
2f70: 72 61 6e 73 70 61 72 65 6e 74 3b 0a 20 20 20 20  ransparent;.    
2f80: 63 6f 6c 6f 72 3a 20 23 38 38 32 64 32 64 3b 0a  color: #882d2d;.
2f90: 20 20 20 20 7a 2d 69 6e 64 65 78 3a 20 35 20 21      z-index: 5 !
2fa0: 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 60 60 60  important;.}.```
2fb0: 0a 22 22 22 0a 20 20 20 20 63 6f 67 2e 6f 75 74  .""".    cog.out
2fc0: 28 73 74 75 66 66 29 0a 40 3e 0a 40 40 0a 0a 0a  (stuff).@>.@@...
2fd0: 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63 6b 7d 20  ```{code-block} 
2fe0: 68 74 6d 6c 0a 2d 2d 2d 0a 66 6f 72 63 65 3a 20  html.---.force: 
2ff0: 74 72 75 65 0a 2d 2d 2d 0a 0a 40 3c 0a 69 6d 70  true.---..@<.imp
3000: 6f 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74 20 6f  ort cog.import o
3010: 73 0a 0a 62 69 74 72 68 79 74 68 6d 20 3d 20 22  s..bitrhythm = "
3020: 22 22 0a 3c 62 69 74 72 68 79 74 68 6d 3e 0a 0a  "".<bitrhythm>..
3030: 3c 64 69 76 3e 0a 20 20 20 20 3c 76 73 74 61 63  <div>.    <vstac
3040: 6b 20 69 64 3d 22 68 65 61 64 65 72 2d 70 6c 61  k id="header-pla
3050: 79 62 61 63 6b 22 3e 0a 20 20 20 20 20 20 20 20  yback">.        
3060: 3c 68 73 74 61 63 6b 3e 0a 20 20 20 20 20 20 20  <hstack>.       
3070: 20 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d       <div class=
3080: 22 6d 6c 2d 32 22 3e 0a 20 20 20 20 20 20 20 20  "ml-2">.        
3090: 20 20 20 20 20 20 20 20 3c 62 75 74 74 6f 6e 20          <button 
30a0: 74 79 70 65 3d 22 62 75 74 74 6f 6e 22 20 63 6c  type="button" cl
30b0: 61 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70 72 69  ass="btn btn-pri
30c0: 6d 61 72 79 20 77 2d 31 2f 31 30 20 6d 6c 2d 32  mary w-1/10 ml-2
30d0: 20 6d 74 2d 31 22 20 6f 6e 63 6c 69 63 6b 3d 7b   mt-1" onclick={
30e0: 61 64 64 44 69 61 6c 7d 3e 2b 20 44 69 61 6c 3c  addDial}>+ Dial<
30f0: 2f 62 75 74 74 6f 6e 3e 0a 20 20 20 20 20 20 20  /button>.       
3100: 20 20 20 20 20 20 20 20 20 3c 62 75 74 74 6f 6e           <button
3110: 20 74 79 70 65 3d 22 62 75 74 74 6f 6e 22 20 63   type="button" c
3120: 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70 72  lass="btn btn-pr
3130: 69 6d 61 72 79 20 77 2d 31 2f 31 30 20 6d 6c 2d  imary w-1/10 ml-
3140: 32 20 6d 74 2d 31 22 20 6f 6e 63 6c 69 63 6b 3d  2 mt-1" onclick=
3150: 7b 61 64 64 4e 75 6d 62 65 72 7d 3e 2b 20 4e 75  {addNumber}>+ Nu
3160: 6d 62 65 72 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20  mber</button>.  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 21                <!
3180: 2d 2d 20 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d  -- <button type=
3190: 22 62 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22  "button" class="
31a0: 62 74 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79 20  btn btn-primary 
31b0: 77 2d 31 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d 31  w-1/10 ml-2 mt-1
31c0: 22 20 6f 6e 63 6c 69 63 6b 3d 7b 61 64 64 53 61  " onclick={addSa
31d0: 6d 70 6c 65 7d 3e 2b 20 53 61 6d 70 6c 65 20 46  mple}>+ Sample F
31e0: 69 6c 65 3c 2f 62 75 74 74 6f 6e 3e 20 2d 2d 3e  ile</button> -->
31f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3200: 20 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62   <button type="b
3210: 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74  utton" class="bt
3220: 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79 20 77 2d  n btn-primary w-
3230: 31 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d 31 22 20  1/10 ml-2 mt-1" 
3240: 6f 6e 63 6c 69 63 6b 3d 7b 61 64 64 53 61 6d 70  onclick={addSamp
3250: 6c 65 55 52 4c 7d 3e 2b 20 53 61 6d 70 6c 65 20  leURL}>+ Sample 
3260: 55 52 4c 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20 20  URL</button>.   
3270: 20 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a           </div>.
3280: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 64 69  .            <di
3290: 76 20 63 6c 61 73 73 3d 22 6d 6c 2d 32 22 20 3e  v class="ml-2" >
32a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
32b0: 20 3c 6c 61 62 65 6c 20 66 6f 72 3d 22 74 65 6d   <label for="tem
32c0: 70 6f 2d 76 61 6c 75 65 22 3e 54 65 6d 70 6f 20  po-value">Tempo 
32d0: 2f 20 54 69 63 6b 73 3c 2f 6c 61 62 65 6c 3e 3c  / Ticks</label><
32e0: 62 72 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  br>.            
32f0: 20 20 20 20 3c 69 6e 70 75 74 20 74 79 70 65 3d      <input type=
3300: 22 74 65 78 74 22 20 69 64 3d 22 74 65 6d 70 6f  "text" id="tempo
3310: 2d 76 61 6c 75 65 22 20 76 61 6c 75 65 3d 7b 73  -value" value={s
3320: 74 61 74 65 2e 74 65 6d 70 6f 7d 20 73 74 79 6c  tate.tempo} styl
3330: 65 3d 22 77 69 64 74 68 3a 20 31 35 30 70 78 22  e="width: 150px"
3340: 20 6f 6e 6b 65 79 75 70 3d 7b 20 65 64 69 74 54   onkeyup={ editT
3350: 65 6d 70 6f 20 7d 2f 3e 0a 20 20 20 20 20 20 20  empo }/>.       
3360: 20 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20           <input 
3370: 74 79 70 65 3d 22 74 65 78 74 22 20 20 63 6c 61  type="text"  cla
3380: 73 73 3d 22 6d 74 2d 32 22 20 69 64 3d 22 74 69  ss="mt-2" id="ti
3390: 63 6b 2d 76 61 6c 75 65 22 20 76 61 6c 75 65 3d  ck-value" value=
33a0: 7b 73 74 61 74 65 2e 74 69 63 6b 73 7d 20 73 74  {state.ticks} st
33b0: 79 6c 65 3d 22 77 69 64 74 68 3a 20 31 35 30 70  yle="width: 150p
33c0: 78 22 20 6f 6e 6b 65 79 75 70 3d 7b 65 64 69 74  x" onkeyup={edit
33d0: 54 69 63 6b 73 7d 2f 3e 0a 20 20 20 20 20 20 20  Ticks}/>.       
33e0: 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20       </div>.    
33f0: 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61          <div cla
3400: 73 73 3d 22 6d 6c 2d 32 22 20 73 74 79 6c 65 3d  ss="ml-2" style=
3410: 22 6d 69 6e 2d 77 69 64 74 68 3a 20 32 35 30 70  "min-width: 250p
3420: 78 3b 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20  x;">.           
3430: 20 20 20 20 20 3c 6c 61 62 65 6c 20 66 6f 72 3d       <label for=
3440: 22 64 75 72 61 74 69 6f 6e 22 3e 42 61 72 73 20  "duration">Bars 
3450: 2f 20 54 69 63 6b 73 20 2f 20 53 65 63 6f 6e 64  / Ticks / Second
3460: 73 3c 2f 6c 61 62 65 6c 3e 3c 62 72 3e 0a 20 20  s</label><br>.  
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 64                <d
3480: 69 76 20 69 64 3d 22 64 75 72 61 74 69 6f 6e 22  iv id="duration"
3490: 20 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20   ></div>.       
34a0: 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20       </div>.    
34b0: 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 0a 20      </hstack>.. 
34c0: 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61 73         <div clas
34d0: 73 3d 22 6d 74 2d 32 20 6d 6c 2d 32 22 20 3e 0a  s="mt-2 ml-2" >.
34e0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 62 75 74              <but
34f0: 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74 6f 6e  ton type="button
3500: 22 20 63 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e  " class="btn btn
3510: 2d 70 72 69 6d 61 72 79 20 77 2d 31 2f 31 30 20  -primary w-1/10 
3520: 6d 6c 2d 32 20 6d 74 2d 31 22 20 20 6f 6e 63 6c  ml-2 mt-1"  oncl
3530: 69 63 6b 3d 7b 70 6c 61 79 7d 3e 50 6c 61 79 3c  ick={play}>Play<
3540: 2f 62 75 74 74 6f 6e 3e 0a 20 20 20 20 20 20 20  /button>.       
3550: 20 20 20 20 20 3c 62 75 74 74 6f 6e 20 74 79 70       <button typ
3560: 65 3d 22 62 75 74 74 6f 6e 22 20 63 6c 61 73 73  e="button" class
3570: 3d 22 62 74 6e 20 62 74 6e 2d 70 72 69 6d 61 72  ="btn btn-primar
3580: 79 20 6d 6c 2d 32 22 20 6f 6e 63 6c 69 63 6b 3d  y ml-2" onclick=
3590: 7b 73 61 76 65 7d 3e 53 61 76 65 3c 2f 62 75 74  {save}>Save</but
35a0: 74 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20  ton>.           
35b0: 20 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62   <button type="b
35c0: 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74  utton" class="bt
35d0: 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79 20 6d 6c  n btn-primary ml
35e0: 2d 32 22 20 6f 6e 63 6c 69 63 6b 3d 7b 72 65 73  -2" onclick={res
35f0: 65 74 7d 3e 52 65 73 65 74 3c 2f 62 75 74 74 6f  et}>Reset</butto
3600: 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  n>.            <
3610: 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62 75 74  button type="but
3620: 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74 6e 20  ton" class="btn 
3630: 62 74 6e 2d 70 72 69 6d 61 72 79 20 6d 6c 2d 32  btn-primary ml-2
3640: 22 20 6f 6e 63 6c 69 63 6b 3d 7b 72 65 6c 6f 61  " onclick={reloa
3650: 64 7d 3e 57 69 6e 64 6f 77 20 52 65 6c 6f 61 64  d}>Window Reload
3660: 3c 2f 62 75 74 74 6f 6e 3e 0a 0a 20 20 20 20 20  </button>..     
3670: 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20 63 6c         <input cl
3680: 61 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d 65 3d  ass="ml-1" name=
3690: 22 65 64 69 74 2d 6d 6f 64 65 22 20 69 64 3d 22  "edit-mode" id="
36a0: 65 64 69 74 2d 6d 6f 64 65 22 20 74 79 70 65 3d  edit-mode" type=
36b0: 22 63 68 65 63 6b 62 6f 78 22 2f 3e 0a 20 20 20  "checkbox"/>.   
36c0: 20 20 20 20 20 20 20 20 20 3c 6c 61 62 65 6c 20           <label 
36d0: 66 6f 72 3d 22 65 64 69 74 2d 6d 6f 64 65 22 3e  for="edit-mode">
36e0: 45 64 69 74 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20  Edit</label>.   
36f0: 20 20 20 20 20 20 20 20 20 3c 69 6e 70 75 74 20           <input 
3700: 63 6c 61 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d  class="ml-1" nam
3710: 65 3d 22 6c 6f 61 64 2d 6d 6f 64 65 22 20 69 64  e="load-mode" id
3720: 3d 22 6c 6f 61 64 2d 6d 6f 64 65 22 20 74 79 70  ="load-mode" typ
3730: 65 3d 22 63 68 65 63 6b 62 6f 78 22 2f 3e 0a 20  e="checkbox"/>. 
3740: 20 20 20 20 20 20 20 20 20 20 20 3c 6c 61 62 65             <labe
3750: 6c 20 66 6f 72 3d 22 6c 6f 61 64 2d 6d 6f 64 65  l for="load-mode
3760: 22 3e 45 78 65 63 75 74 65 20 54 72 61 6e 73 69  ">Execute Transi
3770: 74 69 6f 6e 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20  tion</label>.   
3780: 20 20 20 20 20 3c 2f 64 69 76 3e 0a 0a 20 20 20       </div>..   
3790: 20 20 20 20 20 3c 68 73 74 61 63 6b 3e 0a 20 20       <hstack>.  
37a0: 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 65            <div e
37b0: 61 63 68 3d 7b 20 6b 65 79 2c 20 69 6e 64 65 78  ach={ key, index
37c0: 20 69 6e 20 73 74 61 74 65 2e 73 61 6d 70 6c 65   in state.sample
37d0: 73 7d 20 3e 0a 20 20 20 20 20 20 20 20 20 20 20  s} >.           
37e0: 20 20 20 20 20 3c 64 69 76 20 69 66 3d 7b 20 73       <div if={ s
37f0: 74 61 74 65 2e 73 61 6d 70 6c 65 73 20 26 26 20  tate.samples && 
3800: 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 5b 69 6e  state.samples[in
3810: 64 65 78 5d 20 7d 3e 0a 20 20 20 20 20 20 20 20  dex] }>.        
3820: 20 20 20 20 20 20 20 20 20 20 20 20 3c 73 61 6d              <sam
3830: 70 6c 65 20 20 73 65 74 73 61 6d 70 6c 65 3d 7b  ple  setsample={
3840: 73 65 74 53 61 6d 70 6c 65 7d 20 72 6d 73 61 6d  setSample} rmsam
3850: 70 6c 65 3d 7b 72 6d 53 61 6d 70 6c 65 7d 20 73  ple={rmSample} s
3860: 61 6d 70 6c 65 73 3d 7b 73 74 61 74 65 2e 73 61  amples={state.sa
3870: 6d 70 6c 65 73 7d 20 74 69 3d 7b 69 6e 64 65 78  mples} ti={index
3880: 20 2b 20 31 7d 3e 3c 2f 73 61 6d 70 6c 65 3e 0a   + 1}></sample>.
3890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
38a0: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20  </div>.         
38b0: 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20     </div>.      
38c0: 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 0a 20 20 20    </hstack>..   
38d0: 20 20 20 20 20 3c 68 73 74 61 63 6b 3e 0a 20 20       <hstack>.  
38e0: 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 65            <div e
38f0: 61 63 68 3d 7b 20 6b 65 79 2c 20 69 6e 64 65 78  ach={ key, index
3900: 20 69 6e 20 73 74 61 74 65 2e 64 69 61 6c 73 7d   in state.dials}
3910: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >.              
3920: 20 20 3c 64 69 61 6c 20 72 6d 64 69 61 6c 3d 7b    <dial rmdial={
3930: 72 6d 44 69 61 6c 7d 20 20 76 3d 7b 73 74 61 74  rmDial}  v={stat
3940: 65 2e 64 69 61 6c 73 5b 69 6e 64 65 78 5d 7d 20  e.dials[index]} 
3950: 74 69 3d 7b 69 6e 64 65 78 20 2b 20 31 7d 3e 3c  ti={index + 1}><
3960: 2f 64 69 61 6c 3e 0a 20 20 20 20 20 20 20 20 20  /dial>.         
3970: 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20     </div>.      
3980: 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 0a 20 20 20    </hstack>..   
3990: 20 20 20 20 20 3c 68 73 74 61 63 6b 3e 0a 20 20       <hstack>.  
39a0: 20 20 20 20 20 20 20 20 20 20 3c 64 69 76 20 65            <div e
39b0: 61 63 68 3d 7b 20 6b 65 79 2c 20 69 6e 64 65 78  ach={ key, index
39c0: 20 69 6e 20 73 74 61 74 65 2e 6e 75 6d 62 65 72   in state.number
39d0: 73 7d 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  s}>.            
39e0: 20 20 20 20 3c 6e 75 6d 62 65 72 20 72 6d 6e 75      <number rmnu
39f0: 6d 62 65 72 3d 7b 72 6d 4e 75 6d 62 65 72 7d 20  mber={rmNumber} 
3a00: 76 3d 7b 73 74 61 74 65 2e 6e 75 6d 62 65 72 73  v={state.numbers
3a10: 5b 69 6e 64 65 78 5d 7d 20 74 69 3d 7b 69 6e 64  [index]} ti={ind
3a20: 65 78 20 2b 20 31 7d 3e 3c 2f 6e 75 6d 62 65 72  ex + 1}></number
3a30: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f  >.            </
3a40: 64 69 76 3e 0a 20 20 20 20 20 20 20 20 3c 2f 68  div>.        </h
3a50: 73 74 61 63 6b 3e 0a 0a 20 20 20 20 3c 2f 76 73  stack>..    </vs
3a60: 74 61 63 6b 3e 0a 0a 20 20 20 20 3c 64 69 76 20  tack>..    <div 
3a70: 69 64 3d 22 65 72 72 6f 72 22 20 63 6c 61 73 73  id="error" class
3a80: 3d 22 70 2d 32 22 20 73 74 79 6c 65 3d 22 63 6f  ="p-2" style="co
3a90: 6c 6f 72 3a 20 79 65 6c 6c 6f 77 20 21 69 6d 70  lor: yellow !imp
3aa0: 6f 72 74 61 6e 74 3b 20 68 65 69 67 68 74 3a 20  ortant; height: 
3ab0: 33 32 70 78 3b 20 66 6f 6e 74 2d 73 69 7a 65 3a  32px; font-size:
3ac0: 20 31 32 70 78 3b 22 3e 3c 2f 64 69 76 3e 0a 20   12px;"></div>. 
3ad0: 20 20 20 3c 64 69 76 20 69 64 3d 22 63 61 6e 76     <div id="canv
3ae0: 61 73 2d 63 6f 6e 74 61 69 6e 65 72 22 20 73 74  as-container" st
3af0: 79 6c 65 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 72  yle="position: r
3b00: 65 6c 61 74 69 76 65 3b 22 3e 0a 20 20 20 20 20  elative;">.     
3b10: 20 20 20 3c 64 69 76 20 69 64 3d 22 70 35 22 20     <div id="p5" 
3b20: 73 74 79 6c 65 3d 22 70 6f 73 69 74 69 6f 6e 3a  style="position:
3b30: 20 61 62 73 6f 6c 75 74 65 3b 20 77 69 64 74 68   absolute; width
3b40: 3a 20 31 30 30 25 3b 20 62 61 63 6b 67 72 6f 75  : 100%; backgrou
3b50: 6e 64 3a 20 62 6c 61 63 6b 22 3e 3c 2f 64 69 76  nd: black"></div
3b60: 3e 0a 20 20 20 20 20 20 20 20 3c 63 61 6e 76 61  >.        <canva
3b70: 73 20 69 64 3d 22 76 69 73 75 61 6c 22 20 73 74  s id="visual" st
3b80: 79 6c 65 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 61  yle="position: a
3b90: 62 73 6f 6c 75 74 65 3b 20 77 69 64 74 68 3a 20  bsolute; width: 
3ba0: 31 30 30 25 3b 20 62 61 63 6b 67 72 6f 75 6e 64  100%; background
3bb0: 3a 20 62 6c 61 63 6b 3b 22 3e 3c 2f 63 61 6e 76  : black;"></canv
3bc0: 61 73 3e 0a 20 20 20 20 20 20 20 20 3c 64 69 76  as>.        <div
3bd0: 20 69 64 3d 22 63 6f 64 65 22 20 73 74 79 6c 65   id="code" style
3be0: 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 61 62 73 6f  ="position: abso
3bf0: 6c 75 74 65 3b 22 3e 3c 2f 64 69 76 3e 0a 20 20  lute;"></div>.  
3c00: 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 0a 3c 2f    </div>.    .</
3c10: 64 69 76 3e 0a 0a 3c 73 74 79 6c 65 3e 0a 3a 68  div>..<style>.:h
3c20: 6f 73 74 20 7b 0a 20 20 20 20 6d 61 72 67 69 6e  ost {.    margin
3c30: 2d 74 6f 70 3a 20 34 76 68 3b 0a 7d 0a 3c 2f 73  -top: 4vh;.}.</s
3c40: 74 79 6c 65 3e 0a 0a 3c 73 63 72 69 70 74 3e 0a  tyle>..<script>.
3c50: 76 61 72 20 6f 6c 64 43 6f 64 65 20 3d 20 22 22  var oldCode = ""
3c60: 3b 0a 76 61 72 20 6f 6c 64 50 61 74 74 65 72 6e  ;.var oldPattern
3c70: 73 20 3d 20 5b 5d 3b 0a 0a 2f 2f 20 76 61 72 20  s = [];..// var 
3c80: 61 75 64 69 6f 20 3d 20 6e 65 77 20 41 75 64 69  audio = new Audi
3c90: 6f 28 29 3b 0a 2f 2f 20 61 75 64 69 6f 2e 6c 6f  o();.// audio.lo
3ca0: 6f 70 20 3d 20 74 72 75 65 3b 0a 63 6f 6e 73 74  op = true;.const
3cb0: 20 61 63 74 78 20 3d 20 54 6f 6e 65 2e 63 6f 6e   actx = Tone.con
3cc0: 74 65 78 74 3b 0a 63 6f 6e 73 74 20 64 65 73 74  text;.const dest
3cd0: 20 3d 20 61 63 74 78 2e 63 72 65 61 74 65 4d 65   = actx.createMe
3ce0: 64 69 61 53 74 72 65 61 6d 44 65 73 74 69 6e 61  diaStreamDestina
3cf0: 74 69 6f 6e 28 29 3b 0a 63 6f 6e 73 74 20 72 65  tion();.const re
3d00: 63 6f 72 64 65 72 20 3d 20 6e 65 77 20 4d 65 64  corder = new Med
3d10: 69 61 52 65 63 6f 72 64 65 72 28 64 65 73 74 2e  iaRecorder(dest.
3d20: 73 74 72 65 61 6d 29 3b 0a 6c 65 74 20 63 68 75  stream);.let chu
3d30: 6e 6b 73 20 3d 20 5b 5d 3b 0a 76 61 72 20 73 61  nks = [];.var sa
3d40: 6d 70 6c 65 55 52 4c 20 3d 20 22 22 3b 0a 76 61  mpleURL = "";.va
3d50: 72 20 73 61 6d 3b 0a 76 61 72 20 6c 6f 6f 70 3b  r sam;.var loop;
3d60: 0a 74 68 69 73 2e 70 72 6f 70 73 20 3d 20 6f 70  .this.props = op
3d70: 74 73 3b 0a 0a 74 68 69 73 2e 73 74 61 74 65 20  ts;..this.state 
3d80: 3d 20 7b 0a 20 20 20 20 6d 65 6d 3a 20 7b 7d 2c  = {.    mem: {},
3d90: 0a 20 20 20 20 64 69 61 6c 73 3a 20 5b 5d 2c 0a  .    dials: [],.
3da0: 20 20 20 20 6e 75 6d 62 65 72 73 3a 20 5b 5d 2c      numbers: [],
3db0: 0a 20 20 20 20 73 61 6d 70 6c 65 73 3a 20 5b 5d  .    samples: []
3dc0: 2c 0a 20 20 20 20 74 65 6d 70 6f 3a 20 31 32 30  ,.    tempo: 120
3dd0: 2c 0a 20 20 20 20 74 69 63 6b 73 3a 20 31 36 2c  ,.    ticks: 16,
3de0: 0a 7d 0a 0a 61 73 79 6e 63 20 66 75 6e 63 74 69  .}..async functi
3df0: 6f 6e 20 63 6f 70 79 54 65 78 74 54 6f 43 6c 69  on copyTextToCli
3e00: 70 62 6f 61 72 64 28 74 65 78 74 29 20 7b 0a 20  pboard(text) {. 
3e10: 20 20 20 74 72 79 20 7b 20 61 77 61 69 74 20 6e     try { await n
3e20: 61 76 69 67 61 74 6f 72 2e 63 6c 69 70 62 6f 61  avigator.clipboa
3e30: 72 64 2e 77 72 69 74 65 54 65 78 74 28 74 65 78  rd.writeText(tex
3e40: 74 29 3b 20 7d 0a 20 20 20 20 63 61 74 63 68 28  t); }.    catch(
3e50: 65 72 72 29 20 7b 0a 20 20 20 20 20 20 20 20 61  err) {.        a
3e60: 6c 65 72 74 28 27 45 72 72 6f 72 20 69 6e 20 63  lert('Error in c
3e70: 6f 70 79 69 6e 67 20 74 65 78 74 3a 20 27 2c 20  opying text: ', 
3e80: 65 72 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73  err);.    }.}..s
3e90: 68 6f 75 6c 64 55 70 64 61 74 65 28 64 61 74 61  houldUpdate(data
3ea0: 2c 20 6e 65 78 74 4f 70 74 73 29 20 7b 0a 20 20  , nextOpts) {.  
3eb0: 20 20 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d    return true;.}
3ec0: 0a 0a 74 68 69 73 2e 6f 6e 28 27 6d 6f 75 6e 74  ..this.on('mount
3ed0: 27 2c 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  ', function() {.
3ee0: 20 20 20 20 76 61 72 20 73 65 6c 66 20 3d 20 74      var self = t
3ef0: 68 69 73 3b 0a 20 20 20 20 24 28 22 23 6c 6f 61  his;.    $("#loa
3f00: 64 2d 6d 6f 64 65 22 29 2e 63 6c 69 63 6b 28 29  d-mode").click()
3f10: 3b 0a 20 20 20 20 65 64 69 74 6f 72 20 3d 20 43  ;.    editor = C
3f20: 6f 64 65 4d 69 72 72 6f 72 28 64 6f 63 75 6d 65  odeMirror(docume
3f30: 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49  nt.getElementByI
3f40: 64 28 22 63 6f 64 65 22 29 2c 20 7b 0a 20 20 20  d("code"), {.   
3f50: 20 20 20 20 20 6d 6f 64 65 3a 20 22 6e 75 6c 6c       mode: "null
3f60: 22 2c 0a 20 20 20 20 20 20 20 20 73 70 65 6c 6c  ",.        spell
3f70: 63 68 65 63 6b 3a 20 66 61 6c 73 65 2c 0a 20 20  check: false,.  
3f80: 20 20 20 20 20 20 61 75 74 6f 63 6f 72 72 65 63        autocorrec
3f90: 74 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20  t: false,.      
3fa0: 20 20 73 63 72 6f 6c 6c 62 61 72 53 74 79 6c 65    scrollbarStyle
3fb0: 3a 20 22 6e 75 6c 6c 22 2c 0a 20 20 20 20 20 20  : "null",.      
3fc0: 20 20 6c 69 6e 65 57 72 61 70 70 69 6e 67 3a 20    lineWrapping: 
3fd0: 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 6c  false,.        l
3fe0: 69 6e 65 4e 75 6d 62 65 72 73 3a 20 66 61 6c 73  ineNumbers: fals
3ff0: 65 2c 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65  e,.        style
4000: 41 63 74 69 76 65 4c 69 6e 65 3a 20 66 61 6c 73  ActiveLine: fals
4010: 65 2c 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68  e,.        match
4020: 42 72 61 63 6b 65 74 73 3a 20 66 61 6c 73 65 2c  Brackets: false,
4030: 0a 20 20 20 20 20 20 20 20 76 61 6c 75 65 3a 20  .        value: 
4040: 60 2f 2f 20 74 72 61 63 6b 5f 6e 6f 2c 20 70 61  `// track_no, pa
4050: 74 74 65 72 6e 2c 20 63 75 72 72 65 6e 74 5f 62  ttern, current_b
4060: 69 74 2c 20 73 61 6d 70 6c 65 73 2c 20 73 61 6d  it, samples, sam
4070: 70 6c 65 20 61 6e 64 20 54 6f 6e 65 20 61 72 65  ple and Tone are
4080: 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 67 6c   available as gl
4090: 6f 62 61 6c 73 60 0a 20 20 20 20 7d 29 3b 0a 0a  obals`.    });..
40a0: 20 20 20 20 65 64 69 74 6f 72 2e 73 65 74 53 69      editor.setSi
40b0: 7a 65 28 6e 75 6c 6c 2c 20 77 69 6e 64 6f 77 2e  ze(null, window.
40c0: 69 6e 6e 65 72 48 65 69 67 68 74 20 2d 20 64 6f  innerHeight - do
40d0: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
40e0: 74 42 79 49 64 28 22 68 65 61 64 65 72 2d 70 6c  tById("header-pl
40f0: 61 79 62 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48  ayback").clientH
4100: 65 69 67 68 74 20 2d 20 31 36 30 29 3b 0a 0a 20  eight - 160);.. 
4110: 20 20 20 69 66 20 28 74 68 69 73 2e 70 72 6f 70     if (this.prop
4120: 73 2e 73 6f 6e 67 29 20 7b 0a 20 20 20 20 20 20  s.song) {.      
4130: 20 20 63 6f 6e 73 74 20 6c 69 62 20 3d 20 77 69    const lib = wi
4140: 6e 64 6f 77 2e 4a 73 6f 6e 55 72 6c 28 27 6c 7a  ndow.JsonUrl('lz
4150: 6d 61 27 29 3b 0a 20 20 20 20 20 20 20 20 6c 69  ma');.        li
4160: 62 2e 64 65 63 6f 6d 70 72 65 73 73 28 74 68 69  b.decompress(thi
4170: 73 2e 70 72 6f 70 73 2e 73 6f 6e 67 29 2e 74 68  s.props.song).th
4180: 65 6e 28 64 61 74 61 20 3d 3e 20 7b 0a 20 20 20  en(data => {.   
4190: 20 20 20 20 20 20 20 20 20 76 61 72 20 73 61 6d           var sam
41a0: 70 6c 65 5f 6e 61 6d 65 73 20 3d 20 64 61 74 61  ple_names = data
41b0: 5b 22 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 22 5d  ["sample_names"]
41c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ;.            va
41d0: 72 20 64 69 61 6c 5f 63 6f 75 6e 74 20 3d 20 64  r dial_count = d
41e0: 61 74 61 5b 22 64 69 61 6c 5f 63 6f 75 6e 74 22  ata["dial_count"
41f0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  ];.            v
4200: 61 72 20 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74  ar numbers_count
4210: 20 3d 20 64 61 74 61 5b 22 6e 75 6d 62 65 72 73   = data["numbers
4220: 5f 63 6f 75 6e 74 22 5d 3b 0a 20 20 20 20 20 20  _count"];.      
4230: 20 20 20 20 20 20 64 65 6c 65 74 65 20 64 61 74        delete dat
4240: 61 5b 22 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 22  a["sample_names"
4250: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64  ];.            d
4260: 65 6c 65 74 65 20 64 61 74 61 5b 22 64 69 61 6c  elete data["dial
4270: 5f 63 6f 75 6e 74 22 5d 3b 0a 20 20 20 20 20 20  _count"];.      
4280: 20 20 20 20 20 20 64 65 6c 65 74 65 20 64 61 74        delete dat
4290: 61 5b 22 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74  a["numbers_count
42a0: 22 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  "];.            
42b0: 74 68 69 73 2e 73 74 61 74 65 2e 74 65 6d 70 6f  this.state.tempo
42c0: 20 3d 20 64 61 74 61 2e 74 65 6d 70 6f 3b 0a 20   = data.tempo;. 
42d0: 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e             this.
42e0: 73 74 61 74 65 2e 74 69 63 6b 73 20 3d 20 64 61  state.ticks = da
42f0: 74 61 2e 74 69 63 6b 73 3b 0a 20 20 20 20 20 20  ta.ticks;.      
4300: 20 20 20 20 20 20 74 68 69 73 2e 73 74 61 74 65        this.state
4310: 2e 63 6f 64 65 20 3d 20 64 61 74 61 2e 63 6f 64  .code = data.cod
4320: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  e;.            s
4330: 61 6d 70 6c 65 5f 6e 61 6d 65 73 2e 6d 61 70 28  ample_names.map(
4340: 66 75 6e 63 74 69 6f 6e 20 28 75 72 6c 29 20 7b  function (url) {
4350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
4360: 20 73 65 6c 66 2e 61 64 64 55 52 4c 28 75 72 6c   self.addURL(url
4370: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  );.            }
4380: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66  );.            f
4390: 6f 72 20 28 76 61 72 20 69 20 3d 20 30 3b 20 69  or (var i = 0; i
43a0: 20 3c 20 64 69 61 6c 5f 63 6f 75 6e 74 3b 20 69   < dial_count; i
43b0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ++) {.          
43c0: 20 20 20 20 20 20 74 68 69 73 2e 73 74 61 74 65        this.state
43d0: 2e 64 69 61 6c 73 2e 70 75 73 68 28 7b 7d 29 3b  .dials.push({});
43e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
43f0: 20 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28             for (
4400: 76 61 72 20 69 20 3d 20 30 3b 20 69 20 3c 20 6e  var i = 0; i < n
4410: 75 6d 62 65 72 73 5f 63 6f 75 6e 74 3b 20 69 2b  umbers_count; i+
4420: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
4430: 20 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e       this.state.
4440: 6e 75 6d 62 65 72 73 2e 70 75 73 68 28 7b 7d 29  numbers.push({})
4450: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
4460: 20 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74              edit
4470: 6f 72 2e 73 65 74 56 61 6c 75 65 28 74 68 69 73  or.setValue(this
4480: 2e 73 74 61 74 65 2e 63 6f 64 65 29 3b 0a 20 20  .state.code);.  
4490: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 75            this.u
44a0: 70 64 61 74 65 28 29 3b 0a 20 20 20 20 20 20 20  pdate();.       
44b0: 20 20 20 20 20 72 69 6f 74 2e 6d 6f 75 6e 74 28       riot.mount(
44c0: 27 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 29 0a  '');.        }).
44d0: 20 20 20 20 7d 0a 0a 0a 7d 29 3b 0a 0a 0a 70 61      }...});...pa
44e0: 74 74 65 72 6e 5f 63 6c 65 61 6e 28 70 29 20 7b  ttern_clean(p) {
44f0: 0a 20 20 20 20 72 65 74 75 72 6e 20 77 69 6e 64  .    return wind
4500: 6f 77 2e 70 61 74 74 65 72 6e 5f 63 6c 65 61 6e  ow.pattern_clean
4510: 28 70 29 3b 0a 7d 0a 0a 73 61 76 65 28 29 20 7b  (p);.}..save() {
4520: 0a 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e  .    this.state.
4530: 63 6f 64 65 20 3d 20 65 64 69 74 6f 72 2e 67 65  code = editor.ge
4540: 74 56 61 6c 75 65 28 29 3b 0a 20 20 20 20 76 61  tValue();.    va
4550: 72 20 74 65 78 74 20 3d 20 7b 0a 20 20 20 20 20  r text = {.     
4560: 20 20 20 74 65 6d 70 6f 3a 20 74 68 69 73 2e 73     tempo: this.s
4570: 74 61 74 65 2e 74 65 6d 70 6f 2c 0a 20 20 20 20  tate.tempo,.    
4580: 20 20 20 20 64 69 61 6c 5f 63 6f 75 6e 74 3a 20      dial_count: 
4590: 74 68 69 73 2e 73 74 61 74 65 2e 64 69 61 6c 73  this.state.dials
45a0: 2e 6c 65 6e 67 74 68 2c 0a 20 20 20 20 20 20 20  .length,.       
45b0: 20 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74 3a 20   numbers_count: 
45c0: 74 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d 62 65  this.state.numbe
45d0: 72 73 2e 6c 65 6e 67 74 68 2c 0a 20 20 20 20 20  rs.length,.     
45e0: 20 20 20 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 3a     sample_names:
45f0: 20 74 68 69 73 2e 73 74 61 74 65 2e 73 61 6d 70   this.state.samp
4600: 6c 65 73 2e 6d 61 70 28 66 75 6e 63 74 69 6f 6e  les.map(function
4610: 20 28 69 74 65 6d 29 20 7b 72 65 74 75 72 6e 20   (item) {return 
4620: 69 74 65 6d 5b 22 5f 5f 75 72 6c 22 5d 7d 29 2c  item["__url"]}),
4630: 0a 20 20 20 20 20 20 20 20 74 69 63 6b 73 3a 20  .        ticks: 
4640: 31 36 2c 0a 20 20 20 20 20 20 20 20 63 6f 64 65  16,.        code
4650: 3a 20 74 68 69 73 2e 73 74 61 74 65 2e 63 6f 64  : this.state.cod
4660: 65 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f  e,.    };.    co
4670: 6e 73 74 20 6c 69 62 20 3d 20 77 69 6e 64 6f 77  nst lib = window
4680: 2e 4a 73 6f 6e 55 72 6c 28 27 6c 7a 6d 61 27 29  .JsonUrl('lzma')
4690: 3b 0a 09 6c 69 62 2e 63 6f 6d 70 72 65 73 73 28  ;..lib.compress(
46a0: 74 65 78 74 29 2e 74 68 65 6e 28 65 6e 63 6f 64  text).then(encod
46b0: 65 64 44 61 74 61 20 3d 3e 20 7b 0a 20 20 20 20  edData => {.    
46c0: 20 20 20 20 76 61 72 20 6c 69 6e 6b 20 3d 20 22      var link = "
46d0: 2f 73 6f 6e 67 2f 22 20 2b 20 65 6e 63 6f 64 65  /song/" + encode
46e0: 64 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 77  dData;.        w
46f0: 69 6e 64 6f 77 2e 6f 70 65 6e 28 6c 69 6e 6b 2c  indow.open(link,
4700: 20 22 5f 62 6c 61 6e 6b 22 29 3b 0a 20 20 20 20   "_blank");.    
4710: 7d 29 3b 0a 7d 0a 0a 72 65 6c 6f 61 64 28 29 20  });.}..reload() 
4720: 7b 0a 20 20 20 20 77 69 6e 64 6f 77 2e 6c 6f 63  {.    window.loc
4730: 61 74 69 6f 6e 2e 72 65 70 6c 61 63 65 28 20 22  ation.replace( "
4740: 2f 2f 22 20 2b 20 77 69 6e 64 6f 77 2e 6c 6f 63  //" + window.loc
4750: 61 74 69 6f 6e 2e 68 6f 73 74 29 0a 7d 0a 0a 72  ation.host).}..r
4760: 65 73 65 74 28 29 20 7b 0a 0a 20 20 20 20 54 6f  eset() {..    To
4770: 6e 65 2e 4d 61 73 74 65 72 2e 6d 75 74 65 20 3d  ne.Master.mute =
4780: 20 74 72 75 65 3b 0a 20 20 20 20 69 66 20 28 6c   true;.    if (l
4790: 6f 6f 70 29 20 7b 0a 20 20 20 20 20 20 20 20 6c  oop) {.        l
47a0: 6f 6f 70 2e 73 74 6f 70 28 29 3b 0a 20 20 20 20  oop.stop();.    
47b0: 20 20 20 20 6c 6f 6f 70 2e 63 61 6e 63 65 6c 28      loop.cancel(
47c0: 29 3b 0a 20 20 20 20 20 20 20 20 6c 6f 6f 70 2e  );.        loop.
47d0: 64 69 73 70 6f 73 65 28 29 3b 0a 20 20 20 20 20  dispose();.     
47e0: 20 20 20 54 6f 6e 65 2e 4d 61 73 74 65 72 2e 6d     Tone.Master.m
47f0: 75 74 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  ute = false;.   
4800: 20 7d 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e   }.    document.
4810: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27  getElementById('
4820: 74 65 6d 70 6f 2d 76 61 6c 75 65 27 29 2e 64 69  tempo-value').di
4830: 73 61 62 6c 65 64 20 3d 20 66 61 6c 73 65 3b 0a  sabled = false;.
4840: 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74      document.get
4850: 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 74 69 63  ElementById('tic
4860: 6b 2d 76 61 6c 75 65 27 29 2e 64 69 73 61 62 6c  k-value').disabl
4870: 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  ed = false;.    
4880: 65 64 69 74 6f 72 2e 73 65 74 56 61 6c 75 65 28  editor.setValue(
4890: 22 22 29 3b 0a 0a 20 20 20 20 74 68 69 73 2e 73  "");..    this.s
48a0: 74 61 74 65 20 3d 20 7b 0a 20 20 20 20 20 20 20  tate = {.       
48b0: 20 6d 65 6d 3a 20 7b 7d 2c 0a 20 20 20 20 20 20   mem: {},.      
48c0: 20 20 64 69 61 6c 73 3a 20 5b 5d 2c 0a 20 20 20    dials: [],.   
48d0: 20 20 20 20 20 73 61 6d 70 6c 65 73 3a 20 5b 5d       samples: []
48e0: 2c 0a 20 20 20 20 20 20 20 20 74 65 6d 70 6f 3a  ,.        tempo:
48f0: 20 31 32 30 2c 0a 20 20 20 20 20 20 20 20 74 69   120,.        ti
4900: 63 6b 73 3a 20 31 36 2c 0a 20 20 20 20 7d 0a 0a  cks: 16,.    }..
4910: 20 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28      this.update(
4920: 29 3b 0a 20 20 20 20 72 69 6f 74 2e 6d 6f 75 6e  );.    riot.moun
4930: 74 28 27 62 69 74 72 68 79 74 68 6d 27 2c 20 7b  t('bitrhythm', {
4940: 0a 20 20 20 20 20 20 20 20 73 6f 6e 67 3a 20 74  .        song: t
4950: 68 69 73 2e 70 72 6f 70 73 2e 73 6f 6e 67 0a 20  his.props.song. 
4960: 20 20 20 7d 29 0a 0a 0a 7d 0a 0a 65 64 69 74 54     })...}..editT
4970: 65 6d 70 6f 28 65 29 20 7b 0a 20 20 20 20 74 68  empo(e) {.    th
4980: 69 73 2e 75 70 64 61 74 65 28 7b 0a 20 20 20 20  is.update({.    
4990: 20 20 20 20 74 65 6d 70 6f 3a 20 65 2e 74 61 72      tempo: e.tar
49a0: 67 65 74 2e 76 61 6c 75 65 0a 20 20 20 20 7d 29  get.value.    })
49b0: 0a 7d 0a 0a 65 64 69 74 54 69 63 6b 73 28 65 29  .}..editTicks(e)
49c0: 20 7b 0a 20 20 20 20 74 68 69 73 2e 75 70 64 61   {.    this.upda
49d0: 74 65 28 7b 0a 20 20 20 20 20 20 20 20 74 69 63  te({.        tic
49e0: 6b 73 3a 20 65 2e 74 61 72 67 65 74 2e 76 61 6c  ks: e.target.val
49f0: 75 65 0a 20 20 20 20 7d 29 0a 7d 0a 0a 24 7b 63  ue.    }).}..${c
4a00: 6f 72 65 5f 6c 6f 6f 70 7d 0a 0a 73 74 61 72 74  ore_loop}..start
4a10: 28 29 20 7b 0a 20 20 20 20 72 65 63 6f 72 64 65  () {.    recorde
4a20: 72 2e 73 74 61 72 74 28 29 3b 0a 7d 0a 0a 73 74  r.start();.}..st
4a30: 6f 70 28 29 20 7b 0a 20 20 20 20 72 65 63 6f 72  op() {.    recor
4a40: 64 65 72 2e 73 74 6f 70 28 29 3b 0a 7d 0a 0a 61  der.stop();.}..a
4a50: 64 64 44 69 61 6c 28 29 20 7b 0a 20 20 20 20 74  ddDial() {.    t
4a60: 68 69 73 2e 73 74 61 74 65 2e 64 69 61 6c 73 2e  his.state.dials.
4a70: 70 75 73 68 28 7b 7d 29 3b 0a 20 20 20 20 74 68  push({});.    th
4a80: 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a  is.update();.}..
4a90: 61 64 64 4e 75 6d 62 65 72 28 29 20 7b 0a 20 20  addNumber() {.  
4aa0: 20 20 74 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d    this.state.num
4ab0: 62 65 72 73 2e 70 75 73 68 28 7b 7d 29 3b 0a 20  bers.push({});. 
4ac0: 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28 29     this.update()
4ad0: 3b 0a 7d 0a 0a 61 64 64 55 52 4c 28 76 61 6c 75  ;.}..addURL(valu
4ae0: 65 29 20 7b 0a 20 20 20 20 76 61 72 20 73 65 6c  e) {.    var sel
4af0: 66 20 3d 20 74 68 69 73 3b 0a 20 20 20 20 74 68  f = this;.    th
4b00: 69 73 2e 73 74 61 74 65 2e 73 61 6d 70 6c 65 73  is.state.samples
4b10: 2e 70 75 73 68 28 7b 22 5f 5f 6e 61 6d 65 22 3a  .push({"__name":
4b20: 20 76 61 6c 75 65 7d 29 3b 0a 20 20 20 20 76 61   value});.    va
4b30: 72 20 73 61 6d 3b 0a 20 20 20 20 73 61 6d 20 3d  r sam;.    sam =
4b40: 20 6e 65 77 20 54 6f 6e 65 2e 53 61 6d 70 6c 65   new Tone.Sample
4b50: 72 28 7b 0a 20 20 20 20 20 20 20 20 75 72 6c 73  r({.        urls
4b60: 3a 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  :  {.           
4b70: 20 22 43 33 22 3a 20 76 61 6c 75 65 2c 0a 20 20   "C3": value,.  
4b80: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 29 3b 0a        }.    });.
4b90: 20 20 20 20 73 61 6d 5b 22 5f 5f 6e 61 6d 65 22      sam["__name"
4ba0: 5d 20 3d 20 76 61 6c 75 65 3b 0a 20 20 20 20 73  ] = value;.    s
4bb0: 61 6d 5b 22 5f 5f 75 72 6c 22 5d 20 3d 20 76 61  am["__url"] = va
4bc0: 6c 75 65 3b 0a 20 20 20 20 73 65 6c 66 2e 73 65  lue;.    self.se
4bd0: 74 53 61 6d 70 6c 65 28 73 61 6d 2c 20 73 65 6c  tSample(sam, sel
4be0: 66 2e 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 2e  f.state.samples.
4bf0: 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a 7d 0a 0a  length - 1);.}..
4c00: 61 64 64 53 61 6d 70 6c 65 55 52 4c 28 29 20 7b  addSampleURL() {
4c10: 0a 20 20 20 20 76 61 72 20 73 65 6c 66 20 3d 20  .    var self = 
4c20: 74 68 69 73 3b 0a 20 20 20 20 61 6c 65 72 74 69  this;.    alerti
4c30: 66 79 2e 70 72 6f 6d 70 74 28 20 27 45 6e 74 65  fy.prompt( 'Ente
4c40: 72 20 53 61 6d 70 6c 65 20 55 52 4c 27 2c 20 27  r Sample URL', '
4c50: 27 2c 20 27 27 0a 20 20 20 20 20 20 20 20 2c 20  ', ''.        , 
4c60: 66 75 6e 63 74 69 6f 6e 28 65 76 74 2c 20 76 61  function(evt, va
4c70: 6c 75 65 29 20 7b 0a 20 20 20 20 20 20 20 20 20  lue) {.         
4c80: 20 20 20 73 65 6c 66 2e 61 64 64 55 52 4c 28 76     self.addURL(v
4c90: 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20 20 7d  alue);.        }
4ca0: 0a 20 20 20 20 20 20 20 20 2c 20 66 75 6e 63 74  .        , funct
4cb0: 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20 20 20  ion() {.        
4cc0: 20 20 20 20 61 6c 65 72 74 69 66 79 2e 65 72 72      alertify.err
4cd0: 6f 72 28 27 43 61 6e 63 65 6c 27 29 0a 20 20 20  or('Cancel').   
4ce0: 20 20 20 20 20 7d 29 3b 0a 7d 0a 0a 61 64 64 53       });.}..addS
4cf0: 61 6d 70 6c 65 28 29 20 7b 0a 20 20 20 20 74 68  ample() {.    th
4d00: 69 73 2e 73 74 61 74 65 2e 73 61 6d 70 6c 65 73  is.state.samples
4d10: 2e 70 75 73 68 28 7b 7d 29 3b 0a 20 20 20 20 74  .push({});.    t
4d20: 68 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a  his.update();.}.
4d30: 0a 72 6d 53 61 6d 70 6c 65 28 69 6e 64 65 78 29  .rmSample(index)
4d40: 20 7b 0a 20 20 20 74 68 69 73 2e 73 74 61 74 65   {.   this.state
4d50: 2e 73 61 6d 70 6c 65 73 2e 73 70 6c 69 63 65 28  .samples.splice(
4d60: 69 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20 74 68  index, 1);.   th
4d70: 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a  is.update();.}..
4d80: 72 6d 44 69 61 6c 28 69 6e 64 65 78 29 20 7b 0a  rmDial(index) {.
4d90: 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e 64 69     this.state.di
4da0: 61 6c 73 2e 73 70 6c 69 63 65 28 69 6e 64 65 78  als.splice(index
4db0: 2c 20 31 29 3b 0a 20 20 20 74 68 69 73 2e 75 70  , 1);.   this.up
4dc0: 64 61 74 65 28 29 3b 0a 7d 0a 0a 72 6d 4e 75 6d  date();.}..rmNum
4dd0: 62 65 72 28 69 6e 64 65 78 29 20 7b 0a 20 20 20  ber(index) {.   
4de0: 74 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d 62 65  this.state.numbe
4df0: 72 73 2e 73 70 6c 69 63 65 28 69 6e 64 65 78 2c  rs.splice(index,
4e00: 20 31 29 3b 0a 20 20 20 74 68 69 73 2e 75 70 64   1);.   this.upd
4e10: 61 74 65 28 29 3b 0a 7d 0a 0a 73 65 74 53 61 6d  ate();.}..setSam
4e20: 70 6c 65 28 65 2c 20 69 29 20 7b 0a 20 20 20 20  ple(e, i) {.    
4e30: 74 68 69 73 2e 73 74 61 74 65 2e 73 61 6d 70 6c  this.state.sampl
4e40: 65 73 5b 69 5d 20 3d 20 65 3b 0a 20 20 20 20 74  es[i] = e;.    t
4e50: 68 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d 0a  his.update();.}.
4e60: 0a 3c 2f 73 63 72 69 70 74 3e 0a 0a 3c 2f 62 69  .</script>..</bi
4e70: 74 72 68 79 74 68 6d 3e 0a 0a 22 22 22 0a 66 72  trhythm>..""".fr
4e80: 6f 6d 20 6d 61 6b 6f 2e 74 65 6d 70 6c 61 74 65  om mako.template
4e90: 20 69 6d 70 6f 72 74 20 54 65 6d 70 6c 61 74 65   import Template
4ea0: 0a 0a 63 6f 64 65 20 3d 20 54 65 6d 70 6c 61 74  ..code = Templat
4eb0: 65 28 62 69 74 72 68 79 74 68 6d 29 2e 72 65 6e  e(bitrhythm).ren
4ec0: 64 65 72 28 63 6f 72 65 5f 6c 6f 6f 70 3d 63 6f  der(core_loop=co
4ed0: 72 65 5f 6c 6f 6f 70 29 0a 63 6f 67 2e 6f 75 74  re_loop).cog.out
4ee0: 28 62 69 74 72 68 79 74 68 6d 29 0a 6f 73 2e 73  (bitrhythm).os.s
4ef0: 79 73 74 65 6d 28 22 72 6d 20 70 75 62 6c 69 63  ystem("rm public
4f00: 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 62 69 74 72  /components/bitr
4f10: 68 79 74 68 6d 2e 74 61 67 22 29 0a 66 20 3d 20  hythm.tag").f = 
4f20: 6f 70 65 6e 28 22 70 75 62 6c 69 63 2f 63 6f 6d  open("public/com
4f30: 70 6f 6e 65 6e 74 73 2f 62 69 74 72 68 79 74 68  ponents/bitrhyth
4f40: 6d 2e 74 61 67 22 2c 20 22 77 22 29 0a 66 2e 77  m.tag", "w").f.w
4f50: 72 69 74 65 28 63 6f 64 65 29 0a 66 2e 63 6c 6f  rite(code).f.clo
4f60: 73 65 28 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a  se().@>.@@.```..
4f70: 23 23 20 53 61 6d 70 6c 65 0a 0a 59 6f 75 20 63  ## Sample..You c
4f80: 61 6e 20 61 64 64 20 73 61 6d 70 6c 65 73 20 75  an add samples u
4f90: 73 69 6e 67 20 74 68 65 20 66 69 6c 65 20 75 70  sing the file up
4fa0: 6c 6f 61 64 2e 20 41 6c 6c 20 73 61 6d 70 6c 65  load. All sample
4fb0: 73 20 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20  s are available 
4fc0: 61 73 20 61 6e 20 61 72 72 61 79 20 e2 80 93 20  as an array ... 
4fd0: 73 61 6d 70 6c 65 73 2e 20 49 6e 69 74 69 61 6c  samples. Initial
4fe0: 69 73 65 20 73 61 6d 70 6c 65 73 2c 20 67 6c 6f  ise samples, glo
4ff0: 62 61 6c 20 76 61 72 69 61 62 6c 65 73 20 61 6e  bal variables an
5000: 64 20 73 79 6e 74 68 65 73 69 73 65 72 73 20 75  d synthesisers u
5010: 73 69 6e 67 20 74 68 65 20 74 72 61 6e 73 69 74  sing the transit
5020: 69 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  ion function and
5030: 20 63 68 61 6e 67 65 20 74 68 65 20 73 61 6d 70   change the samp
5040: 6c 65 20 70 61 72 61 6d 65 74 65 72 73 20 75 73  le parameters us
5050: 69 6e 67 20 74 68 65 20 73 61 6d 65 20 64 75 72  ing the same dur
5060: 69 6e 67 20 6c 69 76 65 20 63 6f 64 69 6e 67 2e  ing live coding.
5070: 0a 0a 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63 6b  ..```{code-block
5080: 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a 66 6f 72 63 65  } html.---.force
5090: 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a 40 3c 0a 69  : true.---..@<.i
50a0: 6d 70 6f 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74  mport cog.import
50b0: 20 6f 73 0a 0a 73 61 6d 70 6c 65 20 3d 20 22 22   os..sample = ""
50c0: 22 0a 3c 73 61 6d 70 6c 65 3e 0a 20 20 20 20 3c  ".<sample>.    <
50d0: 76 62 6f 78 20 63 6c 61 73 73 3d 22 6d 6c 2d 32  vbox class="ml-2
50e0: 22 3e 0a 20 20 20 20 20 20 20 20 3c 76 73 74 61  ">.        <vsta
50f0: 63 6b 20 63 6c 61 73 73 3d 22 6d 6c 2d 32 22 3e  ck class="ml-2">
5100: 0a 20 20 20 20 20 20 20 20 3c 21 2d 2d 20 3c 69  .        <!-- <i
5110: 6e 70 75 74 20 74 79 70 65 3d 22 66 69 6c 65 22  nput type="file"
5120: 20 69 64 3d 7b 22 73 61 6d 70 6c 65 2d 66 69 6c   id={"sample-fil
5130: 65 22 20 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e  e" + this.props.
5140: 74 69 7d 20 73 74 79 6c 65 3d 22 77 69 64 74 68  ti} style="width
5150: 3a 20 31 32 30 70 78 3b 22 2f 3e 20 2d 2d 3e 0a  : 120px;"/> -->.
5160: 20 20 20 20 20 20 20 20 3c 64 69 76 20 73 74 79          <div sty
5170: 6c 65 3d 22 6d 61 78 2d 77 69 64 74 68 3a 20 31  le="max-width: 1
5180: 32 30 70 78 3b 74 65 78 74 2d 6f 76 65 72 66 6c  20px;text-overfl
5190: 6f 77 3a 20 65 6c 6c 69 70 73 69 73 3b 20 77 68  ow: ellipsis; wh
51a0: 69 74 65 2d 73 70 61 63 65 3a 20 6e 6f 77 72 61  ite-space: nowra
51b0: 70 3b 6f 76 65 72 66 6c 6f 77 3a 20 68 69 64 64  p;overflow: hidd
51c0: 65 6e 3b 22 3e 0a 20 20 20 20 20 20 20 20 20 20  en;">.          
51d0: 20 20 3c 73 70 61 6e 3e 7b 20 67 65 74 4c 61 73    <span>{ getLas
51e0: 74 28 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 20  t(this.props.ti 
51f0: 2d 31 29 7d 20 3c 2f 73 70 61 6e 3e 0a 20 20 20  -1)} </span>.   
5200: 20 20 20 20 20 20 20 20 20 3c 73 70 61 6e 20 63           <span c
5210: 6c 61 73 73 3d 22 63 75 72 73 6f 72 2d 70 6f 69  lass="cursor-poi
5220: 6e 74 65 72 22 20 69 64 3d 7b 22 73 61 6d 70 6c  nter" id={"sampl
5230: 65 22 20 2b 20 74 68 69 73 2e 70 72 6f 70 73 2e  e" + this.props.
5240: 74 69 7d 20 6f 6e 63 6c 69 63 6b 3d 7b 72 65 6d  ti} onclick={rem
5250: 6f 76 65 28 74 68 69 73 2e 70 72 6f 70 73 2e 74  ove(this.props.t
5260: 69 20 2d 31 29 7d 3e 28 78 29 3c 2f 73 70 61 6e  i -1)}>(x)</span
5270: 3e 0a 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e  >.        </div>
5280: 0a 20 20 20 20 20 20 20 20 3c 2f 76 73 74 61 63  .        </vstac
5290: 6b 3e 0a 20 20 20 20 3c 2f 76 62 6f 78 3e 0a 0a  k>.    </vbox>..
52a0: 20 20 20 20 3c 73 63 72 69 70 74 3e 0a 20 20 20      <script>.   
52b0: 20 74 68 69 73 2e 70 72 6f 70 73 20 3d 20 6f 70   this.props = op
52c0: 74 73 3b 0a 0a 20 20 20 20 72 65 6d 6f 76 65 28  ts;..    remove(
52d0: 69 6e 64 65 78 29 20 7b 0a 20 20 20 20 20 20 20  index) {.       
52e0: 20 72 65 74 75 72 6e 20 28 29 20 3d 3e 20 7b 0a   return () => {.
52f0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
5300: 2e 70 72 6f 70 73 2e 72 6d 73 61 6d 70 6c 65 28  .props.rmsample(
5310: 69 6e 64 65 78 29 3b 0a 20 20 20 20 20 20 20 20  index);.        
5320: 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 67 65 74  }.    }..    get
5330: 4c 61 73 74 20 28 69 6e 64 65 78 29 20 7b 0a 20  Last (index) {. 
5340: 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73 2e         if (this.
5350: 70 72 6f 70 73 2e 73 61 6d 70 6c 65 73 20 26 26  props.samples &&
5360: 20 74 68 69 73 2e 70 72 6f 70 73 2e 73 61 6d 70   this.props.samp
5370: 6c 65 73 5b 69 6e 64 65 78 5d 20 26 26 20 74 68  les[index] && th
5380: 69 73 2e 70 72 6f 70 73 2e 73 61 6d 70 6c 65 73  is.props.samples
5390: 5b 69 6e 64 65 78 5d 5b 22 5f 5f 6e 61 6d 65 22  [index]["__name"
53a0: 5d 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ]) {.           
53b0: 20 76 61 72 20 65 20 3d 20 74 68 69 73 2e 70 72   var e = this.pr
53c0: 6f 70 73 2e 73 61 6d 70 6c 65 73 5b 69 6e 64 65  ops.samples[inde
53d0: 78 5d 5b 22 5f 5f 6e 61 6d 65 22 5d 3b 0a 20 20  x]["__name"];.  
53e0: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 65 6c            var el
53f0: 65 6d 73 20 3d 20 65 2e 73 70 6c 69 74 28 22 2f  ems = e.split("/
5400: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
5410: 76 61 72 20 6e 61 6d 65 20 3d 20 65 6c 65 6d 73  var name = elems
5420: 5b 65 6c 65 6d 73 2e 6c 65 6e 67 74 68 20 2d 20  [elems.length - 
5430: 31 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  1];.            
5440: 72 65 74 75 72 6e 20 6e 61 6d 65 3b 0a 20 20 20  return name;.   
5450: 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20       } else {.  
5460: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73 6f 6c            consol
5470: 65 2e 6c 6f 67 28 74 68 69 73 2e 70 72 6f 70 73  e.log(this.props
5480: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ).            re
5490: 74 75 72 6e 20 22 22 3b 0a 20 20 20 20 20 20 20  turn "";.       
54a0: 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20 20 20 20 74   }.    }...    t
54b0: 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22 2c 20  his.on("mount", 
54c0: 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 0a 20  function () {.. 
54d0: 20 20 20 20 20 20 20 76 61 72 20 73 65 6c 66 20         var self 
54e0: 3d 20 74 68 69 73 3b 0a 2f 2a 0a 20 20 20 20 20  = this;./*.     
54f0: 20 20 20 76 61 72 20 73 61 6d 70 6c 65 5f 66 69     var sample_fi
5500: 6c 65 20 3d 20 24 28 22 23 73 61 6d 70 6c 65 2d  le = $("#sample-
5510: 66 69 6c 65 22 20 2b 20 74 68 69 73 2e 70 72 6f  file" + this.pro
5520: 70 73 2e 74 69 29 2e 67 65 74 28 30 29 3b 0a 20  ps.ti).get(0);. 
5530: 20 20 20 20 20 20 20 76 61 72 20 73 61 6d 3b 0a         var sam;.
5540: 0a 20 20 20 20 20 20 20 20 73 61 6d 70 6c 65 5f  .        sample_
5550: 66 69 6c 65 2e 61 64 64 45 76 65 6e 74 4c 69 73  file.addEventLis
5560: 74 65 6e 65 72 28 27 63 68 61 6e 67 65 27 2c 20  tener('change', 
5570: 28 65 76 65 6e 74 29 20 3d 3e 20 7b 0a 20 20 20  (event) => {.   
5580: 20 20 20 20 20 20 20 20 20 76 61 72 20 66 69 6c           var fil
5590: 65 20 3d 20 65 76 65 6e 74 2e 73 72 63 45 6c 65  e = event.srcEle
55a0: 6d 65 6e 74 2e 66 69 6c 65 73 5b 30 5d 3b 0a 20  ment.files[0];. 
55b0: 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20 61             var a
55c0: 20 3d 20 6e 65 77 20 41 75 64 69 6f 28 29 3b 0a   = new Audio();.
55d0: 20 20 20 20 20 20 20 20 20 20 20 20 61 2e 6f 6e              a.on
55e0: 6c 6f 61 64 65 64 6d 65 74 61 64 61 74 61 20 3d  loadedmetadata =
55f0: 20 28 65 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20   (e) => {.      
5600: 20 20 20 20 20 20 20 20 20 20 73 61 6d 20 3d 20            sam = 
5610: 6e 65 77 20 54 6f 6e 65 2e 53 61 6d 70 6c 65 72  new Tone.Sampler
5620: 28 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ({.             
5630: 20 20 20 20 20 20 20 75 72 6c 73 3a 20 20 7b 0a         urls:  {.
5640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5650: 20 20 20 20 20 20 20 20 22 43 33 22 3a 20 55 52          "C3": UR
5660: 4c 2e 63 72 65 61 74 65 4f 62 6a 65 63 74 55 52  L.createObjectUR
5670: 4c 28 66 69 6c 65 29 2c 0a 20 20 20 20 20 20 20  L(file),.       
5680: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 2c 0a               },.
5690: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56a0: 20 20 20 20 6f 6e 6c 6f 61 64 3a 20 28 29 20 3d      onload: () =
56b0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
56c0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 69 73              this
56d0: 2e 75 70 64 61 74 65 28 29 3b 0a 20 20 20 20 20  .update();.     
56e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
56f0: 20 20 20 73 61 6d 2e 74 72 69 67 67 65 72 41 74     sam.triggerAt
5700: 74 61 63 6b 52 65 6c 65 61 73 65 28 22 43 33 22  tackRelease("C3"
5710: 2c 20 30 2e 35 29 3b 0a 20 20 20 20 20 20 20 20  , 0.5);.        
5720: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
5730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 29                })
5740: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ;..             
5750: 20 20 20 73 61 6d 5b 22 5f 5f 6e 61 6d 65 22 5d     sam["__name"]
5760: 20 3d 20 66 69 6c 65 2e 6e 61 6d 65 3b 0a 20 20   = file.name;.  
5770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 61                sa
5780: 6d 5b 22 5f 5f 75 72 6c 22 5d 20 3d 20 22 22 3b  m["__url"] = "";
5790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
57a0: 20 2f 2f 20 72 69 6f 74 20 64 6f 65 73 6e 27 74   // riot doesn't
57b0: 20 61 6c 6c 6f 77 20 63 61 6d 65 6c 63 61 73 65   allow camelcase
57c0: 20 3f 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ?.             
57d0: 20 20 20 73 65 6c 66 2e 70 72 6f 70 73 2e 73 65     self.props.se
57e0: 74 73 61 6d 70 6c 65 28 73 61 6d 2c 20 73 65 6c  tsample(sam, sel
57f0: 66 2e 70 72 6f 70 73 2e 74 69 20 2d 20 31 29 3b  f.props.ti - 1);
5800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
5810: 20 20 20 20 20 20 20 20 20 20 20 61 2e 73 72 63             a.src
5820: 20 3d 20 55 52 4c 2e 63 72 65 61 74 65 4f 62 6a   = URL.createObj
5830: 65 63 74 55 52 4c 28 66 69 6c 65 29 3b 0a 20 20  ectURL(file);.  
5840: 20 20 20 20 20 20 7d 29 3b 0a 20 20 20 20 20 20        });.      
5850: 20 20 2a 2f 0a 0a 20 20 20 20 7d 29 3b 0a 20 20    */..    });.  
5860: 20 3c 2f 73 63 72 69 70 74 3e 0a 3c 2f 73 61 6d   </script>.</sam
5870: 70 6c 65 3e 0a 22 22 22 0a 0a 63 6f 67 2e 6f 75  ple>."""..cog.ou
5880: 74 28 73 61 6d 70 6c 65 29 0a 6f 73 2e 73 79 73  t(sample).os.sys
5890: 74 65 6d 28 22 72 6d 20 70 75 62 6c 69 63 2f 63  tem("rm public/c
58a0: 6f 6d 70 6f 6e 65 6e 74 73 2f 73 61 6d 70 6c 65  omponents/sample
58b0: 2e 74 61 67 22 29 0a 66 20 3d 20 6f 70 65 6e 28  .tag").f = open(
58c0: 22 70 75 62 6c 69 63 2f 63 6f 6d 70 6f 6e 65 6e  "public/componen
58d0: 74 73 2f 73 61 6d 70 6c 65 2e 74 61 67 22 2c 20  ts/sample.tag", 
58e0: 22 77 22 29 0a 66 2e 77 72 69 74 65 28 73 61 6d  "w").f.write(sam
58f0: 70 6c 65 29 0a 66 2e 63 6c 6f 73 65 28 29 0a 40  ple).f.close().@
5900: 3e 0a 40 40 0a 60 60 60 0a 0a 40 3c 0a 69 6d 70  >.@@.```..@<.imp
5910: 6f 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74 20 6f  ort cog.import o
5920: 73 0a 0a 61 70 70 20 3d 20 22 22 22 0a 28 69 6d  s..app = """.(im
5930: 70 6f 72 74 20 5b 73 61 6e 69 63 20 5b 53 61 6e  port [sanic [San
5940: 69 63 20 72 65 73 70 6f 6e 73 65 5d 5d 29 0a 28  ic response]]).(
5950: 69 6d 70 6f 72 74 20 5b 73 61 6e 69 63 2e 72 65  import [sanic.re
5960: 73 70 6f 6e 73 65 20 5b 6a 73 6f 6e 20 74 65 78  sponse [json tex
5970: 74 5d 5d 29 0a 28 69 6d 70 6f 72 74 20 5b 73 61  t]]).(import [sa
5980: 6e 69 63 2e 65 78 63 65 70 74 69 6f 6e 73 20 5b  nic.exceptions [
5990: 4e 6f 74 46 6f 75 6e 64 20 61 62 6f 72 74 5d 5d  NotFound abort]]
59a0: 29 0a 28 69 6d 70 6f 72 74 20 5b 6a 69 6e 6a 61  ).(import [jinja
59b0: 32 20 5b 45 6e 76 69 72 6f 6e 6d 65 6e 74 20 46  2 [Environment F
59c0: 69 6c 65 53 79 73 74 65 6d 4c 6f 61 64 65 72 5d  ileSystemLoader]
59d0: 5d 29 0a 28 69 6d 70 6f 72 74 20 72 65 29 0a 28  ]).(import re).(
59e0: 69 6d 70 6f 72 74 20 69 70 64 62 29 0a 28 69 6d  import ipdb).(im
59f0: 70 6f 72 74 20 73 79 73 29 0a 28 69 6d 70 6f 72  port sys).(impor
5a00: 74 20 74 72 61 63 65 62 61 63 6b 29 0a 28 69 6d  t traceback).(im
5a10: 70 6f 72 74 20 6a 73 6f 6e 29 0a 28 69 6d 70 6f  port json).(impo
5a20: 72 74 20 64 61 74 65 74 69 6d 65 29 0a 28 69 6d  rt datetime).(im
5a30: 70 6f 72 74 20 5b 65 6d 61 69 6c 2e 75 74 69 6c  port [email.util
5a40: 73 20 5b 66 6f 72 6d 61 74 5f 64 61 74 65 74 69  s [format_dateti
5a50: 6d 65 5d 5d 29 0a 28 69 6d 70 6f 72 74 20 5b 75  me]]).(import [u
5a60: 72 6c 6c 69 62 2e 70 61 72 73 65 20 5b 75 72 6c  rllib.parse [url
5a70: 70 61 72 73 65 5d 5d 29 0a 28 69 6d 70 6f 72 74  parse]]).(import
5a80: 20 62 61 73 65 36 34 29 0a 0a 28 73 65 74 76 20   base64)..(setv 
5a90: 66 69 6c 65 2d 6c 6f 61 64 65 72 20 28 46 69 6c  file-loader (Fil
5aa0: 65 53 79 73 74 65 6d 4c 6f 61 64 65 72 20 22 74  eSystemLoader "t
5ab0: 65 6d 70 6c 61 74 65 73 22 29 29 0a 28 73 65 74  emplates")).(set
5ac0: 76 20 65 6e 76 20 28 45 6e 76 69 72 6f 6e 6d 65  v env (Environme
5ad0: 6e 74 20 3a 6c 6f 61 64 65 72 20 66 69 6c 65 2d  nt :loader file-
5ae0: 6c 6f 61 64 65 72 29 29 0a 0a 28 73 65 74 76 20  loader))..(setv 
5af0: 61 70 70 20 28 53 61 6e 69 63 20 22 42 69 74 72  app (Sanic "Bitr
5b00: 68 79 74 68 6d 22 29 29 0a 0a 28 77 69 74 68 2d  hythm"))..(with-
5b10: 64 65 63 6f 72 61 74 6f 72 0a 20 20 28 61 70 70  decorator.  (app
5b20: 2e 65 78 63 65 70 74 69 6f 6e 20 4e 6f 74 46 6f  .exception NotFo
5b30: 75 6e 64 29 0a 20 20 28 64 65 66 6e 2f 61 20 69  und).  (defn/a i
5b40: 67 6e 6f 72 65 5f 34 30 34 73 20 5b 72 65 71 75  gnore_404s [requ
5b50: 65 73 74 20 65 78 63 65 70 74 69 6f 6e 5d 0a 20  est exception]. 
5b60: 20 20 20 28 72 65 74 75 72 6e 20 28 74 65 78 74     (return (text
5b70: 20 28 2b 20 22 59 65 70 2c 20 49 20 74 6f 74 61   (+ "Yep, I tota
5b80: 6c 6c 79 20 66 6f 75 6e 64 20 74 68 65 20 70 61  lly found the pa
5b90: 67 65 20 22 20 72 65 71 75 65 73 74 2e 75 72 6c  ge " request.url
5ba0: 29 29 29 0a 20 20 29 0a 29 0a 0a 28 77 69 74 68  ))).  ).)..(with
5bb0: 2d 64 65 63 6f 72 61 74 6f 72 0a 20 20 28 61 70  -decorator.  (ap
5bc0: 70 2e 72 6f 75 74 65 20 22 2f 73 6f 6e 67 2f 3c  p.route "/song/<
5bd0: 6e 61 6d 65 3e 22 29 0a 20 20 28 64 65 66 6e 2f  name>").  (defn/
5be0: 61 20 67 65 74 2d 69 6e 64 65 78 20 5b 72 65 71  a get-index [req
5bf0: 75 65 73 74 20 6e 61 6d 65 5d 0a 20 20 20 20 28  uest name].    (
5c00: 73 65 74 76 20 74 65 6d 70 6c 61 74 65 20 28 65  setv template (e
5c10: 6e 76 2e 67 65 74 5f 74 65 6d 70 6c 61 74 65 20  nv.get_template 
5c20: 22 69 6e 64 65 78 2e 68 74 6d 6c 22 29 29 0a 20  "index.html")). 
5c30: 20 20 20 28 72 65 74 75 72 6e 20 28 72 65 73 70     (return (resp
5c40: 6f 6e 73 65 2e 68 74 6d 6c 20 28 74 65 6d 70 6c  onse.html (templ
5c50: 61 74 65 2e 72 65 6e 64 65 72 20 7b 22 64 61 74  ate.render {"dat
5c60: 61 22 20 6e 61 6d 65 7d 29 29 29 0a 20 20 29 0a  a" name}))).  ).
5c70: 29 0a 0a 28 77 69 74 68 2d 64 65 63 6f 72 61 74  )..(with-decorat
5c80: 6f 72 0a 20 20 28 61 70 70 2e 72 6f 75 74 65 20  or.  (app.route 
5c90: 22 2f 22 29 0a 20 20 28 64 65 66 6e 2f 61 20 67  "/").  (defn/a g
5ca0: 65 74 2d 69 6e 64 65 78 20 5b 72 65 71 75 65 73  et-index [reques
5cb0: 74 5d 0a 20 20 20 20 28 73 65 74 76 20 74 65 6d  t].    (setv tem
5cc0: 70 6c 61 74 65 20 28 65 6e 76 2e 67 65 74 5f 74  plate (env.get_t
5cd0: 65 6d 70 6c 61 74 65 20 22 69 6e 64 65 78 2e 68  emplate "index.h
5ce0: 74 6d 6c 22 29 29 0a 20 20 20 20 28 72 65 74 75  tml")).    (retu
5cf0: 72 6e 20 28 72 65 73 70 6f 6e 73 65 2e 68 74 6d  rn (response.htm
5d00: 6c 20 28 74 65 6d 70 6c 61 74 65 2e 72 65 6e 64  l (template.rend
5d10: 65 72 20 7b 22 64 61 74 61 22 20 22 22 7d 29 29  er {"data" ""}))
5d20: 29 0a 20 20 29 0a 29 0a 0a 28 77 69 74 68 2d 64  ).  ).)..(with-d
5d30: 65 63 6f 72 61 74 6f 72 0a 20 20 28 61 70 70 2e  ecorator.  (app.
5d40: 72 6f 75 74 65 20 22 2f 69 73 73 75 65 22 29 0a  route "/issue").
5d50: 20 20 28 64 65 66 6e 2f 61 20 67 65 74 2d 69 6e    (defn/a get-in
5d60: 64 65 78 20 5b 72 65 71 75 65 73 74 5d 0a 20 20  dex [request].  
5d70: 20 20 28 73 65 74 76 20 74 65 6d 70 6c 61 74 65    (setv template
5d80: 20 28 65 6e 76 2e 67 65 74 5f 74 65 6d 70 6c 61   (env.get_templa
5d90: 74 65 20 22 70 61 67 65 2e 68 74 6d 6c 22 29 29  te "page.html"))
5da0: 0a 20 20 20 20 28 72 65 74 75 72 6e 20 28 72 65  .    (return (re
5db0: 73 70 6f 6e 73 65 2e 68 74 6d 6c 20 28 74 65 6d  sponse.html (tem
5dc0: 70 6c 61 74 65 2e 72 65 6e 64 65 72 29 29 29 0a  plate.render))).
5dd0: 20 20 29 0a 29 0a 0a 28 61 70 70 2e 73 74 61 74    ).)..(app.stat
5de0: 69 63 20 22 2f 22 20 22 2e 2f 70 75 62 6c 69 63  ic "/" "./public
5df0: 22 29 0a 0a 28 64 65 66 6d 61 69 6e 20 5b 26 72  ")..(defmain [&r
5e00: 65 73 74 20 61 72 67 73 5d 0a 20 20 20 20 28 61  est args].    (a
5e10: 70 70 2e 72 75 6e 20 3a 68 6f 73 74 20 22 30 2e  pp.run :host "0.
5e20: 30 2e 30 2e 30 22 20 3a 70 6f 72 74 20 38 30 31  0.0.0" :port 801
5e30: 35 29 0a 29 0a 22 22 22 0a 0a 69 66 20 44 45 56  5).)."""..if DEV
5e40: 20 3d 3d 20 22 31 22 3a 0a 20 20 20 20 66 6f 72   == "1":.    for
5e50: 5f 64 6f 63 73 20 3d 20 22 22 22 0a 23 23 20 41  _docs = """.## A
5e60: 70 70 0a 0a 60 60 60 7b 63 6f 64 65 2d 62 6c 6f  pp..```{code-blo
5e70: 63 6b 7d 20 68 79 6c 61 6e 67 0a 2d 2d 2d 0a 66  ck} hylang.---.f
5e80: 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 25  orce: true.---.%
5e90: 73 0a 60 60 60 0a 22 22 22 0a 20 20 20 20 63 6f  s.```.""".    co
5ea0: 67 2e 6f 75 74 28 66 6f 72 5f 64 6f 63 73 20 25  g.out(for_docs %
5eb0: 20 28 61 70 70 2c 29 29 0a 6f 73 2e 73 79 73 74   (app,)).os.syst
5ec0: 65 6d 28 22 72 6d 20 62 69 74 72 68 79 74 68 6d  em("rm bitrhythm
5ed0: 2e 68 79 22 29 0a 66 20 3d 20 6f 70 65 6e 28 22  .hy").f = open("
5ee0: 62 69 74 72 68 79 74 68 6d 2e 68 79 22 2c 20 22  bitrhythm.hy", "
5ef0: 77 22 29 0a 66 2e 77 72 69 74 65 28 61 70 70 29  w").f.write(app)
5f00: 0a 66 2e 63 6c 6f 73 65 28 29 0a 40 3e 0a 40 40  .f.close().@>.@@
5f10: 0a 0a 40 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a  ..@<.import cog.
5f20: 69 6d 70 6f 72 74 20 6f 73 0a 0a 69 6e 64 65 78  import os..index
5f30: 20 3d 20 22 22 22 0a 3c 21 44 4f 43 54 59 50 45   = """.<!DOCTYPE
5f40: 20 68 74 6d 6c 3e 0a 3c 68 74 6d 6c 20 6c 61 6e   html>.<html lan
5f50: 67 3d 22 65 6e 22 3e 0a 0a 20 20 20 20 3c 68 65  g="en">..    <he
5f60: 61 64 3e 0a 20 20 20 20 20 20 20 20 3c 6d 65 74  ad>.        <met
5f70: 61 20 63 68 61 72 73 65 74 3d 22 75 74 66 2d 38  a charset="utf-8
5f80: 22 3e 0a 0a 20 20 20 20 20 20 20 20 3c 74 69 74  ">..        <tit
5f90: 6c 65 3e 42 69 74 72 68 79 74 68 6d 3c 2f 74 69  le>Bitrhythm</ti
5fa0: 74 6c 65 3e 0a 0a 20 20 20 20 20 20 20 20 3c 6d  tle>..        <m
5fb0: 65 74 61 20 68 74 74 70 2d 65 71 75 69 76 3d 22  eta http-equiv="
5fc0: 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 22 20 63  Cache-Control" c
5fd0: 6f 6e 74 65 6e 74 3d 22 6e 6f 2d 63 61 63 68 65  ontent="no-cache
5fe0: 2c 20 6e 6f 2d 73 74 6f 72 65 2c 20 6d 75 73 74  , no-store, must
5ff0: 2d 72 65 76 61 6c 69 64 61 74 65 22 20 2f 3e 0a  -revalidate" />.
6000: 20 20 20 20 20 20 20 20 3c 6d 65 74 61 20 68 74          <meta ht
6010: 74 70 2d 65 71 75 69 76 3d 22 50 72 61 67 6d 61  tp-equiv="Pragma
6020: 22 20 63 6f 6e 74 65 6e 74 3d 22 6e 6f 2d 63 61  " content="no-ca
6030: 63 68 65 22 20 2f 3e 0a 20 20 20 20 20 20 20 20  che" />.        
6040: 3c 6d 65 74 61 20 68 74 74 70 2d 65 71 75 69 76  <meta http-equiv
6050: 3d 22 45 78 70 69 72 65 73 22 20 63 6f 6e 74 65  ="Expires" conte
6060: 6e 74 3d 22 30 22 20 2f 3e 0a 0a 20 20 20 20 20  nt="0" />..     
6070: 20 20 20 3c 6d 65 74 61 20 63 6f 6e 74 65 6e 74     <meta content
6080: 3d 22 42 69 74 72 68 79 74 68 6d 22 20 6e 61 6d  ="Bitrhythm" nam
6090: 65 3d 22 64 65 73 63 72 69 70 74 69 6f 6e 22 20  e="description" 
60a0: 78 6d 6c 3a 6c 61 6e 67 3d 22 65 6e 22 20 6c 61  xml:lang="en" la
60b0: 6e 67 3d 22 65 6e 22 3e 0a 20 20 20 20 20 20 20  ng="en">.       
60c0: 20 3c 6d 65 74 61 20 63 6f 6e 74 65 6e 74 3d 22   <meta content="
60d0: 6c 69 74 65 72 61 74 65 20 70 72 6f 67 72 61 6d  literate program
60e0: 6d 69 6e 67 2c 20 70 35 2c 20 6c 69 76 65 20 63  ming, p5, live c
60f0: 6f 64 69 6e 67 2c 20 61 6c 67 6f 72 61 76 65 2c  oding, algorave,
6100: 20 64 65 6d 6f 73 63 65 6e 65 2c 20 63 72 65 61   demoscene, crea
6110: 74 69 76 65 20 70 72 6f 67 72 61 6d 6d 69 6e 67  tive programming
6120: 2c 20 6d 75 73 69 63 2c 20 74 65 63 68 6e 6f 2c  , music, techno,
6130: 20 70 72 6f 67 72 61 6d 6d 69 6e 67 2c 20 77 65   programming, we
6140: 62 61 75 64 69 6f 2c 20 77 65 62 67 6c 2c 20 70  baudio, webgl, p
6150: 35 2c 20 69 6d 70 72 6f 76 69 73 69 6e 67 22 3e  5, improvising">
6160: 0a 0a 20 20 20 20 20 20 20 24 7b 63 6f 6d 6d 6f  ..       ${commo
6170: 6e 5f 73 63 72 69 70 74 73 7d 0a 0a 20 20 20 20  n_scripts}..    
6180: 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22 70      <link rel="p
6190: 72 65 63 6f 6e 6e 65 63 74 22 20 68 72 65 66 3d  reconnect" href=
61a0: 22 68 74 74 70 73 3a 2f 2f 66 6f 6e 74 73 2e 67  "https://fonts.g
61b0: 73 74 61 74 69 63 2e 63 6f 6d 22 3e 0a 20 20 20  static.com">.   
61c0: 20 20 20 20 20 3c 6c 69 6e 6b 20 68 72 65 66 3d       <link href=
61d0: 22 68 74 74 70 73 3a 2f 2f 66 6f 6e 74 73 2e 67  "https://fonts.g
61e0: 6f 6f 67 6c 65 61 70 69 73 2e 63 6f 6d 2f 63 73  oogleapis.com/cs
61f0: 73 32 3f 66 61 6d 69 6c 79 3d 52 6f 62 6f 74 6f  s2?family=Roboto
6200: 2b 4d 6f 6e 6f 3a 69 74 61 6c 2c 77 67 68 74 40  +Mono:ital,wght@
6210: 30 2c 31 30 30 3b 30 2c 32 30 30 3b 30 2c 33 30  0,100;0,200;0,30
6220: 30 3b 30 2c 34 30 30 3b 30 2c 35 30 30 3b 30 2c  0;0,400;0,500;0,
6230: 37 30 30 3b 31 2c 31 30 30 3b 31 2c 32 30 30 3b  700;1,100;1,200;
6240: 31 2c 33 30 30 3b 31 2c 34 30 30 3b 31 2c 35 30  1,300;1,400;1,50
6250: 30 3b 31 2c 37 30 30 26 64 69 73 70 6c 61 79 3d  0;1,700&display=
6260: 73 77 61 70 22 20 72 65 6c 3d 22 73 74 79 6c 65  swap" rel="style
6270: 73 68 65 65 74 22 3e 0a 20 20 20 20 20 20 20 20  sheet">.        
6280: 3c 6c 69 6e 6b 20 68 72 65 66 3d 22 68 74 74 70  <link href="http
6290: 73 3a 2f 2f 66 6f 6e 74 73 2e 67 6f 6f 67 6c 65  s://fonts.google
62a0: 61 70 69 73 2e 63 6f 6d 2f 63 73 73 32 3f 66 61  apis.com/css2?fa
62b0: 6d 69 6c 79 3d 4d 61 6a 6f 72 2b 4d 6f 6e 6f 2b  mily=Major+Mono+
62c0: 44 69 73 70 6c 61 79 26 66 61 6d 69 6c 79 3d 52  Display&family=R
62d0: 6f 62 6f 74 6f 2b 4d 6f 6e 6f 3a 69 74 61 6c 2c  oboto+Mono:ital,
62e0: 77 67 68 74 40 30 2c 31 30 30 3b 30 2c 32 30 30  wght@0,100;0,200
62f0: 3b 30 2c 33 30 30 3b 30 2c 34 30 30 3b 30 2c 35  ;0,300;0,400;0,5
6300: 30 30 3b 30 2c 37 30 30 3b 31 2c 31 30 30 3b 31  00;0,700;1,100;1
6310: 2c 32 30 30 3b 31 2c 33 30 30 3b 31 2c 34 30 30  ,200;1,300;1,400
6320: 3b 31 2c 35 30 30 3b 31 2c 37 30 30 26 64 69 73  ;1,500;1,700&dis
6330: 70 6c 61 79 3d 73 77 61 70 22 20 72 65 6c 3d 22  play=swap" rel="
6340: 73 74 79 6c 65 73 68 65 65 74 22 3e 0a 0a 20 20  stylesheet">..  
6350: 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73 72        <script sr
6360: 63 3d 22 68 74 74 70 73 3a 2f 2f 63 6f 64 65 2e  c="https://code.
6370: 6a 71 75 65 72 79 2e 63 6f 6d 2f 75 69 2f 31 2e  jquery.com/ui/1.
6380: 31 32 2e 30 2f 6a 71 75 65 72 79 2d 75 69 2e 6d  12.0/jquery-ui.m
6390: 69 6e 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e  in.js"></script>
63a0: 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e 6b 20 72  .        <link r
63b0: 65 6c 3d 22 73 74 79 6c 65 73 68 65 65 74 22 20  el="stylesheet" 
63c0: 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f 63 6f  href="https://co
63d0: 64 65 2e 6a 71 75 65 72 79 2e 63 6f 6d 2f 75 69  de.jquery.com/ui
63e0: 2f 31 2e 31 32 2e 30 2f 74 68 65 6d 65 73 2f 73  /1.12.0/themes/s
63f0: 6d 6f 6f 74 68 6e 65 73 73 2f 6a 71 75 65 72 79  moothness/jquery
6400: 2d 75 69 2e 63 73 73 22 3e 0a 20 20 20 20 20 20  -ui.css">.      
6410: 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68    <script src="h
6420: 74 74 70 73 3a 2f 2f 63 64 6e 6a 73 2e 63 6c 6f  ttps://cdnjs.clo
6430: 75 64 66 6c 61 72 65 2e 63 6f 6d 2f 61 6a 61 78  udflare.com/ajax
6440: 2f 6c 69 62 73 2f 6d 69 63 72 6f 6d 6f 64 61 6c  /libs/micromodal
6450: 2f 30 2e 34 2e 36 2f 6d 69 63 72 6f 6d 6f 64 61  /0.4.6/micromoda
6460: 6c 2e 6d 69 6e 2e 6a 73 22 20 69 6e 74 65 67 72  l.min.js" integr
6470: 69 74 79 3d 22 73 68 61 35 31 32 2d 52 4d 4d 68  ity="sha512-RMMh
6480: 2b 49 48 7a 66 5a 4c 73 56 46 6f 31 72 58 39 50  +IHzfZLsVFo1rX9P
6490: 42 6f 79 73 78 72 4a 4a 71 6a 79 4f 53 33 31 48  BoysxrJJqjyOS31H
64a0: 59 57 66 74 6f 62 57 74 76 32 41 74 36 4b 42 54  YWftobWtv2At6KBT
64b0: 71 4b 70 76 56 44 49 57 41 6a 4c 35 61 69 56 2b  qKpvVDIWAjL5aiV+
64c0: 4c 6a 46 71 6b 51 36 65 35 33 52 64 77 33 56 4f  LjFqkQ6e53Rdw3VO
64d0: 42 67 3d 3d 22 20 63 72 6f 73 73 6f 72 69 67 69  Bg==" crossorigi
64e0: 6e 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 3e 3c 2f  n="anonymous"></
64f0: 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20  script>.        
6500: 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68 74 74  <script src="htt
6510: 70 73 3a 2f 2f 63 64 6e 2e 6a 73 64 65 6c 69 76  ps://cdn.jsdeliv
6520: 72 2e 6e 65 74 2f 6e 70 6d 2f 77 68 65 6e 69 70  r.net/npm/whenip
6530: 72 65 73 73 40 31 2e 38 2e 30 2f 64 69 73 74 2f  ress@1.8.0/dist/
6540: 77 68 65 6e 69 70 72 65 73 73 2e 6a 73 22 3e 3c  whenipress.js"><
6550: 2f 73 63 72 69 70 74 3e 0a 0a 20 20 20 20 20 20  /script>..      
6560: 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68    <script src="h
6570: 74 74 70 73 3a 2f 2f 63 64 6e 6a 73 2e 63 6c 6f  ttps://cdnjs.clo
6580: 75 64 66 6c 61 72 65 2e 63 6f 6d 2f 61 6a 61 78  udflare.com/ajax
6590: 2f 6c 69 62 73 2f 41 6c 65 72 74 69 66 79 4a 53  /libs/AlertifyJS
65a0: 2f 31 2e 31 33 2e 31 2f 61 6c 65 72 74 69 66 79  /1.13.1/alertify
65b0: 2e 6d 69 6e 2e 6a 73 22 20 69 6e 74 65 67 72 69  .min.js" integri
65c0: 74 79 3d 22 73 68 61 35 31 32 2d 4a 6e 6a 47 2b  ty="sha512-JnjG+
65d0: 57 74 35 33 47 73 70 55 51 58 51 68 63 2b 63 34  Wt53GspUQXQhc+c4
65e0: 6a 38 53 42 45 52 73 67 4a 41 6f 48 65 65 68 61  j8SBERsgJAoHeeha
65f0: 67 4b 48 6c 78 51 4e 2b 4d 74 43 43 6d 46 44 67  gKHlxQN+MtCCmFDg
6600: 68 58 39 2f 41 63 62 6b 6b 4e 52 5a 70 74 79 5a  hX9/AcbkkNRZptyZ
6610: 55 34 7a 43 38 75 74 4b 35 39 4d 35 4c 34 35 49  U4zC8utK59M5L45I
6620: 77 3d 3d 22 20 63 72 6f 73 73 6f 72 69 67 69 6e  w==" crossorigin
6630: 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 3e 3c 2f 73  ="anonymous"></s
6640: 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20 3c  cript>.        <
6650: 6c 69 6e 6b 20 72 65 6c 3d 22 73 74 79 6c 65 73  link rel="styles
6660: 68 65 65 74 22 20 68 72 65 66 3d 22 68 74 74 70  heet" href="http
6670: 73 3a 2f 2f 63 64 6e 6a 73 2e 63 6c 6f 75 64 66  s://cdnjs.cloudf
6680: 6c 61 72 65 2e 63 6f 6d 2f 61 6a 61 78 2f 6c 69  lare.com/ajax/li
6690: 62 73 2f 41 6c 65 72 74 69 66 79 4a 53 2f 31 2e  bs/AlertifyJS/1.
66a0: 31 33 2e 31 2f 63 73 73 2f 61 6c 65 72 74 69 66  13.1/css/alertif
66b0: 79 2e 6d 69 6e 2e 63 73 73 22 20 69 6e 74 65 67  y.min.css" integ
66c0: 72 69 74 79 3d 22 73 68 61 35 31 32 2d 49 58 75  rity="sha512-IXu
66d0: 6f 71 31 61 46 64 32 77 58 73 34 4e 71 47 73 6b  oq1aFd2wXs4NqGsk
66e0: 77 58 32 56 62 2b 49 38 55 4a 2b 74 47 4a 45 75  wX2Vb+I8UJ+tGJEu
66f0: 2f 44 63 30 7a 77 4c 4e 4b 65 51 37 43 57 33 53  /Dc0zwLNKeQ7CW3S
6700: 72 36 76 30 79 55 33 7a 35 4f 51 57 65 33 65 53  r6v0yU3z5OQWe3eS
6710: 63 56 49 6b 45 52 34 4a 39 4c 37 62 79 72 67 52  cVIkER4J9L7byrgR
6720: 2f 66 41 3d 3d 22 20 63 72 6f 73 73 6f 72 69 67  /fA==" crossorig
6730: 69 6e 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 20 2f  in="anonymous" /
6740: 3e 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e 6b 20  >.        <link 
6750: 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65 74 22  rel="stylesheet"
6760: 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f 63   href="https://c
6770: 64 6e 6a 73 2e 63 6c 6f 75 64 66 6c 61 72 65 2e  dnjs.cloudflare.
6780: 63 6f 6d 2f 61 6a 61 78 2f 6c 69 62 73 2f 41 6c  com/ajax/libs/Al
6790: 65 72 74 69 66 79 4a 53 2f 31 2e 31 33 2e 31 2f  ertifyJS/1.13.1/
67a0: 63 73 73 2f 74 68 65 6d 65 73 2f 64 65 66 61 75  css/themes/defau
67b0: 6c 74 2e 6d 69 6e 2e 63 73 73 22 20 69 6e 74 65  lt.min.css" inte
67c0: 67 72 69 74 79 3d 22 73 68 61 35 31 32 2d 52 67  grity="sha512-Rg
67d0: 55 6a 44 70 77 6a 45 44 7a 41 62 37 6e 6b 53 68  UjDpwjEDzAb7nkSh
67e0: 69 7a 43 43 4a 2b 51 54 53 4c 49 69 4a 4f 31 6c  izCCJ+QTSLIiJO1l
67f0: 64 74 75 78 7a 73 30 55 49 42 52 48 34 51 70 4f  dtuxzs0UIBRH4QpO
6800: 6a 55 55 39 77 34 37 41 46 39 5a 6c 76 69 71 56  jUU9w47AF9ZlviqV
6810: 2f 64 4f 46 47 57 46 36 6f 37 6c 33 6c 74 74 45  /dOFGWF6o7l3lttE
6820: 46 62 36 67 3d 3d 22 20 63 72 6f 73 73 6f 72 69  Fb6g==" crossori
6830: 67 69 6e 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 20  gin="anonymous" 
6840: 2f 3e 0a 0a 20 20 20 20 20 20 20 20 3c 73 63 72  />..        <scr
6850: 69 70 74 20 73 72 63 3d 22 2f 6a 73 6f 6e 2d 75  ipt src="/json-u
6860: 72 6c 2d 6d 61 73 74 65 72 2f 64 69 73 74 2f 62  rl-master/dist/b
6870: 72 6f 77 73 65 72 2f 6a 73 6f 6e 2d 75 72 6c 2e  rowser/json-url.
6880: 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20  js"></script>.  
6890: 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73 72        <script sr
68a0: 63 3d 22 2f 72 69 6f 74 2d 33 2e 31 33 2e 32 2f  c="/riot-3.13.2/
68b0: 72 69 6f 74 2b 63 6f 6d 70 69 6c 65 72 2e 6a 73  riot+compiler.js
68c0: 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 0a 20 20 20  "></script>..   
68d0: 20 20 20 20 20 3c 6c 69 6e 6b 20 72 65 6c 3d 22       <link rel="
68e0: 73 74 79 6c 65 73 68 65 65 74 22 20 68 72 65 66  stylesheet" href
68f0: 3d 22 68 74 74 70 73 3a 2f 2f 63 64 6e 6a 73 2e  ="https://cdnjs.
6900: 63 6c 6f 75 64 66 6c 61 72 65 2e 63 6f 6d 2f 61  cloudflare.com/a
6910: 6a 61 78 2f 6c 69 62 73 2f 74 61 69 6c 77 69 6e  jax/libs/tailwin
6920: 64 63 73 73 2f 32 2e 31 2e 32 2f 74 61 69 6c 77  dcss/2.1.2/tailw
6930: 69 6e 64 2e 6d 69 6e 2e 63 73 73 22 20 69 6e 74  ind.min.css" int
6940: 65 67 72 69 74 79 3d 22 73 68 61 35 31 32 2d 52  egrity="sha512-R
6950: 6e 74 61 74 50 4f 68 45 63 51 45 41 38 31 67 43  ntatPOhEcQEA81gC
6960: 2f 65 73 59 6f 43 6b 47 6b 4c 37 41 59 56 37 54  /esYoCkGkL7AYV7T
6970: 65 54 50 6f 55 2b 52 39 7a 45 34 34 2f 79 57 78  eTPoU+R9zE44/yWx
6980: 56 76 4c 49 42 66 42 53 61 4d 75 37 38 72 68 6f  VvLIBfBSaMu78rho
6990: 44 64 37 33 5a 65 52 48 58 52 4a 4e 35 2b 61 50  Dd73ZeRHXRJN5+aP
69a0: 45 4b 35 33 51 3d 3d 22 20 63 72 6f 73 73 6f 72  EK53Q==" crossor
69b0: 69 67 69 6e 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22  igin="anonymous"
69c0: 20 2f 3e 0a 20 20 20 20 20 20 20 20 3c 73 63 72   />.        <scr
69d0: 69 70 74 20 73 72 63 3d 22 68 74 74 70 73 3a 2f  ipt src="https:/
69e0: 2f 73 74 61 63 6b 70 61 74 68 2e 62 6f 6f 74 73  /stackpath.boots
69f0: 74 72 61 70 63 64 6e 2e 63 6f 6d 2f 62 6f 6f 74  trapcdn.com/boot
6a00: 73 74 72 61 70 2f 34 2e 33 2e 31 2f 6a 73 2f 62  strap/4.3.1/js/b
6a10: 6f 6f 74 73 74 72 61 70 2e 6d 69 6e 2e 6a 73 22  ootstrap.min.js"
6a20: 20 69 6e 74 65 67 72 69 74 79 3d 22 73 68 61 33   integrity="sha3
6a30: 38 34 2d 4a 6a 53 6d 56 67 79 64 30 70 33 70 58  84-JjSmVgyd0p3pX
6a40: 42 31 72 52 69 62 5a 55 41 59 6f 49 49 79 36 4f  B1rRibZUAYoIIy6O
6a50: 72 51 36 56 72 6a 49 45 61 46 66 2f 6e 4a 47 7a  rQ6VrjIEaFf/nJGz
6a60: 49 78 46 44 73 66 34 78 30 78 49 4d 2b 42 30 37  IxFDsf4x0xIM+B07
6a70: 6a 52 4d 22 20 63 72 6f 73 73 6f 72 69 67 69 6e  jRM" crossorigin
6a80: 3d 22 61 6e 6f 6e 79 6d 6f 75 73 22 3e 3c 2f 73  ="anonymous"></s
6a90: 63 72 69 70 74 3e 0a 0a 20 20 20 20 20 20 20 20  cript>..        
6aa0: 3c 6c 69 6e 6b 20 72 65 6c 3d 22 73 74 79 6c 65  <link rel="style
6ab0: 73 68 65 65 74 22 20 68 72 65 66 3d 22 68 74 74  sheet" href="htt
6ac0: 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69  ps://esironal.gi
6ad0: 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f  thub.io/cmtouch/
6ae0: 6c 69 62 2f 63 6f 64 65 6d 69 72 72 6f 72 2e 63  lib/codemirror.c
6af0: 73 73 22 3e 0a 20 20 20 20 20 20 20 20 3c 6c 69  ss">.        <li
6b00: 6e 6b 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65  nk rel="styleshe
6b10: 65 74 22 20 68 72 65 66 3d 22 68 74 74 70 73 3a  et" href="https:
6b20: 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75  //esironal.githu
6b30: 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f 61 64 64  b.io/cmtouch/add
6b40: 6f 6e 2f 68 69 6e 74 2f 73 68 6f 77 2d 68 69 6e  on/hint/show-hin
6b50: 74 2e 63 73 73 22 3e 0a 20 20 20 20 20 20 20 20  t.css">.        
6b60: 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68 74 74  <script src="htt
6b70: 70 73 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69  ps://esironal.gi
6b80: 74 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f  thub.io/cmtouch/
6b90: 6c 69 62 2f 63 6f 64 65 6d 69 72 72 6f 72 2e 6a  lib/codemirror.j
6ba0: 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20  s"></script>.   
6bb0: 20 20 20 20 20 3c 73 63 72 69 70 74 20 73 72 63       <script src
6bc0: 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69 72 6f 6e  ="https://esiron
6bd0: 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63 6d 74  al.github.io/cmt
6be0: 6f 75 63 68 2f 61 64 64 6f 6e 2f 68 69 6e 74 2f  ouch/addon/hint/
6bf0: 73 68 6f 77 2d 68 69 6e 74 2e 6a 73 22 3e 3c 2f  show-hint.js"></
6c00: 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20  script>.        
6c10: 3c 73 63 72 69 70 74 20 73 72 63 3d 22 68 74 74  <script src="htt
6c20: 70 3a 2f 2f 65 73 69 72 6f 6e 61 6c 2e 67 69 74  p://esironal.git
6c30: 68 75 62 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f 61  hub.io/cmtouch/a
6c40: 64 64 6f 6e 2f 68 69 6e 74 2f 78 6d 6c 2d 68 69  ddon/hint/xml-hi
6c50: 6e 74 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e  nt.js"></script>
6c60: 0a 20 20 20 20 20 20 20 20 3c 73 63 72 69 70 74  .        <script
6c70: 20 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f 65 73   src="https://es
6c80: 69 72 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f  ironal.github.io
6c90: 2f 63 6d 74 6f 75 63 68 2f 61 64 64 6f 6e 2f 68  /cmtouch/addon/h
6ca0: 69 6e 74 2f 68 74 6d 6c 2d 68 69 6e 74 2e 6a 73  int/html-hint.js
6cb0: 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20 20  "></script>.    
6cc0: 20 20 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d      <script src=
6cd0: 22 68 74 74 70 73 3a 2f 2f 65 73 69 72 6f 6e 61  "https://esirona
6ce0: 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63 6d 74 6f  l.github.io/cmto
6cf0: 75 63 68 2f 6d 6f 64 65 2f 78 6d 6c 2f 78 6d 6c  uch/mode/xml/xml
6d00: 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20  .js"></script>. 
6d10: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 73         <script s
6d20: 72 63 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69 72  rc="https://esir
6d30: 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f 63  onal.github.io/c
6d40: 6d 74 6f 75 63 68 2f 6d 6f 64 65 2f 6a 61 76 61  mtouch/mode/java
6d50: 73 63 72 69 70 74 2f 6a 61 76 61 73 63 72 69 70  script/javascrip
6d60: 74 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a  t.js"></script>.
6d70: 20 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20          <script 
6d80: 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f 65 73 69  src="https://esi
6d90: 72 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69 6f 2f  ronal.github.io/
6da0: 63 6d 74 6f 75 63 68 2f 6d 6f 64 65 2f 63 73 73  cmtouch/mode/css
6db0: 2f 63 73 73 2e 6a 73 22 3e 3c 2f 73 63 72 69 70  /css.js"></scrip
6dc0: 74 3e 0a 20 20 20 20 20 20 20 20 3c 73 63 72 69  t>.        <scri
6dd0: 70 74 20 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f  pt src="https://
6de0: 65 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75 62 2e  esironal.github.
6df0: 69 6f 2f 63 6d 74 6f 75 63 68 2f 6d 6f 64 65 2f  io/cmtouch/mode/
6e00: 68 74 6d 6c 6d 69 78 65 64 2f 68 74 6d 6c 6d 69  htmlmixed/htmlmi
6e10: 78 65 64 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74  xed.js"></script
6e20: 3e 0a 20 20 20 20 20 20 20 20 3c 73 63 72 69 70  >.        <scrip
6e30: 74 20 73 72 63 3d 22 68 74 74 70 73 3a 2f 2f 65  t src="https://e
6e40: 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75 62 2e 69  sironal.github.i
6e50: 6f 2f 63 6d 74 6f 75 63 68 2f 61 64 64 6f 6e 2f  o/cmtouch/addon/
6e60: 73 65 6c 65 63 74 69 6f 6e 2f 61 63 74 69 76 65  selection/active
6e70: 2d 6c 69 6e 65 2e 6a 73 22 3e 3c 2f 73 63 72 69  -line.js"></scri
6e80: 70 74 3e 0a 20 20 20 20 20 20 20 20 3c 73 63 72  pt>.        <scr
6e90: 69 70 74 20 73 72 63 3d 22 68 74 74 70 73 3a 2f  ipt src="https:/
6ea0: 2f 65 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75 62  /esironal.github
6eb0: 2e 69 6f 2f 63 6d 74 6f 75 63 68 2f 61 64 64 6f  .io/cmtouch/addo
6ec0: 6e 2f 65 64 69 74 2f 6d 61 74 63 68 62 72 61 63  n/edit/matchbrac
6ed0: 6b 65 74 73 2e 6a 73 22 3e 3c 2f 73 63 72 69 70  kets.js"></scrip
6ee0: 74 3e 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e 6b  t>.        <link
6ef0: 20 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65 74   rel="stylesheet
6f00: 22 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f  " href="https://
6f10: 65 73 69 72 6f 6e 61 6c 2e 67 69 74 68 75 62 2e  esironal.github.
6f20: 69 6f 2f 63 6d 74 6f 75 63 68 2f 74 68 65 6d 65  io/cmtouch/theme
6f30: 2f 6e 65 6f 6e 73 79 6e 74 61 78 2e 63 73 73 22  /neonsyntax.css"
6f40: 3e 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e 6b 20  >.        <link 
6f50: 72 65 6c 3d 22 73 74 79 6c 65 73 68 65 65 74 22  rel="stylesheet"
6f60: 20 68 72 65 66 3d 22 68 74 74 70 73 3a 2f 2f 75   href="https://u
6f70: 6e 70 6b 67 2e 63 6f 6d 2f 70 79 6c 6f 6e 63 73  npkg.com/pyloncs
6f80: 73 40 6c 61 74 65 73 74 2f 63 73 73 2f 70 79 6c  s@latest/css/pyl
6f90: 6f 6e 2e 63 73 73 22 2f 3e 0a 0a 0a 20 20 20 20  on.css"/>...    
6fa0: 20 20 20 20 3c 73 63 72 69 70 74 20 73 72 63 3d      <script src=
6fb0: 22 2f 74 75 6e 65 2e 6a 73 22 3e 3c 2f 73 63 72  "/tune.js"></scr
6fc0: 69 70 74 3e 0a 20 20 20 20 20 20 20 20 3c 73 63  ipt>.        <sc
6fd0: 72 69 70 74 20 73 72 63 3d 22 2f 6d 69 73 63 2e  ript src="/misc.
6fe0: 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 0a 20  js"></script>.. 
6ff0: 20 20 20 20 20 20 20 3c 73 74 79 6c 65 20 74 79         <style ty
7000: 70 65 3d 22 74 65 78 74 2f 63 73 73 22 3e 0a 62  pe="text/css">.b
7010: 6f 64 79 20 7b 0a 20 20 20 20 62 61 63 6b 67 72  ody {.    backgr
7020: 6f 75 6e 64 3a 20 62 6c 61 63 6b 3b 0a 20 20 20  ound: black;.   
7030: 20 63 6f 6c 6f 72 3a 20 77 68 69 74 65 3b 0a 20   color: white;. 
7040: 20 20 20 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20     font-family: 
7050: 27 52 6f 62 6f 74 6f 20 4d 6f 6e 6f 27 2c 20 6d  'Roboto Mono', m
7060: 6f 6e 6f 73 70 61 63 65 3b 0a 7d 0a 0a 61 20 7b  onospace;.}..a {
7070: 0a 20 20 20 20 63 6f 6c 6f 72 3a 20 77 68 69 74  .    color: whit
7080: 65 3b 0a 7d 0a 0a 69 6e 70 75 74 20 7b 0a 20 20  e;.}..input {.  
7090: 20 20 63 6f 6c 6f 72 3a 20 62 6c 61 63 6b 3b 0a    color: black;.
70a0: 7d 0a 0a 2e 62 74 6e 20 7b 0a 20 20 20 20 62 61  }...btn {.    ba
70b0: 63 6b 67 72 6f 75 6e 64 3a 20 77 68 69 74 65 3b  ckground: white;
70c0: 0a 20 20 20 20 63 6f 6c 6f 72 3a 20 62 6c 61 63  .    color: blac
70d0: 6b 3b 0a 20 20 20 20 70 61 64 64 69 6e 67 3a 20  k;.    padding: 
70e0: 34 70 78 3b 0a 7d 0a 0a 2e 43 6f 64 65 4d 69 72  4px;.}...CodeMir
70f0: 72 6f 72 20 7b 0a 20 20 20 20 66 6f 6e 74 2d 73  ror {.    font-s
7100: 69 7a 65 3a 20 31 32 70 78 3b 0a 20 20 20 20 77  ize: 12px;.    w
7110: 69 64 74 68 3a 20 31 30 30 25 3b 0a 20 20 20 20  idth: 100%;.    
7120: 70 61 64 64 69 6e 67 2d 6c 65 66 74 3a 20 34 70  padding-left: 4p
7130: 78 3b 0a 20 20 20 20 6c 69 6e 65 2d 68 65 69 67  x;.    line-heig
7140: 68 74 3a 20 31 3b 0a 20 20 20 20 62 61 63 6b 67  ht: 1;.    backg
7150: 72 6f 75 6e 64 3a 20 74 72 61 6e 73 70 61 72 65  round: transpare
7160: 6e 74 20 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 20  nt !important;. 
7170: 20 20 20 63 6f 6c 6f 72 3a 20 77 68 69 74 65 20     color: white 
7180: 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 20 20 20 20  !important;.    
7190: 66 6f 6e 74 2d 66 61 6d 69 6c 79 3a 20 27 52 6f  font-family: 'Ro
71a0: 62 6f 74 6f 20 4d 6f 6e 6f 27 2c 20 6d 6f 6e 6f  boto Mono', mono
71b0: 73 70 61 63 65 20 21 69 6d 70 6f 72 74 61 6e 74  space !important
71c0: 3b 0a 7d 0a 0a 2e 43 6f 64 65 4d 69 72 72 6f 72  ;.}...CodeMirror
71d0: 2d 76 73 63 72 6f 6c 6c 62 61 72 2c 20 2e 43 6f  -vscrollbar, .Co
71e0: 64 65 4d 69 72 72 6f 72 2d 68 73 63 72 6f 6c 6c  deMirror-hscroll
71f0: 62 61 72 20 7b 0a 20 20 20 20 6f 76 65 72 66 6c  bar {.    overfl
7200: 6f 77 2d 78 3a 20 68 69 64 64 65 6e 20 21 69 6d  ow-x: hidden !im
7210: 70 6f 72 74 61 6e 74 3b 0a 20 20 20 20 6f 76 65  portant;.    ove
7220: 72 66 6c 6f 77 2d 79 3a 20 68 69 64 64 65 6e 20  rflow-y: hidden 
7230: 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a 2e  !important;.}...
7240: 43 6f 64 65 4d 69 72 72 6f 72 2d 63 75 72 73 6f  CodeMirror-curso
7250: 72 20 7b 0a 20 20 62 6f 72 64 65 72 2d 6c 65 66  r {.  border-lef
7260: 74 3a 20 32 70 78 20 73 6f 6c 69 64 20 77 68 69  t: 2px solid whi
7270: 74 65 20 21 69 6d 70 6f 72 74 61 6e 74 3b 0a 7d  te !important;.}
7280: 0a 0a 2e 43 6f 64 65 4d 69 72 72 6f 72 20 70 72  ...CodeMirror pr
7290: 65 2c 0a 2e 43 6f 64 65 4d 69 72 72 6f 72 2d 6c  e,..CodeMirror-l
72a0: 69 6e 65 20 3e 20 73 70 61 6e 2c 0a 2e 43 6f 64  ine > span,..Cod
72b0: 65 4d 69 72 72 6f 72 2d 6c 69 6e 65 73 20 7b 0a  eMirror-lines {.
72c0: 20 20 70 61 64 64 69 6e 67 3a 20 30 20 21 69 6d    padding: 0 !im
72d0: 70 6f 72 74 61 6e 74 3b 0a 7d 0a 0a 0a 20 20 20  portant;.}...   
72e0: 20 20 20 20 20 3c 2f 73 74 79 6c 65 3e 0a 0a 20       </style>.. 
72f0: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 74         <script t
7300: 79 70 65 3d 22 72 69 6f 74 2f 74 61 67 22 20 73  ype="riot/tag" s
7310: 72 63 3d 22 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f  rc="/components/
7320: 62 69 74 72 68 79 74 68 6d 2e 74 61 67 22 3e 3c  bitrhythm.tag"><
7330: 2f 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20 20  /script>.       
7340: 20 3c 73 63 72 69 70 74 20 74 79 70 65 3d 22 72   <script type="r
7350: 69 6f 74 2f 74 61 67 22 20 73 72 63 3d 22 2f 63  iot/tag" src="/c
7360: 6f 6d 70 6f 6e 65 6e 74 73 2f 64 69 61 6c 2e 74  omponents/dial.t
7370: 61 67 22 3e 3c 2f 73 63 72 69 70 74 3e 0a 20 20  ag"></script>.  
7380: 20 20 20 20 20 20 3c 73 63 72 69 70 74 20 74 79        <script ty
7390: 70 65 3d 22 72 69 6f 74 2f 74 61 67 22 20 73 72  pe="riot/tag" sr
73a0: 63 3d 22 2f 63 6f 6d 70 6f 6e 65 6e 74 73 2f 73  c="/components/s
73b0: 61 6d 70 6c 65 2e 74 61 67 22 20 3e 3c 2f 73 63  ample.tag" ></sc
73c0: 72 69 70 74 3e 0a 20 20 20 20 20 20 20 20 3c 73  ript>.        <s
73d0: 63 72 69 70 74 20 74 79 70 65 3d 22 72 69 6f 74  cript type="riot
73e0: 2f 74 61 67 22 20 73 72 63 3d 22 2f 63 6f 6d 70  /tag" src="/comp
73f0: 6f 6e 65 6e 74 73 2f 6e 75 6d 62 65 72 2e 74 61  onents/number.ta
7400: 67 22 20 3e 3c 2f 73 63 72 69 70 74 3e 0a 0a 20  g" ></script>.. 
7410: 20 20 20 20 20 20 20 3c 73 63 72 69 70 74 3e 0a         <script>.
7420: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 6e 64              wind
7430: 6f 77 2e 67 6f 61 74 63 6f 75 6e 74 65 72 20 3d  ow.goatcounter =
7440: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7450: 20 20 20 70 61 74 68 3a 20 66 75 6e 63 74 69 6f     path: functio
7460: 6e 28 70 29 20 7b 20 72 65 74 75 72 6e 20 6c 6f  n(p) { return lo
7470: 63 61 74 69 6f 6e 2e 68 6f 73 74 20 2b 20 70 20  cation.host + p 
7480: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  }.            }.
7490: 20 20 20 20 20 20 20 20 3c 2f 73 63 72 69 70 74          </script
74a0: 3e 0a 09 20 20 20 20 3c 73 63 72 69 70 74 20 64  >..    <script d
74b0: 61 74 61 2d 67 6f 61 74 63 6f 75 6e 74 65 72 3d  ata-goatcounter=
74c0: 22 68 74 74 70 73 3a 2f 2f 61 6e 61 6c 79 74 69  "https://analyti
74d0: 63 73 2e 78 79 7a 7a 79 61 70 70 73 2e 6c 69 6e  cs.xyzzyapps.lin
74e0: 6b 2f 63 6f 75 6e 74 22 20 61 73 79 6e 63 20 73  k/count" async s
74f0: 72 63 3d 22 2f 2f 61 6e 61 6c 79 74 69 63 73 2e  rc="//analytics.
7500: 78 79 7a 7a 79 61 70 70 73 2e 6c 69 6e 6b 2f 63  xyzzyapps.link/c
7510: 6f 75 6e 74 2e 6a 73 22 3e 3c 2f 73 63 72 69 70  ount.js"></scrip
7520: 74 3e 0a 20 20 20 20 3c 2f 68 65 61 64 3e 0a 0a  t>.    </head>..
7530: 20 20 20 20 3c 62 6f 64 79 3e 0a 20 20 20 20 20      <body>.     
7540: 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d 22 63     <div class="c
7550: 6f 6e 74 61 69 6e 65 72 61 2d 66 75 6c 6c 22 3e  ontainera-full">
7560: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 68 73  .            <hs
7570: 74 61 63 6b 20 63 6c 61 73 73 3d 22 6d 62 2d 32  tack class="mb-2
7580: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ">.             
7590: 20 20 20 3c 68 35 20 63 6c 61 73 73 3d 22 6d 6c     <h5 class="ml
75a0: 2d 34 22 3e 3c 61 20 68 72 65 66 3d 22 2f 64 6f  -4"><a href="/do
75b0: 63 73 2f 69 6e 64 65 78 2e 68 74 6d 6c 22 20 74  cs/index.html" t
75c0: 61 72 67 65 74 3d 22 5f 62 6c 61 6e 6b 22 3e 44  arget="_blank">D
75d0: 6f 63 73 3c 2f 61 3e 3c 2f 68 35 3e 0a 20 20 20  ocs</a></h5>.   
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 68 35               <h5
75f0: 20 63 6c 61 73 73 3d 22 6d 6c 2d 34 22 3e 3c 61   class="ml-4"><a
7600: 20 74 61 72 67 65 74 3d 22 5f 62 6c 61 6e 6b 22   target="_blank"
7610: 20 68 72 65 66 3d 22 2f 69 73 73 75 65 22 3e 52   href="/issue">R
7620: 65 70 6f 72 74 20 62 75 67 73 20 2f 20 46 65 65  eport bugs / Fee
7630: 64 62 61 63 6b 3c 2f 61 3e 3c 2f 68 35 3e 0a 20  dback</a></h5>. 
7640: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 3c                 <
7650: 68 35 20 63 6c 61 73 73 3d 22 6d 6c 2d 34 22 3e  h5 class="ml-4">
7660: 3c 61 20 68 72 65 66 3d 22 2f 73 6f 6e 67 2f 58  <a href="/song/X
7670: 51 41 41 41 41 4c 48 43 77 41 41 41 41 41 41 41  QAAAALHCwAAAAAAA
7680: 41 42 44 4b 55 71 47 55 35 76 49 38 45 79 67 76  ABDKUqGU5vI8Eygv
7690: 38 56 4c 63 36 48 31 4e 46 49 7a 64 59 51 34 53  8VLc6H1NFIzdYQ4S
76a0: 6d 54 2d 37 39 42 54 4b 6f 73 48 36 58 6a 65 32  mT-79BTKosH6Xje2
76b0: 49 59 6e 4e 52 67 45 4f 70 65 75 68 67 39 45 6a  IYnNRgEOpeuhg9Ej
76c0: 39 49 7a 2d 5f 75 45 67 2d 6e 70 47 58 30 79 39  9Iz-_uEg-npGX0y9
76d0: 43 6d 7a 79 79 56 70 77 67 61 4f 55 72 4b 4e 6c  CmzyyVpwgaOUrKNl
76e0: 46 2d 70 7a 56 58 66 33 59 6d 73 6c 45 71 42 6c  F-pzVXf3YmslEqBl
76f0: 6f 52 59 30 4a 73 6c 4b 35 4b 61 70 65 53 46 53  oRY0JslK5KapeSFS
7700: 53 48 39 53 63 77 65 52 67 41 50 75 39 61 34 74  SH9ScweRgAPu9a4t
7710: 31 4c 30 2d 74 37 31 58 62 39 45 62 33 4b 4a 2d  1L0-t71Xb9Eb3KJ-
7720: 6c 65 7a 50 6f 37 78 63 6d 4b 39 78 43 6e 4e 47  lezPo7xcmK9xCnNG
7730: 6f 72 6d 5f 5f 6b 69 78 74 50 75 4d 5f 38 4c 33  orm__kixtPuM_8L3
7740: 59 4e 63 33 30 4f 41 33 47 4d 42 50 48 75 35 70  YNc30OA3GMBPHu5p
7750: 41 48 5f 5f 63 4b 6a 4c 46 36 6b 35 6d 43 47 4b  AH__cKjLF6k5mCGK
7760: 73 4e 70 38 57 46 57 59 51 41 43 63 6b 42 52 30  sNp8WFWYQACckBR0
7770: 33 56 61 5a 47 68 66 5a 76 39 34 36 4e 59 79 46  3VaZGhfZv946NYyF
7780: 51 6c 77 36 62 6f 58 51 75 56 69 73 32 39 32 55  Qlw6boXQuVis292U
7790: 55 62 6f 45 6b 61 43 4a 30 43 56 35 77 47 75 72  UboEkaCJ0CV5wGur
77a0: 62 4a 55 41 37 69 6c 32 75 58 2d 6f 6b 79 4d 53  bJUA7il2uX-okyMS
77b0: 6a 78 37 57 56 73 65 56 47 2d 7a 44 51 30 77 42  jx7WVseVG-zDQ0wB
77c0: 6a 62 4d 4c 4e 59 6e 58 7a 6f 54 30 6b 59 78 49  jbMLNYnXzoT0kYxI
77d0: 5f 36 2d 47 4f 41 4f 56 61 6d 4a 4a 48 54 72 6b  _6-GOAOVamJJHTrk
77e0: 75 6c 56 66 64 31 6b 30 41 67 7a 43 48 42 79 49  ulVfd1k0AgzCHByI
77f0: 36 7a 43 4e 74 57 79 42 61 33 69 5f 32 6b 73 34  6zCNtWyBa3i_2ks4
7800: 6e 63 4d 65 63 38 76 71 73 6a 41 79 38 42 68 77  ncMec8vqsjAy8Bhw
7810: 46 41 62 4b 41 50 31 52 44 4b 68 37 4d 55 78 77  FAbKAP1RDKh7MUxw
7820: 73 65 63 42 75 7a 79 4c 52 30 68 4b 47 64 64 69  secBuzyLR0hKGddi
7830: 76 5a 6d 50 6e 2d 78 79 59 42 2d 70 38 2d 58 72  vZmPn-xyYB-p8-Xr
7840: 75 5f 4d 69 6e 32 2d 33 5a 5f 33 59 5a 61 6c 32  u_Min2-3Z_3YZal2
7850: 5f 77 76 38 73 36 63 49 63 71 50 41 4a 34 77 66  _wv8s6cIcqPAJ4wf
7860: 35 44 48 32 39 55 37 6c 65 2d 65 52 4c 63 55 4e  5DH29U7le-eRLcUN
7870: 36 6c 68 4b 37 37 36 35 31 5f 78 65 55 2d 2d 7a  6lhK77651_xeU--z
7880: 37 41 36 45 33 4e 44 51 36 57 45 62 36 55 50 63  7A6E3NDQ6WEb6UPc
7890: 2d 62 72 78 54 7a 2d 4c 2d 77 5a 77 46 77 79 39  -brxTz-L-wZwFwy9
78a0: 35 51 6b 77 41 5a 77 34 62 57 52 32 4c 4e 57 37  5QkwAZw4bWR2LNW7
78b0: 38 44 56 64 43 53 6e 4d 43 38 7a 66 2d 44 56 57  8DVdCSnMC8zf-DVW
78c0: 67 46 6b 4b 50 39 53 55 39 69 47 51 6a 36 79 6b  gFkKP9SU9iGQj6yk
78d0: 36 45 38 71 42 41 6c 5a 66 64 33 59 61 76 74 68  6E8qBAlZfd3Yavth
78e0: 5a 42 64 77 68 73 32 6d 74 7a 73 76 49 4c 38 71  ZBdwhs2mtzsvIL8q
78f0: 63 42 54 42 52 68 79 32 46 78 78 35 6e 35 74 4c  cBTBRhy2Fxx5n5tL
7900: 71 32 6c 58 75 50 6b 48 31 39 2d 63 71 49 6f 4a  q2lXuPkH19-cqIoJ
7910: 43 48 4a 55 6a 69 75 47 4b 57 68 33 50 71 4f 41  CHJUjiuGKWh3PqOA
7920: 6e 54 6a 39 6e 32 50 65 6a 76 4e 6c 70 31 47 55  nTj9n2PejvNlp1GU
7930: 4d 4d 69 78 52 37 59 4d 55 6f 66 63 4c 65 41 35  MMixR7YMUofcLeA5
7940: 6f 51 43 51 70 4d 53 75 49 45 50 38 73 55 73 68  oQCQpMSuIEP8sUsh
7950: 74 6b 33 7a 59 33 35 76 47 34 78 72 33 46 66 50  tk3zY35vG4xr3FfP
7960: 6a 37 4f 5a 69 4f 51 78 35 6a 52 74 4d 61 77 37  j7OZiOQx5jRtMaw7
7970: 6c 38 78 71 46 56 6d 5f 50 5a 2d 6b 45 67 78 6f  l8xqFVm_PZ-kEgxo
7980: 49 56 46 74 70 5a 46 63 67 73 41 43 6e 75 42 65  IVFtpZFcgsACnuBe
7990: 4a 46 31 79 5a 32 73 73 31 47 4e 39 35 58 45 74  JF1yZ2ss1GN95XEt
79a0: 39 42 73 46 33 55 59 5f 55 4d 31 78 38 65 50 67  9BsF3UY_UM1x8ePg
79b0: 59 38 42 4c 34 57 48 37 42 63 48 5a 52 43 4f 56  Y8BL4WH7BcHZRCOV
79c0: 32 59 5a 65 52 58 5a 36 73 59 4c 4e 6a 4b 42 6a  2YZeRXZ6sYLNjKBj
79d0: 47 56 44 5f 46 41 52 5f 5a 4c 36 79 64 36 6c 5f  GVD_FAR_ZL6yd6l_
79e0: 31 77 71 70 51 4a 50 62 33 6c 4c 31 66 68 42 65  1wqpQJPb3lL1fhBe
79f0: 63 4e 54 63 61 58 41 6e 36 31 52 68 79 53 4f 76  cNTcaXAn61RhySOv
7a00: 6f 6b 41 4a 35 54 63 72 54 74 71 64 68 73 47 45  okAJ5TcrTtqdhsGE
7a10: 42 55 6e 61 51 4f 47 52 49 66 4b 55 30 4e 56 34  BUnaQOGRIfKU0NV4
7a20: 7a 50 6d 67 54 6d 39 54 4c 41 53 7a 35 67 73 31  zPmgTm9TLASz5gs1
7a30: 56 52 6f 55 5a 30 36 68 74 57 69 72 66 4e 66 6a  VRoUZ06htWirfNfj
7a40: 69 57 4e 72 62 77 38 49 39 67 67 6f 38 4b 4d 4b  iWNrbw8I9ggo8KMK
7a50: 77 44 5a 32 76 34 43 6e 66 71 79 4c 34 65 43 70  wDZ2v4CnfqyL4eCp
7a60: 46 4e 5a 6a 56 49 59 4f 45 57 47 47 6b 74 4c 41  FNZjVIYOEWGGktLA
7a70: 61 64 61 66 51 6a 64 6a 4f 6b 57 48 57 46 38 4b  adafQjdjOkWHWF8K
7a80: 49 64 72 33 75 50 42 74 31 6b 58 59 5f 2d 49 45  Idr3uPBt1kXY_-IE
7a90: 6b 6e 31 31 67 6a 6d 6e 31 71 39 79 62 67 4d 4c  kn11gjmn1q9ybgML
7aa0: 78 72 69 7a 37 6b 57 71 7a 79 61 77 41 45 70 71  xriz7kWqzyawAEpq
7ab0: 4d 32 37 77 7a 49 77 45 54 32 73 6d 7a 62 4a 2d  M27wzIwET2smzbJ-
7ac0: 7a 48 63 78 30 31 72 64 48 75 33 41 71 4c 4d 48  zHcx01rdHu3AqLMH
7ad0: 6b 2d 41 6c 69 51 4c 47 76 47 6b 6e 6c 75 4a 4e  k-AliQLGvGknluJN
7ae0: 6a 57 6d 4b 2d 57 46 77 5a 55 52 38 5a 6f 6b 4a  jWmK-WFwZUR8ZokJ
7af0: 36 63 56 59 57 37 30 61 36 58 31 64 59 57 6e 63  6cVYW70a6X1dYWnc
7b00: 51 73 50 77 79 43 33 41 4f 70 6c 44 79 55 43 68  QsPwyC3AOplDyUCh
7b10: 6c 43 5f 52 6d 67 76 7a 39 66 71 65 4d 73 2d 66  lC_Rmgvz9fqeMs-f
7b20: 58 75 62 30 6f 64 72 30 31 62 37 50 46 72 72 61  Xub0odr01b7PFrra
7b30: 4c 57 4a 30 32 58 6b 37 74 72 56 71 5f 47 71 68  LWJ02Xk7trVq_Gqh
7b40: 38 56 32 41 32 4c 41 54 55 4b 65 77 4a 54 30 35  8V2A2LATUKewJT05
7b50: 64 47 30 62 56 4a 54 42 64 4d 39 6e 38 36 43 2d  dG0bVJTBdM9n86C-
7b60: 6d 67 79 4c 66 37 73 37 4a 65 4e 66 39 75 6c 39  mgyLf7s7JeNf9ul9
7b70: 37 43 73 53 33 42 61 6c 4e 5a 2d 2d 4e 30 68 66  7CsS3BalNZ--N0hf
7b80: 6b 50 62 54 5f 56 50 55 39 68 65 46 6b 6f 39 67  kPbT_VPU9heFko9g
7b90: 6f 47 5f 6d 6b 46 37 4b 79 36 46 62 74 56 70 45  oG_mkF7Ky6FbtVpE
7ba0: 52 43 71 77 37 55 62 76 50 67 64 46 64 49 4f 45  RCqw7UbvPgdFdIOE
7bb0: 6b 6f 71 50 59 45 77 41 6d 6a 77 7a 76 61 32 55  koqPYEwAmjwzva2U
7bc0: 2d 37 63 4c 6f 33 67 33 75 45 51 71 31 4e 42 56  -7cLo3g3uEQq1NBV
7bd0: 33 43 38 4c 69 6a 50 31 30 2d 31 41 76 71 75 32  3C8LijP10-1Avqu2
7be0: 64 66 5f 52 38 58 74 79 6b 4f 6b 34 48 38 79 69  df_R8XtykOk4H8yi
7bf0: 74 79 6c 63 78 6b 61 34 76 53 71 31 4a 6f 32 66  tylcxka4vSq1Jo2f
7c00: 76 2d 77 70 37 34 45 69 4a 69 36 54 6e 36 54 33  v-wp74EiJi6Tn6T3
7c10: 65 70 5a 4a 59 58 41 4d 42 52 58 52 78 6f 7a 79  epZJYXAMBRXRxozy
7c20: 6c 31 72 34 6c 62 4f 71 52 6a 44 66 71 6a 57 52  l1r4lbOqRjDfqjWR
7c30: 54 52 72 72 38 6c 39 55 32 69 4b 62 41 69 49 7a  TRrr8l9U2iKbAiIz
7c40: 36 53 73 79 37 34 49 63 39 73 51 41 42 52 39 46  6Ssy74Ic9sQABR9F
7c50: 34 55 61 68 77 73 44 51 75 4a 67 6a 4f 48 4b 64  4UahwsDQuJgjOHKd
7c60: 61 4c 58 6d 42 48 6f 50 75 44 37 6e 58 5f 39 6d  aLXmBHoPuD7nX_9m
7c70: 4d 59 56 22 3e 45 78 61 6d 70 6c 65 31 3c 2f 61  MYV">Example1</a
7c80: 3e 3c 2f 68 35 3e 0a 20 20 20 20 20 20 20 20 20  ></h5>.         
7c90: 20 20 20 20 20 20 20 3c 68 35 20 63 6c 61 73 73         <h5 class
7ca0: 3d 22 6d 6c 2d 34 22 3e 3c 61 20 68 72 65 66 3d  ="ml-4"><a href=
7cb0: 22 2f 73 6f 6e 67 2f 58 51 41 41 41 41 4c 59 45  "/song/XQAAAALYE
7cc0: 77 41 41 41 41 41 41 41 41 42 44 4b 55 71 47 55  wAAAAAAAABDKUqGU
7cd0: 35 76 49 38 45 79 67 76 38 56 4c 63 36 48 31 4e  5vI8Eygv8VLc6H1N
7ce0: 46 49 7a 64 59 51 65 35 6d 54 2d 37 39 42 54 4b  FIzdYQe5mT-79BTK
7cf0: 6f 73 48 36 58 6a 65 32 49 59 6e 4e 52 67 45 4f  osH6Xje2IYnNRgEO
7d00: 70 65 75 68 67 39 4e 54 66 49 54 2d 5f 75 45 67  peuhg9NTfIT-_uEg
7d10: 2d 6e 70 47 58 30 79 39 43 6d 7a 79 79 56 70 77  -npGX0y9CmzyyVpw
7d20: 67 61 4f 55 72 4b 4e 6c 46 2d 70 7a 56 58 66 33  gaOUrKNlF-pzVXf3
7d30: 59 6e 51 32 67 53 66 70 7a 59 33 7a 6c 59 4c 75  YnQ2gSfpzY3zlYLu
7d40: 6a 61 76 51 52 71 37 33 68 53 45 4d 2d 52 61 47  javQRq73hSEM-RaG
7d50: 78 54 78 75 75 64 39 6e 61 6f 6b 39 72 4d 70 59  xTxuud9naok9rMpY
7d60: 6e 2d 55 43 61 4e 69 46 32 7a 72 6e 6e 71 55 42  n-UCaNiF2zrnnqUB
7d70: 36 31 73 5f 32 32 70 59 4f 45 5f 39 4b 75 46 6f  61s_22pYOE_9KuFo
7d80: 37 76 45 4a 4d 43 74 55 32 62 6b 78 79 4e 64 67  7vEJMCtU2bkxyNdg
7d90: 53 58 7a 77 6d 49 44 75 6f 38 4f 79 78 63 49 68  SXzwmIDuo8OyxcIh
7da0: 39 48 51 50 35 39 55 5a 62 4e 52 69 78 6c 42 6e  9HQP59UZbNRixlBn
7db0: 6d 77 37 33 50 6e 79 77 53 35 44 4a 42 6f 48 38  mw73PnywS5DJBoH8
7dc0: 4e 45 49 41 6e 6c 4c 70 4c 34 72 71 61 6f 6b 66  NEIAnlLpL4rqaokf
7dd0: 4e 39 43 66 74 65 30 49 64 33 39 32 39 6e 32 36  N9Cfte0Id3929n26
7de0: 49 6a 41 37 7a 56 5a 46 37 35 6f 76 58 33 37 4b  IjA7zVZF75ovX37K
7df0: 4f 31 78 54 39 69 42 61 38 67 74 2d 77 38 63 76  O1xT9iBa8gt-w8cv
7e00: 59 42 64 49 64 56 4c 35 4a 55 4f 72 62 66 30 63  YBdIdVL5JUOrbf0c
7e10: 63 56 4a 53 6f 58 47 46 6f 4d 30 55 34 47 58 6f  cVJSoXGFoM0U4GXo
7e20: 45 44 54 68 77 30 30 46 64 4b 6e 66 73 71 31 57  EDThw00FdKnfsq1W
7e30: 65 4a 6a 45 51 74 34 51 6e 38 66 39 30 54 6b 6b  eJjEQt4Qn8f90Tkk
7e40: 51 67 6b 70 53 61 6a 52 39 64 41 30 41 4a 42 71  QgkpSajR9dA0AJBq
7e50: 4b 44 75 56 65 45 67 44 6f 46 73 62 56 49 2d 5a  KDuVeEgDoFsbVI-Z
7e60: 5a 56 76 4a 57 32 64 44 5f 39 47 49 6d 35 50 70  ZVvJW2dD_9GIm5Pp
7e70: 51 53 54 7a 70 75 42 73 6c 7a 44 37 5a 4a 51 53  QSTzpuBslzD7ZJQS
7e80: 49 33 58 41 31 67 32 46 5f 51 50 34 77 36 55 34  I3XA1g2F_QP4w6U4
7e90: 72 4f 72 54 4d 5a 55 51 53 72 5f 5f 5f 73 32 32  rOrTMZUQSr___s22
7ea0: 64 38 50 6c 70 30 46 62 66 66 44 43 71 38 64 72  d8Plp0FbffDCq8dr
7eb0: 69 30 43 38 6b 55 59 50 71 53 5f 6e 70 5f 4e 6e  i0C8kUYPqS_np_Nn
7ec0: 72 37 73 44 59 39 4b 73 78 67 4e 5a 4a 6d 55 78  r7sDY9KsxgNZJmUx
7ed0: 59 6b 74 31 58 42 54 4f 33 69 57 6d 52 36 52 5a  Ykt1XBTO3iWmR6RZ
7ee0: 37 4f 46 6b 36 50 5a 38 52 34 34 4e 58 77 68 76  7OFk6PZ8R44NXwhv
7ef0: 78 62 55 45 69 6b 4d 6f 62 6f 50 53 57 31 58 50  xbUEikMoboPSW1XP
7f00: 69 56 34 78 74 43 66 5a 62 34 71 45 34 79 43 50  iV4xtCfZb4qE4yCP
7f10: 32 78 48 50 6c 45 6e 69 55 68 63 4e 72 57 63 35  2xHPlEniUhcNrWc5
7f20: 36 30 38 68 72 4e 6b 56 66 70 51 55 6d 59 4c 46  608hrNkVfpQUmYLF
7f30: 76 58 46 54 79 55 48 41 34 61 4f 6b 52 44 6f 48  vXFTyUHA4aOkRDoH
7f40: 66 30 6a 48 77 47 7a 79 42 56 2d 59 61 6e 50 36  f0jHwGzyBV-YanP6
7f50: 35 59 6c 5a 70 75 70 5a 43 34 6f 57 33 62 6a 68  5YlZpupZC4oW3bjh
7f60: 4f 30 31 74 66 68 5f 71 59 57 4e 41 5f 5a 70 44  O01tfh_qYWNA_ZpD
7f70: 56 43 43 58 52 6f 47 5a 4a 66 72 42 6a 6b 6d 61  VCCXRoGZJfrBjkma
7f80: 59 6f 6d 39 47 64 36 6d 76 47 56 7a 69 6c 6c 62  Yom9Gd6mvGVzillb
7f90: 6b 36 4c 44 30 5f 41 6d 75 5f 5a 75 62 6c 62 34  k6LD0_Amu_Zublb4
7fa0: 5f 41 5a 31 53 41 78 4b 53 57 6c 4d 66 62 6d 62  _AZ1SAxKSWlMfbmb
7fb0: 58 51 66 57 31 36 52 53 4d 69 64 74 6d 54 43 4b  XQfW16RSMidtmTCK
7fc0: 41 4d 6d 46 39 4c 43 4f 4e 4b 63 6a 54 52 5f 31  AMmF9LCONKcjTR_1
7fd0: 50 32 76 55 33 66 50 52 37 68 42 68 52 74 62 74  P2vU3fPR7hBhRtbt
7fe0: 4e 52 30 78 4e 45 66 52 73 74 58 4a 38 31 5a 63  NR0xNEfRstXJ81Zc
7ff0: 79 43 35 59 54 4b 38 64 6e 70 4d 77 4d 58 4b 6b  yC5YTK8dnpMwMXKk
8000: 35 75 6f 61 42 4d 44 62 6f 63 68 62 41 4b 58 61  5uoaBMDbochbAKXa
8010: 73 77 67 5a 4b 49 6e 32 75 73 79 69 35 5a 34 70  swgZKIn2usyi5Z4p
8020: 79 51 66 38 78 43 53 68 65 51 61 77 79 59 53 41  yQf8xCSheQawyYSA
8030: 30 33 31 5a 48 41 33 77 52 75 71 5f 37 72 6a 68  031ZHA3wRuq_7rjh
8040: 6e 30 62 58 5a 72 45 47 6e 42 30 51 46 7a 78 67  n0bXZrEGnB0QFzxg
8050: 4d 2d 64 59 73 59 37 43 55 6f 6a 4b 72 38 7a 69  M-dYsY7CUojKr8zi
8060: 5a 47 58 47 62 39 7a 6f 56 48 76 47 44 49 30 53  ZGXGb9zoVHvGDI0S
8070: 49 46 79 46 49 72 4d 73 36 6b 45 7a 70 5a 41 71  IFyFIrMs6kEzpZAq
8080: 5f 43 6e 4a 79 71 4a 69 34 6e 62 62 71 66 6f 48  _CnJyqJi4nbbqfoH
8090: 6c 45 33 6e 44 79 4c 4e 4b 46 6b 31 65 34 4f 48  lE3nDyLNKFk1e4OH
80a0: 71 50 73 55 39 47 31 4c 52 4e 6e 48 42 77 53 6a  qPsU9G1LRNnHBwSj
80b0: 69 4a 43 6e 76 5a 4f 5f 78 76 5f 56 51 62 74 57  iJCnvZO_xv_VQbtW
80c0: 6d 51 77 4c 72 54 37 6a 36 50 5a 65 58 76 4e 4f  mQwLrT7j6PZeXvNO
80d0: 7a 2d 79 4b 57 51 46 63 45 2d 30 52 58 6e 36 2d  z-yKWQFcE-0RXn6-
80e0: 45 75 71 54 37 4c 4e 54 46 31 47 53 6f 32 6f 39  EuqT7LNTF1GSo2o9
80f0: 41 46 53 35 5a 32 50 4a 71 49 58 69 6f 44 39 65  AFS5Z2PJqIXioD9e
8100: 62 72 39 78 6a 46 58 4e 72 66 54 64 49 65 33 32  br9xjFXNrfTdIe32
8110: 64 67 63 67 51 48 56 48 4e 79 6a 45 49 48 32 32  dgcgQHVHNyjEIH22
8120: 41 41 42 55 51 57 59 74 48 52 76 5a 51 70 63 66  AABUQWYtHRvZQpcf
8130: 73 55 6a 4a 51 4d 31 34 30 4d 4a 38 6e 6d 70 6a  sUjJQM140MJ8nmpj
8140: 6d 78 6c 68 74 41 4d 45 73 74 50 7a 62 47 59 55  mxlhtAMEstPzbGYU
8150: 4b 5a 64 6a 68 46 31 4c 6b 65 65 50 78 58 44 34  KZdjhF1LkeePxXD4
8160: 36 7a 6e 69 4e 39 63 46 45 74 52 50 54 4e 52 39  6zniN9cFEtRPTNR9
8170: 6c 75 50 34 57 32 72 68 66 48 6e 76 50 34 5f 74  luP4W2rhfHnvP4_t
8180: 52 41 69 70 6d 51 69 42 5f 36 52 53 52 76 4c 61  RAipmQiB_6RSRvLa
8190: 69 56 59 66 6b 59 59 58 64 7a 4d 6b 58 5f 4d 35  iVYfkYYXdzMkX_M5
81a0: 62 6c 66 77 43 4b 51 2d 44 79 44 46 79 30 68 54  blfwCKQ-DyDFy0hT
81b0: 77 33 6d 59 5a 2d 53 62 59 54 31 31 52 56 4f 2d  w3mYZ-SbYT11RVO-
81c0: 35 64 45 6d 5f 59 6e 74 59 6d 67 51 4f 49 31 46  5dEm_YntYmgQOI1F
81d0: 49 37 41 68 4d 78 70 6d 79 45 32 37 4c 77 62 37  I7AhMxpmyE27Lwb7
81e0: 33 6f 44 4f 30 53 65 53 2d 53 44 6a 34 54 36 6e  3oDO0SeS-SDj4T6n
81f0: 62 66 6c 74 66 48 64 57 44 50 46 61 65 55 57 64  bfltfHdWDPFaeUWd
8200: 31 32 4b 52 6d 49 2d 45 38 41 51 43 63 6e 6d 4a  12KRmI-E8AQCcnmJ
8210: 61 79 6f 42 6e 4d 58 79 58 4e 77 33 6d 75 58 30  ayoBnMXyXNw3muX0
8220: 33 31 39 57 68 75 69 74 54 74 61 62 33 6e 33 76  319WhuitTtab3n3v
8230: 77 5a 4d 31 65 37 6b 75 31 31 71 31 72 4e 6f 61  wZM1e7ku11q1rNoa
8240: 41 33 56 58 4c 62 42 4a 64 79 53 31 56 78 76 64  A3VXLbBJdyS1Vxvd
8250: 76 6d 38 54 6c 65 64 35 36 53 35 34 73 69 4f 73  vm8Tled56S54siOs
8260: 45 59 47 52 71 6d 64 69 43 33 67 4f 32 5a 47 61  EYGRqmdiC3gO2ZGa
8270: 42 71 36 38 53 4a 5a 39 7a 78 65 39 79 74 74 4e  Bq68SJZ9zxe9yttN
8280: 46 45 58 46 46 67 57 59 46 6e 49 6e 5f 45 4d 53  FEXFFgWYFnIn_EMS
8290: 54 4e 6a 31 49 4c 42 30 77 6b 4f 51 50 7a 73 6a  TNj1ILB0wkOQPzsj
82a0: 46 58 45 45 61 33 57 36 65 73 58 54 75 6a 46 75  FXEEa3W6esXTujFu
82b0: 6f 48 4b 30 35 71 34 72 72 66 59 69 63 4b 5a 6b  oHK05q4rrfYicKZk
82c0: 71 30 31 68 66 61 6f 5a 63 6f 76 49 62 44 46 4e  q01hfaoZcovIbDFN
82d0: 79 47 74 70 67 45 7a 6e 2d 42 46 50 4a 58 4b 57  yGtpgEzn-BFPJXKW
82e0: 77 71 6e 35 67 6b 67 72 76 5a 69 59 78 56 78 47  wqn5gkgrvZiYxVxG
82f0: 37 61 34 34 39 47 6a 6a 5f 52 32 48 71 4e 62 62  7a449Gjj_R2HqNbb
8300: 69 54 6d 64 31 6c 61 30 4d 4b 44 6e 56 4c 57 76  iTmd1la0MKDnVLWv
8310: 39 79 58 58 52 64 52 4c 51 72 4b 43 34 5a 32 6b  9yXXRdRLQrKC4Z2k
8320: 41 4a 49 4f 64 77 78 6c 75 6b 36 66 52 42 46 7a  AJIOdwxluk6fRBFz
8330: 52 57 54 5f 6f 30 34 36 79 6a 4d 2d 6e 76 67 70  RWT_o046yjM-nvgp
8340: 33 4b 4c 4a 55 2d 6e 5f 43 57 75 33 6d 67 66 6d  3KLJU-n_CWu3mgfm
8350: 51 69 35 76 43 62 4e 78 52 63 7a 45 65 79 61 4a  Qi5vCbNxRczEeyaJ
8360: 47 67 33 44 4a 4c 2d 61 6e 78 58 6b 30 41 32 43  Gg3DJL-anxXk0A2C
8370: 46 73 46 43 58 52 4c 63 63 6d 68 48 56 37 4d 6a  FsFCXRLccmhHV7Mj
8380: 51 64 68 34 73 64 76 6e 76 6c 33 4a 4f 31 59 70  Qdh4sdvnvl3JO1Yp
8390: 74 31 5f 6e 73 42 58 51 4a 71 58 76 61 68 77 6b  t1_nsBXQJqXvahwk
83a0: 6a 70 45 43 35 6a 7a 64 75 76 54 64 30 72 49 48  jpEC5jzduvTd0rIH
83b0: 67 44 42 41 7a 4f 33 50 41 37 59 4e 6a 57 46 5f  gDBAzO3PA7YNjWF_
83c0: 72 31 45 6d 61 67 74 73 42 5f 31 56 46 53 52 71  r1EmagtsB_1VFSRq
83d0: 41 51 64 58 6a 62 45 65 70 38 53 4c 4b 4e 71 76  AQdXjbEep8SLKNqv
83e0: 38 4e 37 49 4c 6b 69 78 32 4e 65 54 4d 33 30 72  8N7ILkix2NeTM30r
83f0: 39 78 79 58 74 58 63 47 4f 4f 6d 6f 51 4b 34 41  9xyXtXcGOOmoQK4A
8400: 4d 6b 31 74 48 42 6d 51 34 6d 36 59 59 4e 61 6c  Mk1tHBmQ4m6YYNal
8410: 57 58 4a 5f 61 47 49 6a 64 42 67 78 34 6a 67 73  WXJ_aGIjdBgx4jgs
8420: 52 59 6a 57 70 31 48 39 71 52 72 30 77 4d 6b 6d  RYjWp1H9qRr0wMkm
8430: 47 37 35 7a 4f 53 62 75 4f 79 5f 6c 67 35 2d 43  G75zOSbuOy_lg5-C
8440: 2d 78 62 73 7a 76 70 37 42 35 59 45 4c 5a 62 6c  -xbszvp7B5YELZbl
8450: 70 6a 6e 70 58 43 57 38 41 68 58 4d 57 43 4c 4d  pjnpXCW8AhXMWCLM
8460: 5f 69 47 31 36 6c 6b 67 77 32 34 5a 34 30 56 57  _iG16lkgw24Z40VW
8470: 68 34 51 39 44 43 58 6f 4d 67 5a 6d 4f 58 6d 2d  h4Q9DCXoMgZmOXm-
8480: 39 38 57 69 64 45 46 66 6b 4d 50 5f 38 4c 37 73  98WidEFfkMP_8L7s
8490: 64 51 6a 57 52 78 4d 41 6f 64 6b 4c 68 55 6b 48  dQjWRxMAodkLhUkH
84a0: 6e 73 42 52 6c 59 4e 43 68 6d 41 65 78 4e 76 7a  nsBRlYNChmAexNvz
84b0: 4b 57 33 78 69 69 44 68 43 5f 6b 36 71 4b 52 66  KW3xiiDhC_k6qKRf
84c0: 6c 64 56 67 43 47 53 42 46 66 70 6c 64 4a 46 5f  ldVgCGSBFfpldJF_
84d0: 38 65 37 45 79 51 22 3e 45 78 61 6d 70 6c 65 32  8e7EyQ">Example2
84e0: 3c 2f 61 3e 3c 2f 68 35 3e 0a 20 20 20 20 20 20  </a></h5>.      
84f0: 20 20 20 20 20 20 20 20 20 20 3c 68 35 20 63 6c            <h5 cl
8500: 61 73 73 3d 22 6d 6c 2d 34 22 3e 3c 61 20 68 72  ass="ml-4"><a hr
8510: 65 66 3d 22 2f 64 6f 63 73 2f 64 65 6d 6f 2e 68  ef="/docs/demo.h
8520: 74 6d 6c 22 3e 53 65 65 20 44 65 6d 6f 20 53 6f  tml">See Demo So
8530: 6e 67 20 2f 2f 20 54 65 63 68 6e 6f 3c 2f 61 3e  ng // Techno</a>
8540: 3c 2f 68 35 3e 0a 20 20 20 20 20 20 20 20 20 20  </h5>.          
8550: 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 0a 20 20 20    </hstack>..   
8560: 20 20 20 20 20 20 20 20 20 3c 62 69 74 72 68 79           <bitrhy
8570: 74 68 6d 20 73 6f 6e 67 3d 22 7b 7b 64 61 74 61  thm song="{{data
8580: 7d 7d 22 3e 3c 2f 62 69 74 72 68 79 74 68 6d 3e  }}"></bitrhythm>
8590: 0a 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a  .        </div>.
85a0: 0a 20 20 20 20 3c 73 63 72 69 70 74 3e 0a 20 20  .    <script>.  
85b0: 20 20 20 20 20 20 72 69 6f 74 2e 63 6f 6d 70 69        riot.compi
85c0: 6c 65 28 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a  le(function() {.
85d0: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
85e0: 62 69 74 72 68 79 74 68 6d 20 3d 20 72 69 6f 74  bitrhythm = riot
85f0: 2e 6d 6f 75 6e 74 28 27 62 69 74 72 68 79 74 68  .mount('bitrhyth
8600: 6d 27 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  m');.           
8610: 20 77 69 6e 64 6f 77 2e 62 69 74 72 68 79 74 68   window.bitrhyth
8620: 6d 20 3d 20 62 69 74 72 68 79 74 68 6d 5b 30 5d  m = bitrhythm[0]
8630: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ;.            va
8640: 72 20 64 69 61 6c 20 3d 20 72 69 6f 74 2e 6d 6f  r dial = riot.mo
8650: 75 6e 74 28 27 64 69 61 6c 27 29 3b 0a 20 20 20  unt('dial');.   
8660: 20 20 20 20 20 20 20 20 20 76 61 72 20 6e 75 6d           var num
8670: 62 65 72 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74  ber = riot.mount
8680: 28 27 6e 75 6d 62 65 72 27 29 3b 0a 20 20 20 20  ('number');.    
8690: 20 20 20 20 20 20 20 20 76 61 72 20 73 61 6d 70          var samp
86a0: 6c 65 20 3d 20 72 69 6f 74 2e 6d 6f 75 6e 74 28  le = riot.mount(
86b0: 27 73 61 6d 70 6c 65 27 29 3b 0a 20 20 20 20 20  'sample');.     
86c0: 20 20 20 7d 29 0a 20 20 20 20 3c 2f 73 63 72 69     }).    </scri
86d0: 70 74 3e 0a 0a 0a 20 20 20 20 3c 2f 62 6f 64 79  pt>...    </body
86e0: 3e 0a 0a 3c 2f 68 74 6d 6c 3e 0a 0a 22 22 22 0a  >..</html>..""".
86f0: 0a 66 72 6f 6d 20 6d 61 6b 6f 2e 74 65 6d 70 6c  .from mako.templ
8700: 61 74 65 20 69 6d 70 6f 72 74 20 54 65 6d 70 6c  ate import Templ
8710: 61 74 65 0a 69 6d 70 6f 72 74 20 63 6f 6d 6d 6f  ate.import commo
8720: 6e 0a 63 6f 64 65 20 3d 20 54 65 6d 70 6c 61 74  n.code = Templat
8730: 65 28 69 6e 64 65 78 29 2e 72 65 6e 64 65 72 28  e(index).render(
8740: 63 6f 6d 6d 6f 6e 5f 73 63 72 69 70 74 73 3d 63  common_scripts=c
8750: 6f 6d 6d 6f 6e 2e 65 78 74 65 72 6e 61 6c 5f 6c  ommon.external_l
8760: 69 62 72 61 72 69 65 73 29 0a 0a 69 66 20 44 45  ibraries)..if DE
8770: 56 20 3d 3d 20 22 31 22 3a 0a 20 20 20 20 66 6f  V == "1":.    fo
8780: 72 5f 64 6f 63 73 20 3d 20 22 22 22 0a 23 23 20  r_docs = """.## 
8790: 49 6e 64 65 78 0a 0a 60 60 60 7b 63 6f 64 65 2d  Index..```{code-
87a0: 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a  block} html.---.
87b0: 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a  force: true.---.
87c0: 25 73 0a 60 60 60 0a 20 20 20 20 22 22 22 0a 20  %s.```.    """. 
87d0: 20 20 20 63 6f 67 2e 6f 75 74 28 66 6f 72 5f 64     cog.out(for_d
87e0: 6f 63 73 20 25 20 28 69 6e 64 65 78 2c 29 29 0a  ocs % (index,)).
87f0: 0a 6f 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 74  .os.system("rm t
8800: 65 6d 70 6c 61 74 65 73 2f 69 6e 64 65 78 2e 68  emplates/index.h
8810: 74 6d 6c 22 29 0a 66 20 3d 20 6f 70 65 6e 28 22  tml").f = open("
8820: 74 65 6d 70 6c 61 74 65 73 2f 69 6e 64 65 78 2e  templates/index.
8830: 68 74 6d 6c 22 2c 20 22 77 22 29 0a 66 2e 77 72  html", "w").f.wr
8840: 69 74 65 28 63 6f 64 65 29 0a 66 2e 63 6c 6f 73  ite(code).f.clos
8850: 65 28 29 0a 40 3e 0a 40 40 0a 0a 0a 40 3c 0a 69  e().@>.@@...@<.i
8860: 6d 70 6f 72 74 20 63 6f 67 0a 69 6d 70 6f 72 74  mport cog.import
8870: 20 6f 73 0a 0a 70 61 67 65 20 3d 20 22 22 22 0a   os..page = """.
8880: 3c 21 44 4f 43 54 59 50 45 20 68 74 6d 6c 3e 0a  <!DOCTYPE html>.
8890: 3c 68 74 6d 6c 20 6c 61 6e 67 3d 22 65 6e 22 3e  <html lang="en">
88a0: 0a 20 20 20 20 3c 68 65 61 64 3e 0a 20 20 20 20  .    <head>.    
88b0: 20 20 20 20 3c 6d 65 74 61 20 63 68 61 72 73 65      <meta charse
88c0: 74 3d 22 75 74 66 2d 38 22 3e 0a 20 20 20 20 20  t="utf-8">.     
88d0: 20 20 20 3c 6d 65 74 61 20 6e 61 6d 65 3d 22 76     <meta name="v
88e0: 69 65 77 70 6f 72 74 22 20 63 6f 6e 74 65 6e 74  iewport" content
88f0: 3d 22 77 69 64 74 68 3d 64 65 76 69 63 65 2d 77  ="width=device-w
8900: 69 64 74 68 2c 20 69 6e 69 74 69 61 6c 2d 73 63  idth, initial-sc
8910: 61 6c 65 3d 31 22 3e 0a 20 20 20 20 20 20 20 20  ale=1">.        
8920: 3c 6d 65 74 61 20 68 74 74 70 2d 65 71 75 69 76  <meta http-equiv
8930: 3d 22 43 61 63 68 65 2d 43 6f 6e 74 72 6f 6c 22  ="Cache-Control"
8940: 20 63 6f 6e 74 65 6e 74 3d 22 6e 6f 2d 63 61 63   content="no-cac
8950: 68 65 2c 20 6e 6f 2d 73 74 6f 72 65 2c 20 6d 75  he, no-store, mu
8960: 73 74 2d 72 65 76 61 6c 69 64 61 74 65 22 20 2f  st-revalidate" /
8970: 3e 0a 20 20 20 20 20 20 20 20 3c 6d 65 74 61 20  >.        <meta 
8980: 68 74 74 70 2d 65 71 75 69 76 3d 22 50 72 61 67  http-equiv="Prag
8990: 6d 61 22 20 63 6f 6e 74 65 6e 74 3d 22 6e 6f 2d  ma" content="no-
89a0: 63 61 63 68 65 22 20 2f 3e 0a 20 20 20 20 20 20  cache" />.      
89b0: 20 20 3c 6d 65 74 61 20 68 74 74 70 2d 65 71 75    <meta http-equ
89c0: 69 76 3d 22 45 78 70 69 72 65 73 22 20 63 6f 6e  iv="Expires" con
89d0: 74 65 6e 74 3d 22 30 22 20 2f 3e 0a 20 20 20 20  tent="0" />.    
89e0: 20 20 20 20 3c 74 69 74 6c 65 3e 41 62 6f 75 74      <title>About
89f0: 20 62 69 72 74 68 79 74 68 6d 3c 2f 74 69 74 6c   birthythm</titl
8a00: 65 3e 0a 20 20 20 20 20 20 20 20 3c 6c 69 6e 6b  e>.        <link
8a10: 20 72 65 6c 3d 22 69 63 6f 6e 22 20 68 72 65 66   rel="icon" href
8a20: 3d 22 66 61 76 69 63 6f 6e 2e 69 63 6f 22 3e 0a  ="favicon.ico">.
8a30: 20 20 20 20 20 20 20 20 3c 73 74 79 6c 65 3e 0a          <style>.
8a40: 20 20 20 20 20 20 20 20 68 74 6d 6c 2c 20 62 6f          html, bo
8a50: 64 79 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  dy {.           
8a60: 20 6d 61 72 67 69 6e 3a 20 30 3b 0a 20 20 20 20   margin: 0;.    
8a70: 20 20 20 20 20 20 20 20 77 69 64 74 68 3a 20 31          width: 1
8a80: 30 30 25 3b 0a 20 20 20 20 20 20 20 20 20 20 20  00%;.           
8a90: 20 68 65 69 67 68 74 3a 20 31 30 30 25 3b 0a 20   height: 100%;. 
8aa0: 20 20 20 20 20 20 20 20 20 20 20 70 61 64 64 69             paddi
8ab0: 6e 67 3a 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  ng: 0;.        }
8ac0: 0a 20 20 20 20 20 20 20 20 69 66 72 61 6d 65 20  .        iframe 
8ad0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 6f  {.            po
8ae0: 73 69 74 69 6f 6e 3a 66 69 78 65 64 3b 0a 20 20  sition:fixed;.  
8af0: 20 20 20 20 20 20 20 20 20 20 74 6f 70 3a 30 3b            top:0;
8b00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 66  .            lef
8b10: 74 3a 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t:0;.           
8b20: 20 62 6f 74 74 6f 6d 3a 30 3b 0a 20 20 20 20 20   bottom:0;.     
8b30: 20 20 20 20 20 20 20 72 69 67 68 74 3a 30 3b 0a         right:0;.
8b40: 20 20 20 20 20 20 20 20 20 20 20 20 77 69 64 74              widt
8b50: 68 3a 31 30 30 25 3b 0a 20 20 20 20 20 20 20 20  h:100%;.        
8b60: 20 20 20 20 68 65 69 67 68 74 3a 31 30 30 25 3b      height:100%;
8b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 6f 72  .            bor
8b80: 64 65 72 3a 6e 6f 6e 65 3b 0a 20 20 20 20 20 20  der:none;.      
8b90: 20 20 20 20 20 20 6d 61 72 67 69 6e 3a 30 3b 0a        margin:0;.
8ba0: 20 20 20 20 20 20 20 20 20 20 20 20 70 61 64 64              padd
8bb0: 69 6e 67 3a 30 3b 0a 20 20 20 20 20 20 20 20 20  ing:0;.         
8bc0: 20 20 20 6f 76 65 72 66 6c 6f 77 3a 68 69 64 64     overflow:hidd
8bd0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  en;.            
8be0: 7a 2d 69 6e 64 65 78 3a 39 39 39 39 39 39 3b 0a  z-index:999999;.
8bf0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8c00: 20 20 3c 2f 73 74 79 6c 65 3e 0a 20 20 20 20 20    </style>.     
8c10: 20 20 20 3c 6c 69 6e 6b 20 68 72 65 66 3d 22 68     <link href="h
8c20: 74 74 70 73 3a 2f 2f 75 6e 70 6b 67 2e 63 6f 6d  ttps://unpkg.com
8c30: 2f 74 61 69 6c 77 69 6e 64 63 73 73 40 5e 32 2f  /tailwindcss@^2/
8c40: 64 69 73 74 2f 74 61 69 6c 77 69 6e 64 2e 6d 69  dist/tailwind.mi
8c50: 6e 2e 63 73 73 22 20 72 65 6c 3d 22 73 74 79 6c  n.css" rel="styl
8c60: 65 73 68 65 65 74 22 3e 0a 20 20 20 20 20 20 20  esheet">.       
8c70: 20 3c 73 63 72 69 70 74 3e 0a 20 20 20 20 20 20   <script>.      
8c80: 20 20 20 20 20 20 77 69 6e 64 6f 77 2e 67 6f 61        window.goa
8c90: 74 63 6f 75 6e 74 65 72 20 3d 20 7b 0a 20 20 20  tcounter = {.   
8ca0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 61 74               pat
8cb0: 68 3a 20 66 75 6e 63 74 69 6f 6e 28 70 29 20 7b  h: function(p) {
8cc0: 20 72 65 74 75 72 6e 20 6c 6f 63 61 74 69 6f 6e   return location
8cd0: 2e 68 6f 73 74 20 2b 20 70 20 7d 0a 20 20 20 20  .host + p }.    
8ce0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8cf0: 20 20 3c 2f 73 63 72 69 70 74 3e 0a 20 20 20 20    </script>.    
8d00: 20 20 20 20 3c 73 63 72 69 70 74 20 64 61 74 61      <script data
8d10: 2d 67 6f 61 74 63 6f 75 6e 74 65 72 3d 22 68 74  -goatcounter="ht
8d20: 74 70 73 3a 2f 2f 61 6e 61 6c 79 74 69 63 73 2e  tps://analytics.
8d30: 78 79 7a 7a 79 61 70 70 73 2e 6c 69 6e 6b 2f 63  xyzzyapps.link/c
8d40: 6f 75 6e 74 22 20 61 73 79 6e 63 20 73 72 63 3d  ount" async src=
8d50: 22 2f 2f 61 6e 61 6c 79 74 69 63 73 2e 78 79 7a  "//analytics.xyz
8d60: 7a 79 61 70 70 73 2e 6c 69 6e 6b 2f 63 6f 75 6e  zyapps.link/coun
8d70: 74 2e 6a 73 22 3e 3c 2f 73 63 72 69 70 74 3e 0a  t.js"></script>.
8d80: 20 20 20 20 3c 2f 68 65 61 64 3e 0a 20 20 20 20      </head>.    
8d90: 3c 62 6f 64 79 3e 0a 20 20 20 20 20 20 20 20 3c  <body>.        <
8da0: 69 66 72 61 6d 65 20 73 72 63 3d 22 68 74 74 70  iframe src="http
8db0: 73 3a 2f 2f 62 6c 6f 67 2e 78 79 7a 7a 79 61 70  s://blog.xyzzyap
8dc0: 70 73 2e 6c 69 6e 6b 2f 62 69 74 72 68 79 74 68  ps.link/bitrhyth
8dd0: 6d 2d 73 75 62 6d 69 74 2d 69 73 73 75 65 2d 66  m-submit-issue-f
8de0: 65 65 64 62 61 63 6b 22 20 66 72 61 6d 65 62 6f  eedback" framebo
8df0: 72 64 65 72 3d 22 30 22 3e 3c 2f 69 66 72 61 6d  rder="0"></ifram
8e00: 65 3e 0a 20 20 20 20 3c 2f 62 6f 64 79 3e 0a 3c  e>.    </body>.<
8e10: 2f 68 74 6d 6c 3e 0a 22 22 22 0a 0a 69 66 20 44  /html>."""..if D
8e20: 45 56 20 3d 3d 20 22 31 22 3a 0a 20 20 20 20 66  EV == "1":.    f
8e30: 6f 72 5f 64 6f 63 73 20 3d 20 22 22 22 0a 23 23  or_docs = """.##
8e40: 20 50 61 67 65 0a 0a 60 60 60 7b 63 6f 64 65 2d   Page..```{code-
8e50: 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a  block} html.---.
8e60: 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a  force: true.---.
8e70: 25 73 0a 60 60 60 0a 20 20 20 20 22 22 22 0a 20  %s.```.    """. 
8e80: 20 20 20 63 6f 67 2e 6f 75 74 28 66 6f 72 5f 64     cog.out(for_d
8e90: 6f 63 73 20 25 20 28 70 61 67 65 2c 29 29 0a 0a  ocs % (page,))..
8ea0: 6f 73 2e 73 79 73 74 65 6d 28 22 72 6d 20 74 65  os.system("rm te
8eb0: 6d 70 6c 61 74 65 73 2f 70 61 67 65 2e 68 74 6d  mplates/page.htm
8ec0: 6c 22 29 0a 66 20 3d 20 6f 70 65 6e 28 22 74 65  l").f = open("te
8ed0: 6d 70 6c 61 74 65 73 2f 70 61 67 65 2e 68 74 6d  mplates/page.htm
8ee0: 6c 22 2c 20 22 77 22 29 0a 66 2e 77 72 69 74 65  l", "w").f.write
8ef0: 28 70 61 67 65 29 0a 66 2e 63 6c 6f 73 65 28 29  (page).f.close()
8f00: 0a 40 3e 0a 40 40 0a 0a 23 23 20 4a 61 76 61 73  .@>.@@..## Javas
8f10: 63 72 69 70 74 0a 0a 60 60 60 7b 63 6f 64 65 2d  cript..```{code-
8f20: 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d 2d 0a 66 6f  block} js.---.fo
8f30: 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a 40  rce: true.---..@
8f40: 3c 0a 69 6d 70 6f 72 74 20 63 6f 67 0a 69 6d 70  <.import cog.imp
8f50: 6f 72 74 20 6f 73 0a 0a 6d 69 73 63 5f 6a 73 20  ort os..misc_js 
8f60: 3d 20 22 22 22 0a 66 75 6e 63 74 69 6f 6e 20 69  = """.function i
8f70: 6e 69 74 57 69 6e 61 6d 70 28 70 72 65 73 65 74  nitWinamp(preset
8f80: 29 20 7b 0a 20 20 20 20 76 61 72 20 63 61 6e 20  ) {.    var can 
8f90: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
8fa0: 65 6d 65 6e 74 42 79 49 64 28 22 76 69 73 75 61  ementById("visua
8fb0: 6c 22 29 3b 0a 20 20 20 20 63 61 6e 2e 68 65 69  l");.    can.hei
8fc0: 67 68 74 20 3d 20 77 69 6e 64 6f 77 2e 69 6e 6e  ght = window.inn
8fd0: 65 72 48 65 69 67 68 74 20 2d 20 64 6f 63 75 6d  erHeight - docum
8fe0: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
8ff0: 49 64 28 22 68 65 61 64 65 72 2d 70 6c 61 79 62  Id("header-playb
9000: 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48 65 69 67  ack").clientHeig
9010: 68 74 20 2d 20 37 35 3b 0a 20 20 20 20 63 61 6e  ht - 75;.    can
9020: 2e 77 69 64 74 68 20 3d 20 77 69 6e 64 6f 77 2e  .width = window.
9030: 69 6e 6e 65 72 57 69 64 74 68 3b 0a 20 20 20 20  innerWidth;.    
9040: 76 61 72 20 63 61 6e 5f 63 6f 6e 74 61 69 6e 65  var can_containe
9050: 72 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74  r = document.get
9060: 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 63 61 6e  ElementById("can
9070: 76 61 73 2d 63 6f 6e 74 61 69 6e 65 72 22 29 3b  vas-container");
9080: 0a 20 20 20 20 63 61 6e 5f 63 6f 6e 74 61 69 6e  .    can_contain
9090: 65 72 2e 77 69 64 74 68 20 3d 20 77 69 6e 64 6f  er.width = windo
90a0: 77 2e 69 6e 6e 65 72 57 69 64 74 68 3b 0a 20 20  w.innerWidth;.  
90b0: 20 20 76 61 72 20 76 69 73 75 61 6c 69 7a 65 72    var visualizer
90c0: 20 3d 20 77 69 6e 64 6f 77 2e 62 75 74 74 65 72   = window.butter
90d0: 63 68 75 72 6e 2e 64 65 66 61 75 6c 74 2e 63 72  churn.default.cr
90e0: 65 61 74 65 56 69 73 75 61 6c 69 7a 65 72 28 54  eateVisualizer(T
90f0: 6f 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74 28 29  one.getContext()
9100: 2e 72 61 77 43 6f 6e 74 65 78 74 2c 20 63 61 6e  .rawContext, can
9110: 2c 20 7b 0a 20 20 20 20 20 20 20 20 68 65 69 67  , {.        heig
9120: 68 74 3a 20 77 69 6e 64 6f 77 2e 69 6e 6e 65 72  ht: window.inner
9130: 48 65 69 67 68 74 20 2d 20 64 6f 63 75 6d 65 6e  Height - documen
9140: 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64  t.getElementById
9150: 28 22 68 65 61 64 65 72 2d 70 6c 61 79 62 61 63  ("header-playbac
9160: 6b 22 29 2e 63 6c 69 65 6e 74 48 65 69 67 68 74  k").clientHeight
9170: 20 2d 20 37 35 2c 0a 20 20 20 20 20 20 20 20 77   - 75,.        w
9180: 69 64 74 68 3a 20 77 69 6e 64 6f 77 2e 69 6e 6e  idth: window.inn
9190: 65 72 57 69 64 74 68 2c 0a 20 20 20 20 20 20 20  erWidth,.       
91a0: 20 6d 65 73 68 57 69 64 74 68 3a 20 32 34 2c 0a   meshWidth: 24,.
91b0: 20 20 20 20 20 20 20 20 6d 65 73 68 48 65 69 67          meshHeig
91c0: 68 74 3a 20 31 38 2c 0a 20 20 20 20 7d 29 3b 0a  ht: 18,.    });.
91d0: 20 20 20 20 76 69 73 75 61 6c 69 7a 65 72 2e 63      visualizer.c
91e0: 6f 6e 6e 65 63 74 41 75 64 69 6f 28 54 6f 6e 65  onnectAudio(Tone
91f0: 2e 67 65 74 43 6f 6e 74 65 78 74 28 29 2e 64 65  .getContext().de
9200: 73 74 69 6e 61 74 69 6f 6e 29 3b 0a 20 20 20 20  stination);.    
9210: 63 6f 6e 73 74 20 70 72 65 73 65 74 73 20 3d 20  const presets = 
9220: 77 69 6e 64 6f 77 2e 62 75 74 74 65 72 63 68 75  window.butterchu
9230: 72 6e 50 72 65 73 65 74 73 2e 67 65 74 50 72 65  rnPresets.getPre
9240: 73 65 74 73 28 29 3b 0a 20 20 20 20 63 6f 6e 73  sets();.    cons
9250: 74 20 70 72 65 73 65 74 50 61 72 61 6d 20 3d 20  t presetParam = 
9260: 70 72 65 73 65 74 73 5b 70 72 65 73 65 74 5d 3b  presets[preset];
9270: 0a 20 20 20 20 76 69 73 75 61 6c 69 7a 65 72 2e  .    visualizer.
9280: 6c 6f 61 64 50 72 65 73 65 74 28 70 72 65 73 65  loadPreset(prese
9290: 74 50 61 72 61 6d 2c 20 30 2e 30 29 3b 20 2f 2f  tParam, 0.0); //
92a0: 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20 69 73   2nd argument is
92b0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 73   the number of s
92c0: 65 63 6f 6e 64 73 20 74 6f 20 62 6c 65 6e 64 20  econds to blend 
92d0: 70 72 65 73 65 74 73 0a 20 20 20 20 72 65 74 75  presets.    retu
92e0: 72 6e 20 76 69 73 75 61 6c 69 7a 65 72 3b 0a 7d  rn visualizer;.}
92f0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 75 61 72 64  ..function guard
9300: 28 72 61 6e 67 65 29 20 7b 0a 20 20 20 20 76 61  (range) {.    va
9310: 72 20 73 74 61 74 65 20 3d 20 6e 75 6c 6c 3b 0a  r state = null;.
9320: 20 20 20 20 72 65 74 75 72 6e 20 66 75 6e 63 74      return funct
9330: 69 6f 6e 20 28 76 61 6c 29 20 7b 0a 20 20 20 20  ion (val) {.    
9340: 20 20 20 20 69 66 20 28 28 76 61 6c 20 3e 3d 20      if ((val >= 
9350: 72 61 6e 67 65 5b 30 5d 29 20 26 26 20 28 76 61  range[0]) && (va
9360: 6c 20 3c 3d 20 72 61 6e 67 65 5b 31 5d 29 29 20  l <= range[1])) 
9370: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 74  {.            st
9380: 61 74 65 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20  ate = val;.     
9390: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 76 61         return va
93a0: 6c 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73  l;.        } els
93b0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
93c0: 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a 20 20  return state;.  
93d0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 7d 0a        }.    }.}.
93e0: 0a 66 75 6e 63 74 69 6f 6e 20 68 65 78 32 62 69  .function hex2bi
93f0: 6e 28 68 65 78 29 20 7b 0a 20 20 20 20 76 61 72  n(hex) {.    var
9400: 20 6c 65 74 74 65 72 73 20 3d 20 68 65 78 2e 72   letters = hex.r
9410: 65 70 6c 61 63 65 28 27 60 31 27 2c 27 61 27 29  eplace('`1','a')
9420: 3b 0a 20 20 20 20 6c 65 74 74 65 72 73 20 3d 20  ;.    letters = 
9430: 68 65 78 2e 72 65 70 6c 61 63 65 28 27 60 32 27  hex.replace('`2'
9440: 2c 27 62 27 29 3b 0a 20 20 20 20 6c 65 74 74 65  ,'b');.    lette
9450: 72 73 20 3d 20 68 65 78 2e 72 65 70 6c 61 63 65  rs = hex.replace
9460: 28 27 60 33 27 2c 27 63 27 29 3b 0a 20 20 20 20  ('`3','c');.    
9470: 6c 65 74 74 65 72 73 20 3d 20 68 65 78 2e 72 65  letters = hex.re
9480: 70 6c 61 63 65 28 27 60 34 27 2c 27 64 27 29 3b  place('`4','d');
9490: 0a 20 20 20 20 6c 65 74 74 65 72 73 20 3d 20 68  .    letters = h
94a0: 65 78 2e 72 65 70 6c 61 63 65 28 27 60 35 27 2c  ex.replace('`5',
94b0: 27 65 27 29 3b 0a 20 20 20 20 6c 65 74 74 65 72  'e');.    letter
94c0: 73 20 3d 20 68 65 78 2e 72 65 70 6c 61 63 65 28  s = hex.replace(
94d0: 27 60 36 27 2c 27 66 27 29 3b 0a 20 20 20 20 6c  '`6','f');.    l
94e0: 65 74 74 65 72 73 20 3d 20 6c 65 74 74 65 72 73  etters = letters
94f0: 2e 73 70 6c 69 74 28 27 27 29 3b 0a 20 20 20 20  .split('');.    
9500: 76 61 72 20 62 69 6e 20 3d 20 22 22 3b 0a 20 20  var bin = "";.  
9510: 20 20 6c 65 74 74 65 72 73 2e 6d 61 70 28 66 75    letters.map(fu
9520: 6e 63 74 69 6f 6e 28 6c 65 74 74 65 72 29 20 7b  nction(letter) {
9530: 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c 65 74  .        if (let
9540: 74 65 72 20 3d 3d 20 22 30 22 29 20 7b 0a 20 20  ter == "0") {.  
9550: 20 20 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d            bin +=
9560: 20 22 30 30 30 30 22 3b 0a 20 20 20 20 20 20 20   "0000";.       
9570: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 6c   }.        if (l
9580: 65 74 74 65 72 20 3d 3d 20 22 31 22 29 20 7b 0a  etter == "1") {.
9590: 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 20              bin 
95a0: 2b 3d 20 22 30 30 30 31 22 3b 0a 20 20 20 20 20  += "0001";.     
95b0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73     }.        els
95c0: 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20  e if (letter == 
95d0: 22 32 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20  "2") {.         
95e0: 20 20 20 62 69 6e 20 2b 3d 20 22 30 30 31 30 22     bin += "0010"
95f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9600: 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74      else if (let
9610: 74 65 72 20 3d 3d 20 22 33 22 29 20 7b 0a 20 20  ter == "3") {.  
9620: 20 20 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d            bin +=
9630: 20 22 30 30 31 31 22 3b 0a 20 20 20 20 20 20 20   "0011";.       
9640: 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20   }.        else 
9650: 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 34  if (letter == "4
9660: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ") {.           
9670: 20 62 69 6e 20 2b 3d 20 22 30 31 30 30 22 3b 0a   bin += "0100";.
9680: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9690: 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65    else if (lette
96a0: 72 20 3d 3d 20 22 35 22 29 20 7b 0a 20 20 20 20  r == "5") {.    
96b0: 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22          bin += "
96c0: 30 31 30 31 22 3b 0a 20 20 20 20 20 20 20 20 7d  0101";.        }
96d0: 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66  .        else if
96e0: 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 36 22 29   (letter == "6")
96f0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62   {.            b
9700: 69 6e 20 2b 3d 20 22 30 31 31 30 22 3b 0a 20 20  in += "0110";.  
9710: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
9720: 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20  else if (letter 
9730: 3d 3d 20 22 37 22 29 20 7b 0a 20 20 20 20 20 20  == "7") {.      
9740: 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 31        bin += "01
9750: 31 31 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  11";.        }. 
9760: 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20 28         else if (
9770: 6c 65 74 74 65 72 20 3d 3d 20 22 38 22 29 20 7b  letter == "8") {
9780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 69 6e  .            bin
9790: 20 2b 3d 20 22 31 30 30 30 22 3b 0a 20 20 20 20   += "1000";.    
97a0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c      }.        el
97b0: 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d  se if (letter ==
97c0: 20 22 39 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "9") {.        
97d0: 20 20 20 20 62 69 6e 20 2b 3d 20 22 31 30 30 31      bin += "1001
97e0: 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  ";.        }.   
97f0: 20 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65       else if (le
9800: 74 74 65 72 20 3d 3d 20 22 61 22 29 20 7b 0a 20  tter == "a") {. 
9810: 20 20 20 20 20 20 20 20 20 20 20 62 69 6e 20 2b             bin +
9820: 3d 20 22 31 30 31 30 22 3b 0a 20 20 20 20 20 20  = "1010";.      
9830: 20 20 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65    }.        else
9840: 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22   if (letter == "
9850: 62 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  b") {.          
9860: 20 20 62 69 6e 20 2b 3d 20 22 31 30 31 31 22 3b    bin += "1011";
9870: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9880: 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74     else if (lett
9890: 65 72 20 3d 3d 20 22 63 22 29 20 7b 0a 20 20 20  er == "c") {.   
98a0: 20 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20           bin += 
98b0: 22 31 31 30 30 22 3b 0a 20 20 20 20 20 20 20 20  "1100";.        
98c0: 7d 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20 69  }.        else i
98d0: 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 64 22  f (letter == "d"
98e0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
98f0: 62 69 6e 20 2b 3d 20 22 31 31 30 31 22 3b 0a 20  bin += "1101";. 
9900: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9910: 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72   else if (letter
9920: 20 3d 3d 20 22 65 22 29 20 7b 0a 20 20 20 20 20   == "e") {.     
9930: 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 31         bin += "1
9940: 31 31 30 22 3b 0a 20 20 20 20 20 20 20 20 7d 0a  110";.        }.
9950: 20 20 20 20 20 20 20 20 65 6c 73 65 20 69 66 20          else if 
9960: 28 6c 65 74 74 65 72 20 3d 3d 20 22 66 22 29 20  (letter == "f") 
9970: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 69  {.            bi
9980: 6e 20 2b 3d 20 22 31 31 31 31 22 3b 0a 20 20 20  n += "1111";.   
9990: 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d 29 0a 20       }..    }). 
99a0: 20 20 20 72 65 74 75 72 6e 20 62 69 6e 3b 0a 7d     return bin;.}
99b0: 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 61 74 74  ...function patt
99c0: 65 72 6e 5f 63 6c 65 61 6e 28 70 29 20 7b 0a 20  ern_clean(p) {. 
99d0: 20 20 20 69 66 20 28 21 70 29 20 7b 0a 20 20 20     if (!p) {.   
99e0: 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b 0a       return "";.
99f0: 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70 2e      }.    p = p.
9a00: 72 65 70 6c 61 63 65 28 2f 20 2f 67 2c 20 22 22  replace(/ /g, ""
9a10: 29 3b 0a 20 20 20 20 76 61 72 20 66 63 20 3d 20  );.    var fc = 
9a20: 70 2e 73 70 6c 69 74 28 27 27 29 5b 30 5d 3b 0a  p.split('')[0];.
9a30: 20 20 20 20 69 66 20 28 66 63 3d 3d 20 22 70 22      if (fc== "p"
9a40: 29 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72 20  ) {.        var 
9a50: 70 74 79 70 65 20 3d 20 22 78 6f 22 3b 0a 20 20  ptype = "xo";.  
9a60: 20 20 20 20 20 20 76 61 72 20 6c 20 3d 20 28 70        var l = (p
9a70: 2e 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a 20 20  .length - 1);.  
9a80: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
9a90: 28 66 63 3d 3d 20 22 62 22 29 20 7b 0a 20 20 20  (fc== "b") {.   
9aa0: 20 20 20 20 20 76 61 72 20 6c 20 3d 20 28 70 2e       var l = (p.
9ab0: 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a 20 20 20  length - 1);.   
9ac0: 20 20 20 20 20 76 61 72 20 70 74 79 70 65 20 3d       var ptype =
9ad0: 20 22 62 69 6e 22 3b 0a 20 20 20 20 7d 0a 20 20   "bin";.    }.  
9ae0: 20 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20    else {.       
9af0: 20 76 61 72 20 70 74 79 70 65 20 3d 20 22 68 65   var ptype = "he
9b00: 78 22 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20  x";.        var 
9b10: 6c 20 3d 20 28 70 2e 6c 65 6e 67 74 68 29 20 2a  l = (p.length) *
9b20: 20 34 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69   4;.    }..    i
9b30: 66 20 28 70 74 79 70 65 20 3d 3d 20 22 62 69 6e  f (ptype == "bin
9b40: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72  ") {.        var
9b50: 20 66 70 20 3d 20 20 70 2e 73 75 62 73 74 72 69   fp =  p.substri
9b60: 6e 67 28 31 29 3b 0a 20 20 20 20 7d 20 65 6c 73  ng(1);.    } els
9b70: 65 20 69 66 20 28 70 74 79 70 65 20 3d 3d 20 22  e if (ptype == "
9b80: 78 6f 22 29 20 7b 0a 20 20 20 20 20 20 20 20 76  xo") {.        v
9b90: 61 72 20 66 70 20 3d 20 70 2e 73 75 62 73 74 72  ar fp = p.substr
9ba0: 28 31 29 3b 0a 20 20 20 20 20 20 20 20 66 70 20  (1);.        fp 
9bb0: 3d 20 66 70 2e 72 65 70 6c 61 63 65 28 2f 78 2f  = fp.replace(/x/
9bc0: 67 2c 20 22 31 22 29 3b 0a 20 20 20 20 7d 20 65  g, "1");.    } e
9bd0: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 76 61  lse {.        va
9be0: 72 20 66 70 20 3d 20 68 65 78 32 62 69 6e 28 70  r fp = hex2bin(p
9bf0: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65  );.    }..    re
9c00: 74 75 72 6e 20 66 70 3b 0a 7d 0a 0a 66 75 6e 63  turn fp;.}..func
9c10: 74 69 6f 6e 20 64 6f 77 6e 6c 6f 61 64 28 64 61  tion download(da
9c20: 74 61 2c 20 66 69 6c 65 6e 61 6d 65 2c 20 74 79  ta, filename, ty
9c30: 70 65 29 20 7b 0a 20 20 20 20 76 61 72 20 66 69  pe) {.    var fi
9c40: 6c 65 20 3d 20 6e 65 77 20 42 6c 6f 62 28 5b 64  le = new Blob([d
9c50: 61 74 61 5d 2c 20 7b 20 74 79 70 65 3a 20 74 79  ata], { type: ty
9c60: 70 65 20 7d 29 3b 0a 20 20 20 20 69 66 20 28 77  pe });.    if (w
9c70: 69 6e 64 6f 77 2e 6e 61 76 69 67 61 74 6f 72 2e  indow.navigator.
9c80: 6d 73 53 61 76 65 4f 72 4f 70 65 6e 42 6c 6f 62  msSaveOrOpenBlob
9c90: 29 20 2f 2f 20 49 45 31 30 2b 0a 20 20 20 20 20  ) // IE10+.     
9ca0: 20 20 20 77 69 6e 64 6f 77 2e 6e 61 76 69 67 61     window.naviga
9cb0: 74 6f 72 2e 6d 73 53 61 76 65 4f 72 4f 70 65 6e  tor.msSaveOrOpen
9cc0: 42 6c 6f 62 28 66 69 6c 65 2c 20 66 69 6c 65 6e  Blob(file, filen
9cd0: 61 6d 65 29 3b 0a 20 20 20 20 65 6c 73 65 20 7b  ame);.    else {
9ce0: 20 2f 2f 20 4f 74 68 65 72 73 0a 20 20 20 20 20   // Others.     
9cf0: 20 20 20 76 61 72 20 61 20 3d 20 64 6f 63 75 6d     var a = docum
9d00: 65 6e 74 2e 63 72 65 61 74 65 45 6c 65 6d 65 6e  ent.createElemen
9d10: 74 28 22 61 22 29 2c 0a 20 20 20 20 20 20 20 20  t("a"),.        
9d20: 20 20 20 20 75 72 6c 20 3d 20 55 52 4c 2e 63 72      url = URL.cr
9d30: 65 61 74 65 4f 62 6a 65 63 74 55 52 4c 28 66 69  eateObjectURL(fi
9d40: 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 61 2e 68  le);.        a.h
9d50: 72 65 66 20 3d 20 75 72 6c 3b 0a 20 20 20 20 20  ref = url;.     
9d60: 20 20 20 61 2e 64 6f 77 6e 6c 6f 61 64 20 3d 20     a.download = 
9d70: 66 69 6c 65 6e 61 6d 65 3b 0a 20 20 20 20 20 20  filename;.      
9d80: 20 20 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e    document.body.
9d90: 61 70 70 65 6e 64 43 68 69 6c 64 28 61 29 3b 0a  appendChild(a);.
9da0: 20 20 20 20 20 20 20 20 61 2e 63 6c 69 63 6b 28          a.click(
9db0: 29 3b 0a 20 20 20 20 20 20 20 20 73 65 74 54 69  );.        setTi
9dc0: 6d 65 6f 75 74 28 66 75 6e 63 74 69 6f 6e 20 28  meout(function (
9dd0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
9de0: 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e 72 65  document.body.re
9df0: 6d 6f 76 65 43 68 69 6c 64 28 61 29 3b 0a 20 20  moveChild(a);.  
9e00: 20 20 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77            window
9e10: 2e 55 52 4c 2e 72 65 76 6f 6b 65 4f 62 6a 65 63  .URL.revokeObjec
9e20: 74 55 52 4c 28 75 72 6c 29 3b 0a 20 20 20 20 20  tURL(url);.     
9e30: 20 20 20 7d 2c 20 30 29 3b 0a 20 20 20 20 7d 0a     }, 0);.    }.
9e40: 7d 0a 0a 2f 2f 20 68 74 74 70 73 3a 2f 2f 73 74  }..// https://st
9e50: 61 63 6b 6f 76 65 72 66 6c 6f 77 2e 63 6f 6d 2f  ackoverflow.com/
9e60: 71 75 65 73 74 69 6f 6e 73 2f 31 35 37 36 32 37  questions/157627
9e70: 36 38 2f 6a 61 76 61 73 63 72 69 70 74 2d 6d 61  68/javascript-ma
9e80: 74 68 2d 72 6f 75 6e 64 2d 74 6f 2d 74 77 6f 2d  th-round-to-two-
9e90: 64 65 63 69 6d 61 6c 2d 70 6c 61 63 65 73 0a 66  decimal-places.f
9ea0: 75 6e 63 74 69 6f 6e 20 72 6f 75 6e 64 54 6f 28  unction roundTo(
9eb0: 6e 2c 20 64 69 67 69 74 73 29 20 7b 0a 20 20 20  n, digits) {.   
9ec0: 20 76 61 72 20 6e 65 67 61 74 69 76 65 20 3d 20   var negative = 
9ed0: 66 61 6c 73 65 3b 0a 20 20 20 20 69 66 20 28 64  false;.    if (d
9ee0: 69 67 69 74 73 20 3d 3d 3d 20 75 6e 64 65 66 69  igits === undefi
9ef0: 6e 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 64  ned) {.        d
9f00: 69 67 69 74 73 20 3d 20 30 3b 0a 20 20 20 20 7d  igits = 0;.    }
9f10: 0a 20 20 20 20 69 66 20 28 6e 20 3c 20 30 29 20  .    if (n < 0) 
9f20: 7b 0a 20 20 20 20 20 20 20 20 6e 65 67 61 74 69  {.        negati
9f30: 76 65 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20  ve = true;.     
9f40: 20 20 20 6e 20 3d 20 6e 20 2a 20 2d 31 3b 0a 20     n = n * -1;. 
9f50: 20 20 20 7d 0a 20 20 20 20 76 61 72 20 6d 75 6c     }.    var mul
9f60: 74 69 70 6c 69 63 61 74 6f 72 20 3d 20 4d 61 74  tiplicator = Mat
9f70: 68 2e 70 6f 77 28 31 30 2c 20 64 69 67 69 74 73  h.pow(10, digits
9f80: 29 3b 0a 20 20 20 20 6e 20 3d 20 70 61 72 73 65  );.    n = parse
9f90: 46 6c 6f 61 74 28 28 6e 20 2a 20 6d 75 6c 74 69  Float((n * multi
9fa0: 70 6c 69 63 61 74 6f 72 29 2e 74 6f 46 69 78 65  plicator).toFixe
9fb0: 64 28 31 31 29 29 3b 0a 20 20 20 20 6e 20 3d 20  d(11));.    n = 
9fc0: 28 4d 61 74 68 2e 72 6f 75 6e 64 28 6e 29 20 2f  (Math.round(n) /
9fd0: 20 6d 75 6c 74 69 70 6c 69 63 61 74 6f 72 29 2e   multiplicator).
9fe0: 74 6f 46 69 78 65 64 28 64 69 67 69 74 73 29 3b  toFixed(digits);
9ff0: 0a 20 20 20 20 69 66 20 28 6e 65 67 61 74 69 76  .    if (negativ
a000: 65 29 20 7b 0a 20 20 20 20 20 20 20 20 6e 20 3d  e) {.        n =
a010: 20 28 6e 20 2a 20 2d 31 29 2e 74 6f 46 69 78 65   (n * -1).toFixe
a020: 64 28 64 69 67 69 74 73 29 3b 0a 20 20 20 20 7d  d(digits);.    }
a030: 0a 20 20 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d  .    return n;.}
a040: 0a 0a 24 7b 6b 6e 6f 62 5f 63 6f 64 65 7d 0a 22  ..${knob_code}."
a050: 22 22 0a 66 72 6f 6d 20 6d 61 6b 6f 2e 74 65 6d  "".from mako.tem
a060: 70 6c 61 74 65 20 69 6d 70 6f 72 74 20 54 65 6d  plate import Tem
a070: 70 6c 61 74 65 0a 0a 63 6f 64 65 20 3d 20 54 65  plate..code = Te
a080: 6d 70 6c 61 74 65 28 6d 69 73 63 5f 6a 73 29 2e  mplate(misc_js).
a090: 72 65 6e 64 65 72 28 6b 6e 6f 62 5f 63 6f 64 65  render(knob_code
a0a0: 3d 6b 6e 6f 62 5f 63 6f 64 65 29 0a 63 6f 67 2e  =knob_code).cog.
a0b0: 6f 75 74 28 6d 69 73 63 5f 6a 73 29 0a 0a 6f 73  out(misc_js)..os
a0c0: 2e 73 79 73 74 65 6d 28 22 72 6d 20 70 75 62 6c  .system("rm publ
a0d0: 69 63 2f 6d 69 73 63 2e 6a 73 22 29 0a 66 20 3d  ic/misc.js").f =
a0e0: 20 6f 70 65 6e 28 22 70 75 62 6c 69 63 2f 6d 69   open("public/mi
a0f0: 73 63 2e 6a 73 22 2c 20 22 77 22 29 0a 66 2e 77  sc.js", "w").f.w
a100: 72 69 74 65 28 63 6f 64 65 29 0a 66 2e 63 6c 6f  rite(code).f.clo
a110: 73 65 28 29 0a 40 3e 0a 40 40 0a 60 60 60 0a 0a  se().@>.@@.```..