⌈⌋ ⎇ branch:  Bitrhythm


Hex Artifact Content

Artifact 0a67982c37d95660f09233e02b6cc34ab24f07e671a78bec6934ac4412d4f2a5:

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

0000: 0a 23 20 43 6f 64 65 20 57 61 6c 6b 74 68 72 6f  .# Code Walkthro
0010: 75 67 68 0a 0a 23 23 20 43 6f 72 65 20 54 72 61  ugh..## Core Tra
0020: 63 6b 65 72 20 4c 6f 6f 70 0a 0a 49 6e 20 62 69  cker Loop..In bi
0030: 74 72 68 79 74 68 6d 20 63 6f 64 65 20 69 73 20  trhythm code is 
0040: 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 76  evaluated for ev
0050: 65 72 79 20 63 79 63 6c 65 2e 0a 0a 31 20 62 65  ery cycle...1 be
0060: 61 74 20 3d 20 36 30 20 2f 20 74 65 6d 70 6f 0a  at = 60 / tempo.
0070: 31 20 63 79 63 6c 65 20 3d 20 31 20 62 65 61 74  1 cycle = 1 beat
0080: 20 2f 20 74 69 63 6b 73 0a 0a 46 6f 72 20 65 76   / ticks..For ev
0090: 65 72 79 20 63 79 63 6c 65 20 76 69 73 75 61 6c  ery cycle visual
00a0: 20 61 6e 64 20 61 75 64 69 6f 20 63 6f 64 65 20   and audio code 
00b0: 69 73 20 65 76 61 6c 75 61 74 65 64 2e 0a 0a 54  is evaluated...T
00c0: 68 65 20 65 64 69 74 20 63 68 65 63 6b 62 6f 78  he edit checkbox
00d0: 20 61 6c 6c 6f 77 73 20 79 6f 75 20 74 6f 20 70   allows you to p
00e0: 65 72 66 6f 72 6d 20 6c 6f 6e 67 20 65 64 69 74  erform long edit
00f0: 73 2c 20 77 68 65 72 65 20 6f 6e 6c 79 20 6f 6c  s, where only ol
0100: 64 20 63 6f 64 65 20 69 73 20 65 76 61 6c 75 61  d code is evalua
0110: 74 65 64 2e 20 4f 6e 63 65 20 79 6f 75 20 64 69  ted. Once you di
0120: 73 61 62 6c 65 20 69 74 2c 20 61 6c 6c 20 74 68  sable it, all th
0130: 65 20 6e 65 77 20 65 64 69 74 20 63 68 61 6e 67  e new edit chang
0140: 65 73 20 61 72 65 20 61 70 70 6c 69 65 64 20 69  es are applied i
0150: 6e 20 74 68 65 20 6e 65 78 74 20 63 79 63 6c 65  n the next cycle
0160: 2e 0a 0a 49 66 20 74 68 65 72 65 20 69 73 20 61  ...If there is a
0170: 6e 79 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2c  ny syntax error,
0180: 20 70 72 65 76 69 6f 75 73 20 77 6f 72 6b 69 6e   previous workin
0190: 67 20 63 6f 64 65 20 69 73 20 75 73 65 64 2e 0a  g code is used..
01a0: 0a 49 66 20 74 68 65 20 63 6c 69 63 6b 20 74 68  .If the click th
01b0: 65 20 60 65 78 65 63 75 74 65 20 74 72 61 6e 73  e `execute trans
01c0: 69 74 69 6f 6e 60 20 69 73 20 73 65 6c 65 63 74  ition` is select
01d0: 65 64 2c 20 74 68 65 20 74 72 61 6e 73 69 74 69  ed, the transiti
01e0: 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 72  on function is r
01f0: 75 6e 2e 20 55 73 65 20 74 68 69 73 20 70 72 6f  un. Use this pro
0200: 67 72 65 73 73 69 6e 67 20 74 68 65 20 73 6f 6e  gressing the son
0210: 67 20 66 72 6f 6d 20 69 6e 69 74 69 61 6c 69 7a  g from initializ
0220: 69 6e 67 20 74 6f 20 74 77 65 61 6b 69 6e 67 2e  ing to tweaking.
0230: 0a 0a 0a 50 61 74 74 65 72 6e 73 20 69 73 20 61  ...Patterns is a
0240: 6e 20 61 72 72 61 79 20 6f 66 20 73 74 72 69 6e  n array of strin
0250: 67 73 2c 20 65 61 63 68 20 73 74 72 69 6e 67 20  gs, each string 
0260: 63 61 6e 20 62 65 20 68 65 78 61 64 65 63 69 6d  can be hexadecim
0270: 61 6c 2c 20 64 65 63 69 6d 61 6c 20 6f 72 20 73  al, decimal or s
0280: 6f 6d 65 74 68 69 6e 67 20 6c 69 6b 65 20 e2 80  omething like ..
0290: 9c 78 30 30 30 20 78 30 30 30 20 78 30 30 30 20  .x000 x000 x000 
02a0: 78 30 30 30 e2 80 9d 2e 0a 69 73 48 69 74 20 61  x000.....isHit a
02b0: 6e 64 20 74 72 61 63 6b 5f 6e 6f 20 63 61 6e 20  nd track_no can 
02c0: 62 65 20 75 73 65 64 20 74 6f 20 69 64 65 6e 74  be used to ident
02d0: 69 66 79 20 74 68 65 20 6c 61 79 65 72 20 69 6e  ify the layer in
02e0: 20 74 68 65 20 6c 69 76 65 20 65 64 69 74 6f 72   the live editor
02f0: 2e 20 48 65 78 61 64 65 63 69 6d 61 6c 20 75 73  . Hexadecimal us
0300: 65 73 20 5c 60 30 20 5c 60 31 20 5c 60 32 20 5c  es \`0 \`1 \`2 \
0310: 60 33 20 5c 60 34 20 5c 60 35 20 69 6e 73 74 65  `3 \`4 \`5 inste
0320: 61 64 20 6f 66 20 74 68 65 20 52 6f 6d 61 6e 20  ad of the Roman 
0330: 6e 75 6d 65 72 61 6c 73 20 61 62 63 64 65 20 66  numerals abcde f
0340: 6f 72 20 31 30 2c 20 31 31 2c 20 31 32 20 2e 2e  or 10, 11, 12 ..
0350: 2e 0a 0a 53 63 68 65 64 75 6c 65 64 20 54 69 6d  ...Scheduled Tim
0360: 65 20 61 73 20 73 69 67 6e 69 66 69 65 64 20 62  e as signified b
0370: 79 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 74  y the variable t
0380: 69 6d 65 20 69 73 20 63 72 75 63 69 61 6c 20 77  ime is crucial w
0390: 68 65 6e 20 63 61 6c 6c 69 6e 67 20 6e 6f 74 65  hen calling note
03a0: 20 74 72 69 67 67 65 72 73 2e 20 54 68 69 73 20   triggers. This 
03b0: 69 73 20 75 73 65 64 20 62 79 20 54 6f 6e 65 2e  is used by Tone.
03c0: 6a 73 20 74 6f 20 73 63 68 65 64 75 6c 65 20 6e  js to schedule n
03d0: 6f 74 65 73 20 74 6f 20 70 6c 61 79 20 69 6e 20  otes to play in 
03e0: 74 68 65 20 66 75 74 75 72 65 2e 0a 0a 23 23 23  the future...###
03f0: 20 4f 62 73 65 72 76 65 72 73 0a 0a 53 69 64 65   Observers..Side
0400: 63 68 61 69 6e 20 63 6f 6d 70 72 65 73 73 69 6f  chain compressio
0410: 6e 20 69 73 20 61 20 73 69 6d 70 6c 65 20 61 6c  n is a simple al
0420: 67 6f 72 69 74 68 6d 20 77 68 69 63 68 20 6f 62  gorithm which ob
0430: 73 65 72 76 65 73 20 61 6d 70 6c 69 74 75 64 65  serves amplitude
0440: 20 6f 66 20 61 6e 6f 74 68 65 72 20 69 6e 73 74   of another inst
0450: 72 75 6d 65 6e 74 20 62 75 74 20 79 6f 75 20 63  rument but you c
0460: 61 6e 20 67 65 6e 65 72 61 6c 69 73 65 20 69 74  an generalise it
0470: 20 74 6f 20 61 6e 79 74 68 69 6e 67 2e 20 42 79   to anything. By
0480: 20 61 74 74 61 63 68 69 6e 67 20 6f 62 73 65 72   attaching obser
0490: 76 65 72 73 20 20 74 6f 20 74 69 6d 65 20 6f 72  vers  to time or
04a0: 20 6f 74 68 65 72 20 69 6e 73 74 72 75 6d 65 6e   other instrumen
04b0: 74 73 20 79 6f 75 20 63 61 6e 20 63 72 65 61 74  ts you can creat
04c0: 65 20 73 65 63 74 69 6f 6e 73 20 77 69 74 68 69  e sections withi
04d0: 6e 20 74 68 65 20 73 6f 6e 67 20 74 68 61 74 20  n the song that 
04e0: 63 61 6e 20 74 72 69 67 67 65 72 20 6f 74 68 65  can trigger othe
04f0: 72 73 20 77 69 74 68 20 63 6f 6e 64 69 74 69 6f  rs with conditio
0500: 6e 61 6c 20 6c 6f 67 69 63 2e 20 54 68 69 73 20  nal logic. This 
0510: 69 73 20 73 69 6d 69 6c 61 72 20 74 6f 20 70 75  is similar to pu
0520: 72 65 20 64 61 74 61 27 73 20 62 61 6e 67 73 20  re data's bangs 
0530: 2d 20 5b 73 65 65 20 74 68 69 73 5d 28 68 74 74  - [see this](htt
0540: 70 73 3a 2f 2f 77 77 77 2e 79 6f 75 74 75 62 65  ps://www.youtube
0550: 2e 63 6f 6d 2f 77 61 74 63 68 3f 76 3d 6e 54 54  .com/watch?v=nTT
0560: 5a 5a 79 44 34 78 6c 45 29 2e 20 49 6e 20 66 75  ZZyD4xlE). In fu
0570: 74 75 72 65 20 74 68 69 73 20 77 69 6c 6c 20 62  ture this will b
0580: 65 20 72 65 66 65 72 72 65 64 20 74 6f 20 61 73  e referred to as
0590: 20 73 69 64 65 20 65 76 65 6e 74 73 2e 20 59 6f   side events. Yo
05a0: 75 20 63 6f 75 6c 64 20 64 65 63 72 65 61 73 65  u could decrease
05b0: 20 74 68 65 20 76 6f 6c 75 6d 65 20 6f 66 20 74   the volume of t
05c0: 68 65 20 64 72 75 6d 73 20 74 6f 20 68 61 76 65  he drums to have
05d0: 20 74 68 65 20 73 6e 61 72 65 73 20 64 72 6f 70   the snares drop
05e0: 20 61 75 74 6f 6d 61 74 69 63 61 6c 6c 79 20 66   automatically f
05f0: 6f 72 20 65 78 61 6d 70 6c 65 2e 0a 0a 54 68 69  or example...Thi
0600: 73 20 69 73 20 73 6f 6d 65 74 68 69 6e 67 20 74  s is something t
0610: 68 61 74 20 79 6f 75 20 63 61 6e 27 74 20 64 6f  hat you can't do
0620: 20 69 6e 20 44 41 57 73 2e 0a 0a 60 60 60 7b 63   in DAWs...```{c
0630: 6f 64 65 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d  ode-block} js.--
0640: 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d  -.force: true.--
0650: 2d 0a 0a 0a 0a 61 73 79 6e 63 20 70 6c 61 79 28  -....async play(
0660: 29 20 7b 0a 20 20 20 20 76 61 72 20 73 65 6c 66  ) {.    var self
0670: 20 3d 20 74 68 69 73 3b 0a 20 20 20 20 76 61 72   = this;.    var
0680: 20 63 65 6c 6c 78 20 3d 20 77 69 6e 64 6f 77 2e   cellx = window.
0690: 63 65 6c 6c 78 2e 63 65 6c 6c 78 3b 0a 20 20 20  cellx.cellx;.   
06a0: 20 76 61 72 20 24 20 3d 20 6a 51 75 65 72 79 3b   var $ = jQuery;
06b0: 0a 0a 20 20 20 20 61 77 61 69 74 20 54 6f 6e 65  ..    await Tone
06c0: 2e 63 6f 6e 74 65 78 74 2e 72 65 73 75 6d 65 28  .context.resume(
06d0: 29 0a 20 20 20 20 61 77 61 69 74 20 54 6f 6e 65  ).    await Tone
06e0: 2e 73 74 61 72 74 28 29 3b 0a 20 20 20 20 61 77  .start();.    aw
06f0: 61 69 74 20 54 6f 6e 65 2e 54 72 61 6e 73 70 6f  ait Tone.Transpo
0700: 72 74 2e 73 74 61 72 74 28 29 3b 0a 20 20 20 20  rt.start();.    
0710: 54 6f 6e 65 2e 54 72 61 6e 73 70 6f 72 74 2e 62  Tone.Transport.b
0720: 70 6d 2e 76 61 6c 75 65 20 3d 20 74 68 69 73 2e  pm.value = this.
0730: 73 74 61 74 65 2e 74 65 6d 70 6f 3b 0a 20 20 20  state.tempo;.   
0740: 20 54 6f 6e 65 2e 54 72 61 6e 73 70 6f 72 74 2e   Tone.Transport.
0750: 73 77 69 6e 67 2e 76 61 6c 75 65 20 3d 20 30 3b  swing.value = 0;
0760: 0a 0a 20 20 20 20 77 69 6e 64 6f 77 2e 68 69 74  ..    window.hit
0770: 5f 6d 61 70 20 3d 20 7b 7d 3b 0a 0a 20 20 20 20  _map = {};..    
0780: 76 61 72 20 74 72 61 6e 73 69 74 69 6f 6e 20 3d  var transition =
0790: 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20   function () {. 
07a0: 20 20 20 7d 0a 0a 20 20 20 20 76 61 72 20 61 6c     }..    var al
07b0: 77 61 79 73 20 3d 20 66 75 6e 63 74 69 6f 6e 20  ways = function 
07c0: 28 29 20 7b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  () {.    }..    
07d0: 76 61 72 20 72 65 6e 64 65 72 5f 6c 6f 6f 70 20  var render_loop 
07e0: 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a  = function () {.
07f0: 20 20 20 20 7d 0a 0a 20 20 20 20 76 61 72 20 61      }..    var a
0800: 6e 69 6d 61 74 69 6f 6e 20 3d 20 66 75 6e 63 74  nimation = funct
0810: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20  ion () {.       
0820: 20 72 65 6e 64 65 72 5f 6c 6f 6f 70 28 29 3b 0a   render_loop();.
0830: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 2e 72          window.r
0840: 65 71 75 65 73 74 41 6e 69 6d 61 74 69 6f 6e 46  equestAnimationF
0850: 72 61 6d 65 28 61 6e 69 6d 61 74 69 6f 6e 29 0a  rame(animation).
0860: 20 20 20 20 7d 0a 0a 20 20 20 20 54 6f 6e 65 2e      }..    Tone.
0870: 4d 61 73 74 65 72 2e 6d 75 74 65 20 3d 20 66 61  Master.mute = fa
0880: 6c 73 65 3b 0a 20 20 20 20 64 6f 63 75 6d 65 6e  lse;.    documen
0890: 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64  t.getElementById
08a0: 28 27 74 65 6d 70 6f 2d 76 61 6c 75 65 27 29 2e  ('tempo-value').
08b0: 64 69 73 61 62 6c 65 64 20 3d 20 74 72 75 65 3b  disabled = true;
08c0: 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65  .    document.ge
08d0: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 74 69  tElementById('ti
08e0: 63 6b 2d 76 61 6c 75 65 27 29 2e 64 69 73 61 62  ck-value').disab
08f0: 6c 65 64 20 3d 20 74 72 75 65 3b 0a 0a 20 20 20  led = true;..   
0900: 20 76 61 72 20 6d 65 6d 20 3d 20 73 65 6c 66 2e   var mem = self.
0910: 73 74 61 74 65 2e 6d 65 6d 3b 0a 20 20 20 20 77  state.mem;.    w
0920: 69 6e 64 6f 77 2e 6d 65 6d 20 3d 20 6d 65 6d 3b  indow.mem = mem;
0930: 0a 20 20 20 20 76 61 72 20 68 61 6e 64 6c 65 72  .    var handler
0940: 73 20 3d 20 7b 7d 3b 0a 20 20 20 20 77 69 6e 64  s = {};.    wind
0950: 6f 77 2e 63 6f 75 6e 74 20 3d 20 2d 31 3b 0a 0a  ow.count = -1;..
0960: 20 20 20 20 76 61 72 20 74 65 78 74 20 3d 20 65      var text = e
0970: 64 69 74 6f 72 2e 67 65 74 56 61 6c 75 65 28 29  ditor.getValue()
0980: 3b 0a 0a 20 20 20 20 65 64 69 74 6f 72 2e 6f 6e  ;..    editor.on
0990: 28 22 63 68 61 6e 67 65 22 2c 20 66 75 6e 63 74  ("change", funct
09a0: 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20  ion () {.       
09b0: 20 74 65 78 74 20 3d 20 65 64 69 74 6f 72 2e 67   text = editor.g
09c0: 65 74 56 61 6c 75 65 28 29 3b 0a 20 20 20 20 7d  etValue();.    }
09d0: 29 3b 0a 0a 20 20 20 20 76 61 72 20 70 61 74 74  );..    var patt
09e0: 65 72 6e 73 20 3d 20 5b 20 63 65 6c 6c 78 28 22  erns = [ cellx("
09f0: 30 30 30 30 22 29 20 5d 3b 20 2f 2f 20 6e 65 65  0000") ]; // nee
0a00: 64 20 74 68 69 73 20 66 6f 72 20 66 69 72 73 74  d this for first
0a10: 20 65 76 61 6c 0a 0a 20 20 20 20 76 61 72 20 62   eval..    var b
0a20: 61 72 73 20 3d 20 30 3b 0a 20 20 20 20 76 61 72  ars = 0;.    var
0a30: 20 74 69 63 6b 20 3d 20 30 3b 0a 0a 20 20 20 20   tick = 0;..    
0a40: 76 61 72 20 71 75 61 72 74 65 72 5f 62 65 61 74  var quarter_beat
0a50: 5f 6c 65 6e 67 74 68 20 3d 20 36 30 30 30 30 2e  _length = 60000.
0a60: 30 20 2f 20 74 68 69 73 2e 73 74 61 74 65 2e 74  0 / this.state.t
0a70: 65 6d 70 6f 3b 0a 20 20 20 20 76 61 72 20 62 65  empo;.    var be
0a80: 61 74 5f 6c 65 6e 67 74 68 20 3d 20 71 75 61 72  at_length = quar
0a90: 74 65 72 5f 62 65 61 74 5f 6c 65 6e 67 74 68 20  ter_beat_length 
0aa0: 2a 20 34 3b 0a 20 20 20 20 76 61 72 20 64 65 6c  * 4;.    var del
0ab0: 74 61 20 3d 20 62 65 61 74 5f 6c 65 6e 67 74 68  ta = beat_length
0ac0: 20 2f 20 74 68 69 73 2e 73 74 61 74 65 2e 74 69   / this.state.ti
0ad0: 63 6b 73 3b 0a 0a 20 20 20 20 77 69 6e 64 6f 77  cks;..    window
0ae0: 2e 73 61 6d 70 6c 65 73 20 3d 20 74 68 69 73 2e  .samples = this.
0af0: 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 3b 0a 20  state.samples;. 
0b00: 20 20 20 76 61 72 20 65 76 61 6c 5f 67 75 61 72     var eval_guar
0b10: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 73  d = false;.    s
0b20: 65 6c 66 2e 74 69 6d 65 72 20 3d 20 73 65 74 49  elf.timer = setI
0b30: 6e 74 65 72 76 61 6c 28 66 75 6e 63 74 69 6f 6e  nterval(function
0b40: 20 28 29 20 7b 0a 20 20 20 20 63 6f 75 6e 74 20   () {.    count 
0b50: 3d 20 63 6f 75 6e 74 20 2b 20 31 3b 0a 20 20 20  = count + 1;.   
0b60: 20 74 69 63 6b 20 3d 20 28 63 6f 75 6e 74 20 25   tick = (count %
0b70: 20 74 68 69 73 2e 73 74 61 74 65 2e 74 69 63 6b   this.state.tick
0b80: 73 29 3b 0a 20 20 20 20 69 66 20 28 74 69 63 6b  s);.    if (tick
0b90: 20 3d 3d 3d 20 30 29 20 2b 2b 62 61 72 73 3b 0a   === 0) ++bars;.
0ba0: 0a 20 20 20 20 24 28 22 23 64 75 72 61 74 69 6f  .    $("#duratio
0bb0: 6e 22 29 2e 68 74 6d 6c 28 22 22 20 2b 20 62 61  n").html("" + ba
0bc0: 72 73 20 2b 20 22 2e 22 20 2b 20 74 69 63 6b 20  rs + "." + tick 
0bd0: 2b 20 22 20 2f 20 22 20 2b 20 63 6f 75 6e 74 20  + " / " + count 
0be0: 2b 20 22 20 2f 20 22 20 2b 20 77 69 6e 64 6f 77  + " / " + window
0bf0: 2e 72 6f 75 6e 64 54 6f 28 54 6f 6e 65 2e 54 72  .roundTo(Tone.Tr
0c00: 61 6e 73 70 6f 72 74 2e 73 65 63 6f 6e 64 73 2c  ansport.seconds,
0c10: 20 32 29 29 3b 0a 20 20 20 20 61 6c 77 61 79 73   2));.    always
0c20: 28 29 3b 0a 20 20 20 20 66 6f 72 20 28 76 61 72  ();.    for (var
0c30: 20 69 20 3d 20 30 3b 20 69 20 3c 20 70 61 74 74   i = 0; i < patt
0c40: 65 72 6e 73 2e 6c 65 6e 67 74 68 3b 20 69 2b 2b  erns.length; i++
0c50: 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28  ) {.        if (
0c60: 69 20 3d 3d 20 30 29 20 7b 0a 20 20 20 20 20 20  i == 0) {.      
0c70: 20 20 20 20 20 20 65 76 61 6c 5f 67 75 61 72 64        eval_guard
0c80: 20 3d 20 74 72 75 65 3b 0a 20 20 20 20 20 20 20   = true;.       
0c90: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
0ca0: 20 20 20 20 20 20 65 76 61 6c 5f 67 75 61 72 64        eval_guard
0cb0: 20 3d 20 66 61 6c 73 65 3b 0a 0a 20 20 20 20 20   = false;..     
0cc0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 76 61 72     }.        var
0cd0: 20 64 69 61 6c 73 20 3d 20 73 65 6c 66 2e 73 74   dials = self.st
0ce0: 61 74 65 2e 64 69 61 6c 73 3b 0a 20 20 20 20 20  ate.dials;.     
0cf0: 20 20 20 76 61 72 20 6e 75 6d 62 65 72 73 20 3d     var numbers =
0d00: 20 73 65 6c 66 2e 73 74 61 74 65 2e 6e 75 6d 62   self.state.numb
0d10: 65 72 73 3b 0a 0a 20 20 20 20 20 20 20 20 69 66  ers;..        if
0d20: 20 28 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c   (document.getEl
0d30: 65 6d 65 6e 74 42 79 49 64 28 27 65 64 69 74 2d  ementById('edit-
0d40: 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65 64 29 20  mode').checked) 
0d50: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  {.            va
0d60: 72 20 70 5f 74 65 78 74 20 20 3d 20 6f 6c 64 50  r p_text  = oldP
0d70: 61 74 74 65 72 6e 73 5b 69 5d 3b 0a 20 20 20 20  atterns[i];.    
0d80: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
0d90: 20 20 20 20 20 20 20 20 20 76 61 72 20 70 5f 74           var p_t
0da0: 65 78 74 20 3d 20 70 61 74 74 65 72 6e 73 5b 69  ext = patterns[i
0db0: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6f  ];.            o
0dc0: 6c 64 50 61 74 74 65 72 6e 73 5b 69 5d 20 3d 20  ldPatterns[i] = 
0dd0: 70 5f 74 65 78 74 3b 0a 20 20 20 20 20 20 20 20  p_text;.        
0de0: 7d 0a 20 20 20 20 20 20 20 20 69 66 20 28 70 5f  }.        if (p_
0df0: 74 65 78 74 28 29 20 26 26 20 70 5f 74 65 78 74  text() && p_text
0e00: 28 29 2e 6c 65 6e 67 74 68 20 21 3d 3d 20 30 29  ().length !== 0)
0e10: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76   {.            v
0e20: 61 72 20 74 72 61 63 6b 5f 6e 6f 20 3d 20 69 20  ar track_no = i 
0e30: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  + 1;.           
0e40: 20 76 61 72 20 70 61 74 74 65 72 6e 20 3d 20 70   var pattern = p
0e50: 61 74 74 65 72 6e 5f 70 61 72 73 65 28 70 5f 74  attern_parse(p_t
0e60: 65 78 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20  ext());.        
0e70: 20 20 20 20 76 61 72 20 6d 65 74 61 20 3d 20 70      var meta = p
0e80: 61 74 74 65 72 6e 5f 6d 65 74 61 28 70 5f 74 65  attern_meta(p_te
0e90: 78 74 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20  xt());.         
0ea0: 20 20 20 76 61 72 20 69 73 48 69 74 20 3d 20 28     var isHit = (
0eb0: 70 61 74 74 65 72 6e 2e 73 70 6c 69 74 28 27 27  pattern.split(''
0ec0: 29 5b 74 69 63 6b 5d 20 3d 3d 20 22 31 22 29 20  )[tick] == "1") 
0ed0: 3f 20 74 72 75 65 20 3a 20 66 61 6c 73 65 3b 0a  ? true : false;.
0ee0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 72 79  .            try
0ef0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0f00: 20 20 20 69 66 20 28 64 6f 63 75 6d 65 6e 74 2e     if (document.
0f10: 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27  getElementById('
0f20: 65 64 69 74 2d 6d 6f 64 65 27 29 2e 63 68 65 63  edit-mode').chec
0f30: 6b 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ked) {.         
0f40: 20 20 20 20 20 20 20 20 20 20 20 65 76 61 6c 28             eval(
0f50: 6f 6c 64 43 6f 64 65 29 3b 0a 20 20 20 20 20 20  oldCode);.      
0f60: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
0f70: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
0f80: 20 20 20 20 20 20 20 65 76 61 6c 28 74 65 78 74         eval(text
0f90: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
0fa0: 20 20 20 20 20 20 20 69 66 20 28 64 6f 63 75 6d         if (docum
0fb0: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
0fc0: 49 64 28 27 72 65 64 6f 27 29 2e 63 68 65 63 6b  Id('redo').check
0fd0: 65 64 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  ed) {.          
0fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 64 6f                do
0ff0: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
1000: 74 42 79 49 64 28 27 72 65 64 6f 27 29 2e 63 68  tById('redo').ch
1010: 65 63 6b 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20  ecked = false;. 
1020: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1030: 20 20 20 20 20 20 20 74 69 63 6b 20 3d 20 28 63         tick = (c
1040: 6f 75 6e 74 20 25 20 74 68 69 73 2e 73 74 61 74  ount % this.stat
1050: 65 2e 74 69 63 6b 73 29 3b 0a 20 20 20 20 20 20  e.ticks);.      
1060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1070: 20 20 63 6f 75 6e 74 20 2d 3d 20 74 69 63 6b 20    count -= tick 
1080: 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20  + 1;.           
1090: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d               i =
10a0: 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   0;.            
10b0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
10c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
10d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
10e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f0: 69 66 20 28 64 6f 63 75 6d 65 6e 74 2e 67 65 74  if (document.get
1100: 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 6c 6f 61  ElementById('loa
1110: 64 2d 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65 64  d-mode').checked
1120: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
1130: 20 20 20 20 20 20 20 20 20 20 20 20 64 6f 63 75              docu
1140: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
1150: 79 49 64 28 27 6c 6f 61 64 2d 6d 6f 64 65 27 29  yId('load-mode')
1160: 2e 63 68 65 63 6b 65 64 20 3d 20 66 61 6c 73 65  .checked = false
1170: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
1180: 20 20 20 20 20 20 20 20 20 20 74 72 61 6e 73 69            transi
1190: 74 69 6f 6e 28 29 3b 0a 20 20 20 20 20 20 20 20  tion();.        
11a0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
11b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
11c0: 20 20 6f 6c 64 43 6f 64 65 20 3d 20 74 65 78 74    oldCode = text
11d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
11e0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
11f0: 20 20 20 20 24 28 22 23 65 72 72 6f 72 22 29 2e      $("#error").
1200: 68 74 6d 6c 28 22 22 29 3b 0a 20 20 20 20 20 20  html("");.      
1210: 20 20 20 20 20 20 7d 20 63 61 74 63 68 20 28 65        } catch (e
1220: 78 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  x) {.           
1230: 20 20 20 20 20 24 28 22 23 65 72 72 6f 72 22 29       $("#error")
1240: 2e 68 74 6d 6c 28 65 78 29 3b 0a 20 20 20 20 20  .html(ex);.     
1250: 20 20 20 20 20 20 20 20 20 20 20 65 76 61 6c 28             eval(
1260: 6f 6c 64 43 6f 64 65 29 3b 0a 20 20 20 20 20 20  oldCode);.      
1270: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1280: 7d 0a 20 20 20 20 7d 0a 20 20 7d 2e 62 69 6e 64  }.    }.  }.bind
1290: 28 74 68 69 73 29 2c 20 64 65 6c 74 61 29 0a 0a  (this), delta)..
12a0: 20 20 77 69 6e 64 6f 77 2e 72 65 71 75 65 73 74    window.request
12b0: 41 6e 69 6d 61 74 69 6f 6e 46 72 61 6d 65 28 61  AnimationFrame(a
12c0: 6e 69 6d 61 74 69 6f 6e 29 3b 0a 0a 7d 0a 60 60  nimation);..}.``
12d0: 60 0a 0a 23 23 20 44 69 61 6c 73 0a 0a 42 69 74  `..## Dials..Bit
12e0: 72 68 79 74 68 6d 20 70 72 6f 76 69 64 65 73 20  rhythm provides 
12f0: 63 75 73 74 6f 6d 20 64 69 61 6c 73 2e 20 54 68  custom dials. Th
1300: 65 73 65 20 64 69 61 6c 73 20 63 61 6e 20 62 65  ese dials can be
1310: 20 6d 61 70 70 65 64 20 74 6f 20 61 6e 79 20 61   mapped to any a
1320: 73 70 65 63 74 73 20 6f 66 20 54 6f 6e 65 2e 6a  spects of Tone.j
1330: 73 2e 20 41 6c 6c 20 64 69 61 6c 73 20 61 72 65  s. All dials are
1340: 20 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 6e   available as an
1350: 20 61 72 72 61 79 20 64 69 61 6c 73 20 69 6e 20   array dials in 
1360: 74 68 65 20 6c 69 76 65 20 63 6f 64 65 20 65 64  the live code ed
1370: 69 74 6f 72 2e 0a 0a 60 60 60 7b 63 6f 64 65 2d  itor...```{code-
1380: 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a 2d 2d 2d 0a  block} html.---.
1390: 66 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a  force: true.---.
13a0: 0a 0a 3c 64 69 61 6c 3e 0a 20 20 20 20 3c 76 62  ..<dial>.    <vb
13b0: 6f 78 3e 0a 20 20 20 20 20 20 20 20 3c 64 69 76  ox>.        <div
13c0: 20 63 6c 61 73 73 3d 22 6d 6c 2d 34 22 3e 0a 20   class="ml-4">. 
13d0: 20 20 20 20 20 20 20 20 20 20 20 3c 68 73 74 61             <hsta
13e0: 63 6b 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  ck>.            
13f0: 20 20 20 20 3c 64 69 76 20 69 64 3d 7b 22 6b 6e      <div id={"kn
1400: 6f 62 22 20 2b 20 70 72 6f 70 73 2e 74 69 7d 3e  ob" + props.ti}>
1410: 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20  </div>.         
1420: 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61 73         <div clas
1430: 73 3d 22 6d 74 2d 31 22 20 73 74 79 6c 65 3d 22  s="mt-1" style="
1440: 68 65 69 67 68 74 3a 20 32 32 70 78 22 20 69 64  height: 22px" id
1450: 3d 7b 22 6b 6e 6f 62 2d 76 61 6c 75 65 22 20 2b  ={"knob-value" +
1460: 20 70 72 6f 70 73 2e 74 69 7d 3e 3c 2f 64 69 76   props.ti}></div
1470: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  >.              
1480: 20 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 63    <span class="c
1490: 75 72 73 6f 72 2d 70 6f 69 6e 74 65 72 22 20 69  ursor-pointer" i
14a0: 64 3d 7b 22 73 61 6d 70 6c 65 22 20 2b 20 74 68  d={"sample" + th
14b0: 69 73 2e 70 72 6f 70 73 2e 74 69 7d 20 6f 6e 63  is.props.ti} onc
14c0: 6c 69 63 6b 3d 7b 72 65 6d 6f 76 65 28 74 68 69  lick={remove(thi
14d0: 73 2e 70 72 6f 70 73 2e 74 69 20 2d 31 29 7d 3e  s.props.ti -1)}>
14e0: 28 78 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20 20  (x)</span>.     
14f0: 20 20 20 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e         </hstack>
1500: 0a 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a  .        </div>.
1510: 20 20 20 20 3c 2f 76 62 6f 78 3e 0a 0a 20 20 20      </vbox>..   
1520: 20 3c 73 63 72 69 70 74 3e 0a 0a 74 68 69 73 2e   <script>..this.
1530: 70 72 6f 70 73 20 3d 20 6f 70 74 73 3b 0a 0a 72  props = opts;..r
1540: 65 6d 6f 76 65 28 69 6e 64 65 78 29 20 7b 0a 20  emove(index) {. 
1550: 20 20 20 72 65 74 75 72 6e 20 28 29 20 3d 3e 20     return () => 
1560: 7b 0a 20 20 20 20 20 20 20 20 74 68 69 73 2e 70  {.        this.p
1570: 72 6f 70 73 2e 72 6d 64 69 61 6c 28 69 6e 64 65  rops.rmdial(inde
1580: 78 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 74 68 69  x);.    }.}..thi
1590: 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22 2c 20 28 29  s.on("mount", ()
15a0: 20 3d 3e 20 7b 0a 20 20 20 20 69 66 20 28 6f 70   => {.    if (op
15b0: 74 73 2e 76 29 20 7b 0a 0a 20 20 20 20 20 20 20  ts.v) {..       
15c0: 20 4e 65 78 75 73 2e 63 6f 6c 6f 72 73 2e 61 63   Nexus.colors.ac
15d0: 63 65 6e 74 20 3d 20 22 23 30 30 30 30 30 30 22  cent = "#000000"
15e0: 0a 20 20 20 20 20 20 20 20 4e 65 78 75 73 2e 63  .        Nexus.c
15f0: 6f 6c 6f 72 73 2e 66 69 6c 6c 20 3d 20 22 23 66  olors.fill = "#f
1600: 66 66 66 66 66 22 0a 0a 20 20 20 20 20 20 20 20  fffff"..        
1610: 76 61 72 20 63 65 6c 6c 20 3d 20 77 69 6e 64 6f  var cell = windo
1620: 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78 28 30 2e  w.cellx.cellx(0.
1630: 35 29 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20  5);.        var 
1640: 64 69 61 6c 20 3d 20 6e 65 77 20 4e 65 78 75 73  dial = new Nexus
1650: 2e 44 69 61 6c 28 27 23 6b 6e 6f 62 27 20 2b 20  .Dial('#knob' + 
1660: 74 68 69 73 2e 70 72 6f 70 73 2e 74 69 2c 20 7b  this.props.ti, {
1670: 0a 20 20 20 20 20 20 20 20 20 20 20 20 27 73 69  .            'si
1680: 7a 65 27 3a 20 5b 34 35 2c 20 34 35 5d 2c 0a 20  ze': [45, 45],. 
1690: 20 20 20 20 20 20 20 20 20 20 20 27 76 61 6c 75             'valu
16a0: 65 27 3a 20 30 2e 35 0a 20 20 20 20 20 20 20 20  e': 0.5.        
16b0: 7d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c  });.        cell
16c0: 2e 6f 6e 43 68 61 6e 67 65 28 65 76 74 20 3d 3e  .onChange(evt =>
16d0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
16e0: 66 20 28 65 76 74 2e 64 61 74 61 2e 70 72 65 76  f (evt.data.prev
16f0: 56 61 6c 75 65 20 21 3d 3d 20 65 76 74 2e 64 61  Value !== evt.da
1700: 74 61 2e 76 61 6c 75 65 29 20 7b 0a 20 20 20 20  ta.value) {.    
1710: 20 20 20 20 20 20 20 20 20 20 20 20 64 69 61 6c              dial
1720: 2e 76 61 6c 75 65 20 3d 20 65 76 74 2e 64 61 74  .value = evt.dat
1730: 61 2e 76 61 6c 75 65 3b 0a 20 20 20 20 20 20 20  a.value;.       
1740: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
1750: 29 3b 0a 20 20 20 20 20 20 20 20 64 69 61 6c 2e  );.        dial.
1760: 63 6f 6c 6f 72 69 7a 65 28 22 61 63 63 65 6e 74  colorize("accent
1770: 22 2c 22 23 30 30 30 22 29 0a 20 20 20 20 20 20  ","#000").      
1780: 20 20 64 69 61 6c 2e 6f 6e 28 27 63 68 61 6e 67    dial.on('chang
1790: 65 27 2c 20 28 76 61 6c 29 20 3d 3e 20 7b 0a 20  e', (val) => {. 
17a0: 20 20 20 20 20 20 20 20 20 20 20 76 61 6c 20 3d             val =
17b0: 20 77 69 6e 64 6f 77 2e 72 6f 75 6e 64 54 6f 28   window.roundTo(
17c0: 76 61 6c 2c 20 34 29 3b 0a 20 20 20 20 20 20 20  val, 4);.       
17d0: 20 20 20 20 20 24 28 27 23 6b 6e 6f 62 2d 76 61       $('#knob-va
17e0: 6c 75 65 27 20 2b 20 74 68 69 73 2e 70 72 6f 70  lue' + this.prop
17f0: 73 2e 74 69 29 2e 68 74 6d 6c 28 76 61 6c 29 3b  s.ti).html(val);
1800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 65 6c  .            cel
1810: 6c 28 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20  l(val);.        
1820: 7d 29 3b 0a 20 20 20 20 20 20 20 74 68 69 73 2e  });.       this.
1830: 70 72 6f 70 73 2e 76 5b 22 63 65 6c 6c 22 5d 20  props.v["cell"] 
1840: 3d 20 63 65 6c 6c 3b 0a 20 20 20 20 7d 0a 7d 29  = cell;.    }.})
1850: 3b 0a 20 20 20 3c 2f 73 63 72 69 70 74 3e 0a 0a  ;.   </script>..
1860: 3c 2f 64 69 61 6c 3e 0a 60 60 60 0a 0a 23 23 20  </dial>.```..## 
1870: 4e 75 6d 62 65 72 73 0a 0a 54 68 65 73 65 20 6e  Numbers..These n
1880: 75 6d 62 65 72 73 20 63 61 6e 20 62 65 20 6d 61  umbers can be ma
1890: 70 70 65 64 20 74 6f 20 61 6e 79 20 61 73 70 65  pped to any aspe
18a0: 63 74 20 6f 66 20 54 6f 6e 65 2e 6a 73 2e 20 41  ct of Tone.js. A
18b0: 6c 6c 20 6e 75 6d 62 65 72 20 62 6f 78 65 73 20  ll number boxes 
18c0: 61 72 65 20 61 76 61 69 6c 61 62 6c 65 20 61 73  are available as
18d0: 20 61 6e 20 61 72 72 61 79 20 6e 75 6d 62 65 72   an array number
18e0: 73 20 69 6e 20 74 68 65 20 6c 69 76 65 20 63 6f  s in the live co
18f0: 64 65 20 65 64 69 74 6f 72 2e 20 55 73 65 66 75  de editor. Usefu
1900: 6c 20 66 6f 72 20 64 65 62 75 67 67 69 6e 67 20  l for debugging 
1910: 70 75 72 70 6f 73 65 73 2e 0a 0a 60 60 60 7b 63  purposes...```{c
1920: 6f 64 65 2d 62 6c 6f 63 6b 7d 20 68 74 6d 6c 0a  ode-block} html.
1930: 2d 2d 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65 0a  ---.force: true.
1940: 2d 2d 2d 0a 0a 0a 3c 6e 75 6d 62 65 72 3e 0a 20  ---...<number>. 
1950: 20 20 20 3c 76 62 6f 78 3e 0a 20 20 20 20 20 20     <vbox>.      
1960: 20 20 3c 64 69 76 20 20 63 6c 61 73 73 3d 22 6d    <div  class="m
1970: 6c 2d 34 22 3e 0a 20 20 20 20 20 20 20 20 20 20  l-4">.          
1980: 20 20 3c 68 73 74 61 63 6b 3e 0a 20 20 20 20 20    <hstack>.     
1990: 20 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d 7b         <div id={
19a0: 22 6e 75 6d 62 65 72 22 20 2b 20 70 72 6f 70 73  "number" + props
19b0: 2e 74 69 7d 3e 3c 2f 64 69 76 3e 0a 20 20 20 20  .ti}></div>.    
19c0: 20 20 20 20 20 20 20 20 3c 64 69 76 20 63 6c 61          <div cla
19d0: 73 73 3d 22 6d 74 2d 31 22 20 73 74 79 6c 65 3d  ss="mt-1" style=
19e0: 22 68 65 69 67 68 74 3a 20 32 32 70 78 22 20 69  "height: 22px" i
19f0: 64 3d 7b 22 6e 75 6d 62 65 72 2d 76 61 6c 75 65  d={"number-value
1a00: 22 20 2b 20 70 72 6f 70 73 2e 74 69 7d 3e 3c 2f  " + props.ti}></
1a10: 64 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20  div>.           
1a20: 20 3c 73 70 61 6e 20 63 6c 61 73 73 3d 22 63 75   <span class="cu
1a30: 72 73 6f 72 2d 70 6f 69 6e 74 65 72 22 20 6f 6e  rsor-pointer" on
1a40: 63 6c 69 63 6b 3d 7b 72 65 6d 6f 76 65 28 74 68  click={remove(th
1a50: 69 73 2e 70 72 6f 70 73 2e 74 69 20 2d 31 29 7d  is.props.ti -1)}
1a60: 3e 28 78 29 3c 2f 73 70 61 6e 3e 0a 20 20 20 20  >(x)</span>.    
1a70: 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 20 20      </hstack>.  
1a80: 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20        </div>.   
1a90: 20 3c 2f 76 62 6f 78 3e 0a 0a 20 20 20 20 3c 73   </vbox>..    <s
1aa0: 63 72 69 70 74 3e 0a 0a 74 68 69 73 2e 70 72 6f  cript>..this.pro
1ab0: 70 73 20 3d 20 6f 70 74 73 3b 0a 0a 20 20 20 20  ps = opts;..    
1ac0: 72 65 6d 6f 76 65 28 69 6e 64 65 78 29 20 7b 0a  remove(index) {.
1ad0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 28          return (
1ae0: 29 20 3d 3e 20 7b 0a 20 20 20 20 20 20 20 20 20  ) => {.         
1af0: 20 20 20 74 68 69 73 2e 70 72 6f 70 73 2e 72 6d     this.props.rm
1b00: 6e 75 6d 62 65 72 28 69 6e 64 65 78 29 3b 0a 20  number(index);. 
1b10: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a         }.    }..
1b20: 74 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e 74 22 2c  this.on("mount",
1b30: 20 28 29 20 3d 3e 20 7b 0a 20 20 20 20 69 66 20   () => {.    if 
1b40: 28 6f 70 74 73 2e 76 29 20 7b 0a 0a 20 20 20 20  (opts.v) {..    
1b50: 20 20 20 20 4e 65 78 75 73 2e 63 6f 6c 6f 72 73      Nexus.colors
1b60: 2e 61 63 63 65 6e 74 20 3d 20 22 23 30 30 30 30  .accent = "#0000
1b70: 30 30 22 0a 20 20 20 20 20 20 20 20 4e 65 78 75  00".        Nexu
1b80: 73 2e 63 6f 6c 6f 72 73 2e 66 69 6c 6c 20 3d 20  s.colors.fill = 
1b90: 22 23 66 66 66 66 66 66 22 0a 0a 20 20 20 20 20  "#ffffff"..     
1ba0: 20 20 20 76 61 72 20 63 65 6c 6c 20 3d 20 77 69     var cell = wi
1bb0: 6e 64 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78  ndow.cellx.cellx
1bc0: 28 30 29 0a 20 20 20 20 20 20 20 20 76 61 72 20  (0).        var 
1bd0: 6e 75 6d 62 65 72 20 3d 20 6e 65 77 20 4e 65 78  number = new Nex
1be0: 75 73 2e 4e 75 6d 62 65 72 28 27 23 6e 75 6d 62  us.Number('#numb
1bf0: 65 72 27 20 2b 20 74 68 69 73 2e 70 72 6f 70 73  er' + this.props
1c00: 2e 74 69 2c 20 7b 0a 20 20 20 20 20 20 20 20 20  .ti, {.         
1c10: 20 20 20 27 76 61 6c 75 65 27 3a 20 30 2c 0a 20     'value': 0,. 
1c20: 20 20 20 20 20 20 20 20 20 20 20 27 73 74 65 70             'step
1c30: 27 3a 20 30 2e 30 31 0a 20 20 20 20 20 20 20 20  ': 0.01.        
1c40: 7d 29 3b 0a 20 20 20 20 20 20 20 20 63 65 6c 6c  });.        cell
1c50: 2e 6f 6e 43 68 61 6e 67 65 28 65 76 74 20 3d 3e  .onChange(evt =>
1c60: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   {.            i
1c70: 66 20 28 65 76 74 2e 64 61 74 61 2e 70 72 65 76  f (evt.data.prev
1c80: 56 61 6c 75 65 20 21 3d 3d 20 65 76 74 2e 64 61  Value !== evt.da
1c90: 74 61 2e 76 61 6c 75 65 29 20 7b 0a 20 20 20 20  ta.value) {.    
1ca0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 75 6d 62              numb
1cb0: 65 72 2e 76 61 6c 75 65 20 3d 20 65 76 74 2e 64  er.value = evt.d
1cc0: 61 74 61 2e 76 61 6c 75 65 3b 0a 20 20 20 20 20  ata.value;.     
1cd0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1ce0: 20 7d 29 3b 0a 0a 20 20 20 20 20 20 20 20 74 68   });..        th
1cf0: 69 73 2e 70 72 6f 70 73 2e 76 5b 22 76 22 5d 20  is.props.v["v"] 
1d00: 3d 20 63 65 6c 6c 3b 0a 20 20 20 20 7d 0a 7d 29  = cell;.    }.})
1d10: 3b 0a 20 20 20 3c 2f 73 63 72 69 70 74 3e 0a 0a  ;.   </script>..
1d20: 3c 2f 6e 75 6d 62 65 72 3e 0a 60 60 60 0a 0a 23  </number>.```..#
1d30: 23 20 41 75 74 6f 4b 6e 6f 62 0a 0a 41 75 74 6f  # AutoKnob..Auto
1d40: 4b 6e 6f 62 20 65 6e 61 62 6c 65 73 20 70 72 6f  Knob enables pro
1d50: 67 72 61 6d 6d 61 74 69 63 20 61 75 74 6f 6d 61  grammatic automa
1d60: 74 69 6f 6e 20 69 6e 20 42 69 74 72 68 79 74 68  tion in Bitrhyth
1d70: 6d 0a 0a 60 78 20 2d 3e 20 5b 31 2c 20 32 2e 35  m..`x -> [1, 2.5
1d80: 2c 20 34 2c 20 33 2e 32 5d 20 7c 20 62 79 20 30  , 4, 3.2] | by 0
1d90: 2e 33 60 0a 0a 78 20 77 69 6c 6c 20 67 6f 20 66  .3`..x will go f
1da0: 72 6f 6d 20 31 20 74 6f 20 32 2e 35 20 74 6f 20  rom 1 to 2.5 to 
1db0: 34 20 74 6f 20 33 2e 32 20 69 6e 20 69 6e 63 72  4 to 3.2 in incr
1dc0: 65 6d 65 6e 74 73 20 6f 66 20 30 2e 33 20 66 6f  ements of 0.3 fo
1dd0: 72 20 65 76 65 72 79 20 74 69 63 6b 2e 20 57 68  r every tick. Wh
1de0: 69 6c 65 20 78 20 77 69 6c 6c 20 69 6e 63 72 65  ile x will incre
1df0: 61 73 65 20 74 69 6c 6c 20 34 20 2e 2e 2e 20 69  ase till 4 ... i
1e00: 74 20 77 69 6c 6c 20 64 65 63 72 65 61 73 65 20  t will decrease 
1e10: 6f 6e 63 65 20 69 74 20 72 65 61 63 68 65 73 20  once it reaches 
1e20: 34 20 61 6e 64 20 64 72 6f 70 20 64 6f 77 6e 20  4 and drop down 
1e30: 74 6f 20 33 2e 32 2e 20 41 66 74 65 72 20 72 65  to 3.2. After re
1e40: 61 63 68 69 6e 67 20 33 2e 32 20 79 6f 75 20 63  aching 3.2 you c
1e50: 61 6e 20 73 74 61 79 20 74 68 65 72 65 20 6f 72  an stay there or
1e60: 20 72 65 76 65 72 73 65 20 62 61 63 6b 2e 20 41   reverse back. A
1e70: 74 20 61 6e 79 20 70 6f 69 6e 74 20 64 75 72 69  t any point duri
1e80: 6e 67 20 6c 69 76 65 20 65 64 69 74 69 6e 67 2c  ng live editing,
1e90: 20 79 6f 75 20 63 61 6e 20 61 64 64 20 61 6e 20   you can add an 
1ea0: 65 78 74 72 61 20 65 6c 65 6d 65 6e 74 20 74 6f  extra element to
1eb0: 20 74 68 65 20 61 72 72 61 79 2e 20 49 66 20 79   the array. If y
1ec0: 6f 75 20 61 64 64 20 35 20 66 6f 72 20 65 78 61  ou add 5 for exa
1ed0: 6d 70 6c 65 2c 20 74 68 65 20 6c 6f 6f 70 20 77  mple, the loop w
1ee0: 69 6c 6c 20 63 6f 6e 74 69 6e 75 65 20 66 72 6f  ill continue fro
1ef0: 6d 20 33 2e 32 20 74 6f 20 35 2e 0a 0a 59 6f 75  m 3.2 to 5...You
1f00: 20 63 61 6e 20 74 68 69 6e 6b 20 6f 66 20 65 61   can think of ea
1f10: 63 68 20 65 6c 65 6d 65 6e 74 20 69 6e 20 74 68  ch element in th
1f20: 65 20 61 72 72 61 79 20 61 73 20 74 68 65 20 22  e array as the "
1f30: 66 69 6e 61 6c 20 6b 6e 6f 62 20 70 6f 73 69 74  final knob posit
1f40: 69 6f 6e 22 20 61 6e 64 20 69 6e 20 65 61 63 68  ion" and in each
1f50: 20 63 79 63 6c 65 20 77 65 20 61 72 65 20 6d 6f   cycle we are mo
1f60: 76 69 6e 67 20 74 6f 20 74 68 65 20 6e 65 78 74  ving to the next
1f70: 20 6b 6e 6f 62 20 70 6f 73 69 74 69 6f 6e 20 69   knob position i
1f80: 6e 20 69 6e 63 72 65 6d 65 6e 74 73 20 6f 66 20  n increments of 
1f90: 30 2e 33 0a 0a 41 6e 20 61 6c 74 65 72 6e 61 74  0.3..An alternat
1fa0: 65 20 74 6f 20 41 75 74 6f 4b 6e 6f 62 20 69 73  e to AutoKnob is
1fb0: 20 74 6f 20 75 73 65 20 54 69 6d 65 64 4b 6e 6f   to use TimedKno
1fc0: 62 2e 20 49 6e 20 74 68 65 20 65 6e 64 6c 65 73  b. In the endles
1fd0: 73 20 61 63 69 64 20 62 61 6e 67 65 72 20 20 70  s acid banger  p
1fe0: 72 6f 6a 65 63 74 2c 20 74 68 65 20 62 61 73 69  roject, the basi
1ff0: 63 20 63 6f 64 65 20 77 61 73 20 75 73 69 6e 67  c code was using
2000: 20 61 20 73 69 6d 70 6c 65 20 74 69 6d 65 72 20   a simple timer 
2010: 74 6f 20 72 61 6e 64 6f 6d 6c 79 20 6d 6f 76 65  to randomly move
2020: 20 74 68 65 20 6b 6e 6f 62 20 70 6f 73 69 74 69   the knob positi
2030: 6f 6e 20 61 6c 6f 6e 67 20 77 69 74 68 20 6e 6f  on along with no
2040: 74 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 61  te collections a
2050: 6e 64 20 77 65 69 67 68 74 65 64 20 72 61 6e 64  nd weighted rand
2060: 6f 6d 20 63 68 6f 69 63 65 20 6f 6e 20 6e 6f 74  om choice on not
2070: 65 20 63 6f 6c 6c 65 63 74 69 6f 6e 73 20 66 6f  e collections fo
2080: 72 20 67 65 6e 65 72 61 74 69 6e 67 20 72 68 79  r generating rhy
2090: 74 68 6d 73 2e 0a 0a 54 69 6d 65 64 4b 6e 6f 62  thms...TimedKnob
20a0: 73 20 63 61 6e 20 62 65 20 75 73 65 64 20 74 6f  s can be used to
20b0: 20 61 64 64 20 73 6d 61 6c 6c 20 76 61 72 69 61   add small varia
20c0: 74 69 6f 6e 73 20 69 6e 20 76 6f 6c 75 6d 65 20  tions in volume 
20d0: 74 6f 20 6d 61 6b 65 20 74 68 65 20 64 72 75 6d  to make the drum
20e0: 73 20 73 6f 75 6e 64 73 20 6d 6f 72 65 20 6e 61  s sounds more na
20f0: 74 75 72 61 6c 2e 0a 0a 60 60 60 7b 63 6f 64 65  tural...```{code
2100: 2d 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d 2d 0a 66  -block} js.---.f
2110: 6f 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a  orce: true.---..
2120: 0a 66 75 6e 63 74 69 6f 6e 20 6b 6e 6f 62 28 6f  .function knob(o
2130: 70 74 69 6f 6e 73 29 20 7b 0a 20 20 20 20 6f 70  ptions) {.    op
2140: 74 69 6f 6e 73 20 3d 20 6f 70 74 69 6f 6e 73 20  tions = options 
2150: 7c 7c 20 7b 7d 3b 0a 20 20 20 20 76 61 72 20 63  || {};.    var c
2160: 6f 6e 74 65 78 74 20 3d 20 7b 7d 3b 0a 20 20 20  ontext = {};.   
2170: 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 20 3d 20   context.ramp = 
2180: 6f 70 74 69 6f 6e 73 2e 72 61 6d 70 20 7c 7c 20  options.ramp || 
2190: 5b 30 20 2c 20 31 5d 3b 0a 20 20 20 20 63 6f 6e  [0 , 1];.    con
21a0: 74 65 78 74 2e 63 6f 75 6e 74 5f 73 6b 69 70 20  text.count_skip 
21b0: 3d 20 6f 70 74 69 6f 6e 73 2e 73 70 65 65 64 20  = options.speed 
21c0: 7c 7c 20 34 3b 0a 20 20 20 20 63 6f 6e 74 65 78  || 4;.    contex
21d0: 74 2e 73 74 65 70 20 3d 20 6f 70 74 69 6f 6e 73  t.step = options
21e0: 2e 73 74 65 70 20 7c 7c 20 30 2e 30 31 3b 0a 20  .step || 0.01;. 
21f0: 20 20 20 63 6f 6e 74 65 78 74 2e 72 65 76 65 72     context.rever
2200: 73 65 20 3d 20 6f 70 74 69 6f 6e 73 2e 72 65 76  se = options.rev
2210: 65 72 73 65 20 7c 7c 20 74 72 75 65 3b 0a 20 20  erse || true;.  
2220: 20 20 63 6f 6e 74 65 78 74 2e 6e 75 6d 62 65 72    context.number
2230: 20 3d 20 6f 70 74 69 6f 6e 73 2e 6e 75 6d 62 65   = options.numbe
2240: 72 20 7c 7c 20 6e 75 6c 6c 3b 0a 0a 20 20 20 20  r || null;..    
2250: 63 6f 6e 74 65 78 74 2e 63 75 72 72 65 6e 74 5f  context.current_
2260: 63 6f 75 6e 74 20 3d 20 30 3b 0a 20 20 20 20 63  count = 0;.    c
2270: 6f 6e 74 65 78 74 2e 69 6e 64 65 78 20 3d 20 30  ontext.index = 0
2280: 3b 0a 0a 20 20 20 20 2f 2f 20 53 6d 6f 6f 74 68  ;..    // Smooth
2290: 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 72 6f 6d   transition from
22a0: 20 70 72 65 76 69 6f 75 73 20 6b 6e 6f 62 20 76   previous knob v
22b0: 61 6c 75 65 73 0a 20 20 20 20 69 66 20 28 63 6f  alues.    if (co
22c0: 6e 74 65 78 74 2e 6e 75 6d 62 65 72 29 20 7b 0a  ntext.number) {.
22d0: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e          context.
22e0: 76 61 6c 20 3d 20 77 69 6e 64 6f 77 2e 63 65 6c  val = window.cel
22f0: 6c 78 2e 63 65 6c 6c 78 28 63 6f 6e 74 65 78 74  lx.cellx(context
2300: 2e 6e 75 6d 62 65 72 28 29 29 0a 20 20 20 20 7d  .number()).    }
2310: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
2320: 63 6f 6e 74 65 78 74 2e 76 61 6c 20 3d 20 77 69  context.val = wi
2330: 6e 64 6f 77 2e 63 65 6c 6c 78 2e 63 65 6c 6c 78  ndow.cellx.cellx
2340: 28 6f 70 74 69 6f 6e 73 2e 69 6e 69 74 69 61 6c  (options.initial
2350: 20 7c 7c 20 30 2e 35 29 0a 20 20 20 20 7d 0a 0a   || 0.5).    }..
2360: 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 63 68 61      function cha
2370: 6e 67 65 43 6f 6e 74 65 78 74 28 29 20 7b 0a 20  ngeContext() {. 
2380: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 6e         context.n
2390: 65 78 74 5f 76 61 6c 20 3d 20 63 6f 6e 74 65 78  ext_val = contex
23a0: 74 2e 72 61 6d 70 5b 63 6f 6e 74 65 78 74 2e 69  t.ramp[context.i
23b0: 6e 64 65 78 20 2b 20 31 5d 3b 0a 0a 20 20 20 20  ndex + 1];..    
23c0: 20 20 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28      context.val(
23d0: 63 6f 6e 74 65 78 74 2e 72 61 6d 70 5b 63 6f 6e  context.ramp[con
23e0: 74 65 78 74 2e 69 6e 64 65 78 5d 29 3b 0a 20 20  text.index]);.  
23f0: 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74 65 78        if (contex
2400: 74 2e 76 61 6c 28 29 20 3e 20 63 6f 6e 74 65 78  t.val() > contex
2410: 74 2e 6e 65 78 74 5f 76 61 6c 29 20 7b 0a 20 20  t.next_val) {.  
2420: 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78            contex
2430: 74 2e 64 69 72 65 63 74 69 6f 6e 20 3d 20 2d 31  t.direction = -1
2440: 3b 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65  ;.        } else
2450: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63   {.            c
2460: 6f 6e 74 65 78 74 2e 64 69 72 65 63 74 69 6f 6e  ontext.direction
2470: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
2480: 20 20 20 20 7d 0a 0a 20 20 20 20 63 68 61 6e 67      }..    chang
2490: 65 43 6f 6e 74 65 78 74 28 29 3b 0a 0a 20 20 20  eContext();..   
24a0: 20 72 65 74 75 72 6e 20 7b 0a 20 20 20 20 20 20   return {.      
24b0: 20 20 22 63 65 6c 6c 22 3a 20 63 6f 6e 74 65 78    "cell": contex
24c0: 74 2e 76 61 6c 2c 0a 20 20 20 20 20 20 20 20 22  t.val,.        "
24d0: 70 75 73 68 22 3a 20 66 75 6e 63 74 69 6f 6e 20  push": function 
24e0: 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  (val) {.        
24f0: 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70      context.ramp
2500: 2e 70 75 73 68 28 76 61 6c 29 3b 0a 20 20 20 20  .push(val);.    
2510: 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22      },.        "
2520: 72 65 70 6c 61 63 65 22 3a 20 66 75 6e 63 74 69  replace": functi
2530: 6f 6e 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20  on (val) {.     
2540: 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 72         context.r
2550: 61 6d 70 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20  amp = val;.     
2560: 20 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 73     },.        "s
2570: 70 65 65 64 22 3a 20 66 75 6e 63 74 69 6f 6e 20  peed": function 
2580: 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20 20 20  (val) {.        
2590: 20 20 20 20 63 6f 6e 74 65 78 74 2e 63 6f 75 6e      context.coun
25a0: 74 5f 73 6b 69 70 20 3d 20 76 61 6c 3b 0a 20 20  t_skip = val;.  
25b0: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
25c0: 20 22 73 74 65 70 22 3a 20 66 75 6e 63 74 69 6f   "step": functio
25d0: 6e 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20  n (val) {.      
25e0: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 73 74        context.st
25f0: 65 70 20 3d 20 76 61 6c 3b 0a 20 20 20 20 20 20  ep = val;.      
2600: 20 20 7d 2c 0a 20 20 20 20 20 20 20 20 22 75 70    },.        "up
2610: 22 3a 20 66 75 6e 63 74 69 6f 6e 20 28 76 61 6c  ": function (val
2620: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
2630: 76 61 6c 20 3d 20 76 61 6c 20 7c 7c 20 30 2e 31  val = val || 0.1
2640: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  ;.            co
2650: 6e 74 65 78 74 2e 72 61 6d 70 2e 70 75 73 68 28  ntext.ramp.push(
2660: 63 6f 6e 74 65 78 74 2e 72 61 6d 70 5b 63 6f 6e  context.ramp[con
2670: 74 65 78 74 2e 72 61 6d 70 2e 6c 65 6e 67 74 68  text.ramp.length
2680: 20 2d 20 31 5d 20 2b 20 76 61 6c 29 3b 0a 20 20   - 1] + val);.  
2690: 20 20 20 20 20 20 7d 2c 0a 20 20 20 20 20 20 20        },.       
26a0: 20 22 64 6f 77 6e 22 3a 20 66 75 6e 63 74 69 6f   "down": functio
26b0: 6e 20 28 76 61 6c 29 20 7b 0a 20 20 20 20 20 20  n (val) {.      
26c0: 20 20 20 20 20 20 76 61 6c 20 3d 20 76 61 6c 20        val = val 
26d0: 7c 7c 20 2d 30 2e 31 3b 0a 20 20 20 20 20 20 20  || -0.1;.       
26e0: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d       context.ram
26f0: 70 2e 70 75 73 68 28 63 6f 6e 74 65 78 74 2e 72  p.push(context.r
2700: 61 6d 70 5b 63 6f 6e 74 65 78 74 2e 72 61 6d 70  amp[context.ramp
2710: 2e 6c 65 6e 67 74 68 20 2d 20 31 5d 20 2b 20 76  .length - 1] + v
2720: 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d 2c 0a  al);.        },.
2730: 20 20 20 20 20 20 20 22 6d 6f 76 65 22 3a 20 66         "move": f
2740: 75 6e 63 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20  unction () {.   
2750: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e           if (con
2760: 74 65 78 74 2e 63 75 72 72 65 6e 74 5f 63 6f 75  text.current_cou
2770: 6e 74 20 3e 3d 20 63 6f 6e 74 65 78 74 2e 63 6f  nt >= context.co
2780: 75 6e 74 5f 73 6b 69 70 29 20 7b 0a 20 20 20 20  unt_skip) {.    
2790: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
27a0: 65 78 74 2e 63 75 72 72 65 6e 74 5f 63 6f 75 6e  ext.current_coun
27b0: 74 20 3d 20 31 3b 0a 0a 20 20 20 20 20 20 20 20  t = 1;..        
27c0: 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74          if (cont
27d0: 65 78 74 2e 64 69 72 65 63 74 69 6f 6e 20 3d 3d  ext.direction ==
27e0: 20 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20   1) {.          
27f0: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 63 6d            var cm
2800: 70 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  p = function () 
2810: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2820: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
2830: 20 28 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20   (context.val() 
2840: 3e 3d 20 63 6f 6e 74 65 78 74 2e 6e 65 78 74 5f  >= context.next_
2850: 76 61 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  val);.          
2860: 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20            };.   
2870: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65               } e
2880: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
2890: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 63 6d            var cm
28a0: 70 20 3d 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  p = function () 
28b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
28c0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
28d0: 20 28 63 6f 6e 74 65 78 74 2e 6e 65 78 74 5f 76   (context.next_v
28e0: 61 6c 20 3e 3d 20 63 6f 6e 74 65 78 74 2e 76 61  al >= context.va
28f0: 6c 28 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  l());.          
2900: 20 20 20 20 20 20 20 20 20 20 7d 3b 0a 20 20 20            };.   
2910: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a               }..
2920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2930: 69 66 20 28 63 6d 70 28 29 29 20 7b 0a 20 20 20  if (cmp()) {.   
2940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2950: 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28 63 6f 6e   context.val(con
2960: 74 65 78 74 2e 6e 65 78 74 5f 76 61 6c 29 3b 0a  text.next_val);.
2970: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2980: 20 20 20 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65      context.inde
2990: 78 20 3d 20 63 6f 6e 74 65 78 74 2e 69 6e 64 65  x = context.inde
29a0: 78 20 2b 20 31 3b 0a 20 20 20 20 20 20 20 20 20  x + 1;.         
29b0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
29c0: 6f 6e 74 65 78 74 2e 69 6e 64 65 78 20 3d 3d 3d  ontext.index ===
29d0: 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70 2e 6c 65   context.ramp.le
29e0: 6e 67 74 68 20 2d 31 29 20 7b 0a 20 20 20 20 20  ngth -1) {.     
29f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a00: 20 20 20 69 66 20 28 63 6f 6e 74 65 78 74 2e 72     if (context.r
2a10: 65 76 65 72 73 65 29 20 7b 0a 20 20 20 20 20 20  everse) {.      
2a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a30: 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 69 6e        context.in
2a40: 64 65 78 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  dex = 0;.       
2a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2a60: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 72 61 6d       context.ram
2a70: 70 20 3d 20 63 6f 6e 74 65 78 74 2e 72 61 6d 70  p = context.ramp
2a80: 2e 72 65 76 65 72 73 65 28 29 3b 0a 20 20 20 20  .reverse();.    
2a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2aa0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
2ab0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2ac0: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74           context
2ad0: 2e 69 6e 64 65 78 20 3d 20 63 6f 6e 74 65 78 74  .index = context
2ae0: 2e 69 6e 64 65 78 20 2d 20 31 3b 0a 20 20 20 20  .index - 1;.    
2af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b00: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2b10: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b30: 63 68 61 6e 67 65 43 6f 6e 74 65 78 74 28 29 3b  changeContext();
2b40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2b50: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 76 61 6c       context.val
2b60: 28 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 20 2b  (context.val() +
2b70: 20 63 6f 6e 74 65 78 74 2e 73 74 65 70 20 2a 20   context.step * 
2b80: 63 6f 6e 74 65 78 74 2e 64 69 72 65 63 74 69 6f  context.directio
2b90: 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  n);.            
2ba0: 20 20 20 20 20 20 20 20 69 66 20 28 63 6f 6e 74          if (cont
2bb0: 65 78 74 2e 6e 75 6d 62 65 72 29 20 63 6f 6e 74  ext.number) cont
2bc0: 65 78 74 2e 6e 75 6d 62 65 72 28 63 6f 6e 74 65  ext.number(conte
2bd0: 78 74 2e 76 61 6c 28 29 29 3b 0a 20 20 20 20 20  xt.val());.     
2be0: 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73             } els
2bf0: 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e {.            
2c00: 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78 74 2e          context.
2c10: 76 61 6c 28 63 6f 6e 74 65 78 74 2e 76 61 6c 28  val(context.val(
2c20: 29 20 2b 20 63 6f 6e 74 65 78 74 2e 73 74 65 70  ) + context.step
2c30: 20 2a 20 63 6f 6e 74 65 78 74 2e 64 69 72 65 63   * context.direc
2c40: 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  tion);.         
2c50: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
2c60: 6f 6e 74 65 78 74 2e 6e 75 6d 62 65 72 29 20 63  ontext.number) c
2c70: 6f 6e 74 65 78 74 2e 6e 75 6d 62 65 72 28 63 6f  ontext.number(co
2c80: 6e 74 65 78 74 2e 76 61 6c 28 29 29 3b 0a 20 20  ntext.val());.  
2c90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
2ca0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c              } el
2cb0: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  se {.           
2cc0: 20 20 20 20 20 63 6f 6e 74 65 78 74 2e 63 75 72       context.cur
2cd0: 72 65 6e 74 5f 63 6f 75 6e 74 20 2b 3d 20 31 3b  rent_count += 1;
2ce0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  .            }..
2cf0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
2d00: 6e 20 63 6f 6e 74 65 78 74 2e 76 61 6c 28 29 3b  n context.val();
2d10: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  .        }.    }
2d20: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 74 69 6d  .}..function tim
2d30: 65 64 4b 6e 6f 62 28 6f 70 74 69 6f 6e 73 29 20  edKnob(options) 
2d40: 7b 0a 20 20 20 20 6f 70 74 69 6f 6e 73 20 3d 20  {.    options = 
2d50: 6f 70 74 69 6f 6e 73 20 7c 7c 20 7b 7d 3b 0a 20  options || {};. 
2d60: 20 20 20 76 61 72 20 63 6f 6e 74 65 78 74 20 3d     var context =
2d70: 20 7b 7d 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74   {};.    context
2d80: 2e 69 6e 74 65 72 76 61 6c 20 3d 20 6f 70 74 69  .interval = opti
2d90: 6f 6e 73 2e 69 6e 74 65 72 76 61 6c 20 7c 7c 20  ons.interval || 
2da0: 31 30 30 3b 0a 20 20 20 20 63 6f 6e 74 65 78 74  100;.    context
2db0: 2e 6b 6e 6f 62 20 3d 20 6b 6e 6f 62 28 6f 70 74  .knob = knob(opt
2dc0: 69 6f 6e 73 29 3b 0a 0a 20 20 20 20 63 6f 6e 74  ions);..    cont
2dd0: 65 78 74 2e 74 69 6d 65 72 20 3d 20 73 65 74 49  ext.timer = setI
2de0: 6e 74 65 72 76 61 6c 28 66 75 6e 63 74 69 6f 6e  nterval(function
2df0: 20 28 29 20 7b 0a 20 20 20 20 20 20 20 63 6f 6e   () {.       con
2e00: 74 65 78 74 2e 6b 6e 6f 62 2e 6d 6f 76 65 28 29  text.knob.move()
2e10: 3b 0a 20 20 20 20 7d 2c 20 63 6f 6e 74 65 78 74  ;.    }, context
2e20: 2e 69 6e 74 65 72 76 61 6c 29 3b 0a 0a 20 20 20  .interval);..   
2e30: 20 63 6f 6e 74 65 78 74 2e 6b 6e 6f 62 5b 22 63   context.knob["c
2e40: 6c 65 61 72 22 5d 20 3d 20 66 75 6e 63 74 69 6f  lear"] = functio
2e50: 6e 20 28 29 20 7b 0a 20 20 20 20 20 20 20 20 63  n () {.        c
2e60: 6c 65 61 72 49 6e 74 65 72 76 61 6c 28 63 6f 6e  learInterval(con
2e70: 74 65 78 74 2e 74 69 6d 65 72 29 3b 0a 20 20 20  text.timer);.   
2e80: 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20 63   }..    return c
2e90: 6f 6e 74 65 78 74 2e 6b 6e 6f 62 3b 0a 7d 0a 60  ontext.knob;.}.`
2ea0: 60 60 0a 0a 23 23 20 4d 61 69 6e 20 55 49 0a 0a  ``..## Main UI..
2eb0: 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63 6b 7d 20  ```{code-block} 
2ec0: 68 74 6d 6c 0a 2d 2d 2d 0a 66 6f 72 63 65 3a 20  html.---.force: 
2ed0: 74 72 75 65 0a 2d 2d 2d 0a 0a 0a 3c 62 69 74 72  true.---...<bitr
2ee0: 68 79 74 68 6d 3e 0a 0a 3c 64 69 76 3e 0a 20 20  hythm>..<div>.  
2ef0: 20 20 3c 76 73 74 61 63 6b 20 69 64 3d 22 68 65    <vstack id="he
2f00: 61 64 65 72 2d 70 6c 61 79 62 61 63 6b 22 3e 0a  ader-playback">.
2f10: 20 20 20 20 20 20 20 20 3c 68 73 74 61 63 6b 3e          <hstack>
2f20: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 64 69  .            <di
2f30: 76 20 63 6c 61 73 73 3d 22 6d 6c 2d 32 22 3e 0a  v class="ml-2">.
2f40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2f50: 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62 75  <button type="bu
2f60: 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74 6e  tton" class="btn
2f70: 20 62 74 6e 2d 70 72 69 6d 61 72 79 20 77 2d 31   btn-primary w-1
2f80: 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d 31 22 20 6f  /10 ml-2 mt-1" o
2f90: 6e 63 6c 69 63 6b 3d 7b 61 64 64 44 69 61 6c 7d  nclick={addDial}
2fa0: 3e 2b 20 44 69 61 6c 3c 2f 62 75 74 74 6f 6e 3e  >+ Dial</button>
2fb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
2fc0: 20 3c 62 75 74 74 6f 6e 20 74 79 70 65 3d 22 62   <button type="b
2fd0: 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74  utton" class="bt
2fe0: 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79 20 77 2d  n btn-primary w-
2ff0: 31 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d 31 22 20  1/10 ml-2 mt-1" 
3000: 6f 6e 63 6c 69 63 6b 3d 7b 61 64 64 4e 75 6d 62  onclick={addNumb
3010: 65 72 7d 3e 2b 20 4e 75 6d 62 65 72 3c 2f 62 75  er}>+ Number</bu
3020: 74 74 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20  tton>.          
3030: 20 20 20 20 20 20 3c 21 2d 2d 20 3c 62 75 74 74        <!-- <butt
3040: 6f 6e 20 74 79 70 65 3d 22 62 75 74 74 6f 6e 22  on type="button"
3050: 20 63 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e 2d   class="btn btn-
3060: 70 72 69 6d 61 72 79 20 77 2d 31 2f 31 30 20 6d  primary w-1/10 m
3070: 6c 2d 32 20 6d 74 2d 31 22 20 6f 6e 63 6c 69 63  l-2 mt-1" onclic
3080: 6b 3d 7b 61 64 64 53 61 6d 70 6c 65 7d 3e 2b 20  k={addSample}>+ 
3090: 53 61 6d 70 6c 65 20 46 69 6c 65 3c 2f 62 75 74  Sample File</but
30a0: 74 6f 6e 3e 20 2d 2d 3e 0a 20 20 20 20 20 20 20  ton> -->.       
30b0: 20 20 20 20 20 20 20 20 20 3c 62 75 74 74 6f 6e           <button
30c0: 20 74 79 70 65 3d 22 62 75 74 74 6f 6e 22 20 63   type="button" c
30d0: 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70 72  lass="btn btn-pr
30e0: 69 6d 61 72 79 20 77 2d 31 2f 31 30 20 6d 6c 2d  imary w-1/10 ml-
30f0: 32 20 6d 74 2d 31 22 20 6f 6e 63 6c 69 63 6b 3d  2 mt-1" onclick=
3100: 7b 61 64 64 53 61 6d 70 6c 65 55 52 4c 7d 3e 2b  {addSampleURL}>+
3110: 20 53 61 6d 70 6c 65 20 55 52 4c 3c 2f 62 75 74   Sample URL</but
3120: 74 6f 6e 3e 0a 20 20 20 20 20 20 20 20 20 20 20  ton>.           
3130: 20 3c 2f 64 69 76 3e 0a 0a 20 20 20 20 20 20 20   </div>..       
3140: 20 20 20 20 20 3c 64 69 76 20 63 6c 61 73 73 3d       <div class=
3150: 22 6d 6c 2d 32 22 20 3e 0a 20 20 20 20 20 20 20  "ml-2" >.       
3160: 20 20 20 20 20 20 20 20 20 3c 6c 61 62 65 6c 20           <label 
3170: 66 6f 72 3d 22 74 65 6d 70 6f 2d 76 61 6c 75 65  for="tempo-value
3180: 22 3e 54 65 6d 70 6f 20 2f 20 54 69 63 6b 73 3c  ">Tempo / Ticks<
3190: 2f 6c 61 62 65 6c 3e 3c 62 72 3e 0a 20 20 20 20  /label><br>.    
31a0: 20 20 20 20 20 20 20 20 20 20 20 20 3c 69 6e 70              <inp
31b0: 75 74 20 74 79 70 65 3d 22 74 65 78 74 22 20 69  ut type="text" i
31c0: 64 3d 22 74 65 6d 70 6f 2d 76 61 6c 75 65 22 20  d="tempo-value" 
31d0: 76 61 6c 75 65 3d 7b 73 74 61 74 65 2e 74 65 6d  value={state.tem
31e0: 70 6f 7d 20 73 74 79 6c 65 3d 22 77 69 64 74 68  po} style="width
31f0: 3a 20 31 35 30 70 78 22 20 6f 6e 6b 65 79 75 70  : 150px" onkeyup
3200: 3d 7b 20 65 64 69 74 54 65 6d 70 6f 20 7d 2f 3e  ={ editTempo }/>
3210: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3220: 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22 74 65   <input type="te
3230: 78 74 22 20 20 63 6c 61 73 73 3d 22 6d 74 2d 32  xt"  class="mt-2
3240: 22 20 69 64 3d 22 74 69 63 6b 2d 76 61 6c 75 65  " id="tick-value
3250: 22 20 76 61 6c 75 65 3d 7b 73 74 61 74 65 2e 74  " value={state.t
3260: 69 63 6b 73 7d 20 73 74 79 6c 65 3d 22 77 69 64  icks} style="wid
3270: 74 68 3a 20 31 35 30 70 78 22 20 6f 6e 6b 65 79  th: 150px" onkey
3280: 75 70 3d 7b 65 64 69 74 54 69 63 6b 73 7d 2f 3e  up={editTicks}/>
3290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f 64  .            </d
32a0: 69 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20  iv>.            
32b0: 3c 64 69 76 20 63 6c 61 73 73 3d 22 6d 6c 2d 32  <div class="ml-2
32c0: 22 20 73 74 79 6c 65 3d 22 6d 69 6e 2d 77 69 64  " style="min-wid
32d0: 74 68 3a 20 32 35 30 70 78 3b 22 3e 0a 20 20 20  th: 250px;">.   
32e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 3c 6c 61               <la
32f0: 62 65 6c 20 66 6f 72 3d 22 64 75 72 61 74 69 6f  bel for="duratio
3300: 6e 22 3e 42 61 72 73 20 2f 20 54 69 63 6b 73 20  n">Bars / Ticks 
3310: 2f 20 53 65 63 6f 6e 64 73 3c 2f 6c 61 62 65 6c  / Seconds</label
3320: 3e 3c 62 72 3e 0a 20 20 20 20 20 20 20 20 20 20  ><br>.          
3330: 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d 22 64        <div id="d
3340: 75 72 61 74 69 6f 6e 22 20 3e 3c 2f 64 69 76 3e  uration" ></div>
3350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f 64  .            </d
3360: 69 76 3e 0a 20 20 20 20 20 20 20 20 3c 2f 68 73  iv>.        </hs
3370: 74 61 63 6b 3e 0a 0a 20 20 20 20 20 20 20 20 3c  tack>..        <
3380: 64 69 76 20 63 6c 61 73 73 3d 22 6d 74 2d 32 20  div class="mt-2 
3390: 6d 6c 2d 32 22 20 3e 0a 20 20 20 20 20 20 20 20  ml-2" >.        
33a0: 20 20 20 20 3c 62 75 74 74 6f 6e 20 74 79 70 65      <button type
33b0: 3d 22 62 75 74 74 6f 6e 22 20 63 6c 61 73 73 3d  ="button" class=
33c0: 22 62 74 6e 20 62 74 6e 2d 70 72 69 6d 61 72 79  "btn btn-primary
33d0: 20 77 2d 31 2f 31 30 20 6d 6c 2d 32 20 6d 74 2d   w-1/10 ml-2 mt-
33e0: 31 22 20 20 6f 6e 63 6c 69 63 6b 3d 7b 70 6c 61  1"  onclick={pla
33f0: 79 7d 3e 50 6c 61 79 3c 2f 62 75 74 74 6f 6e 3e  y}>Play</button>
3400: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 62 75  .            <bu
3410: 74 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74 6f  tton type="butto
3420: 6e 22 20 63 6c 61 73 73 3d 22 62 74 6e 20 62 74  n" class="btn bt
3430: 6e 2d 70 72 69 6d 61 72 79 20 6d 6c 2d 32 22 20  n-primary ml-2" 
3440: 6f 6e 63 6c 69 63 6b 3d 7b 73 61 76 65 7d 3e 53  onclick={save}>S
3450: 61 76 65 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20 20  ave</button>.   
3460: 20 20 20 20 20 20 20 20 20 3c 62 75 74 74 6f 6e           <button
3470: 20 74 79 70 65 3d 22 62 75 74 74 6f 6e 22 20 63   type="button" c
3480: 6c 61 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70 72  lass="btn btn-pr
3490: 69 6d 61 72 79 20 6d 6c 2d 32 22 20 6f 6e 63 6c  imary ml-2" oncl
34a0: 69 63 6b 3d 7b 72 65 73 65 74 7d 3e 52 65 73 65  ick={reset}>Rese
34b0: 74 3c 2f 62 75 74 74 6f 6e 3e 0a 20 20 20 20 20  t</button>.     
34c0: 20 20 20 20 20 20 20 3c 62 75 74 74 6f 6e 20 74         <button t
34d0: 79 70 65 3d 22 62 75 74 74 6f 6e 22 20 63 6c 61  ype="button" cla
34e0: 73 73 3d 22 62 74 6e 20 62 74 6e 2d 70 72 69 6d  ss="btn btn-prim
34f0: 61 72 79 20 6d 6c 2d 32 22 20 6f 6e 63 6c 69 63  ary ml-2" onclic
3500: 6b 3d 7b 72 65 6c 6f 61 64 7d 3e 57 69 6e 64 6f  k={reload}>Windo
3510: 77 20 52 65 6c 6f 61 64 3c 2f 62 75 74 74 6f 6e  w Reload</button
3520: 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 62  >.            <b
3530: 75 74 74 6f 6e 20 74 79 70 65 3d 22 62 75 74 74  utton type="butt
3540: 6f 6e 22 20 63 6c 61 73 73 3d 22 62 74 6e 20 62  on" class="btn b
3550: 74 6e 2d 70 72 69 6d 61 72 79 20 6d 6c 2d 32 22  tn-primary ml-2"
3560: 20 6f 6e 63 6c 69 63 6b 3d 7b 64 6f 77 6e 6c 6f   onclick={downlo
3570: 61 64 7d 3e 53 61 76 65 20 46 69 6c 65 3c 2f 62  ad}>Save File</b
3580: 75 74 74 6f 6e 3e 0a 0a 20 20 20 20 20 20 20 20  utton>..        
3590: 20 20 20 20 3c 69 6e 70 75 74 20 63 6c 61 73 73      <input class
35a0: 3d 22 6d 6c 2d 31 22 20 6e 61 6d 65 3d 22 65 64  ="ml-1" name="ed
35b0: 69 74 2d 6d 6f 64 65 22 20 69 64 3d 22 65 64 69  it-mode" id="edi
35c0: 74 2d 6d 6f 64 65 22 20 74 79 70 65 3d 22 63 68  t-mode" type="ch
35d0: 65 63 6b 62 6f 78 22 2f 3e 0a 20 20 20 20 20 20  eckbox"/>.      
35e0: 20 20 20 20 20 20 3c 6c 61 62 65 6c 20 66 6f 72        <label for
35f0: 3d 22 65 64 69 74 2d 6d 6f 64 65 22 3e 45 64 69  ="edit-mode">Edi
3600: 74 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20  t</label>.      
3610: 20 20 20 20 20 20 3c 69 6e 70 75 74 20 63 6c 61        <input cla
3620: 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d 65 3d 22  ss="ml-1" name="
3630: 6c 6f 61 64 2d 6d 6f 64 65 22 20 69 64 3d 22 6c  load-mode" id="l
3640: 6f 61 64 2d 6d 6f 64 65 22 20 74 79 70 65 3d 22  oad-mode" type="
3650: 63 68 65 63 6b 62 6f 78 22 2f 3e 0a 20 20 20 20  checkbox"/>.    
3660: 20 20 20 20 20 20 20 20 3c 6c 61 62 65 6c 20 66          <label f
3670: 6f 72 3d 22 6c 6f 61 64 2d 6d 6f 64 65 22 3e 45  or="load-mode">E
3680: 78 65 63 75 74 65 20 54 72 61 6e 73 69 74 69 6f  xecute Transitio
3690: 6e 3c 2f 6c 61 62 65 6c 3e 0a 20 20 20 20 20 20  n</label>.      
36a0: 20 20 20 20 20 20 3c 69 6e 70 75 74 20 63 6c 61        <input cla
36b0: 73 73 3d 22 6d 6c 2d 31 22 20 6e 61 6d 65 3d 22  ss="ml-1" name="
36c0: 6c 6f 61 64 2d 6d 6f 64 65 22 20 69 64 3d 22 72  load-mode" id="r
36d0: 65 64 6f 22 20 74 79 70 65 3d 22 63 68 65 63 6b  edo" type="check
36e0: 62 6f 78 22 2f 3e 0a 20 20 20 20 20 20 20 20 20  box"/>.         
36f0: 20 20 20 3c 6c 61 62 65 6c 20 66 6f 72 3d 22 72     <label for="r
3700: 65 64 6f 22 3e 52 65 64 6f 20 42 61 72 3c 2f 6c  edo">Redo Bar</l
3710: 61 62 65 6c 3e 0a 20 20 20 20 20 20 20 20 3c 2f  abel>.        </
3720: 64 69 76 3e 0a 0a 20 20 20 20 20 20 20 20 3c 76  div>..        <v
3730: 73 74 61 63 6b 20 69 64 3d 22 73 61 6d 70 6c 65  stack id="sample
3740: 73 2d 62 6c 6f 63 6b 22 3e 0a 20 20 20 20 20 20  s-block">.      
3750: 20 20 20 20 20 20 3c 64 69 76 20 65 61 63 68 3d        <div each=
3760: 7b 20 6b 65 79 2c 20 69 6e 64 65 78 20 69 6e 20  { key, index in 
3770: 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 7d 20 3e  state.samples} >
3780: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
3790: 20 3c 64 69 76 20 69 66 3d 7b 20 73 74 61 74 65   <div if={ state
37a0: 2e 73 61 6d 70 6c 65 73 20 26 26 20 73 74 61 74  .samples && stat
37b0: 65 2e 73 61 6d 70 6c 65 73 5b 69 6e 64 65 78 5d  e.samples[index]
37c0: 20 7d 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20   }>.            
37d0: 20 20 20 20 20 20 20 20 3c 73 61 6d 70 6c 65 20          <sample 
37e0: 20 73 65 74 73 61 6d 70 6c 65 3d 7b 73 65 74 53   setsample={setS
37f0: 61 6d 70 6c 65 7d 20 72 6d 73 61 6d 70 6c 65 3d  ample} rmsample=
3800: 7b 72 6d 53 61 6d 70 6c 65 7d 20 73 61 6d 70 6c  {rmSample} sampl
3810: 65 73 3d 7b 73 74 61 74 65 2e 73 61 6d 70 6c 65  es={state.sample
3820: 73 7d 20 74 69 3d 7b 69 6e 64 65 78 20 2b 20 31  s} ti={index + 1
3830: 7d 3e 3c 2f 73 61 6d 70 6c 65 3e 0a 20 20 20 20  }></sample>.    
3840: 20 20 20 20 20 20 20 20 20 20 20 20 3c 2f 64 69              </di
3850: 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  v>.            <
3860: 2f 64 69 76 3e 0a 20 20 20 20 20 20 20 20 3c 2f  /div>.        </
3870: 76 73 74 61 63 6b 3e 0a 0a 20 20 20 20 20 20 20  vstack>..       
3880: 20 3c 68 73 74 61 63 6b 20 73 74 79 6c 65 3d 22   <hstack style="
3890: 6d 61 72 67 69 6e 2d 74 6f 70 3a 20 31 36 70 78  margin-top: 16px
38a0: 22 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  ">.            <
38b0: 64 69 76 20 65 61 63 68 3d 7b 20 6b 65 79 2c 20  div each={ key, 
38c0: 69 6e 64 65 78 20 69 6e 20 73 74 61 74 65 2e 64  index in state.d
38d0: 69 61 6c 73 7d 3e 0a 20 20 20 20 20 20 20 20 20  ials}>.         
38e0: 20 20 20 20 20 20 20 3c 64 69 61 6c 20 72 6d 64         <dial rmd
38f0: 69 61 6c 3d 7b 72 6d 44 69 61 6c 7d 20 20 76 3d  ial={rmDial}  v=
3900: 7b 73 74 61 74 65 2e 64 69 61 6c 73 5b 69 6e 64  {state.dials[ind
3910: 65 78 5d 7d 20 74 69 3d 7b 69 6e 64 65 78 20 2b  ex]} ti={index +
3920: 20 31 7d 3e 3c 2f 64 69 61 6c 3e 0a 20 20 20 20   1}></dial>.    
3930: 20 20 20 20 20 20 20 20 3c 2f 64 69 76 3e 0a 20          </div>. 
3940: 20 20 20 20 20 20 20 3c 2f 68 73 74 61 63 6b 3e         </hstack>
3950: 0a 0a 20 20 20 20 20 20 20 20 3c 68 73 74 61 63  ..        <hstac
3960: 6b 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  k>.            <
3970: 64 69 76 20 65 61 63 68 3d 7b 20 6b 65 79 2c 20  div each={ key, 
3980: 69 6e 64 65 78 20 69 6e 20 73 74 61 74 65 2e 6e  index in state.n
3990: 75 6d 62 65 72 73 7d 3e 0a 20 20 20 20 20 20 20  umbers}>.       
39a0: 20 20 20 20 20 20 20 20 20 3c 6e 75 6d 62 65 72           <number
39b0: 20 72 6d 6e 75 6d 62 65 72 3d 7b 72 6d 4e 75 6d   rmnumber={rmNum
39c0: 62 65 72 7d 20 76 3d 7b 73 74 61 74 65 2e 6e 75  ber} v={state.nu
39d0: 6d 62 65 72 73 5b 69 6e 64 65 78 5d 7d 20 74 69  mbers[index]} ti
39e0: 3d 7b 69 6e 64 65 78 20 2b 20 31 7d 3e 3c 2f 6e  ={index + 1}></n
39f0: 75 6d 62 65 72 3e 0a 20 20 20 20 20 20 20 20 20  umber>.         
3a00: 20 20 20 3c 2f 64 69 76 3e 0a 20 20 20 20 20 20     </div>.      
3a10: 20 20 3c 2f 68 73 74 61 63 6b 3e 0a 0a 20 20 20    </hstack>..   
3a20: 20 3c 2f 76 73 74 61 63 6b 3e 0a 0a 20 20 20 20   </vstack>..    
3a30: 3c 64 69 76 20 69 64 3d 22 63 75 65 64 22 20 63  <div id="cued" c
3a40: 6c 61 73 73 3d 22 70 2d 32 22 20 73 74 79 6c 65  lass="p-2" style
3a50: 3d 22 63 6f 6c 6f 72 3a 20 77 68 69 74 65 20 21  ="color: white !
3a60: 69 6d 70 6f 72 74 61 6e 74 3b 20 68 65 69 67 68  important; heigh
3a70: 74 3a 20 33 32 70 78 3b 20 66 6f 6e 74 2d 73 69  t: 32px; font-si
3a80: 7a 65 3a 20 32 34 70 78 3b 22 3e 3c 2f 64 69 76  ze: 24px;"></div
3a90: 3e 0a 20 20 20 20 3c 64 69 76 20 69 64 3d 22 65  >.    <div id="e
3aa0: 72 72 6f 72 22 20 63 6c 61 73 73 3d 22 70 2d 32  rror" class="p-2
3ab0: 22 20 73 74 79 6c 65 3d 22 63 6f 6c 6f 72 3a 20  " style="color: 
3ac0: 79 65 6c 6c 6f 77 20 21 69 6d 70 6f 72 74 61 6e  yellow !importan
3ad0: 74 3b 20 68 65 69 67 68 74 3a 20 33 32 70 78 3b  t; height: 32px;
3ae0: 20 66 6f 6e 74 2d 73 69 7a 65 3a 20 31 32 70 78   font-size: 12px
3af0: 3b 22 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 3c 64  ;"></div>.    <d
3b00: 69 76 20 69 64 3d 22 63 61 6e 76 61 73 2d 63 6f  iv id="canvas-co
3b10: 6e 74 61 69 6e 65 72 22 20 73 74 79 6c 65 3d 22  ntainer" style="
3b20: 70 6f 73 69 74 69 6f 6e 3a 20 72 65 6c 61 74 69  position: relati
3b30: 76 65 3b 22 3e 0a 20 20 20 20 20 20 20 20 3c 64  ve;">.        <d
3b40: 69 76 20 69 64 3d 22 70 35 22 20 73 74 79 6c 65  iv id="p5" style
3b50: 3d 22 70 6f 73 69 74 69 6f 6e 3a 20 61 62 73 6f  ="position: abso
3b60: 6c 75 74 65 3b 20 77 69 64 74 68 3a 20 31 30 30  lute; width: 100
3b70: 25 3b 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 62  %; background: b
3b80: 6c 61 63 6b 22 3e 3c 2f 64 69 76 3e 0a 20 20 20  lack"></div>.   
3b90: 20 20 20 20 20 3c 63 61 6e 76 61 73 20 69 64 3d       <canvas id=
3ba0: 22 76 69 73 75 61 6c 22 20 73 74 79 6c 65 3d 22  "visual" style="
3bb0: 70 6f 73 69 74 69 6f 6e 3a 20 61 62 73 6f 6c 75  position: absolu
3bc0: 74 65 3b 20 77 69 64 74 68 3a 20 31 30 30 25 3b  te; width: 100%;
3bd0: 20 62 61 63 6b 67 72 6f 75 6e 64 3a 20 62 6c 61   background: bla
3be0: 63 6b 3b 22 3e 3c 2f 63 61 6e 76 61 73 3e 0a 20  ck;"></canvas>. 
3bf0: 20 20 20 20 20 20 20 3c 64 69 76 20 69 64 3d 22         <div id="
3c00: 63 6f 64 65 22 20 73 74 79 6c 65 3d 22 70 6f 73  code" style="pos
3c10: 69 74 69 6f 6e 3a 20 61 62 73 6f 6c 75 74 65 3b  ition: absolute;
3c20: 22 3e 3c 2f 64 69 76 3e 0a 20 20 20 20 3c 2f 64  "></div>.    </d
3c30: 69 76 3e 0a 20 20 20 20 0a 3c 2f 64 69 76 3e 0a  iv>.    .</div>.
3c40: 0a 3c 73 74 79 6c 65 3e 0a 3a 68 6f 73 74 20 7b  .<style>.:host {
3c50: 0a 20 20 20 20 6d 61 72 67 69 6e 2d 74 6f 70 3a  .    margin-top:
3c60: 20 34 76 68 3b 0a 7d 0a 3c 2f 73 74 79 6c 65 3e   4vh;.}.</style>
3c70: 0a 0a 3c 73 63 72 69 70 74 3e 0a 76 61 72 20 6f  ..<script>.var o
3c80: 6c 64 43 6f 64 65 20 3d 20 22 22 3b 0a 76 61 72  ldCode = "";.var
3c90: 20 6f 6c 64 50 61 74 74 65 72 6e 73 20 3d 20 5b   oldPatterns = [
3ca0: 5d 3b 0a 0a 4d 6f 75 73 65 74 72 61 70 2e 73 74  ];..Mousetrap.st
3cb0: 6f 70 43 61 6c 6c 62 61 63 6b 20 3d 20 66 75 6e  opCallback = fun
3cc0: 63 74 69 6f 6e 28 65 2c 20 65 6c 65 6d 65 6e 74  ction(e, element
3cd0: 2c 20 63 6f 6d 62 6f 29 20 7b 0a 20 20 20 20 72  , combo) {.    r
3ce0: 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 0a 0a  eturn false;.}..
3cf0: 4d 6f 75 73 65 74 72 61 70 2e 62 69 6e 64 28 5b  Mousetrap.bind([
3d00: 27 66 39 27 5d 2c 20 66 75 6e 63 74 69 6f 6e 28  'f9'], function(
3d10: 65 29 20 7b 0a 20 20 20 20 69 66 20 28 64 6f 63  e) {.    if (doc
3d20: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
3d30: 42 79 49 64 28 27 65 64 69 74 2d 6d 6f 64 65 27  ById('edit-mode'
3d40: 29 2e 63 68 65 63 6b 65 64 29 20 7b 0a 20 20 20  ).checked) {.   
3d50: 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65       document.ge
3d60: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 65 64  tElementById('ed
3d70: 69 74 2d 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65  it-mode').checke
3d80: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d  d = false;.    }
3d90: 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20   else {.        
3da0: 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d  document.getElem
3db0: 65 6e 74 42 79 49 64 28 27 65 64 69 74 2d 6d 6f  entById('edit-mo
3dc0: 64 65 27 29 2e 63 68 65 63 6b 65 64 20 3d 20 74  de').checked = t
3dd0: 72 75 65 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  rue;.    }..    
3de0: 72 65 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 29  return false;.})
3df0: 3b 0a 0a 4d 6f 75 73 65 74 72 61 70 2e 62 69 6e  ;..Mousetrap.bin
3e00: 64 28 5b 27 63 74 72 6c 2b 31 27 5d 2c 20 66 75  d(['ctrl+1'], fu
3e10: 6e 63 74 69 6f 6e 28 65 29 20 7b 0a 0a 20 20 20  nction(e) {..   
3e20: 20 69 66 20 28 64 6f 63 75 6d 65 6e 74 2e 67 65   if (document.ge
3e30: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 72 65  tElementById('re
3e40: 64 6f 27 29 2e 63 68 65 63 6b 65 64 29 20 7b 0a  do').checked) {.
3e50: 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
3e60: 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28  .getElementById(
3e70: 27 72 65 64 6f 27 29 2e 63 68 65 63 6b 65 64 20  'redo').checked 
3e80: 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 20 65  = false;.    } e
3e90: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 64 6f  lse {.        do
3ea0: 63 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e  cument.getElemen
3eb0: 74 42 79 49 64 28 27 72 65 64 6f 27 29 2e 63 68  tById('redo').ch
3ec0: 65 63 6b 65 64 20 3d 20 74 72 75 65 3b 0a 20 20  ecked = true;.  
3ed0: 20 20 7d 0a 0a 20 20 20 20 72 65 74 75 72 6e 20    }..    return 
3ee0: 66 61 6c 73 65 3b 0a 7d 29 3b 0a 0a 4d 6f 75 73  false;.});..Mous
3ef0: 65 74 72 61 70 2e 62 69 6e 64 28 5b 27 66 31 30  etrap.bind(['f10
3f00: 27 5d 2c 20 66 75 6e 63 74 69 6f 6e 28 65 29 20  '], function(e) 
3f10: 7b 0a 20 20 20 20 69 66 20 28 64 6f 63 75 6d 65  {.    if (docume
3f20: 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49  nt.getElementByI
3f30: 64 28 27 6c 6f 61 64 2d 6d 6f 64 65 27 29 2e 63  d('load-mode').c
3f40: 68 65 63 6b 65 64 29 20 7b 0a 20 20 20 20 20 20  hecked) {.      
3f50: 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c    document.getEl
3f60: 65 6d 65 6e 74 42 79 49 64 28 27 6c 6f 61 64 2d  ementById('load-
3f70: 6d 6f 64 65 27 29 2e 63 68 65 63 6b 65 64 20 3d  mode').checked =
3f80: 20 66 61 6c 73 65 3b 0a 20 20 20 20 7d 20 65 6c   false;.    } el
3f90: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 64 6f 63  se {.        doc
3fa0: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
3fb0: 42 79 49 64 28 27 6c 6f 61 64 2d 6d 6f 64 65 27  ById('load-mode'
3fc0: 29 2e 63 68 65 63 6b 65 64 20 3d 20 74 72 75 65  ).checked = true
3fd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
3fe0: 72 6e 20 66 61 6c 73 65 3b 0a 7d 29 3b 0a 0a 4d  rn false;.});..M
3ff0: 6f 75 73 65 74 72 61 70 2e 62 69 6e 64 28 5b 27  ousetrap.bind(['
4000: 63 74 72 6c 2b 30 27 5d 2c 20 66 75 6e 63 74 69  ctrl+0'], functi
4010: 6f 6e 28 65 29 20 7b 0a 20 20 20 20 24 28 22 23  on(e) {.    $("#
4020: 73 61 6d 70 6c 65 73 2d 62 6c 6f 63 6b 22 29 2e  samples-block").
4030: 74 6f 67 67 6c 65 28 29 3b 0a 20 20 20 20 72 65  toggle();.    re
4040: 74 75 72 6e 20 66 61 6c 73 65 3b 0a 7d 29 3b 0a  turn false;.});.
4050: 0a 0a 66 6f 72 20 28 6c 65 74 20 69 20 3d 20 31  ..for (let i = 1
4060: 3b 20 69 20 3c 3d 20 38 3b 20 69 2b 2b 29 20 7b  ; i <= 8; i++) {
4070: 0a 20 20 20 20 4d 6f 75 73 65 74 72 61 70 2e 62  .    Mousetrap.b
4080: 69 6e 64 28 5b 27 66 27 20 2b 20 69 5d 2c 20 66  ind(['f' + i], f
4090: 75 6e 63 74 69 6f 6e 28 65 29 20 7b 0a 20 20 20  unction(e) {.   
40a0: 20 20 20 20 20 69 66 20 28 69 20 3c 3d 20 73 61       if (i <= sa
40b0: 6d 70 6c 65 73 2e 6c 65 6e 67 74 68 29 20 7b 0a  mples.length) {.
40c0: 20 20 20 20 20 20 20 20 20 20 20 20 70 28 69 20              p(i 
40d0: 2d 20 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  - 1);.        }.
40e0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
40f0: 61 6c 73 65 3b 0a 20 20 20 20 7d 29 3b 0a 7d 0a  alse;.    });.}.
4100: 0a 2f 2f 20 76 61 72 20 61 75 64 69 6f 20 3d 20  .// var audio = 
4110: 6e 65 77 20 41 75 64 69 6f 28 29 3b 0a 2f 2f 20  new Audio();.// 
4120: 61 75 64 69 6f 2e 6c 6f 6f 70 20 3d 20 74 72 75  audio.loop = tru
4130: 65 3b 0a 63 6f 6e 73 74 20 61 63 74 78 20 3d 20  e;.const actx = 
4140: 54 6f 6e 65 2e 63 6f 6e 74 65 78 74 3b 0a 63 6f  Tone.context;.co
4150: 6e 73 74 20 64 65 73 74 20 3d 20 61 63 74 78 2e  nst dest = actx.
4160: 63 72 65 61 74 65 4d 65 64 69 61 53 74 72 65 61  createMediaStrea
4170: 6d 44 65 73 74 69 6e 61 74 69 6f 6e 28 29 3b 0a  mDestination();.
4180: 63 6f 6e 73 74 20 72 65 63 6f 72 64 65 72 20 3d  const recorder =
4190: 20 6e 65 77 20 4d 65 64 69 61 52 65 63 6f 72 64   new MediaRecord
41a0: 65 72 28 64 65 73 74 2e 73 74 72 65 61 6d 29 3b  er(dest.stream);
41b0: 0a 6c 65 74 20 63 68 75 6e 6b 73 20 3d 20 5b 5d  .let chunks = []
41c0: 3b 0a 76 61 72 20 73 61 6d 70 6c 65 55 52 4c 20  ;.var sampleURL 
41d0: 3d 20 22 22 3b 0a 76 61 72 20 73 61 6d 3b 0a 74  = "";.var sam;.t
41e0: 68 69 73 2e 70 72 6f 70 73 20 3d 20 6f 70 74 73  his.props = opts
41f0: 3b 0a 0a 74 68 69 73 2e 73 74 61 74 65 20 3d 20  ;..this.state = 
4200: 7b 0a 20 20 20 20 6d 65 6d 3a 20 7b 7d 2c 0a 20  {.    mem: {},. 
4210: 20 20 20 64 69 61 6c 73 3a 20 5b 5d 2c 0a 20 20     dials: [],.  
4220: 20 20 6e 75 6d 62 65 72 73 3a 20 5b 5d 2c 0a 20    numbers: [],. 
4230: 20 20 20 73 61 6d 70 6c 65 73 3a 20 5b 5d 2c 0a     samples: [],.
4240: 20 20 20 20 74 65 6d 70 6f 3a 20 31 32 30 2c 0a      tempo: 120,.
4250: 20 20 20 20 74 69 63 6b 73 3a 20 31 36 2c 0a 7d      ticks: 16,.}
4260: 0a 0a 61 73 79 6e 63 20 66 75 6e 63 74 69 6f 6e  ..async function
4270: 20 63 6f 70 79 54 65 78 74 54 6f 43 6c 69 70 62   copyTextToClipb
4280: 6f 61 72 64 28 74 65 78 74 29 20 7b 0a 20 20 20  oard(text) {.   
4290: 20 74 72 79 20 7b 20 61 77 61 69 74 20 6e 61 76   try { await nav
42a0: 69 67 61 74 6f 72 2e 63 6c 69 70 62 6f 61 72 64  igator.clipboard
42b0: 2e 77 72 69 74 65 54 65 78 74 28 74 65 78 74 29  .writeText(text)
42c0: 3b 20 7d 0a 20 20 20 20 63 61 74 63 68 28 65 72  ; }.    catch(er
42d0: 72 29 20 7b 0a 20 20 20 20 20 20 20 20 61 6c 65  r) {.        ale
42e0: 72 74 28 27 45 72 72 6f 72 20 69 6e 20 63 6f 70  rt('Error in cop
42f0: 79 69 6e 67 20 74 65 78 74 3a 20 27 2c 20 65 72  ying text: ', er
4300: 72 29 3b 0a 20 20 20 20 7d 0a 7d 0a 0a 73 68 6f  r);.    }.}..sho
4310: 75 6c 64 55 70 64 61 74 65 28 64 61 74 61 2c 20  uldUpdate(data, 
4320: 6e 65 78 74 4f 70 74 73 29 20 7b 0a 20 20 20 20  nextOpts) {.    
4330: 72 65 74 75 72 6e 20 74 72 75 65 3b 0a 7d 0a 0a  return true;.}..
4340: 74 68 69 73 2e 6f 6e 28 27 6d 6f 75 6e 74 27 2c  this.on('mount',
4350: 20 66 75 6e 63 74 69 6f 6e 28 29 20 7b 0a 20 20   function() {.  
4360: 20 20 76 61 72 20 73 65 6c 66 20 3d 20 74 68 69    var self = thi
4370: 73 3b 0a 20 20 20 20 24 28 22 23 6c 6f 61 64 2d  s;.    $("#load-
4380: 6d 6f 64 65 22 29 2e 63 6c 69 63 6b 28 29 3b 0a  mode").click();.
4390: 20 20 20 20 65 64 69 74 6f 72 20 3d 20 43 6f 64      editor = Cod
43a0: 65 4d 69 72 72 6f 72 28 64 6f 63 75 6d 65 6e 74  eMirror(document
43b0: 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28  .getElementById(
43c0: 22 63 6f 64 65 22 29 2c 20 7b 0a 20 20 20 20 20  "code"), {.     
43d0: 20 20 20 6d 6f 64 65 3a 20 22 6e 75 6c 6c 22 2c     mode: "null",
43e0: 0a 20 20 20 20 20 20 20 20 73 70 65 6c 6c 63 68  .        spellch
43f0: 65 63 6b 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20  eck: false,.    
4400: 20 20 20 20 61 75 74 6f 63 6f 72 72 65 63 74 3a      autocorrect:
4410: 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20 20   false,.        
4420: 73 63 72 6f 6c 6c 62 61 72 53 74 79 6c 65 3a 20  scrollbarStyle: 
4430: 22 6e 75 6c 6c 22 2c 0a 20 20 20 20 20 20 20 20  "null",.        
4440: 6c 69 6e 65 57 72 61 70 70 69 6e 67 3a 20 66 61  lineWrapping: fa
4450: 6c 73 65 2c 0a 20 20 20 20 20 20 20 20 6c 69 6e  lse,.        lin
4460: 65 4e 75 6d 62 65 72 73 3a 20 66 61 6c 73 65 2c  eNumbers: false,
4470: 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 41 63  .        styleAc
4480: 74 69 76 65 4c 69 6e 65 3a 20 66 61 6c 73 65 2c  tiveLine: false,
4490: 0a 20 20 20 20 20 20 20 20 73 74 79 6c 65 53 65  .        styleSe
44a0: 6c 65 63 74 65 64 54 65 78 74 3a 20 74 72 75 65  lectedText: true
44b0: 2c 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 42  ,.        matchB
44c0: 72 61 63 6b 65 74 73 3a 20 66 61 6c 73 65 2c 0a  rackets: false,.
44d0: 20 20 20 20 20 20 20 20 76 61 6c 75 65 3a 20 60          value: `
44e0: 2f 2f 20 74 72 61 63 6b 5f 6e 6f 2c 20 70 61 74  // track_no, pat
44f0: 74 65 72 6e 2c 20 63 75 72 72 65 6e 74 5f 62 69  tern, current_bi
4500: 74 2c 20 73 61 6d 70 6c 65 73 2c 20 73 61 6d 70  t, samples, samp
4510: 6c 65 20 61 6e 64 20 54 6f 6e 65 20 61 72 65 20  le and Tone are 
4520: 61 76 61 69 6c 61 62 6c 65 20 61 73 20 67 6c 6f  available as glo
4530: 62 61 6c 73 60 0a 20 20 20 20 7d 29 3b 0a 0a 20  bals`.    });.. 
4540: 20 20 20 65 64 69 74 6f 72 2e 73 65 74 53 69 7a     editor.setSiz
4550: 65 28 6e 75 6c 6c 2c 20 77 69 6e 64 6f 77 2e 69  e(null, window.i
4560: 6e 6e 65 72 48 65 69 67 68 74 20 2d 20 64 6f 63  nnerHeight - doc
4570: 75 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74  ument.getElement
4580: 42 79 49 64 28 22 68 65 61 64 65 72 2d 70 6c 61  ById("header-pla
4590: 79 62 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48 65  yback").clientHe
45a0: 69 67 68 74 20 2d 20 31 36 30 29 3b 0a 0a 20 20  ight - 160);..  
45b0: 20 20 69 66 20 28 74 68 69 73 2e 70 72 6f 70 73    if (this.props
45c0: 2e 73 6f 6e 67 29 20 7b 0a 20 20 20 20 20 20 20  .song) {.       
45d0: 20 63 6f 6e 73 74 20 6c 69 62 20 3d 20 77 69 6e   const lib = win
45e0: 64 6f 77 2e 4a 73 6f 6e 55 72 6c 28 27 6c 7a 6d  dow.JsonUrl('lzm
45f0: 61 27 29 3b 0a 20 20 20 20 20 20 20 20 6c 69 62  a');.        lib
4600: 2e 64 65 63 6f 6d 70 72 65 73 73 28 74 68 69 73  .decompress(this
4610: 2e 70 72 6f 70 73 2e 73 6f 6e 67 29 2e 74 68 65  .props.song).the
4620: 6e 28 64 61 74 61 20 3d 3e 20 7b 0a 20 20 20 20  n(data => {.    
4630: 20 20 20 20 20 20 20 20 76 61 72 20 73 61 6d 70          var samp
4640: 6c 65 5f 6e 61 6d 65 73 20 3d 20 64 61 74 61 5b  le_names = data[
4650: 22 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 22 5d 3b  "sample_names"];
4660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72  .            var
4670: 20 64 69 61 6c 5f 63 6f 75 6e 74 20 3d 20 64 61   dial_count = da
4680: 74 61 5b 22 64 69 61 6c 5f 63 6f 75 6e 74 22 5d  ta["dial_count"]
4690: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ;.            va
46a0: 72 20 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74 20  r numbers_count 
46b0: 3d 20 64 61 74 61 5b 22 6e 75 6d 62 65 72 73 5f  = data["numbers_
46c0: 63 6f 75 6e 74 22 5d 3b 0a 20 20 20 20 20 20 20  count"];.       
46d0: 20 20 20 20 20 64 65 6c 65 74 65 20 64 61 74 61       delete data
46e0: 5b 22 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 22 5d  ["sample_names"]
46f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  ;.            de
4700: 6c 65 74 65 20 64 61 74 61 5b 22 64 69 61 6c 5f  lete data["dial_
4710: 63 6f 75 6e 74 22 5d 3b 0a 20 20 20 20 20 20 20  count"];.       
4720: 20 20 20 20 20 64 65 6c 65 74 65 20 64 61 74 61       delete data
4730: 5b 22 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74 22  ["numbers_count"
4740: 5d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  ];.            t
4750: 68 69 73 2e 73 74 61 74 65 2e 74 65 6d 70 6f 20  his.state.tempo 
4760: 3d 20 64 61 74 61 2e 74 65 6d 70 6f 3b 0a 20 20  = data.tempo;.  
4770: 20 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 73            this.s
4780: 74 61 74 65 2e 74 69 63 6b 73 20 3d 20 64 61 74  tate.ticks = dat
4790: 61 2e 74 69 63 6b 73 3b 0a 20 20 20 20 20 20 20  a.ticks;.       
47a0: 20 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e       this.state.
47b0: 63 6f 64 65 20 3d 20 64 61 74 61 2e 63 6f 64 65  code = data.code
47c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 61  ;.            sa
47d0: 6d 70 6c 65 5f 6e 61 6d 65 73 2e 6d 61 70 28 66  mple_names.map(f
47e0: 75 6e 63 74 69 6f 6e 20 28 75 72 6c 29 20 7b 0a  unction (url) {.
47f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4800: 73 65 6c 66 2e 61 64 64 55 52 4c 28 75 72 6c 29  self.addURL(url)
4810: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 29  ;.            })
4820: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 66 6f  ;.            fo
4830: 72 20 28 76 61 72 20 69 20 3d 20 30 3b 20 69 20  r (var i = 0; i 
4840: 3c 20 64 69 61 6c 5f 63 6f 75 6e 74 3b 20 69 2b  < dial_count; i+
4850: 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  +) {.           
4860: 20 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e       this.state.
4870: 64 69 61 6c 73 2e 70 75 73 68 28 7b 7d 29 3b 0a  dials.push({});.
4880: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
4890: 20 20 20 20 20 20 20 20 20 20 66 6f 72 20 28 76            for (v
48a0: 61 72 20 69 20 3d 20 30 3b 20 69 20 3c 20 6e 75  ar i = 0; i < nu
48b0: 6d 62 65 72 73 5f 63 6f 75 6e 74 3b 20 69 2b 2b  mbers_count; i++
48c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
48d0: 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e 6e      this.state.n
48e0: 75 6d 62 65 72 73 2e 70 75 73 68 28 7b 7d 29 3b  umbers.push({});
48f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
4900: 20 20 20 20 20 20 20 20 20 20 20 65 64 69 74 6f             edito
4910: 72 2e 73 65 74 56 61 6c 75 65 28 74 68 69 73 2e  r.setValue(this.
4920: 73 74 61 74 65 2e 63 6f 64 65 29 3b 0a 20 20 20  state.code);.   
4930: 20 20 20 20 20 20 20 20 20 74 68 69 73 2e 75 70           this.up
4940: 64 61 74 65 28 29 3b 0a 20 20 20 20 20 20 20 20  date();.        
4950: 20 20 20 20 72 69 6f 74 2e 6d 6f 75 6e 74 28 27      riot.mount('
4960: 27 29 3b 0a 20 20 20 20 20 20 20 20 7d 29 0a 20  ');.        }). 
4970: 20 20 20 7d 0a 0a 0a 7d 29 3b 0a 0a 0a 0a 0a 64     }...});.....d
4980: 6f 77 6e 6c 6f 61 64 28 29 20 7b 0a 20 20 20 20  ownload() {.    
4990: 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20 64 6f  .    function do
49a0: 77 6e 6c 6f 61 64 28 64 61 74 61 2c 20 66 69 6c  wnload(data, fil
49b0: 65 6e 61 6d 65 20 3d 20 22 73 6f 6e 67 2e 74 78  ename = "song.tx
49c0: 74 22 2c 20 74 79 70 65 20 3d 20 22 74 65 78 74  t", type = "text
49d0: 2f 70 6c 61 69 6e 22 29 20 7b 0a 20 20 20 20 20  /plain") {.     
49e0: 20 20 20 20 20 20 20 76 61 72 20 66 69 6c 65 20         var file 
49f0: 3d 20 6e 65 77 20 42 6c 6f 62 28 5b 64 61 74 61  = new Blob([data
4a00: 5d 2c 20 7b 74 79 70 65 3a 20 74 79 70 65 7d 29  ], {type: type})
4a10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ;.            va
4a20: 72 20 61 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 63  r a = document.c
4a30: 72 65 61 74 65 45 6c 65 6d 65 6e 74 28 22 61 22  reateElement("a"
4a40: 29 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ),.             
4a50: 20 20 20 20 20 20 20 75 72 6c 20 3d 20 55 52 4c         url = URL
4a60: 2e 63 72 65 61 74 65 4f 62 6a 65 63 74 55 52 4c  .createObjectURL
4a70: 28 66 69 6c 65 29 3b 0a 20 20 20 20 20 20 20 20  (file);.        
4a80: 20 20 20 20 61 2e 68 72 65 66 20 3d 20 75 72 6c      a.href = url
4a90: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 2e  ;.            a.
4aa0: 64 6f 77 6e 6c 6f 61 64 20 3d 20 66 69 6c 65 6e  download = filen
4ab0: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
4ac0: 20 64 6f 63 75 6d 65 6e 74 2e 62 6f 64 79 2e 61   document.body.a
4ad0: 70 70 65 6e 64 43 68 69 6c 64 28 61 29 3b 0a 20  ppendChild(a);. 
4ae0: 20 20 20 20 20 20 20 20 20 20 20 61 2e 63 6c 69             a.cli
4af0: 63 6b 28 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ck();.          
4b00: 20 20 73 65 74 54 69 6d 65 6f 75 74 28 66 75 6e    setTimeout(fun
4b10: 63 74 69 6f 6e 28 29 20 7b 0a 20 20 20 20 20 20  ction() {.      
4b20: 20 20 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65            docume
4b30: 6e 74 2e 62 6f 64 79 2e 72 65 6d 6f 76 65 43 68  nt.body.removeCh
4b40: 69 6c 64 28 61 29 3b 0a 20 20 20 20 20 20 20 20  ild(a);.        
4b50: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 2e 55          window.U
4b60: 52 4c 2e 72 65 76 6f 6b 65 4f 62 6a 65 63 74 55  RL.revokeObjectU
4b70: 52 4c 28 75 72 6c 29 3b 20 20 0a 20 20 20 20 20  RL(url);  .     
4b80: 20 20 20 20 20 20 20 7d 2c 20 30 29 3b 20 0a 20         }, 0); . 
4b90: 20 20 20 7d 0a 20 20 20 20 64 6f 77 6e 6c 6f 61     }.    downloa
4ba0: 64 28 65 64 69 74 6f 72 2e 67 65 74 56 61 6c 75  d(editor.getValu
4bb0: 65 28 29 29 0a 7d 0a 0a 73 61 76 65 28 29 20 7b  e()).}..save() {
4bc0: 0a 20 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e  .    this.state.
4bd0: 63 6f 64 65 20 3d 20 65 64 69 74 6f 72 2e 67 65  code = editor.ge
4be0: 74 56 61 6c 75 65 28 29 3b 0a 20 20 20 20 76 61  tValue();.    va
4bf0: 72 20 74 65 78 74 20 3d 20 7b 0a 20 20 20 20 20  r text = {.     
4c00: 20 20 20 74 65 6d 70 6f 3a 20 74 68 69 73 2e 73     tempo: this.s
4c10: 74 61 74 65 2e 74 65 6d 70 6f 2c 0a 20 20 20 20  tate.tempo,.    
4c20: 20 20 20 20 64 69 61 6c 5f 63 6f 75 6e 74 3a 20      dial_count: 
4c30: 74 68 69 73 2e 73 74 61 74 65 2e 64 69 61 6c 73  this.state.dials
4c40: 2e 6c 65 6e 67 74 68 2c 0a 20 20 20 20 20 20 20  .length,.       
4c50: 20 6e 75 6d 62 65 72 73 5f 63 6f 75 6e 74 3a 20   numbers_count: 
4c60: 74 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d 62 65  this.state.numbe
4c70: 72 73 2e 6c 65 6e 67 74 68 2c 0a 20 20 20 20 20  rs.length,.     
4c80: 20 20 20 73 61 6d 70 6c 65 5f 6e 61 6d 65 73 3a     sample_names:
4c90: 20 74 68 69 73 2e 73 74 61 74 65 2e 73 61 6d 70   this.state.samp
4ca0: 6c 65 73 2e 6d 61 70 28 66 75 6e 63 74 69 6f 6e  les.map(function
4cb0: 20 28 69 74 65 6d 29 20 7b 72 65 74 75 72 6e 20   (item) {return 
4cc0: 69 74 65 6d 5b 22 5f 5f 75 72 6c 22 5d 7d 29 2c  item["__url"]}),
4cd0: 0a 20 20 20 20 20 20 20 20 74 69 63 6b 73 3a 20  .        ticks: 
4ce0: 31 36 2c 0a 20 20 20 20 20 20 20 20 63 6f 64 65  16,.        code
4cf0: 3a 20 74 68 69 73 2e 73 74 61 74 65 2e 63 6f 64  : this.state.cod
4d00: 65 2c 0a 20 20 20 20 7d 3b 0a 20 20 20 20 63 6f  e,.    };.    co
4d10: 6e 73 74 20 6c 69 62 20 3d 20 77 69 6e 64 6f 77  nst lib = window
4d20: 2e 4a 73 6f 6e 55 72 6c 28 27 6c 7a 6d 61 27 29  .JsonUrl('lzma')
4d30: 3b 0a 09 6c 69 62 2e 63 6f 6d 70 72 65 73 73 28  ;..lib.compress(
4d40: 74 65 78 74 29 2e 74 68 65 6e 28 65 6e 63 6f 64  text).then(encod
4d50: 65 64 44 61 74 61 20 3d 3e 20 7b 0a 20 20 20 20  edData => {.    
4d60: 20 20 20 20 76 61 72 20 6c 69 6e 6b 20 3d 20 22      var link = "
4d70: 2f 73 6f 6e 67 2f 22 20 2b 20 65 6e 63 6f 64 65  /song/" + encode
4d80: 64 44 61 74 61 3b 0a 20 20 20 20 20 20 20 20 77  dData;.        w
4d90: 69 6e 64 6f 77 2e 68 69 73 74 6f 72 79 2e 70 75  indow.history.pu
4da0: 73 68 53 74 61 74 65 28 7b 7d 2c 20 27 42 69 74  shState({}, 'Bit
4db0: 72 68 79 74 68 6d 27 2c 20 6c 69 6e 6b 29 3b 0a  rhythm', link);.
4dc0: 20 20 20 20 20 20 20 20 2f 2f 77 69 6e 64 6f 77          //window
4dd0: 2e 6f 70 65 6e 28 6c 69 6e 6b 2c 20 22 5f 62 6c  .open(link, "_bl
4de0: 61 6e 6b 22 29 3b 0a 20 20 20 20 7d 29 3b 0a 7d  ank");.    });.}
4df0: 0a 0a 72 65 6c 6f 61 64 28 29 20 7b 0a 20 20 20  ..reload() {.   
4e00: 20 77 69 6e 64 6f 77 2e 6c 6f 63 61 74 69 6f 6e   window.location
4e10: 2e 72 65 70 6c 61 63 65 28 20 22 2f 2f 22 20 2b  .replace( "//" +
4e20: 20 77 69 6e 64 6f 77 2e 6c 6f 63 61 74 69 6f 6e   window.location
4e30: 2e 68 6f 73 74 29 0a 7d 0a 0a 72 65 73 65 74 28  .host).}..reset(
4e40: 29 20 7b 0a 0a 20 20 20 20 54 6f 6e 65 2e 4d 61  ) {..    Tone.Ma
4e50: 73 74 65 72 2e 6d 75 74 65 20 3d 20 74 72 75 65  ster.mute = true
4e60: 3b 0a 20 20 20 20 54 6f 6e 65 2e 54 72 61 6e 73  ;.    Tone.Trans
4e70: 70 6f 72 74 2e 73 74 6f 70 28 29 3b 0a 20 20 20  port.stop();.   
4e80: 20 76 61 72 20 73 65 6c 66 20 3d 20 74 68 69 73   var self = this
4e90: 3b 0a 0a 20 20 20 20 69 66 20 28 73 65 6c 66 2e  ;..    if (self.
4ea0: 74 69 6d 65 72 29 20 7b 0a 20 20 20 20 20 20 20  timer) {.       
4eb0: 20 63 6c 65 61 72 49 6e 74 65 72 76 61 6c 28 73   clearInterval(s
4ec0: 65 6c 66 2e 74 69 6d 65 72 29 3b 0a 20 20 20 20  elf.timer);.    
4ed0: 7d 0a 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67  }.    document.g
4ee0: 65 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 27 74  etElementById('t
4ef0: 65 6d 70 6f 2d 76 61 6c 75 65 27 29 2e 64 69 73  empo-value').dis
4f00: 61 62 6c 65 64 20 3d 20 66 61 6c 73 65 3b 0a 20  abled = false;. 
4f10: 20 20 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45     document.getE
4f20: 6c 65 6d 65 6e 74 42 79 49 64 28 27 74 69 63 6b  lementById('tick
4f30: 2d 76 61 6c 75 65 27 29 2e 64 69 73 61 62 6c 65  -value').disable
4f40: 64 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20 65  d = false;.    e
4f50: 64 69 74 6f 72 2e 73 65 74 56 61 6c 75 65 28 22  ditor.setValue("
4f60: 22 29 3b 0a 0a 20 20 20 20 74 68 69 73 2e 73 74  ");..    this.st
4f70: 61 74 65 20 3d 20 7b 0a 20 20 20 20 20 20 20 20  ate = {.        
4f80: 6d 65 6d 3a 20 7b 7d 2c 0a 20 20 20 20 20 20 20  mem: {},.       
4f90: 20 64 69 61 6c 73 3a 20 5b 5d 2c 0a 20 20 20 20   dials: [],.    
4fa0: 20 20 20 20 73 61 6d 70 6c 65 73 3a 20 5b 5d 2c      samples: [],
4fb0: 0a 20 20 20 20 20 20 20 20 74 65 6d 70 6f 3a 20  .        tempo: 
4fc0: 31 32 30 2c 0a 20 20 20 20 20 20 20 20 74 69 63  120,.        tic
4fd0: 6b 73 3a 20 31 36 2c 0a 20 20 20 20 7d 0a 0a 20  ks: 16,.    }.. 
4fe0: 20 20 20 74 68 69 73 2e 75 70 64 61 74 65 28 29     this.update()
4ff0: 3b 0a 20 20 20 20 72 69 6f 74 2e 6d 6f 75 6e 74  ;.    riot.mount
5000: 28 27 62 69 74 72 68 79 74 68 6d 27 2c 20 7b 0a  ('bitrhythm', {.
5010: 20 20 20 20 20 20 20 20 73 6f 6e 67 3a 20 74 68          song: th
5020: 69 73 2e 70 72 6f 70 73 2e 73 6f 6e 67 0a 20 20  is.props.song.  
5030: 20 20 7d 29 0a 0a 0a 7d 0a 0a 65 64 69 74 54 65    })...}..editTe
5040: 6d 70 6f 28 65 29 20 7b 0a 20 20 20 20 74 68 69  mpo(e) {.    thi
5050: 73 2e 75 70 64 61 74 65 28 7b 0a 20 20 20 20 20  s.update({.     
5060: 20 20 20 73 74 61 74 65 3a 20 7b 0a 20 20 20 20     state: {.    
5070: 20 20 20 20 20 20 20 20 2e 2e 2e 74 68 69 73 2e          ...this.
5080: 73 74 61 74 65 2c 0a 20 20 20 20 20 20 20 20 20  state,.         
5090: 20 20 20 74 65 6d 70 6f 3a 20 70 61 72 73 65 49     tempo: parseI
50a0: 6e 74 28 65 2e 74 61 72 67 65 74 2e 76 61 6c 75  nt(e.target.valu
50b0: 65 29 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e).        }.   
50c0: 20 7d 29 0a 7d 0a 0a 65 64 69 74 54 69 63 6b 73   }).}..editTicks
50d0: 28 65 29 20 7b 0a 20 20 20 20 74 68 69 73 2e 75  (e) {.    this.u
50e0: 70 64 61 74 65 28 7b 0a 20 20 20 20 20 20 20 20  pdate({.        
50f0: 73 74 61 74 65 3a 20 7b 0a 20 20 20 20 20 20 20  state: {.       
5100: 20 20 20 20 20 2e 2e 2e 74 68 69 73 2e 73 74 61       ...this.sta
5110: 74 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  te,.            
5120: 74 69 63 6b 73 3a 20 65 2e 74 61 72 67 65 74 2e  ticks: e.target.
5130: 76 61 6c 75 65 0a 20 20 20 20 20 20 20 20 7d 0a  value.        }.
5140: 20 20 20 20 7d 29 0a 7d 0a 0a 24 7b 63 6f 72 65      }).}..${core
5150: 5f 6c 6f 6f 70 7d 0a 0a 73 74 61 72 74 28 29 20  _loop}..start() 
5160: 7b 0a 20 20 20 20 72 65 63 6f 72 64 65 72 2e 73  {.    recorder.s
5170: 74 61 72 74 28 29 3b 0a 7d 0a 0a 73 74 6f 70 28  tart();.}..stop(
5180: 29 20 7b 0a 20 20 20 20 72 65 63 6f 72 64 65 72  ) {.    recorder
5190: 2e 73 74 6f 70 28 29 3b 0a 7d 0a 0a 61 64 64 44  .stop();.}..addD
51a0: 69 61 6c 28 29 20 7b 0a 20 20 20 20 74 68 69 73  ial() {.    this
51b0: 2e 73 74 61 74 65 2e 64 69 61 6c 73 2e 70 75 73  .state.dials.pus
51c0: 68 28 7b 7d 29 3b 0a 20 20 20 20 74 68 69 73 2e  h({});.    this.
51d0: 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a 61 64 64  update();.}..add
51e0: 4e 75 6d 62 65 72 28 29 20 7b 0a 20 20 20 20 74  Number() {.    t
51f0: 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d 62 65 72  his.state.number
5200: 73 2e 70 75 73 68 28 7b 7d 29 3b 0a 20 20 20 20  s.push({});.    
5210: 74 68 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d  this.update();.}
5220: 0a 0a 61 64 64 55 52 4c 28 76 61 6c 75 65 29 20  ..addURL(value) 
5230: 7b 0a 20 20 20 20 76 61 72 20 73 65 6c 66 20 3d  {.    var self =
5240: 20 74 68 69 73 3b 0a 20 20 20 20 74 68 69 73 2e   this;.    this.
5250: 73 74 61 74 65 2e 73 61 6d 70 6c 65 73 2e 70 75  state.samples.pu
5260: 73 68 28 7b 22 5f 5f 6e 61 6d 65 22 3a 20 76 61  sh({"__name": va
5270: 6c 75 65 7d 29 3b 0a 20 20 20 20 76 61 72 20 73  lue});.    var s
5280: 61 6d 3b 0a 20 20 20 20 73 61 6d 20 3d 20 6e 65  am;.    sam = ne
5290: 77 20 54 6f 6e 65 2e 53 61 6d 70 6c 65 72 28 7b  w Tone.Sampler({
52a0: 0a 20 20 20 20 20 20 20 20 75 72 6c 73 3a 20 20  .        urls:  
52b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 43  {.            "C
52c0: 33 22 3a 20 76 61 6c 75 65 2c 0a 20 20 20 20 20  3": value,.     
52d0: 20 20 20 7d 0a 20 20 20 20 7d 29 3b 0a 20 20 20     }.    });.   
52e0: 20 73 61 6d 5b 22 5f 5f 6e 61 6d 65 22 5d 20 3d   sam["__name"] =
52f0: 20 76 61 6c 75 65 3b 0a 20 20 20 20 73 61 6d 5b   value;.    sam[
5300: 22 5f 5f 75 72 6c 22 5d 20 3d 20 76 61 6c 75 65  "__url"] = value
5310: 3b 0a 20 20 20 20 73 65 6c 66 2e 73 65 74 53 61  ;.    self.setSa
5320: 6d 70 6c 65 28 73 61 6d 2c 20 73 65 6c 66 2e 73  mple(sam, self.s
5330: 74 61 74 65 2e 73 61 6d 70 6c 65 73 2e 6c 65 6e  tate.samples.len
5340: 67 74 68 20 2d 20 31 29 3b 0a 7d 0a 0a 61 64 64  gth - 1);.}..add
5350: 53 61 6d 70 6c 65 55 52 4c 28 29 20 7b 0a 20 20  SampleURL() {.  
5360: 20 20 76 61 72 20 73 65 6c 66 20 3d 20 74 68 69    var self = thi
5370: 73 3b 0a 20 20 20 20 61 6c 65 72 74 69 66 79 2e  s;.    alertify.
5380: 70 72 6f 6d 70 74 28 20 27 45 6e 74 65 72 20 53  prompt( 'Enter S
5390: 61 6d 70 6c 65 20 55 52 4c 27 2c 20 27 27 2c 20  ample URL', '', 
53a0: 27 27 0a 20 20 20 20 20 20 20 20 2c 20 66 75 6e  ''.        , fun
53b0: 63 74 69 6f 6e 28 65 76 74 2c 20 76 61 6c 75 65  ction(evt, value
53c0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
53d0: 73 65 6c 66 2e 61 64 64 55 52 4c 28 76 61 6c 75  self.addURL(valu
53e0: 65 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  e);.        }.  
53f0: 20 20 20 20 20 20 2c 20 66 75 6e 63 74 69 6f 6e        , function
5400: 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20  () {.           
5410: 20 61 6c 65 72 74 69 66 79 2e 65 72 72 6f 72 28   alertify.error(
5420: 27 43 61 6e 63 65 6c 27 29 0a 20 20 20 20 20 20  'Cancel').      
5430: 20 20 7d 0a 20 20 20 20 29 3b 0a 7d 0a 0a 61 64    }.    );.}..ad
5440: 64 53 61 6d 70 6c 65 28 29 20 7b 0a 20 20 20 20  dSample() {.    
5450: 74 68 69 73 2e 73 74 61 74 65 2e 73 61 6d 70 6c  this.state.sampl
5460: 65 73 2e 70 75 73 68 28 7b 7d 29 3b 0a 20 20 20  es.push({});.   
5470: 20 74 68 69 73 2e 75 70 64 61 74 65 28 29 3b 0a   this.update();.
5480: 7d 0a 0a 72 6d 53 61 6d 70 6c 65 28 69 6e 64 65  }..rmSample(inde
5490: 78 29 20 7b 0a 20 20 20 74 68 69 73 2e 73 74 61  x) {.   this.sta
54a0: 74 65 2e 73 61 6d 70 6c 65 73 2e 73 70 6c 69 63  te.samples.splic
54b0: 65 28 69 6e 64 65 78 2c 20 31 29 3b 0a 20 20 20  e(index, 1);.   
54c0: 74 68 69 73 2e 75 70 64 61 74 65 28 29 3b 0a 7d  this.update();.}
54d0: 0a 0a 72 6d 44 69 61 6c 28 69 6e 64 65 78 29 20  ..rmDial(index) 
54e0: 7b 0a 20 20 20 74 68 69 73 2e 73 74 61 74 65 2e  {.   this.state.
54f0: 64 69 61 6c 73 2e 73 70 6c 69 63 65 28 69 6e 64  dials.splice(ind
5500: 65 78 2c 20 31 29 3b 0a 20 20 20 74 68 69 73 2e  ex, 1);.   this.
5510: 75 70 64 61 74 65 28 29 3b 0a 7d 0a 0a 72 6d 4e  update();.}..rmN
5520: 75 6d 62 65 72 28 69 6e 64 65 78 29 20 7b 0a 20  umber(index) {. 
5530: 20 20 74 68 69 73 2e 73 74 61 74 65 2e 6e 75 6d    this.state.num
5540: 62 65 72 73 2e 73 70 6c 69 63 65 28 69 6e 64 65  bers.splice(inde
5550: 78 2c 20 31 29 3b 0a 20 20 20 74 68 69 73 2e 75  x, 1);.   this.u
5560: 70 64 61 74 65 28 29 3b 0a 7d 0a 0a 73 65 74 53  pdate();.}..setS
5570: 61 6d 70 6c 65 28 65 2c 20 69 29 20 7b 0a 20 20  ample(e, i) {.  
5580: 20 20 74 68 69 73 2e 73 74 61 74 65 2e 73 61 6d    this.state.sam
5590: 70 6c 65 73 5b 69 5d 20 3d 20 65 3b 0a 20 20 20  ples[i] = e;.   
55a0: 20 74 68 69 73 2e 75 70 64 61 74 65 28 29 3b 0a   this.update();.
55b0: 7d 0a 0a 3c 2f 73 63 72 69 70 74 3e 0a 0a 3c 2f  }..</script>..</
55c0: 62 69 74 72 68 79 74 68 6d 3e 0a 0a 60 60 60 0a  bitrhythm>..```.
55d0: 0a 23 23 20 57 6f 72 6b 6c 65 74 0a 0a 4d 6f 72  .## Worklet..Mor
55e0: 65 20 77 6f 72 6b 6c 65 74 20 69 6d 70 6c 65 6d  e worklet implem
55f0: 65 6e 74 61 74 69 6f 6e 73 0a 0a 2d 20 3c 68 74  entations..- <ht
5600: 74 70 73 3a 2f 2f 6d 69 6d 69 63 70 72 6f 6a 65  tps://mimicproje
5610: 63 74 2e 63 6f 6d 2f 67 75 69 64 65 73 2f 6d 61  ct.com/guides/ma
5620: 78 69 6d 4a 53 3e 20 20 0a 2d 20 47 69 62 62 65  ximJS>  .- Gibbe
5630: 72 69 73 68 0a 0a 53 6f 6d 65 20 69 6d 70 6c 65  rish..Some imple
5640: 6d 65 6e 74 61 74 69 6f 6e 20 6c 69 6e 6b 73 0a  mentation links.
5650: 0a 3c 68 74 74 70 73 3a 2f 2f 73 74 61 63 6b 6f  .<https://stacko
5660: 76 65 72 66 6c 6f 77 2e 63 6f 6d 2f 71 75 65 73  verflow.com/ques
5670: 74 69 6f 6e 73 2f 31 32 30 38 39 36 36 32 2f 6d  tions/12089662/m
5680: 69 78 69 6e 67 2d 31 36 2d 62 69 74 2d 6c 69 6e  ixing-16-bit-lin
5690: 65 61 72 2d 70 63 6d 2d 73 74 72 65 61 6d 73 2d  ear-pcm-streams-
56a0: 61 6e 64 2d 61 76 6f 69 64 69 6e 67 2d 63 6c 69  and-avoiding-cli
56b0: 70 70 69 6e 67 2d 6f 76 65 72 66 6c 6f 77 3e 20  pping-overflow> 
56c0: 20 20 20 0a 3c 68 74 74 70 73 3a 2f 2f 77 77 77     .<https://www
56d0: 2e 65 75 6d 75 73 2e 65 64 75 2e 75 79 2f 65 6d  .eumus.edu.uy/em
56e0: 65 2f 65 6e 73 65 6e 61 6e 7a 61 2f 65 6c 65 63  e/ensenanza/elec
56f0: 74 69 76 61 73 2f 64 73 70 2f 70 72 65 73 65 6e  tivas/dsp/presen
5700: 74 61 63 69 6f 6e 65 73 2f 50 68 61 73 65 56 6f  taciones/PhaseVo
5710: 63 6f 64 65 72 54 75 74 6f 72 69 61 6c 2e 70 64  coderTutorial.pd
5720: 66 3e 20 20 20 0a 0a 60 60 60 7b 63 6f 64 65 2d  f>   ..```{code-
5730: 62 6c 6f 63 6b 7d 20 6a 73 0a 2d 2d 2d 0a 66 6f  block} js.---.fo
5740: 72 63 65 3a 20 74 72 75 65 0a 2d 2d 2d 0a 0a 0a  rce: true.---...
5750: 63 6c 61 73 73 20 53 61 6d 70 6c 65 72 20 65 78  class Sampler ex
5760: 74 65 6e 64 73 20 41 75 64 69 6f 57 6f 72 6b 6c  tends AudioWorkl
5770: 65 74 50 72 6f 63 65 73 73 6f 72 20 7b 0a 20 20  etProcessor {.  
5780: 66 69 6c 65 73 20 3d 20 5b 5d 0a 20 20 72 65 61  files = [].  rea
5790: 64 49 64 78 20 3d 20 7b 7d 0a 20 20 6c 6f 6f 70  dIdx = {}.  loop
57a0: 53 74 61 72 74 49 64 78 20 3d 20 5b 5d 0a 0a 20  StartIdx = [].. 
57b0: 20 63 6f 6e 73 74 72 75 63 74 6f 72 28 6f 70 74   constructor(opt
57c0: 69 6f 6e 73 29 20 7b 0a 20 20 20 20 73 75 70 65  ions) {.    supe
57d0: 72 28 29 0a 20 20 20 20 74 68 69 73 2e 70 6f 72  r().    this.por
57e0: 74 2e 6f 6e 6d 65 73 73 61 67 65 20 3d 20 28 7b  t.onmessage = ({
57f0: 20 64 61 74 61 20 7d 29 20 3d 3e 20 7b 0a 20 20   data }) => {.  
5800: 20 20 20 20 69 66 20 28 64 61 74 61 2e 69 6e 69      if (data.ini
5810: 74 29 20 7b 0a 20 20 20 20 20 20 20 20 74 68 69  t) {.        thi
5820: 73 2e 66 69 6c 65 73 20 3d 20 64 61 74 61 2e 69  s.files = data.i
5830: 6e 69 74 0a 20 20 20 20 20 20 20 20 74 68 69 73  nit.        this
5840: 2e 6c 6f 6f 70 53 74 61 72 74 49 64 78 20 3d 20  .loopStartIdx = 
5850: 74 68 69 73 2e 66 69 6c 65 73 2e 6d 61 70 28 66  this.files.map(f
5860: 75 6e 63 74 69 6f 6e 20 28 66 29 20 7b 0a 20 20  unction (f) {.  
5870: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
5880: 20 30 0a 20 20 20 20 20 20 20 20 7d 29 0a 20 20   0.        }).  
5890: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
58a0: 20 69 66 20 28 64 61 74 61 2e 6e 6f 74 65 4f 6e   if (data.noteOn
58b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
58c0: 74 68 69 73 2e 72 65 61 64 49 64 78 5b 64 61 74  this.readIdx[dat
58d0: 61 2e 73 61 6d 70 6c 65 5d 20 3d 20 74 68 69 73  a.sample] = this
58e0: 2e 6c 6f 6f 70 53 74 61 72 74 49 64 78 5b 64 61  .loopStartIdx[da
58f0: 74 61 2e 73 61 6d 70 6c 65 5d 0a 20 20 20 20 20  ta.sample].     
5900: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
5910: 20 28 64 61 74 61 2e 6e 6f 74 65 4f 66 66 29 20   (data.noteOff) 
5920: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  {.            de
5930: 6c 65 74 65 20 74 68 69 73 2e 72 65 61 64 49 64  lete this.readId
5940: 78 5b 64 61 74 61 2e 73 61 6d 70 6c 65 5d 3b 0a  x[data.sample];.
5950: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 3b 0a 20        }.    };. 
5960: 20 7d 0a 0a 20 20 70 72 6f 63 65 73 73 28 69 6e   }..  process(in
5970: 70 75 74 73 2c 20 6f 75 74 70 75 74 73 29 20 7b  puts, outputs) {
5980: 0a 20 20 20 20 76 61 72 20 6f 75 74 4c 65 66 74  .    var outLeft
5990: 20 3d 20 6f 75 74 70 75 74 73 5b 30 5d 5b 30 5d   = outputs[0][0]
59a0: 0a 20 20 20 20 76 61 72 20 6f 75 74 52 69 67 68  .    var outRigh
59b0: 74 20 3d 20 6f 75 74 70 75 74 73 5b 30 5d 5b 31  t = outputs[0][1
59c0: 5d 0a 0a 20 20 20 20 4f 62 6a 65 63 74 2e 6b 65  ]..    Object.ke
59d0: 79 73 28 74 68 69 73 2e 72 65 61 64 49 64 78 29  ys(this.readIdx)
59e0: 2e 6d 61 70 28 28 73 61 6d 70 6c 65 29 20 3d 3e  .map((sample) =>
59f0: 20 7b 0a 20 20 20 20 20 20 20 20 66 6f 72 20 28   {.        for (
5a00: 6c 65 74 20 69 3d 30 3b 20 69 20 3c 20 6f 75 74  let i=0; i < out
5a10: 4c 65 66 74 2e 6c 65 6e 67 74 68 3b 20 69 2b 2b  Left.length; i++
5a20: 2c 20 74 68 69 73 2e 72 65 61 64 49 64 78 5b 73  , this.readIdx[s
5a30: 61 6d 70 6c 65 5d 2b 2b 29 20 7b 0a 20 20 20 20  ample]++) {.    
5a40: 20 20 20 20 20 20 20 20 69 66 20 28 74 68 69 73          if (this
5a50: 2e 72 65 61 64 49 64 78 5b 73 61 6d 70 6c 65 5d  .readIdx[sample]
5a60: 20 3c 20 74 68 69 73 2e 66 69 6c 65 73 5b 73 61   < this.files[sa
5a70: 6d 70 6c 65 5d 2e 70 63 6d 4c 65 66 74 2e 6c 65  mple].pcmLeft.le
5a80: 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20 20  ngth) {.        
5a90: 20 20 20 20 20 20 20 20 6f 75 74 4c 65 66 74 5b          outLeft[
5aa0: 69 5d 20 2b 3d 20 74 68 69 73 2e 66 69 6c 65 73  i] += this.files
5ab0: 5b 73 61 6d 70 6c 65 5d 2e 70 63 6d 4c 65 66 74  [sample].pcmLeft
5ac0: 5b 74 68 69 73 2e 72 65 61 64 49 64 78 5b 73 61  [this.readIdx[sa
5ad0: 6d 70 6c 65 5d 5d 0a 20 20 20 20 20 20 20 20 20  mple]].         
5ae0: 20 20 20 20 20 20 20 6f 75 74 52 69 67 68 74 5b         outRight[
5af0: 69 5d 20 2b 3d 20 74 68 69 73 2e 66 69 6c 65 73  i] += this.files
5b00: 5b 73 61 6d 70 6c 65 5d 2e 70 63 6d 52 69 67 68  [sample].pcmRigh
5b10: 74 5b 74 68 69 73 2e 72 65 61 64 49 64 78 5b 73  t[this.readIdx[s
5b20: 61 6d 70 6c 65 5d 5d 0a 20 20 20 20 20 20 20 20  ample]].        
5b30: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
5b40: 20 20 20 20 7d 29 0a 0a 20 20 20 20 72 65 74 75      })..    retu
5b50: 72 6e 20 74 72 75 65 0a 20 20 7d 0a 7d 0a 0a 72  rn true.  }.}..r
5b60: 65 67 69 73 74 65 72 50 72 6f 63 65 73 73 6f 72  egisterProcessor
5b70: 28 27 73 61 6d 70 6c 65 72 27 2c 20 53 61 6d 70  ('sampler', Samp
5b80: 6c 65 72 29 0a 60 60 60 0a 0a 23 23 20 53 61 6d  ler).```..## Sam
5b90: 70 6c 65 0a 0a 59 6f 75 20 63 61 6e 20 61 64 64  ple..You can add
5ba0: 20 73 61 6d 70 6c 65 73 20 75 73 69 6e 67 20 74   samples using t
5bb0: 68 65 20 66 69 6c 65 20 75 70 6c 6f 61 64 2e 20  he file upload. 
5bc0: 41 6c 6c 20 73 61 6d 70 6c 65 73 20 61 72 65 20  All samples are 
5bd0: 61 76 61 69 6c 61 62 6c 65 20 61 73 20 61 6e 20  available as an 
5be0: 61 72 72 61 79 20 e2 80 93 20 73 61 6d 70 6c 65  array ... sample
5bf0: 73 2e 20 49 6e 69 74 69 61 6c 69 73 65 20 73 61  s. Initialise sa
5c00: 6d 70 6c 65 73 2c 20 67 6c 6f 62 61 6c 20 76 61  mples, global va
5c10: 72 69 61 62 6c 65 73 20 61 6e 64 20 73 79 6e 74  riables and synt
5c20: 68 65 73 69 73 65 72 73 20 75 73 69 6e 67 20 74  hesisers using t
5c30: 68 65 20 74 72 61 6e 73 69 74 69 6f 6e 20 66 75  he transition fu
5c40: 6e 63 74 69 6f 6e 20 61 6e 64 20 63 68 61 6e 67  nction and chang
5c50: 65 20 74 68 65 20 73 61 6d 70 6c 65 20 70 61 72  e the sample par
5c60: 61 6d 65 74 65 72 73 20 75 73 69 6e 67 20 74 68  ameters using th
5c70: 65 20 73 61 6d 65 20 64 75 72 69 6e 67 20 6c 69  e same during li
5c80: 76 65 20 63 6f 64 69 6e 67 2e 0a 0a 60 60 60 7b  ve coding...```{
5c90: 63 6f 64 65 2d 62 6c 6f 63 6b 7d 20 68 74 6d 6c  code-block} html
5ca0: 0a 2d 2d 2d 0a 66 6f 72 63 65 3a 20 74 72 75 65  .---.force: true
5cb0: 0a 2d 2d 2d 0a 0a 0a 3c 73 61 6d 70 6c 65 3e 0a  .---...<sample>.
5cc0: 20 20 20 20 3c 76 62 6f 78 20 63 6c 61 73 73 3d      <vbox class=
5cd0: 22 6d 6c 2d 32 22 3e 0a 20 20 20 20 20 20 20 20  "ml-2">.        
5ce0: 3c 76 73 74 61 63 6b 20 63 6c 61 73 73 3d 22 6d  <vstack class="m
5cf0: 6c 2d 32 22 3e 0a 20 20 20 20 20 20 20 20 3c 21  l-2">.        <!
5d00: 2d 2d 20 3c 69 6e 70 75 74 20 74 79 70 65 3d 22  -- <input type="
5d10: 66 69 6c 65 22 20 69 64 3d 7b 22 73 61 6d 70 6c  file" id={"sampl
5d20: 65 2d 66 69 6c 65 22 20 2b 20 74 68 69 73 2e 70  e-file" + this.p
5d30: 72 6f 70 73 2e 74 69 7d 20 73 74 79 6c 65 3d 22  rops.ti} style="
5d40: 77 69 64 74 68 3a 20 31 32 30 70 78 3b 22 2f 3e  width: 120px;"/>
5d50: 20 2d 2d 3e 0a 20 20 20 20 20 20 20 20 3c 64 69   -->.        <di
5d60: 76 3e 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c  v>.            <
5d70: 73 70 61 6e 20 63 6c 61 73 73 3d 22 6d 61 78 2d  span class="max-
5d80: 77 69 64 74 68 3a 20 31 32 30 70 78 3b 74 65 78  width: 120px;tex
5d90: 74 2d 6f 76 65 72 66 6c 6f 77 3a 20 65 6c 6c 69  t-overflow: elli
5da0: 70 73 69 73 3b 20 77 68 69 74 65 2d 73 70 61 63  psis; white-spac
5db0: 65 3a 20 6e 6f 77 72 61 70 3b 22 3e 7b 20 67 65  e: nowrap;">{ ge
5dc0: 74 4c 61 73 74 28 74 68 69 73 2e 70 72 6f 70 73  tLast(this.props
5dd0: 2e 74 69 20 2d 31 29 7d 20 3c 2f 73 70 61 6e 3e  .ti -1)} </span>
5de0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 3c 73 70  .            <sp
5df0: 61 6e 20 63 6c 61 73 73 3d 22 63 75 72 73 6f 72  an class="cursor
5e00: 2d 70 6f 69 6e 74 65 72 22 20 69 64 3d 7b 22 73  -pointer" id={"s
5e10: 61 6d 70 6c 65 22 20 2b 20 74 68 69 73 2e 70 72  ample" + this.pr
5e20: 6f 70 73 2e 74 69 7d 20 6f 6e 63 6c 69 63 6b 3d  ops.ti} onclick=
5e30: 7b 72 65 6d 6f 76 65 28 74 68 69 73 2e 70 72 6f  {remove(this.pro
5e40: 70 73 2e 74 69 20 2d 31 29 7d 3e 28 78 29 3c 2f  ps.ti -1)}>(x)</
5e50: 73 70 61 6e 3e 0a 20 20 20 20 20 20 20 20 3c 2f  span>.        </
5e60: 64 69 76 3e 0a 20 20 20 20 20 20 20 20 3c 2f 76  div>.        </v
5e70: 73 74 61 63 6b 3e 0a 20 20 20 20 3c 2f 76 62 6f  stack>.    </vbo
5e80: 78 3e 0a 0a 20 20 20 20 3c 73 63 72 69 70 74 3e  x>..    <script>
5e90: 0a 20 20 20 20 74 68 69 73 2e 70 72 6f 70 73 20  .    this.props 
5ea0: 3d 20 6f 70 74 73 3b 0a 0a 20 20 20 20 72 65 6d  = opts;..    rem
5eb0: 6f 76 65 28 69 6e 64 65 78 29 20 7b 0a 20 20 20  ove(index) {.   
5ec0: 20 20 20 20 20 72 65 74 75 72 6e 20 28 29 20 3d       return () =
5ed0: 3e 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  > {.            
5ee0: 74 68 69 73 2e 70 72 6f 70 73 2e 72 6d 73 61 6d  this.props.rmsam
5ef0: 70 6c 65 28 69 6e 64 65 78 29 3b 0a 20 20 20 20  ple(index);.    
5f00: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
5f10: 20 67 65 74 4c 61 73 74 20 28 69 6e 64 65 78 29   getLast (index)
5f20: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 20 28 74   {.        if (t
5f30: 68 69 73 2e 70 72 6f 70 73 2e 73 61 6d 70 6c 65  his.props.sample
5f40: 73 20 26 26 20 74 68 69 73 2e 70 72 6f 70 73 2e  s && this.props.
5f50: 73 61 6d 70 6c 65 73 5b 69 6e 64 65 78 5d 20 26  samples[index] &
5f60: 26 20 74 68 69 73 2e 70 72 6f 70 73 2e 73 61 6d  & this.props.sam
5f70: 70 6c 65 73 5b 69 6e 64 65 78 5d 5b 22 5f 5f 6e  ples[index]["__n
5f80: 61 6d 65 22 5d 29 20 7b 0a 20 20 20 20 20 20 20  ame"]) {.       
5f90: 20 20 20 20 20 76 61 72 20 65 20 3d 20 74 68 69       var e = thi
5fa0: 73 2e 70 72 6f 70 73 2e 73 61 6d 70 6c 65 73 5b  s.props.samples[
5fb0: 69 6e 64 65 78 5d 5b 22 5f 5f 6e 61 6d 65 22 5d  index]["__name"]
5fc0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76 61  ;.            va
5fd0: 72 20 65 6c 65 6d 73 20 3d 20 65 2e 73 70 6c 69  r elems = e.spli
5fe0: 74 28 22 2f 22 29 3b 0a 20 20 20 20 20 20 20 20  t("/");.        
5ff0: 20 20 20 20 76 61 72 20 6e 61 6d 65 20 3d 20 65      var name = e
6000: 6c 65 6d 73 5b 65 6c 65 6d 73 2e 6c 65 6e 67 74  lems[elems.lengt
6010: 68 20 2d 20 31 5d 3b 0a 20 20 20 20 20 20 20 20  h - 1];.        
6020: 20 20 20 20 72 65 74 75 72 6e 20 6e 61 6d 65 3b      return name;
6030: 0a 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20  .        } else 
6040: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f  {.            co
6050: 6e 73 6f 6c 65 2e 6c 6f 67 28 74 68 69 73 2e 70  nsole.log(this.p
6060: 72 6f 70 73 29 0a 20 20 20 20 20 20 20 20 20 20  rops).          
6070: 20 20 72 65 74 75 72 6e 20 22 22 3b 0a 20 20 20    return "";.   
6080: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 0a 20       }.    }... 
6090: 20 20 20 74 68 69 73 2e 6f 6e 28 22 6d 6f 75 6e     this.on("moun
60a0: 74 22 2c 20 66 75 6e 63 74 69 6f 6e 20 28 29 20  t", function () 
60b0: 7b 0a 20 20 20 20 7d 29 3b 0a 20 20 20 3c 2f 73  {.    });.   </s
60c0: 63 72 69 70 74 3e 0a 3c 2f 73 61 6d 70 6c 65 3e  cript>.</sample>
60d0: 0a 60 60 60 0a 0a 0a 0a 0a 0a 23 23 20 4a 61 76  .```......## Jav
60e0: 61 73 63 72 69 70 74 0a 0a 54 68 69 73 20 69 6e  ascript..This in
60f0: 63 6c 75 64 65 73 20 74 68 65 20 66 75 6e 63 74  cludes the funct
6100: 69 6f 6e 73 20 75 73 65 64 20 66 6f 72 20 70 61  ions used for pa
6110: 72 73 69 6e 67 20 74 68 65 20 70 61 74 74 65 72  rsing the patter
6120: 6e 20 61 6e 64 20 69 6e 69 74 69 61 6c 69 73 69  n and initialisi
6130: 6e 67 20 74 68 65 20 73 61 6d 70 6c 65 73 2e 20  ng the samples. 
6140: 0a 41 20 70 72 65 6c 69 6d 6e 61 72 79 20 73 61  .A prelimnary sa
6150: 6d 70 6c 65 72 20 69 6d 70 6c 65 6d 65 6e 74 61  mpler implementa
6160: 74 69 6f 6e 20 68 61 73 20 62 65 65 6e 20 64 6f  tion has been do
6170: 6e 65 20 77 69 74 68 20 41 75 64 69 6f 57 6f 72  ne with AudioWor
6180: 6b 6c 65 74 20 73 75 70 70 6f 72 74 2c 20 61 6c  klet support, al
6190: 74 68 6f 75 67 68 20 74 68 65 72 65 20 64 6f 65  though there doe
61a0: 73 6e 27 74 20 73 65 65 6d 20 74 6f 20 6d 75 63  sn't seem to muc
61b0: 68 20 69 6d 70 72 6f 76 65 6d 65 6e 74 20 69 6e  h improvement in
61c0: 20 74 68 65 20 70 65 72 66 6f 72 6d 61 6e 63 65   the performance
61d0: 2e 0a 0a 60 60 60 7b 63 6f 64 65 2d 62 6c 6f 63  ...```{code-bloc
61e0: 6b 7d 20 6a 73 0a 2d 2d 2d 0a 66 6f 72 63 65 3a  k} js.---.force:
61f0: 20 74 72 75 65 0a 2d 2d 2d 0a 0a 0a 66 75 6e 63   true.---...func
6200: 74 69 6f 6e 20 67 65 74 52 61 6e 64 6f 6d 49 6e  tion getRandomIn
6210: 74 28 6d 61 78 29 20 7b 0a 20 20 72 65 74 75 72  t(max) {.  retur
6220: 6e 20 4d 61 74 68 2e 66 6c 6f 6f 72 28 4d 61 74  n Math.floor(Mat
6230: 68 2e 72 61 6e 64 6f 6d 28 29 20 2a 20 6d 61 78  h.random() * max
6240: 29 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 69  );.}..function i
6250: 6e 69 74 57 69 6e 61 6d 70 28 70 72 65 73 65 74  nitWinamp(preset
6260: 29 20 7b 0a 20 20 20 20 76 61 72 20 63 61 6e 20  ) {.    var can 
6270: 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65 74 45 6c  = document.getEl
6280: 65 6d 65 6e 74 42 79 49 64 28 22 76 69 73 75 61  ementById("visua
6290: 6c 22 29 3b 0a 20 20 20 20 63 61 6e 2e 68 65 69  l");.    can.hei
62a0: 67 68 74 20 3d 20 77 69 6e 64 6f 77 2e 69 6e 6e  ght = window.inn
62b0: 65 72 48 65 69 67 68 74 20 2d 20 28 64 6f 63 75  erHeight - (docu
62c0: 6d 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42  ment.getElementB
62d0: 79 49 64 28 22 68 65 61 64 65 72 2d 70 6c 61 79  yId("header-play
62e0: 62 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48 65 69  back").clientHei
62f0: 67 68 74 20 2f 20 32 29 3b 0a 20 20 20 20 63 61  ght / 2);.    ca
6300: 6e 2e 77 69 64 74 68 20 3d 20 77 69 6e 64 6f 77  n.width = window
6310: 2e 69 6e 6e 65 72 57 69 64 74 68 3b 0a 20 20 20  .innerWidth;.   
6320: 20 76 61 72 20 63 61 6e 5f 63 6f 6e 74 61 69 6e   var can_contain
6330: 65 72 20 3d 20 64 6f 63 75 6d 65 6e 74 2e 67 65  er = document.ge
6340: 74 45 6c 65 6d 65 6e 74 42 79 49 64 28 22 63 61  tElementById("ca
6350: 6e 76 61 73 2d 63 6f 6e 74 61 69 6e 65 72 22 29  nvas-container")
6360: 3b 0a 20 20 20 20 63 61 6e 5f 63 6f 6e 74 61 69  ;.    can_contai
6370: 6e 65 72 2e 77 69 64 74 68 20 3d 20 77 69 6e 64  ner.width = wind
6380: 6f 77 2e 69 6e 6e 65 72 57 69 64 74 68 3b 0a 20  ow.innerWidth;. 
6390: 20 20 20 76 61 72 20 76 69 73 75 61 6c 69 7a 65     var visualize
63a0: 72 20 3d 20 77 69 6e 64 6f 77 2e 62 75 74 74 65  r = window.butte
63b0: 72 63 68 75 72 6e 2e 64 65 66 61 75 6c 74 2e 63  rchurn.default.c
63c0: 72 65 61 74 65 56 69 73 75 61 6c 69 7a 65 72 28  reateVisualizer(
63d0: 54 6f 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74 28  Tone.getContext(
63e0: 29 2e 72 61 77 43 6f 6e 74 65 78 74 2c 20 63 61  ).rawContext, ca
63f0: 6e 2c 20 7b 0a 20 20 20 20 20 20 20 20 68 65 69  n, {.        hei
6400: 67 68 74 3a 20 77 69 6e 64 6f 77 2e 69 6e 6e 65  ght: window.inne
6410: 72 48 65 69 67 68 74 20 2d 20 28 64 6f 63 75 6d  rHeight - (docum
6420: 65 6e 74 2e 67 65 74 45 6c 65 6d 65 6e 74 42 79  ent.getElementBy
6430: 49 64 28 22 68 65 61 64 65 72 2d 70 6c 61 79 62  Id("header-playb
6440: 61 63 6b 22 29 2e 63 6c 69 65 6e 74 48 65 69 67  ack").clientHeig
6450: 68 74 20 2f 20 32 29 2c 0a 20 20 20 20 20 20 20  ht / 2),.       
6460: 20 77 69 64 74 68 3a 20 77 69 6e 64 6f 77 2e 69   width: window.i
6470: 6e 6e 65 72 57 69 64 74 68 2c 0a 20 20 20 20 20  nnerWidth,.     
6480: 20 20 20 6d 65 73 68 57 69 64 74 68 3a 20 32 34     meshWidth: 24
6490: 2c 0a 20 20 20 20 20 20 20 20 6d 65 73 68 48 65  ,.        meshHe
64a0: 69 67 68 74 3a 20 31 38 2c 0a 20 20 20 20 7d 29  ight: 18,.    })
64b0: 3b 0a 20 20 20 20 76 69 73 75 61 6c 69 7a 65 72  ;.    visualizer
64c0: 2e 63 6f 6e 6e 65 63 74 41 75 64 69 6f 28 54 6f  .connectAudio(To
64d0: 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74 28 29 2e  ne.getContext().
64e0: 64 65 73 74 69 6e 61 74 69 6f 6e 29 3b 0a 20 20  destination);.  
64f0: 20 20 63 6f 6e 73 74 20 70 72 65 73 65 74 73 20    const presets 
6500: 3d 20 77 69 6e 64 6f 77 2e 62 75 74 74 65 72 63  = window.butterc
6510: 68 75 72 6e 50 72 65 73 65 74 73 2e 67 65 74 50  hurnPresets.getP
6520: 72 65 73 65 74 73 28 29 3b 0a 20 20 20 20 63 6f  resets();.    co
6530: 6e 73 74 20 70 72 65 73 65 74 50 61 72 61 6d 20  nst presetParam 
6540: 3d 20 70 72 65 73 65 74 73 5b 70 72 65 73 65 74  = presets[preset
6550: 5d 3b 0a 20 20 20 20 76 69 73 75 61 6c 69 7a 65  ];.    visualize
6560: 72 2e 6c 6f 61 64 50 72 65 73 65 74 28 70 72 65  r.loadPreset(pre
6570: 73 65 74 50 61 72 61 6d 2c 20 30 2e 30 29 3b 20  setParam, 0.0); 
6580: 2f 2f 20 32 6e 64 20 61 72 67 75 6d 65 6e 74 20  // 2nd argument 
6590: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
65a0: 20 73 65 63 6f 6e 64 73 20 74 6f 20 62 6c 65 6e   seconds to blen
65b0: 64 20 70 72 65 73 65 74 73 0a 20 20 20 20 72 65  d presets.    re
65c0: 74 75 72 6e 20 76 69 73 75 61 6c 69 7a 65 72 3b  turn visualizer;
65d0: 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 75 61  .}..function gua
65e0: 72 64 28 72 61 6e 67 65 29 20 7b 0a 20 20 20 20  rd(range) {.    
65f0: 76 61 72 20 73 74 61 74 65 20 3d 20 6e 75 6c 6c  var state = null
6600: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 66 75 6e  ;.    return fun
6610: 63 74 69 6f 6e 20 28 76 61 6c 29 20 7b 0a 20 20  ction (val) {.  
6620: 20 20 20 20 20 20 69 66 20 28 28 76 61 6c 20 3e        if ((val >
6630: 3d 20 72 61 6e 67 65 5b 30 5d 29 20 26 26 20 28  = range[0]) && (
6640: 76 61 6c 20 3c 3d 20 72 61 6e 67 65 5b 31 5d 29  val <= range[1])
6650: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
6660: 73 74 61 74 65 20 3d 20 76 61 6c 3b 0a 20 20 20  state = val;.   
6670: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6680: 76 61 6c 3b 0a 20 20 20 20 20 20 20 20 7d 20 65  val;.        } e
6690: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
66a0: 20 20 72 65 74 75 72 6e 20 73 74 61 74 65 3b 0a    return state;.
66b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a          }.    }.
66c0: 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 72 6f 6d 61  }..function roma
66d0: 6e 74 6f 67 79 70 73 79 28 68 65 78 29 20 7b 0a  ntogypsy(hex) {.
66e0: 20 20 20 20 76 61 72 20 6c 65 74 74 65 72 73 20      var letters 
66f0: 3d 20 68 65 78 2e 72 65 70 6c 61 63 65 28 27 60  = hex.replace('`
6700: 30 27 2c 27 61 27 29 3b 0a 20 20 20 20 6c 65 74  0','a');.    let
6710: 74 65 72 73 20 3d 20 6c 65 74 74 65 72 73 2e 72  ters = letters.r
6720: 65 70 6c 61 63 65 28 27 60 31 27 2c 27 62 27 29  eplace('`1','b')
6730: 3b 0a 20 20 20 20 6c 65 74 74 65 72 73 20 3d 20  ;.    letters = 
6740: 6c 65 74 74 65 72 73 2e 72 65 70 6c 61 63 65 28  letters.replace(
6750: 27 60 32 27 2c 27 63 27 29 3b 0a 20 20 20 20 6c  '`2','c');.    l
6760: 65 74 74 65 72 73 20 3d 20 6c 65 74 74 65 72 73  etters = letters
6770: 2e 72 65 70 6c 61 63 65 28 27 60 33 27 2c 27 64  .replace('`3','d
6780: 27 29 3b 0a 20 20 20 20 6c 65 74 74 65 72 73 20  ');.    letters 
6790: 3d 20 6c 65 74 74 65 72 73 2e 72 65 70 6c 61 63  = letters.replac
67a0: 65 28 27 60 34 27 2c 27 65 27 29 3b 0a 20 20 20  e('`4','e');.   
67b0: 20 6c 65 74 74 65 72 73 20 3d 20 6c 65 74 74 65   letters = lette
67c0: 72 73 2e 72 65 70 6c 61 63 65 28 27 60 35 27 2c  rs.replace('`5',
67d0: 27 66 27 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  'f');.    return
67e0: 20 6c 65 74 74 65 72 73 3b 0a 7d 0a 0a 66 75 6e   letters;.}..fun
67f0: 63 74 69 6f 6e 20 6c 65 74 74 65 72 74 6f 64 65  ction lettertode
6800: 63 28 6c 65 74 74 65 72 29 20 7b 0a 20 20 20 20  c(letter) {.    
6810: 76 61 72 20 62 69 6e 20 3d 20 22 22 3b 0a 20 20  var bin = "";.  
6820: 20 20 69 66 20 28 6c 65 74 74 65 72 2e 6d 61 74    if (letter.mat
6830: 63 68 28 2f 5c 64 2f 29 29 20 7b 0a 20 20 20 20  ch(/\d/)) {.    
6840: 20 20 20 20 6e 6f 20 3d 20 70 61 72 73 65 49 6e      no = parseIn
6850: 74 28 6c 65 74 74 65 72 29 3b 0a 20 20 20 20 7d  t(letter);.    }
6860: 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65  .    else if (le
6870: 74 74 65 72 20 3d 3d 20 22 61 22 29 20 7b 0a 20  tter == "a") {. 
6880: 20 20 20 20 20 20 20 6e 6f 20 3d 20 31 30 3b 0a         no = 10;.
6890: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
68a0: 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 62 22  f (letter == "b"
68b0: 29 20 7b 0a 20 20 20 20 20 20 20 20 6e 6f 20 3d  ) {.        no =
68c0: 20 31 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65   11;.    }.    e
68d0: 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d  lse if (letter =
68e0: 3d 20 22 63 22 29 20 7b 0a 20 20 20 20 20 20 20  = "c") {.       
68f0: 20 6e 6f 20 3d 20 31 32 3b 0a 20 20 20 20 7d 0a   no = 12;.    }.
6900: 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74      else if (let
6910: 74 65 72 20 3d 3d 20 22 64 22 29 20 7b 0a 20 20  ter == "d") {.  
6920: 20 20 20 20 20 20 6e 6f 20 3d 20 31 33 3b 0a 20        no = 13;. 
6930: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
6940: 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 65 22 29   (letter == "e")
6950: 20 7b 0a 20 20 20 20 20 20 20 20 6e 6f 20 3d 20   {.        no = 
6960: 31 34 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  14;.    }.    el
6970: 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d  se if (letter ==
6980: 20 22 66 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "f") {.        
6990: 6e 6f 20 3d 20 31 35 3b 0a 20 20 20 20 7d 0a 20  no = 15;.    }. 
69a0: 20 20 20 66 6f 72 20 28 69 20 3d 20 31 3b 20 69     for (i = 1; i
69b0: 20 3c 3d 20 6e 6f 3b 20 69 2b 2b 29 20 7b 0a 20   <= no; i++) {. 
69c0: 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30         bin += "0
69d0: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74  ";.    }.    ret
69e0: 75 72 6e 20 62 69 6e 3b 0a 7d 0a 0a 66 75 6e 63  urn bin;.}..func
69f0: 74 69 6f 6e 20 6c 65 74 74 65 72 74 6f 62 69 6e  tion lettertobin
6a00: 28 6c 65 74 74 65 72 29 20 7b 0a 20 20 20 20 76  (letter) {.    v
6a10: 61 72 20 62 69 6e 20 3d 20 22 22 3b 0a 20 20 20  ar bin = "";.   
6a20: 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22   if (letter == "
6a30: 30 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69  0") {.        bi
6a40: 6e 20 2b 3d 20 22 30 30 30 30 22 3b 0a 20 20 20  n += "0000";.   
6a50: 20 7d 0a 20 20 20 20 69 66 20 28 6c 65 74 74 65   }.    if (lette
6a60: 72 20 3d 3d 20 22 31 22 29 20 7b 0a 20 20 20 20  r == "1") {.    
6a70: 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 30 30 31      bin += "0001
6a80: 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73  ";.    }.    els
6a90: 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20  e if (letter == 
6aa0: 22 32 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62  "2") {.        b
6ab0: 69 6e 20 2b 3d 20 22 30 30 31 30 22 3b 0a 20 20  in += "0010";.  
6ac0: 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20    }.    else if 
6ad0: 28 6c 65 74 74 65 72 20 3d 3d 20 22 33 22 29 20  (letter == "3") 
6ae0: 7b 0a 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d  {.        bin +=
6af0: 20 22 30 30 31 31 22 3b 0a 20 20 20 20 7d 0a 20   "0011";.    }. 
6b00: 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74     else if (lett
6b10: 65 72 20 3d 3d 20 22 34 22 29 20 7b 0a 20 20 20  er == "4") {.   
6b20: 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 31 30       bin += "010
6b30: 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  0";.    }.    el
6b40: 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d  se if (letter ==
6b50: 20 22 35 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "5") {.        
6b60: 62 69 6e 20 2b 3d 20 22 30 31 30 31 22 3b 0a 20  bin += "0101";. 
6b70: 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69 66     }.    else if
6b80: 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 36 22 29   (letter == "6")
6b90: 20 7b 0a 20 20 20 20 20 20 20 20 62 69 6e 20 2b   {.        bin +
6ba0: 3d 20 22 30 31 31 30 22 3b 0a 20 20 20 20 7d 0a  = "0110";.    }.
6bb0: 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65 74      else if (let
6bc0: 74 65 72 20 3d 3d 20 22 37 22 29 20 7b 0a 20 20  ter == "7") {.  
6bd0: 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 30 31        bin += "01
6be0: 31 31 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65  11";.    }.    e
6bf0: 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20 3d  lse if (letter =
6c00: 3d 20 22 38 22 29 20 7b 0a 20 20 20 20 20 20 20  = "8") {.       
6c10: 20 62 69 6e 20 2b 3d 20 22 31 30 30 30 22 3b 0a   bin += "1000";.
6c20: 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20 69      }.    else i
6c30: 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 39 22  f (letter == "9"
6c40: 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69 6e 20  ) {.        bin 
6c50: 2b 3d 20 22 31 30 30 31 22 3b 0a 20 20 20 20 7d  += "1001";.    }
6c60: 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c 65  .    else if (le
6c70: 74 74 65 72 20 3d 3d 20 22 61 22 29 20 7b 0a 20  tter == "a") {. 
6c80: 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22 31         bin += "1
6c90: 30 31 30 22 3b 0a 20 20 20 20 7d 0a 20 20 20 20  010";.    }.    
6ca0: 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72 20  else if (letter 
6cb0: 3d 3d 20 22 62 22 29 20 7b 0a 20 20 20 20 20 20  == "b") {.      
6cc0: 20 20 62 69 6e 20 2b 3d 20 22 31 30 31 31 22 3b    bin += "1011";
6cd0: 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65 20  .    }.    else 
6ce0: 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22 63  if (letter == "c
6cf0: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69 6e  ") {.        bin
6d00: 20 2b 3d 20 22 31 31 30 30 22 3b 0a 20 20 20 20   += "1100";.    
6d10: 7d 0a 20 20 20 20 65 6c 73 65 20 69 66 20 28 6c  }.    else if (l
6d20: 65 74 74 65 72 20 3d 3d 20 22 64 22 29 20 7b 0a  etter == "d") {.
6d30: 20 20 20 20 20 20 20 20 62 69 6e 20 2b 3d 20 22          bin += "
6d40: 31 31 30 31 22 3b 0a 20 20 20 20 7d 0a 20 20 20  1101";.    }.   
6d50: 20 65 6c 73 65 20 69 66 20 28 6c 65 74 74 65 72   else if (letter
6d60: 20 3d 3d 20 22 65 22 29 20 7b 0a 20 20 20 20 20   == "e") {.     
6d70: 20 20 20 62 69 6e 20 2b 3d 20 22 31 31 31 30 22     bin += "1110"
6d80: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c 73 65  ;.    }.    else
6d90: 20 69 66 20 28 6c 65 74 74 65 72 20 3d 3d 20 22   if (letter == "
6da0: 66 22 29 20 7b 0a 20 20 20 20 20 20 20 20 62 69  f") {.        bi
6db0: 6e 20 2b 3d 20 22 31 31 31 31 22 3b 0a 20 20 20  n += "1111";.   
6dc0: 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 62 69   }.    return bi
6dd0: 6e 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 68  n;.}..function h
6de0: 65 78 32 62 69 6e 28 68 65 78 29 20 7b 0a 20 20  ex2bin(hex) {.  
6df0: 20 20 76 61 72 20 6c 65 74 74 65 72 73 20 3d 20    var letters = 
6e00: 72 6f 6d 61 6e 74 6f 67 79 70 73 79 28 68 65 78  romantogypsy(hex
6e10: 29 0a 20 20 20 20 6c 65 74 74 65 72 73 20 3d 20  ).    letters = 
6e20: 6c 65 74 74 65 72 73 2e 73 70 6c 69 74 28 27 27  letters.split(''
6e30: 29 3b 0a 20 20 20 20 76 61 72 20 62 69 6e 20 3d  );.    var bin =
6e40: 20 22 22 3b 0a 20 20 20 20 6c 65 74 74 65 72 73   "";.    letters
6e50: 2e 6d 61 70 28 66 75 6e 63 74 69 6f 6e 28 6c 65  .map(function(le
6e60: 74 74 65 72 29 20 7b 0a 20 20 20 20 20 20 20 20  tter) {.        
6e70: 62 69 6e 20 2b 3d 20 6c 65 74 74 65 72 74 6f 62  bin += lettertob
6e80: 69 6e 28 6c 65 74 74 65 72 29 0a 20 20 20 20 7d  in(letter).    }
6e90: 29 0a 20 20 20 20 72 65 74 75 72 6e 20 62 69 6e  ).    return bin
6ea0: 3b 0a 7d 0a 0a 66 75 6e 63 74 69 6f 6e 20 67 65  ;.}..function ge
6eb0: 74 5f 63 68 61 72 28 73 74 72 2c 20 69 6e 64 65  t_char(str, inde
6ec0: 78 29 20 7b 0a 20 20 20 20 69 66 20 28 28 69 6e  x) {.    if ((in
6ed0: 64 65 78 20 3e 20 30 29 20 26 26 20 28 69 6e 64  dex > 0) && (ind
6ee0: 65 78 20 3c 20 73 74 72 2e 6c 65 6e 67 74 68 29  ex < str.length)
6ef0: 29 20 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ) {.        retu
6f00: 72 6e 20 73 74 72 5b 69 6e 64 65 78 5d 3b 0a 20  rn str[index];. 
6f10: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
6f20: 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c 0a      return null.
6f30: 20 20 20 20 7d 0a 7d 0a 0a 66 75 6e 63 74 69 6f      }.}..functio
6f40: 6e 20 70 61 74 74 65 72 6e 5f 6d 65 74 61 28 70  n pattern_meta(p
6f50: 29 20 7b 0a 20 20 20 20 69 66 20 28 21 70 29 20  ) {.    if (!p) 
6f60: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6f70: 20 6e 75 6c 6c 3b 0a 20 20 20 20 7d 0a 20 20 20   null;.    }.   
6f80: 20 70 20 3d 20 70 2e 72 65 70 6c 61 63 65 28 2f   p = p.replace(/
6f90: 20 2f 67 2c 20 22 22 29 3b 0a 20 20 20 20 76 61   /g, "");.    va
6fa0: 72 20 66 63 20 3d 20 70 2e 73 70 6c 69 74 28 27  r fc = p.split('
6fb0: 27 29 5b 30 5d 3b 0a 20 20 20 20 69 66 20 28 66  ')[0];.    if (f
6fc0: 63 3d 3d 20 22 70 22 29 20 7b 0a 20 20 20 20 20  c== "p") {.     
6fd0: 20 20 20 76 61 72 20 70 74 79 70 65 20 3d 20 22     var ptype = "
6fe0: 78 6f 22 3b 0a 20 20 20 20 20 20 20 20 76 61 72  xo";.        var
6ff0: 20 6c 20 3d 20 28 70 2e 6c 65 6e 67 74 68 20 2d   l = (p.length -
7000: 20 31 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20   1);.    }..    
7010: 69 66 20 28 70 74 79 70 65 20 3d 3d 20 22 78 6f  if (ptype == "xo
7020: 22 29 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72  ") {.        var
7030: 20 66 70 20 3d 20 70 2e 73 75 62 73 74 72 28 31   fp = p.substr(1
7040: 29 3b 0a 20 20 20 20 20 20 20 20 66 70 20 3d 20  );.        fp = 
7050: 66 70 2e 72 65 70 6c 61 63 65 28 2f 78 2f 67 2c  fp.replace(/x/g,
7060: 20 22 31 22 29 3b 0a 20 20 20 20 7d 0a 0a 20 20   "1");.    }..  
7070: 20 20 69 66 20 28 21 66 70 29 20 7b 0a 20 20 20    if (!fp) {.   
7080: 20 20 20 20 20 72 65 74 75 72 6e 20 6e 75 6c 6c       return null
7090: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 76 61 72  ;.    }..    var
70a0: 20 64 6f 6e 65 20 3d 20 66 61 6c 73 65 3b 0a 20   done = false;. 
70b0: 20 20 20 76 61 72 20 69 6e 64 65 78 20 3d 20 30     var index = 0
70c0: 3b 0a 20 20 20 20 76 61 72 20 6d 65 74 61 20 3d  ;.    var meta =
70d0: 20 7b 7d 0a 20 20 20 20 76 61 72 20 6f 6e 65 5f   {}.    var one_
70e0: 69 6e 64 65 78 20 3d 20 31 3b 0a 0a 20 20 20 20  index = 1;..    
70f0: 77 68 69 6c 65 28 31 29 20 7b 0a 20 20 20 20 20  while(1) {.     
7100: 20 20 20 69 66 20 28 69 6e 64 65 78 20 3e 20 66     if (index > f
7110: 70 2e 6c 65 6e 67 74 68 29 20 7b 0a 20 20 20 20  p.length) {.    
7120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
7130: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7140: 20 76 61 72 20 63 75 72 72 65 6e 74 5f 6d 65 74   var current_met
7150: 61 20 3d 20 7b 7d 0a 20 20 20 20 20 20 20 20 76  a = {}.        v
7160: 61 72 20 63 75 72 72 65 6e 74 5f 6c 65 74 74 65  ar current_lette
7170: 72 20 3d 20 66 70 5b 69 6e 64 65 78 5d 0a 20 20  r = fp[index].  
7180: 20 20 20 20 20 20 69 66 20 28 63 75 72 72 65 6e        if (curren
7190: 74 5f 6c 65 74 74 65 72 20 3d 3d 20 22 5f 22 29  t_letter == "_")
71a0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d   {.            m
71b0: 65 74 61 5b 6f 6e 65 5f 69 6e 64 65 78 20 2d 31  eta[one_index -1
71c0: 5d 20 3d 20 7b 22 76 6f 6c 75 6d 65 22 3a 20 22  ] = {"volume": "
71d0: 6f 66 66 22 20 7d 3b 0a 20 20 20 20 20 20 20 20  off" };.        
71e0: 20 20 20 20 69 6e 64 65 78 20 2b 3d 20 32 3b 0a      index += 2;.
71f0: 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 5f              one_
7200: 69 6e 64 65 78 20 2b 3d 20 32 3b 0a 20 20 20 20  index += 2;.    
7210: 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65          continue
7220: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
7230: 20 20 20 20 65 6c 73 65 20 69 66 20 28 63 75 72      else if (cur
7240: 72 65 6e 74 5f 6c 65 74 74 65 72 20 3d 3d 20 22  rent_letter == "
7250: 31 22 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  1") {.          
7260: 20 20 76 61 72 20 6e 65 78 74 5f 6c 65 74 74 65    var next_lette
7270: 72 20 3d 20 67 65 74 5f 63 68 61 72 28 66 70 2c  r = get_char(fp,
7280: 69 6e 64 65 78 20 2b 20 31 29 3b 0a 20 20 20 20  index + 1);.    
7290: 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 78 74          if (next
72a0: 5f 6c 65 74 74 65 72 20 3d 3d 20 22 5b 22 29 20  _letter == "[") 
72b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
72c0: 20 20 76 61 72 20 6a 75 6d 70 5f 69 6e 64 65 78    var jump_index
72d0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
72e0: 20 20 20 20 20 20 76 61 72 20 62 75 66 66 65 72        var buffer
72f0: 20 3d 20 22 22 3b 0a 20 20 20 20 20 20 20 20 20   = "";.         
7300: 20 20 20 20 20 20 20 77 68 69 6c 65 28 31 29 20         while(1) 
7310: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
7320: 20 20 20 20 20 20 69 66 20 28 28 28 69 6e 64 65        if (((inde
7330: 78 20 2b 20 31 29 20 2b 20 6a 75 6d 70 5f 69 6e  x + 1) + jump_in
7340: 64 65 78 29 20 3e 20 66 70 2e 6c 65 6e 67 74 68  dex) > fp.length
7350: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ) {.            
7360: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
7370: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
7380: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 6c 65 74               let
73a0: 20 62 5f 6e 65 78 74 5f 6c 65 74 74 65 72 20 3d   b_next_letter =
73b0: 20 67 65 74 5f 63 68 61 72 28 66 70 2c 20 28 28   get_char(fp, ((
73c0: 69 6e 64 65 78 20 2b 20 31 29 20 2b 20 6a 75 6d  index + 1) + jum
73d0: 70 5f 69 6e 64 65 78 29 29 3b 0a 0a 20 20 20 20  p_index));..    
73e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73f0: 69 66 20 28 62 5f 6e 65 78 74 5f 6c 65 74 74 65  if (b_next_lette
7400: 72 20 3d 3d 20 22 5d 22 29 20 7b 0a 20 20 20 20  r == "]") {.    
7410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7420: 20 20 20 20 6a 75 6d 70 5f 69 6e 64 65 78 20 2b      jump_index +
7430: 3d 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20  = 2;.           
7440: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
7450: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
7460: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
7470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7480: 20 20 20 20 20 20 20 20 20 62 75 66 66 65 72 20           buffer 
7490: 2b 3d 20 62 5f 6e 65 78 74 5f 6c 65 74 74 65 72  += b_next_letter
74a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
74b0: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 5f 69            jump_i
74c0: 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20  ndex += 1;.     
74d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d                 }
74e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
74f0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   }.             
7500: 20 20 20 76 61 72 20 69 6e 64 69 76 69 64 75 61     var individua
7510: 6c 5f 6d 65 74 61 20 3d 20 62 75 66 66 65 72 2e  l_meta = buffer.
7520: 73 70 6c 69 74 28 22 3b 22 29 0a 20 20 20 20 20  split(";").     
7530: 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 69 76             indiv
7540: 69 64 75 61 6c 5f 6d 65 74 61 2e 6d 61 70 28 66  idual_meta.map(f
7550: 75 6e 63 74 69 6f 6e 20 28 65 29 20 7b 0a 20 20  unction (e) {.  
7560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7570: 20 20 69 66 20 28 65 2e 73 74 61 72 74 73 57 69    if (e.startsWi
7580: 74 68 28 22 5f 22 29 29 20 7b 0a 20 20 20 20 20  th("_")) {.     
7590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75a0: 20 20 20 63 75 72 72 65 6e 74 5f 6d 65 74 61 5b     current_meta[
75b0: 22 70 61 6e 22 5d 20 3d 20 65 2e 73 75 62 73 74  "pan"] = e.subst
75c0: 72 69 6e 67 28 31 29 0a 20 20 20 20 20 20 20 20  ring(1).        
75d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
75e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
75f0: 20 20 69 66 20 28 65 2e 73 74 61 72 74 73 57 69    if (e.startsWi
7600: 74 68 28 22 5e 22 29 29 20 7b 0a 20 20 20 20 20  th("^")) {.     
7610: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7620: 20 20 20 63 75 72 72 65 6e 74 5f 6d 65 74 61 5b     current_meta[
7630: 22 70 69 74 63 68 22 5d 20 3d 20 65 2e 73 75 62  "pitch"] = e.sub
7640: 73 74 72 69 6e 67 28 31 29 0a 20 20 20 20 20 20  string(1).      
7650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 20                } 
7660: 65 6c 73 65 20 69 66 20 28 65 2e 73 74 61 72 74  else if (e.start
7670: 73 57 69 74 68 28 22 2b 22 29 29 20 7b 0a 20 20  sWith("+")) {.  
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7690: 20 20 20 20 20 20 63 75 72 72 65 6e 74 5f 6d 65        current_me
76a0: 74 61 5b 22 64 65 6c 61 79 22 5d 20 3d 20 65 0a  ta["delay"] = e.
76b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76c0: 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20      } else {.   
76d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
76e0: 20 20 20 20 20 63 75 72 72 65 6e 74 5f 6d 65 74       current_met
76f0: 61 5b 22 76 6f 6c 75 6d 65 22 5d 20 3d 20 65 0a  a["volume"] = e.
7700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7710: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7720: 20 20 20 20 20 20 7d 29 0a 20 20 20 20 20 20 20        }).       
7730: 20 20 20 20 20 20 20 20 20 6d 65 74 61 5b 6f 6e           meta[on
7740: 65 5f 69 6e 64 65 78 20 2d 31 5d 20 3d 20 63 75  e_index -1] = cu
7750: 72 72 65 6e 74 5f 6d 65 74 61 0a 20 20 20 20 20  rrent_meta.     
7760: 20 20 20 20 20 20 20 20 20 20 20 69 6e 64 65 78             index
7770: 20 2b 3d 20 6a 75 6d 70 5f 69 6e 64 65 78 3b 0a   += jump_index;.
7780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7790: 6f 6e 65 5f 69 6e 64 65 78 20 2b 3d 20 31 3b 0a  one_index += 1;.
77a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77b0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
77c0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
77d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6d                 m
77e0: 65 74 61 5b 6f 6e 65 5f 69 6e 64 65 78 20 2d 31  eta[one_index -1
77f0: 5d 20 3d 20 63 75 72 72 65 6e 74 5f 6d 65 74 61  ] = current_meta
7800: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7810: 20 6f 6e 65 5f 69 6e 64 65 78 20 2b 3d 20 31 3b   one_index += 1;
7820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7830: 20 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20   index += 1;.   
7840: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
7850: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7860: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 20 65     }.        } e
7870: 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20 20  lse {.          
7880: 20 20 69 66 20 28 63 75 72 72 65 6e 74 5f 6c 65    if (current_le
7890: 74 74 65 72 20 3d 3d 20 22 2a 22 29 20 7b 0a 20  tter == "*") {. 
78a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 76                 v
78b0: 61 72 20 6e 65 78 74 5f 6c 65 74 74 65 72 20 3d  ar next_letter =
78c0: 20 67 65 74 5f 63 68 61 72 28 66 70 2c 69 6e 64   get_char(fp,ind
78d0: 65 78 20 2b 20 31 29 3b 0a 20 20 20 20 20 20 20  ex + 1);.       
78e0: 20 20 20 20 20 20 20 20 20 69 66 20 28 6e 65 78           if (nex
78f0: 74 5f 6c 65 74 74 65 72 20 3d 3d 20 22 60 22 29  t_letter == "`")
7900: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
7910: 20 20 20 20 20 20 20 69 6e 64 65 78 20 2b 3d 20         index += 
7920: 33 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  3;.             
7930: 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20     } else {.    
7940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7950: 69 6e 64 65 78 20 2b 3d 20 32 3b 0a 20 20 20 20  index += 2;.    
7960: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7970: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
7980: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7990: 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b          } else {
79a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
79b0: 20 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20   index += 1;.   
79c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65               one
79d0: 5f 69 6e 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20  _index += 1;.   
79e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
79f0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
7a00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
7a10: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7a20: 6d 65 74 61 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 2e  meta;.}..window.
7a30: 70 61 74 74 65 72 6e 5f 6d 65 74 61 20 3d 20 70  pattern_meta = p
7a40: 61 74 74 65 72 6e 5f 6d 65 74 61 3b 0a 0a 0a 66  attern_meta;...f
7a50: 75 6e 63 74 69 6f 6e 20 63 75 65 28 68 74 6d 6c  unction cue(html
7a60: 2c 20 73 65 63 6f 6e 64 73 20 3d 20 35 29 20 7b  , seconds = 5) {
7a70: 0a 20 20 20 20 20 20 20 20 24 28 22 23 63 75 65  .        $("#cue
7a80: 64 22 29 2e 68 74 6d 6c 28 68 74 6d 6c 29 3b 0a  d").html(html);.
7a90: 20 20 20 20 20 20 20 20 73 65 74 54 69 6d 65 6f          setTimeo
7aa0: 75 74 28 66 75 6e 63 74 69 6f 6e 20 28 29 20 7b  ut(function () {
7ab0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 24 28 22  .            $("
7ac0: 23 63 75 65 64 22 29 2e 68 74 6d 6c 28 22 22 29  #cued").html("")
7ad0: 3b 0a 20 20 20 20 20 20 20 20 7d 2c 20 73 65 63  ;.        }, sec
7ae0: 6f 6e 64 73 20 2a 20 31 30 30 30 29 0a 7d 0a 0a  onds * 1000).}..
7af0: 77 69 6e 64 6f 77 2e 63 75 65 20 3d 20 63 75 65  window.cue = cue
7b00: 3b 0a 0a 61 73 79 6e 63 20 66 75 6e 63 74 69 6f  ;..async functio
7b10: 6e 20 6c 6f 61 64 53 61 6d 70 6c 65 73 54 6f 57  n loadSamplesToW
7b20: 6f 72 6b 6c 65 74 28 75 72 6c 73 29 20 7b 0a 20  orklet(urls) {. 
7b30: 20 20 20 76 61 72 20 63 6f 6e 74 65 78 74 20 3d     var context =
7b40: 20 54 6f 6e 65 2e 67 65 74 43 6f 6e 74 65 78 74   Tone.getContext
7b50: 28 29 3b 0a 20 20 20 20 77 69 6e 64 6f 77 2e 63  ();.    window.c
7b60: 6f 6e 74 65 78 74 20 3d 20 63 6f 6e 74 65 78 74  ontext = context
7b70: 3b 0a 20 20 20 20 61 77 61 69 74 20 63 6f 6e 74  ;.    await cont
7b80: 65 78 74 2e 61 64 64 41 75 64 69 6f 57 6f 72 6b  ext.addAudioWork
7b90: 6c 65 74 4d 6f 64 75 6c 65 28 27 2f 73 61 6d 70  letModule('/samp
7ba0: 6c 65 72 2e 6a 73 27 2c 20 27 73 61 6d 70 6c 65  ler.js', 'sample
7bb0: 72 27 29 3b 0a 20 20 20 20 76 61 72 20 73 61 6d  r');.    var sam
7bc0: 70 6c 65 72 20 3d 20 61 77 61 69 74 20 63 6f 6e  pler = await con
7bd0: 74 65 78 74 2e 63 72 65 61 74 65 41 75 64 69 6f  text.createAudio
7be0: 57 6f 72 6b 6c 65 74 4e 6f 64 65 28 27 73 61 6d  WorkletNode('sam
7bf0: 70 6c 65 72 27 2c 20 7b 0a 20 20 20 20 20 20 20  pler', {.       
7c00: 20 6f 75 74 70 75 74 43 68 61 6e 6e 65 6c 43 6f   outputChannelCo
7c10: 75 6e 74 3a 20 5b 32 5d 2c 20 20 2f 2f 20 73 74  unt: [2],  // st
7c20: 65 72 65 6f 0a 20 20 20 20 7d 29 3b 0a 20 20 20  ereo.    });.   
7c30: 20 77 69 6e 64 6f 77 2e 73 61 6d 70 6c 65 72 20   window.sampler 
7c40: 3d 20 73 61 6d 70 6c 65 72 3b 0a 20 20 20 20 76  = sampler;.    v
7c50: 61 72 20 66 69 6c 65 73 20 3d 20 5b 5d 0a 20 20  ar files = [].  
7c60: 20 20 66 6f 72 20 28 76 61 72 20 69 20 3d 20 30    for (var i = 0
7c70: 3b 20 69 20 3c 20 75 72 6c 73 2e 6c 65 6e 67 74  ; i < urls.lengt
7c80: 68 3b 20 69 2b 2b 29 20 7b 0a 20 20 20 20 20 20  h; i++) {.      
7c90: 20 20 76 61 72 20 75 72 6c 20 3d 20 75 72 6c 73    var url = urls
7ca0: 5b 69 5d 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  [i].        cons
7cb0: 74 20 73 6f 75 72 63 65 20 3d 20 63 6f 6e 74 65  t source = conte
7cc0: 78 74 2e 63 72 65 61 74 65 42 75 66 66 65 72 53  xt.createBufferS
7cd0: 6f 75 72 63 65 28 29 3b 0a 20 20 20 20 20 20 20  ource();.       
7ce0: 20 63 6f 6e 73 74 20 61 75 64 69 6f 42 75 66 66   const audioBuff
7cf0: 65 72 20 3d 20 61 77 61 69 74 20 66 65 74 63 68  er = await fetch
7d00: 28 75 72 6c 29 0a 20 20 20 20 20 20 20 20 20 20  (url).          
7d10: 20 20 2e 74 68 65 6e 28 72 65 73 20 3d 3e 20 72    .then(res => r
7d20: 65 73 2e 61 72 72 61 79 42 75 66 66 65 72 28 29  es.arrayBuffer()
7d30: 29 0a 20 20 20 20 20 20 20 20 20 20 20 20 2e 74  ).            .t
7d40: 68 65 6e 28 41 72 72 61 79 42 75 66 66 65 72 20  hen(ArrayBuffer 
7d50: 3d 3e 20 63 6f 6e 74 65 78 74 2e 64 65 63 6f 64  => context.decod
7d60: 65 41 75 64 69 6f 44 61 74 61 28 41 72 72 61 79  eAudioData(Array
7d70: 42 75 66 66 65 72 29 29 3b 0a 0a 20 20 20 20 20  Buffer));..     
7d80: 20 20 20 63 6f 6e 73 74 20 70 63 6d 4c 65 66 74     const pcmLeft
7d90: 20 3d 20 20 61 75 64 69 6f 42 75 66 66 65 72 2e   =  audioBuffer.
7da0: 67 65 74 43 68 61 6e 6e 65 6c 44 61 74 61 28 30  getChannelData(0
7db0: 29 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ).        const 
7dc0: 70 63 6d 52 69 67 68 74 20 3d 20 61 75 64 69 6f  pcmRight = audio
7dd0: 42 75 66 66 65 72 2e 67 65 74 43 68 61 6e 6e 65  Buffer.getChanne
7de0: 6c 44 61 74 61 28 31 29 0a 20 20 20 20 20 20 20  lData(1).       
7df0: 20 66 69 6c 65 73 2e 70 75 73 68 28 7b 20 70 63   files.push({ pc
7e00: 6d 4c 65 66 74 2c 20 70 63 6d 52 69 67 68 74 20  mLeft, pcmRight 
7e10: 7d 29 0a 20 20 20 20 7d 0a 20 20 20 20 73 61 6d  }).    }.    sam
7e20: 70 6c 65 72 2e 70 6f 72 74 2e 70 6f 73 74 4d 65  pler.port.postMe
7e30: 73 73 61 67 65 28 7b 20 69 6e 69 74 3a 20 20 66  ssage({ init:  f
7e40: 69 6c 65 73 20 7d 29 0a 20 20 20 20 63 6f 6e 74  iles }).    cont
7e50: 65 78 74 2e 72 61 77 43 6f 6e 74 65 78 74 2e 72  ext.rawContext.r
7e60: 65 73 75 6d 65 28 29 3b 0a 20 20 20 20 73 61 6d  esume();.    sam
7e70: 70 6c 65 72 2e 63 6f 6e 6e 65 63 74 28 54 6f 6e  pler.connect(Ton
7e80: 65 2e 67 65 74 43 6f 6e 74 65 78 74 28 29 2e 72  e.getContext().r
7e90: 61 77 43 6f 6e 74 65 78 74 2e 64 65 73 74 69 6e  awContext.destin
7ea0: 61 74 69 6f 6e 29 3b 0a 7d 0a 0a 66 75 6e 63 74  ation);.}..funct
7eb0: 69 6f 6e 20 53 61 6d 70 6c 65 28 6e 61 6d 65 2c  ion Sample(name,
7ec0: 20 6e 6f 2c 20 66 69 6c 74 65 72 2c 20 76 6f 6c   no, filter, vol
7ed0: 75 6d 65 29 20 7b 0a 20 20 20 20 6e 61 6d 65 20  ume) {.    name 
7ee0: 3d 20 6e 61 6d 65 0a 20 20 20 20 66 69 6c 74 65  = name.    filte
7ef0: 72 20 3d 20 66 69 6c 74 65 72 20 7c 7c 20 31 30  r = filter || 10
7f00: 30 30 30 0a 20 20 20 20 76 6f 6c 75 6d 65 20 3d  000.    volume =
7f10: 20 76 6f 6c 75 6d 65 20 7c 7c 20 30 0a 20 20 20   volume || 0.   
7f20: 20 6d 65 6d 5b 6e 61 6d 65 20 2b 20 22 5f 66 69   mem[name + "_fi
7f30: 6c 74 65 72 22 5d 20 3d 20 6e 65 77 20 54 6f 6e  lter"] = new Ton
7f40: 65 2e 46 69 6c 74 65 72 28 66 69 6c 74 65 72 2c  e.Filter(filter,
7f50: 20 27 6c 6f 77 70 61 73 73 27 2c 20 2d 39 36 29   'lowpass', -96)
7f60: 3b 0a 20 20 20 20 6d 65 6d 5b 6e 61 6d 65 20 2b  ;.    mem[name +
7f70: 20 22 5f 63 68 61 6e 6e 65 6c 22 5d 20 3d 20 6e   "_channel"] = n
7f80: 65 77 20 54 6f 6e 65 2e 43 68 61 6e 6e 65 6c 28  ew Tone.Channel(
7f90: 7b 63 68 61 6e 6e 65 6c 43 6f 75 6e 74 3a 20 32  {channelCount: 2
7fa0: 2c 20 76 6f 6c 75 6d 65 3a 20 76 6f 6c 75 6d 65  , volume: volume
7fb0: 7d 29 2e 63 68 61 69 6e 28 6d 65 6d 5b 6e 61 6d  }).chain(mem[nam
7fc0: 65 20 2b 20 22 5f 66 69 6c 74 65 72 22 5d 2c 20  e + "_filter"], 
7fd0: 6d 65 6d 2e 6d 61 73 74 65 72 29 0a 20 20 20 20  mem.master).    
7fe0: 73 61 6d 70 6c 65 73 5b 6e 6f 5d 2e 63 6f 6e 6e  samples[no].conn
7ff0: 65 63 74 28 6d 65 6d 5b 6e 61 6d 65 20 2b 20 22  ect(mem[name + "
8000: 5f 63 68 61 6e 6e 65 6c 22 5d 29 3b 0a 20 20 20  _channel"]);.   
8010: 20 68 69 74 5f 6d 61 70 5b 6e 61 6d 65 5d 20 3d   hit_map[name] =
8020: 20 6e 6f 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 2e 53   no;.}..window.S
8030: 61 6d 70 6c 65 20 3d 20 53 61 6d 70 6c 65 3b 0a  ample = Sample;.
8040: 0a 66 75 6e 63 74 69 6f 6e 20 70 77 28 73 2c 20  .function pw(s, 
8050: 76 6f 6c 2c 20 6e 6f 74 65 2c 20 6c 65 6e 2c 20  vol, note, len, 
8060: 64 65 6c 61 79 2c 20 70 61 6e 3d 30 29 20 7b 0a  delay, pan=0) {.
8070: 20 20 20 20 77 69 6e 64 6f 77 2e 73 61 6d 70 6c      window.sampl
8080: 65 72 2e 70 6f 72 74 2e 70 6f 73 74 4d 65 73 73  er.port.postMess
8090: 61 67 65 28 7b 20 6e 6f 74 65 4f 6e 3a 20 74 72  age({ noteOn: tr
80a0: 75 65 2c 20 73 61 6d 70 6c 65 3a 20 73 2c 20 76  ue, sample: s, v
80b0: 6f 6c 75 6d 65 3a 20 76 6f 6c 7d 29 3b 0a 7d 0a  olume: vol});.}.
80c0: 0a 77 69 6e 64 6f 77 2e 70 77 20 3d 20 70 77 3b  .window.pw = pw;
80d0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 28 73 2c 20  ..function p(s, 
80e0: 76 6f 6c 2c 20 6e 6f 74 65 2c 20 6c 65 6e 2c 20  vol, note, len, 
80f0: 64 65 6c 61 79 2c 20 70 61 6e 3d 30 29 20 7b 0a  delay, pan=0) {.
8100: 20 20 20 20 6e 6f 74 65 20 3d 20 6e 6f 74 65 20      note = note 
8110: 7c 7c 20 22 43 33 22 0a 20 20 20 20 6c 65 6e 20  || "C3".    len 
8120: 3d 20 6c 65 6e 20 7c 7c 20 22 31 36 6e 22 0a 20  = len || "16n". 
8130: 20 20 20 76 6f 6c 20 3d 20 76 6f 6c 20 7c 7c 20     vol = vol || 
8140: 31 0a 20 20 20 20 64 65 6c 61 79 20 3d 20 64 65  1.    delay = de
8150: 6c 61 79 20 7c 7c 20 22 2b 30 22 3b 0a 20 20 20  lay || "+0";.   
8160: 20 66 6f 72 20 28 63 6f 6e 73 74 20 5b 6b 65 79   for (const [key
8170: 2c 20 76 61 6c 75 65 5d 20 6f 66 20 4f 62 6a 65  , value] of Obje
8180: 63 74 2e 65 6e 74 72 69 65 73 28 68 69 74 5f 6d  ct.entries(hit_m
8190: 61 70 29 29 20 7b 0a 20 20 20 20 20 20 20 20 69  ap)) {.        i
81a0: 66 20 28 76 61 6c 75 65 20 3d 3d 20 73 29 20 7b  f (value == s) {
81b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6d 65 6d  .            mem
81c0: 5b 6b 65 79 20 2b 20 22 5f 6c 61 73 74 22 5d 20  [key + "_last"] 
81d0: 3d 20 63 6f 75 6e 74 0a 20 20 20 20 20 20 20 20  = count.        
81e0: 20 20 20 20 6d 65 6d 5b 6b 65 79 20 2b 20 22 5f      mem[key + "_
81f0: 63 68 61 6e 6e 65 6c 22 5d 2e 70 61 6e 2e 76 61  channel"].pan.va
8200: 6c 75 65 20 3d 20 70 61 6e 0a 20 20 20 20 20 20  lue = pan.      
8210: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 61    }.    }.    sa
8220: 6d 70 6c 65 73 5b 73 5d 2e 74 72 69 67 67 65 72  mples[s].trigger
8230: 41 74 74 61 63 6b 52 65 6c 65 61 73 65 28 6e 6f  AttackRelease(no
8240: 74 65 2c 20 6c 65 6e 2c 20 64 65 6c 61 79 2c 20  te, len, delay, 
8250: 76 6f 6c 29 3b 0a 7d 0a 0a 77 69 6e 64 6f 77 2e  vol);.}..window.
8260: 70 20 3d 20 70 3b 0a 0a 66 75 6e 63 74 69 6f 6e  p = p;..function
8270: 20 70 31 28 73 2c 20 76 6f 6c 2c 20 6e 6f 74 65   p1(s, vol, note
8280: 2c 20 6c 65 6e 2c 20 64 65 6c 61 79 2c 20 70 61  , len, delay, pa
8290: 6e 3d 30 29 20 7b 0a 20 20 20 20 6e 6f 74 65 20  n=0) {.    note 
82a0: 3d 20 6e 6f 74 65 20 7c 7c 20 22 43 33 22 0a 20  = note || "C3". 
82b0: 20 20 20 6c 65 6e 20 3d 20 6c 65 6e 20 7c 7c 20     len = len || 
82c0: 22 31 36 6e 22 0a 20 20 20 20 76 6f 6c 20 3d 20  "16n".    vol = 
82d0: 76 6f 6c 20 7c 7c 20 31 0a 20 20 20 20 64 65 6c  vol || 1.    del
82e0: 61 79 20 3d 20 64 65 6c 61 79 20 7c 7c 20 22 2b  ay = delay || "+
82f0: 30 22 3b 0a 0a 20 20 20 66 6f 72 20 28 63 6f 6e  0";..   for (con
8300: 73 74 20 5b 6b 65 79 2c 20 76 61 6c 75 65 5d 20  st [key, value] 
8310: 6f 66 20 4f 62 6a 65 63 74 2e 65 6e 74 72 69 65  of Object.entrie
8320: 73 28 68 69 74 5f 6d 61 70 29 29 20 7b 0a 20 20  s(hit_map)) {.  
8330: 20 20 20 20 20 20 69 66 20 28 76 61 6c 75 65 20        if (value 
8340: 3d 3d 20 28 73 20 2d 20 31 29 29 20 7b 0a 20 20  == (s - 1)) {.  
8350: 20 20 20 20 20 20 20 20 20 20 6d 65 6d 5b 6b 65            mem[ke
8360: 79 20 2b 20 22 5f 6c 61 73 74 22 5d 20 3d 20 63  y + "_last"] = c
8370: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ount.           
8380: 20 6d 65 6d 5b 6b 65 79 20 2b 20 22 5f 63 68 61   mem[key + "_cha
8390: 6e 6e 65 6c 22 5d 2e 70 61 6e 2e 76 61 6c 75 65  nnel"].pan.value
83a0: 20 3d 20 70 61 6e 0a 0a 20 20 20 20 20 20 20 20   = pan..        
83b0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 61 6d 70  }.    }.    samp
83c0: 6c 65 73 5b 73 20 2d 20 31 5d 2e 74 72 69 67 67  les[s - 1].trigg
83d0: 65 72 41 74 74 61 63 6b 52 65 6c 65 61 73 65 28  erAttackRelease(
83e0: 6e 6f 74 65 2c 20 6c 65 6e 2c 20 64 65 6c 61 79  note, len, delay
83f0: 2c 20 76 6f 6c 29 3b 0a 20 0a 7d 0a 0a 77 69 6e  , vol);. .}..win
8400: 64 6f 77 2e 70 31 20 3d 20 70 31 3b 0a 0a 66 75  dow.p1 = p1;..fu
8410: 6e 63 74 69 6f 6e 20 70 6e 28 73 2c 20 76 6f 6c  nction pn(s, vol
8420: 2c 20 6e 6f 74 65 2c 20 6c 65 6e 2c 20 64 65 6c  , note, len, del
8430: 61 79 2c 20 70 61 6e 3d 30 29 20 7b 0a 20 20 20  ay, pan=0) {.   
8440: 20 73 61 6d 70 6c 65 5f 6e 6f 20 3d 20 68 69 74   sample_no = hit
8450: 5f 6d 61 70 5b 73 5d 0a 20 20 20 20 6e 6f 74 65  _map[s].    note
8460: 20 3d 20 6e 6f 74 65 20 7c 7c 20 22 43 33 22 0a   = note || "C3".
8470: 20 20 20 20 6c 65 6e 20 3d 20 6c 65 6e 20 7c 7c      len = len ||
8480: 20 22 31 36 6e 22 0a 20 20 20 20 76 6f 6c 20 3d   "16n".    vol =
8490: 20 76 6f 6c 20 7c 7c 20 31 0a 20 20 20 20 64 65   vol || 1.    de
84a0: 6c 61 79 20 3d 20 64 65 6c 61 79 20 7c 7c 20 22  lay = delay || "
84b0: 2b 30 22 3b 0a 0a 20 20 20 20 0a 20 20 20 20 66  +0";..    .    f
84c0: 6f 72 20 28 63 6f 6e 73 74 20 5b 6b 65 79 2c 20  or (const [key, 
84d0: 76 61 6c 75 65 5d 20 6f 66 20 4f 62 6a 65 63 74  value] of Object
84e0: 2e 65 6e 74 72 69 65 73 28 68 69 74 5f 6d 61 70  .entries(hit_map
84f0: 29 29 20 7b 0a 20 20 20 20 09 69 66 20 28 76 61  )) {.    .if (va
8500: 6c 75 65 20 3d 3d 20 73 61 6d 70 6c 65 5f 6e 6f  lue == sample_no
8510: 29 20 7b 0a 09 20 20 20 20 09 6d 65 6d 5b 6b 65  ) {..    .mem[ke
8520: 79 20 2b 20 22 5f 6c 61 73 74 22 5d 20 3d 20 63  y + "_last"] = c
8530: 6f 75 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20  ount.           
8540: 20 6d 65 6d 5b 6b 65 79 20 2b 20 22 5f 63 68 61   mem[key + "_cha
8550: 6e 6e 65 6c 22 5d 2e 70 61 6e 2e 76 61 6c 75 65  nnel"].pan.value
8560: 20 3d 20 70 61 6e 0a 0a 09 20 20 20 20 7d 0a 20   = pan...    }. 
8570: 20 09 7d 0a 20 20 20 20 0a 20 20 20 20 73 61 6d   .}.    .    sam
8580: 70 6c 65 73 5b 73 61 6d 70 6c 65 5f 6e 6f 5d 2e  ples[sample_no].
8590: 74 72 69 67 67 65 72 41 74 74 61 63 6b 52 65 6c  triggerAttackRel
85a0: 65 61 73 65 28 6e 6f 74 65 2c 20 6c 65 6e 2c 20  ease(note, len, 
85b0: 64 65 6c 61 79 2c 20 76 6f 6c 29 3b 0a 0a 7d 0a  delay, vol);..}.
85c0: 0a 77 69 6e 64 6f 77 2e 70 6e 20 3d 20 70 6e 3b  .window.pn = pn;
85d0: 0a 0a 0a 0a 66 75 6e 63 74 69 6f 6e 20 70 61 74  ....function pat
85e0: 74 65 72 6e 5f 70 61 72 73 65 28 70 29 20 7b 0a  tern_parse(p) {.
85f0: 20 20 20 20 69 66 20 28 21 70 29 20 7b 0a 20 20      if (!p) {.  
8600: 20 20 20 20 20 20 72 65 74 75 72 6e 20 22 22 3b        return "";
8610: 0a 20 20 20 20 7d 0a 20 20 20 20 70 20 3d 20 70  .    }.    p = p
8620: 2e 72 65 70 6c 61 63 65 28 2f 20 2f 67 2c 20 22  .replace(/ /g, "
8630: 22 29 3b 0a 20 20 20 20 70 20 3d 20 70 2e 72 65  ");.    p = p.re
8640: 70 6c 61 63 65 28 2f 5c 5b 2e 2b 3f 5c 5d 2f 67  place(/\[.+?\]/g
8650: 2c 20 22 22 29 3b 0a 20 20 20 20 76 61 72 20 66  , "");.    var f
8660: 63 20 3d 20 70 2e 73 70 6c 69 74 28 27 27 29 5b  c = p.split('')[
8670: 30 5d 3b 0a 20 20 20 20 69 66 20 28 66 63 3d 3d  0];.    if (fc==
8680: 20 22 70 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "p") {.        
8690: 76 61 72 20 70 74 79 70 65 20 3d 20 22 78 6f 22  var ptype = "xo"
86a0: 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20 6c 20  ;.        var l 
86b0: 3d 20 28 70 2e 6c 65 6e 67 74 68 20 2d 20 31 29  = (p.length - 1)
86c0: 3b 0a 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20  ;.    } else {. 
86d0: 20 20 20 20 20 20 20 76 61 72 20 70 74 79 70 65         var ptype
86e0: 20 3d 20 22 68 65 78 22 3b 0a 20 20 20 20 20 20   = "hex";.      
86f0: 20 20 76 61 72 20 6c 20 3d 20 28 70 2e 6c 65 6e    var l = (p.len
8700: 67 74 68 29 20 2a 20 34 3b 0a 20 20 20 20 7d 0a  gth) * 4;.    }.
8710: 0a 20 20 20 20 69 66 20 28 70 74 79 70 65 20 3d  .    if (ptype =
8720: 3d 20 22 78 6f 22 29 20 7b 0a 20 20 20 20 20 20  = "xo") {.      
8730: 20 20 76 61 72 20 66 70 20 3d 20 70 2e 73 75 62    var fp = p.sub
8740: 73 74 72 28 31 29 3b 0a 20 20 20 20 20 20 20 20  str(1);.        
8750: 66 70 20 3d 20 66 70 2e 72 65 70 6c 61 63 65 28  fp = fp.replace(
8760: 2f 78 2f 67 2c 20 22 31 22 29 3b 0a 20 20 20 20  /x/g, "1");.    
8770: 7d 0a 0a 20 20 20 20 69 66 20 28 70 74 79 70 65  }..    if (ptype
8780: 20 3d 3d 20 22 78 6f 22 29 20 7b 0a 20 20 20 20   == "xo") {.    
8790: 20 20 20 20 76 61 72 20 66 69 6e 20 3d 20 22 22      var fin = ""
87a0: 3b 0a 20 20 20 20 20 20 20 20 76 61 72 20 64 6f  ;.        var do
87b0: 6e 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20 20  ne = false;.    
87c0: 20 20 20 20 76 61 72 20 69 6e 64 65 78 20 3d 20      var index = 
87d0: 31 3b 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  1;.        while
87e0: 28 31 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20  (1) {.          
87f0: 20 20 69 66 20 28 64 6f 6e 65 29 20 7b 0a 20 20    if (done) {.  
8800: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
8810: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
8820: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 69   }.            i
8830: 66 20 28 69 6e 64 65 78 20 3e 3d 20 66 70 2e 6c  f (index >= fp.l
8840: 65 6e 67 74 68 29 20 7b 0a 20 20 20 20 20 20 20  ength) {.       
8850: 20 20 20 20 20 20 20 20 20 64 6f 6e 65 20 3d 20           done = 
8860: 74 72 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  true;.          
8870: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
8880: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
8890: 20 20 20 20 20 20 20 20 20 20 76 61 72 20 63 75            var cu
88a0: 72 72 65 6e 74 5f 6c 65 74 74 65 72 20 3d 20 66  rrent_letter = f
88b0: 70 5b 69 6e 64 65 78 20 2d 20 31 5d 0a 20 20 20  p[index - 1].   
88c0: 20 20 20 20 20 20 20 20 20 69 66 20 28 63 75 72           if (cur
88d0: 72 65 6e 74 5f 6c 65 74 74 65 72 29 20 7b 0a 20  rent_letter) {. 
88e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 20 28 63             if (c
88f0: 75 72 72 65 6e 74 5f 6c 65 74 74 65 72 20 3d 3d  urrent_letter ==
8900: 20 22 2a 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "*") {.        
8910: 20 20 20 20 20 20 20 20 76 61 72 20 6e 65 78 74          var next
8920: 5f 6c 65 74 74 65 72 20 3d 20 67 65 74 5f 63 68  _letter = get_ch
8930: 61 72 28 66 70 2c 69 6e 64 65 78 29 3b 0a 20 20  ar(fp,index);.  
8940: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
8950: 20 28 6e 65 78 74 5f 6c 65 74 74 65 72 20 3d 3d   (next_letter ==
8960: 20 22 60 22 29 20 7b 0a 20 20 20 20 20 20 20 20   "`") {.        
8970: 20 20 20 20 20 20 20 20 20 20 20 20 76 61 72 20              var 
8980: 6e 65 78 74 5f 6e 65 78 74 5f 6c 65 74 74 65 72  next_next_letter
8990: 20 3d 20 67 65 74 5f 63 68 61 72 28 66 70 2c 69   = get_char(fp,i
89a0: 6e 64 65 78 20 2b 20 31 29 3b 0a 20 20 20 20 20  ndex + 1);.     
89b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
89c0: 69 6e 20 2b 3d 20 20 6c 65 74 74 65 72 74 6f 64  in +=  lettertod
89d0: 65 63 28 72 6f 6d 61 6e 74 6f 67 79 70 73 79 28  ec(romantogypsy(
89e0: 6e 65 78 74 5f 6c 65 74 74 65 72 20 2b 20 6e 65  next_letter + ne
89f0: 78 74 5f 6e 65 78 74 5f 6c 65 74 74 65 72 29 29  xt_next_letter))
8a00: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8a10: 20 20 20 20 20 20 69 6e 64 65 78 20 2b 3d 20 33        index += 3
8a20: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
8a30: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
8a40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66                 f
8a50: 69 6e 20 2b 3d 20 6c 65 74 74 65 72 74 6f 64 65  in += lettertode
8a60: 63 28 6e 65 78 74 5f 6c 65 74 74 65 72 29 3b 0a  c(next_letter);.
8a70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8a80: 20 20 20 20 69 6e 64 65 78 20 2b 3d 20 32 3b 0a      index += 2;.
8a90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8aa0: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 20  }.            } 
8ab0: 65 6c 73 65 20 7b 0a 20 20 20 20 20 20 20 20 20  else {.         
8ac0: 20 20 20 20 20 20 20 66 69 6e 20 2b 3d 20 63 75         fin += cu
8ad0: 72 72 65 6e 74 5f 6c 65 74 74 65 72 3b 0a 20 20  rrent_letter;.  
8ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6e                in
8af0: 64 65 78 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20  dex += 1;.      
8b00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8b10: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
8b20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 66          return f
8b30: 69 6e 3b 0a 20 20 20 20 7d 0a 20 20 20 20 65 6c  in;.    }.    el
8b40: 73 65 20 7b 0a 20 20 20 20 20 20 20 20 76 61 72  se {.        var
8b50: 20 66 70 20 3d 20 68 65 78 32 62 69 6e 28 70 29   fp = hex2bin(p)
8b60: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 72 65 74  ;.    }..    ret
8b70: 75 72 6e 20 66 70 3b 0a 7d 0a 0a 77 69 6e 64 6f  urn fp;.}..windo
8b80: 77 2e 70 61 74 74 65 72 6e 5f 70 61 72 73 65 20  w.pattern_parse 
8b90: 3d 20 70 61 74 74 65 72 6e 5f 70 61 72 73 65 3b  = pattern_parse;
8ba0: 0a 0a 66 75 6e 63 74 69 6f 6e 20 64 6f 77 6e 6c  ..function downl
8bb0: 6f 61 64 28 64 61 74 61 2c 20 66 69 6c 65 6e 61  oad(data, filena
8bc0: 6d 65 2c 20 74 79 70 65 29 20 7b 0a 20 20 20 20  me, type) {.    
8bd0: 76 61 72 20 66 69 6c 65 20 3d 20 6e 65 77 20 42  var file = new B
8be0: 6c 6f 62 28 5b 64 61 74 61 5d 2c 20 7b 20 74 79  lob([data], { ty
8bf0: 70 65 3a 20 74 79 70 65 20 7d 29 3b 0a 20 20 20  pe: type });.   
8c00: 20 69 66 20 28 77 69 6e 64 6f 77 2e 6e 61 76 69   if (window.navi
8c10: 67 61 74 6f 72 2e 6d 73 53 61 76 65 4f 72 4f 70  gator.msSaveOrOp
8c20: 65 6e 42 6c 6f 62 29 20 2f 2f 20 49 45 31 30 2b  enBlob) // IE10+
8c30: 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 2e  .        window.
8c40: 6e 61 76 69 67 61 74 6f 72 2e 6d 73 53 61 76 65  navigator.msSave
8c50: 4f 72 4f 70 65 6e 42 6c 6f 62 28 66 69 6c 65 2c  OrOpenBlob(file,
8c60: 20 66 69 6c 65 6e 61 6d 65 29 3b 0a 20 20 20 20   filename);.    
8c70: 65 6c 73 65 20 7b 20 2f 2f 20 4f 74 68 65 72 73  else { // Others
8c80: 0a 20 20 20 20 20 20 20 20 76 61 72 20 61 20 3d  .        var a =
8c90: 20 64 6f 63 75 6d 65 6e 74 2e 63 72 65 61 74 65   document.create
8ca0: 45 6c 65 6d 65 6e 74 28 22 61 22 29 2c 0a 20 20  Element("a"),.  
8cb0: 20 20 20 20 20 20 20 20 20 20 75 72 6c 20 3d 20            url = 
8cc0: 55 52 4c 2e 63 72 65 61 74 65 4f 62 6a 65 63 74  URL.createObject
8cd0: 55 52 4c 28 66 69 6c 65 29 3b 0a 20 20 20 20 20  URL(file);.     
8ce0: 20 20 20 61 2e 68 72 65 66 20 3d 20 75 72 6c 3b     a.href = url;
8cf0: 0a 20 20 20 20 20 20 20 20 61 2e 64 6f 77 6e 6c  .        a.downl
8d00: 6f 61 64 20 3d 20 66 69 6c 65 6e 61 6d 65 3b 0a  oad = filename;.
8d10: 20 20 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74          document
8d20: 2e 62 6f 64 79 2e 61 70 70 65 6e 64 43 68 69 6c  .body.appendChil
8d30: 64 28 61 29 3b 0a 20 20 20 20 20 20 20 20 61 2e  d(a);.        a.
8d40: 63 6c 69 63 6b 28 29 3b 0a 20 20 20 20 20 20 20  click();.       
8d50: 20 73 65 74 54 69 6d 65 6f 75 74 28 66 75 6e 63   setTimeout(func
8d60: 74 69 6f 6e 20 28 29 20 7b 0a 20 20 20 20 20 20  tion () {.      
8d70: 20 20 20 20 20 20 64 6f 63 75 6d 65 6e 74 2e 62        document.b
8d80: 6f 64 79 2e 72 65 6d 6f 76 65 43 68 69 6c 64 28  ody.removeChild(
8d90: 61 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  a);.            
8da0: 77 69 6e 64 6f 77 2e 55 52 4c 2e 72 65 76 6f 6b  window.URL.revok
8db0: 65 4f 62 6a 65 63 74 55 52 4c 28 75 72 6c 29 3b  eObjectURL(url);
8dc0: 0a 20 20 20 20 20 20 20 20 7d 2c 20 30 29 3b 0a  .        }, 0);.
8dd0: 20 20 20 20 7d 0a 7d 0a 0a 2f 2f 20 68 74 74 70      }.}..// http
8de0: 73 3a 2f 2f 73 74 61 63 6b 6f 76 65 72 66 6c 6f  s://stackoverflo
8df0: 77 2e 63 6f 6d 2f 71 75 65 73 74 69 6f 6e 73 2f  w.com/questions/
8e00: 31 35 37 36 32 37 36 38 2f 6a 61 76 61 73 63 72  15762768/javascr
8e10: 69 70 74 2d 6d 61 74 68 2d 72 6f 75 6e 64 2d 74  ipt-math-round-t
8e20: 6f 2d 74 77 6f 2d 64 65 63 69 6d 61 6c 2d 70 6c  o-two-decimal-pl
8e30: 61 63 65 73 0a 66 75 6e 63 74 69 6f 6e 20 72 6f  aces.function ro
8e40: 75 6e 64 54 6f 28 6e 2c 20 64 69 67 69 74 73 29  undTo(n, digits)
8e50: 20 7b 0a 20 20 20 20 76 61 72 20 6e 65 67 61 74   {.    var negat
8e60: 69 76 65 20 3d 20 66 61 6c 73 65 3b 0a 20 20 20  ive = false;.   
8e70: 20 69 66 20 28 64 69 67 69 74 73 20 3d 3d 3d 20   if (digits === 
8e80: 75 6e 64 65 66 69 6e 65 64 29 20 7b 0a 20 20 20  undefined) {.   
8e90: 20 20 20 20 20 64 69 67 69 74 73 20 3d 20 30 3b       digits = 0;
8ea0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 20 28 6e  .    }.    if (n
8eb0: 20 3c 20 30 29 20 7b 0a 20 20 20 20 20 20 20 20   < 0) {.        
8ec0: 6e 65 67 61 74 69 76 65 20 3d 20 74 72 75 65 3b  negative = true;
8ed0: 0a 20 20 20 20 20 20 20 20 6e 20 3d 20 6e 20 2a  .        n = n *
8ee0: 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 76   -1;.    }.    v
8ef0: 61 72 20 6d 75 6c 74 69 70 6c 69 63 61 74 6f 72  ar multiplicator
8f00: 20 3d 20 4d 61 74 68 2e 70 6f 77 28 31 30 2c 20   = Math.pow(10, 
8f10: 64 69 67 69 74 73 29 3b 0a 20 20 20 20 6e 20 3d  digits);.    n =
8f20: 20 70 61 72 73 65 46 6c 6f 61 74 28 28 6e 20 2a   parseFloat((n *
8f30: 20 6d 75 6c 74 69 70 6c 69 63 61 74 6f 72 29 2e   multiplicator).
8f40: 74 6f 46 69 78 65 64 28 31 31 29 29 3b 0a 20 20  toFixed(11));.  
8f50: 20 20 6e 20 3d 20 28 4d 61 74 68 2e 72 6f 75 6e    n = (Math.roun
8f60: 64 28 6e 29 20 2f 20 6d 75 6c 74 69 70 6c 69 63  d(n) / multiplic
8f70: 61 74 6f 72 29 2e 74 6f 46 69 78 65 64 28 64 69  ator).toFixed(di
8f80: 67 69 74 73 29 3b 0a 20 20 20 20 69 66 20 28 6e  gits);.    if (n
8f90: 65 67 61 74 69 76 65 29 20 7b 0a 20 20 20 20 20  egative) {.     
8fa0: 20 20 20 6e 20 3d 20 28 6e 20 2a 20 2d 31 29 2e     n = (n * -1).
8fb0: 74 6f 46 69 78 65 64 28 64 69 67 69 74 73 29 3b  toFixed(digits);
8fc0: 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72  .    }.    retur
8fd0: 6e 20 6e 3b 0a 7d 0a 0a 24 7b 6b 6e 6f 62 5f 63  n n;.}..${knob_c
8fe0: 6f 64 65 7d 0a 60 60 60 0a 0a 23 23 20 33 30 33  ode}.```..## 303
8ff0: 0a 0a 54 61 6b 65 6e 20 66 72 6f 6d 20 5b 65 6e  ..Taken from [en
9000: 64 6c 65 73 73 20 61 63 69 64 20 62 61 6e 67 65  dless acid bange
9010: 72 5d 28 68 74 74 70 73 3a 2f 2f 77 77 77 2e 76  r](https://www.v
9020: 69 74 6c 69 6e 67 2e 78 79 7a 2f 74 6f 79 73 2f  itling.xyz/toys/
9030: 61 63 69 64 2d 62 61 6e 67 65 72 2f 29 2e 0a 0a  acid-banger/)...
9040: 60 60 60 6a 73 0a 66 75 6e 63 74 69 6f 6e 20 54  ```js.function T
9050: 68 72 65 65 4f 68 55 6e 69 74 28 61 75 64 69 6f  hreeOhUnit(audio
9060: 2c 20 77 61 76 65 66 6f 72 6d 2c 20 64 65 66 61  , waveform, defa
9070: 75 6c 74 73 20 3d 20 6e 75 6c 6c 2c 20 6f 75 74  ults = null, out
9080: 70 75 74 2c 20 70 61 74 74 65 72 6e 4c 65 6e 67  put, patternLeng
9090: 74 68 20 3d 20 31 36 29 20 7b 0a 20 20 20 20 63  th = 16) {.    c
90a0: 6f 6e 73 74 20 73 79 6e 74 68 20 3d 20 61 75 64  onst synth = aud
90b0: 69 6f 2e 54 68 72 65 65 4f 68 28 77 61 76 65 66  io.ThreeOh(wavef
90c0: 6f 72 6d 2c 20 64 65 66 61 75 6c 74 73 20 3d 20  orm, defaults = 
90d0: 64 65 66 61 75 6c 74 73 2c 20 6f 75 74 70 75 74  defaults, output
90e0: 29 3b 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  );.    function 
90f0: 73 74 65 70 28 6e 6f 74 65 29 20 7b 0a 20 20 20  step(note) {.   
9100: 20 20 20 20 20 6e 6f 74 65 20 3d 20 6e 6f 74 65       note = note
9110: 20 7c 7c 20 7b 0a 20 20 20 20 20 20 20 20 20 20   || {.          
9120: 20 20 74 79 70 65 3a 20 22 6f 6e 22 2c 0a 20 20    type: "on",.  
9130: 20 20 20 20 20 20 20 20 20 20 61 63 63 65 6e 74            accent
9140: 3a 20 66 61 6c 73 65 2c 0a 20 20 20 20 20 20 20  : false,.       
9150: 20 20 20 20 20 67 6c 69 64 65 3a 20 74 72 75 65       glide: true
9160: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e 6f  ,.            no
9170: 74 65 3a 20 22 41 33 22 2c 0a 20 20 20 20 20 20  te: "A3",.      
9180: 20 20 7d 3b 0a 20 20 20 20 20 20 20 20 69 66 20    };.        if 
9190: 28 6e 6f 74 65 20 3d 3d 20 22 6f 66 66 22 29 20  (note == "off") 
91a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 79  {.            sy
91b0: 6e 74 68 2e 6e 6f 74 65 4f 66 66 28 29 3b 0a 20  nth.noteOff();. 
91c0: 20 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a         } else {.
91d0: 20 20 20 20 20 20 20 20 20 20 20 20 73 79 6e 74              synt
91e0: 68 2e 6e 6f 74 65 4f 6e 28 6e 6f 74 65 2e 6e 6f  h.noteOn(note.no
91f0: 74 65 2c 20 6e 6f 74 65 2e 61 63 63 65 6e 74 2c  te, note.accent,
9200: 20 6e 6f 74 65 2e 67 6c 69 64 65 29 3b 0a 20 20   note.glide);.  
9210: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
9220: 20 20 72 65 74 75 72 6e 20 7b 0a 20 20 20 20 20    return {.     
9230: 20 20 20 73 74 65 70 2c 0a 20 20 20 20 20 20 20     step,.       
9240: 20 70 61 72 61 6d 73 3a 20 73 79 6e 74 68 2e 70   params: synth.p
9250: 61 72 61 6d 73 0a 20 20 20 20 7d 3b 0a 7d 0a 0a  arams.    };.}..
9260: 66 75 6e 63 74 69 6f 6e 20 74 65 78 74 4e 6f 74  function textNot
9270: 65 54 6f 4e 75 6d 62 65 72 28 6e 6f 74 65 29 20  eToNumber(note) 
9280: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 6c 6f 6f 6b  {.    const look
9290: 75 70 54 61 62 6c 65 20 3d 20 6e 65 77 20 4d 61  upTable = new Ma
92a0: 70 28 29 3b 0a 20 20 20 20 63 6f 6e 73 74 20 72  p();.    const r
92b0: 65 76 4c 6f 6f 6b 20 3d 20 6e 65 77 20 4d 61 70  evLook = new Map
92c0: 28 29 3b 0a 20 20 20 20 28 28 29 20 3d 3e 20 7b  ();.    (() => {
92d0: 0a 20 20 20 20 20 20 20 20 66 75 6e 63 74 69 6f  .        functio
92e0: 6e 20 61 64 64 28 6e 6f 74 65 2c 20 6e 29 20 7b  n add(note, n) {
92f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 6c 6f 6f  .            loo
9300: 6b 75 70 54 61 62 6c 65 2e 73 65 74 28 6e 6f 74  kupTable.set(not
9310: 65 2c 20 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  e, n);.         
9320: 20 20 20 72 65 76 4c 6f 6f 6b 2e 73 65 74 28 6e     revLook.set(n
9330: 2c 20 6e 6f 74 65 29 3b 0a 20 20 20 20 20 20 20  , note);.       
9340: 20 7d 0a 20 20 20 20 20 20 20 20 61 64 64 28 27   }.        add('
9350: 41 27 2c 20 39 29 3b 0a 20 20 20 20 20 20 20 20  A', 9);.        
9360: 61 64 64 28 27 41 23 27 2c 20 31 30 29 3b 0a 20  add('A#', 10);. 
9370: 20 20 20 20 20 20 20 61 64 64 28 27 42 27 2c 20         add('B', 
9380: 31 31 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  11);.        add
9390: 28 27 43 27 2c 20 30 29 3b 0a 20 20 20 20 20 20  ('C', 0);.      
93a0: 20 20 61 64 64 28 27 43 23 27 2c 20 31 29 3b 0a    add('C#', 1);.
93b0: 20 20 20 20 20 20 20 20 61 64 64 28 27 44 27 2c          add('D',
93c0: 20 32 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64   2);.        add
93d0: 28 27 44 23 27 2c 20 33 29 3b 0a 20 20 20 20 20  ('D#', 3);.     
93e0: 20 20 20 61 64 64 28 27 45 27 2c 20 34 29 3b 0a     add('E', 4);.
93f0: 20 20 20 20 20 20 20 20 61 64 64 28 27 46 27 2c          add('F',
9400: 20 35 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64   5);.        add
9410: 28 27 46 23 27 2c 20 36 29 3b 0a 20 20 20 20 20  ('F#', 6);.     
9420: 20 20 20 61 64 64 28 27 47 27 2c 20 37 29 3b 0a     add('G', 7);.
9430: 20 20 20 20 20 20 20 20 61 64 64 28 27 47 23 27          add('G#'
9440: 2c 20 38 29 3b 0a 20 20 20 20 7d 29 28 29 3b 0a  , 8);.    })();.
9450: 0a 20 20 20 20 63 6f 6e 73 74 20 6f 20 3d 20 6e  .    const o = n
9460: 6f 74 65 2e 73 75 62 73 74 72 69 6e 67 28 6e 6f  ote.substring(no
9470: 74 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29 3b 0a  te.length - 1);.
9480: 20 20 20 20 63 6f 6e 73 74 20 6e 20 3d 20 6e 6f      const n = no
9490: 74 65 2e 73 75 62 73 74 72 69 6e 67 28 30 2c 20  te.substring(0, 
94a0: 6e 6f 74 65 2e 6c 65 6e 67 74 68 20 2d 20 31 29  note.length - 1)
94b0: 3b 0a 20 20 20 20 2f 2f 20 40 74 73 2d 69 67 6e  ;.    // @ts-ign
94c0: 6f 72 65 0a 20 20 20 20 72 65 74 75 72 6e 20 70  ore.    return p
94d0: 61 72 73 65 49 6e 74 28 6f 29 20 2a 20 31 32 20  arseInt(o) * 12 
94e0: 2b 20 6c 6f 6f 6b 75 70 54 61 62 6c 65 2e 67 65  + lookupTable.ge
94f0: 74 28 6e 29 20 2b 20 31 32 3b 0a 7d 0a 0a 66 75  t(n) + 12;.}..fu
9500: 6e 63 74 69 6f 6e 20 6d 69 64 69 4e 6f 74 65 54  nction midiNoteT
9510: 6f 46 72 65 71 75 65 6e 63 79 28 6e 6f 74 65 4e  oFrequency(noteN
9520: 75 6d 62 65 72 29 20 7b 0a 20 20 20 20 72 65 74  umber) {.    ret
9530: 75 72 6e 20 34 34 30 20 2a 20 4d 61 74 68 2e 70  urn 440 * Math.p
9540: 6f 77 28 32 2c 20 28 6e 6f 74 65 4e 75 6d 62 65  ow(2, (noteNumbe
9550: 72 20 2d 20 36 39 29 20 2f 20 31 32 29 3b 0a 7d  r - 69) / 12);.}
9560: 0a 0a 66 75 6e 63 74 69 6f 6e 20 41 75 64 69 6f  ..function Audio
9570: 28 61 75 20 3d 20 6e 65 77 20 28 77 69 6e 64 6f  (au = new (windo
9580: 77 2e 41 75 64 69 6f 43 6f 6e 74 65 78 74 20 7c  w.AudioContext |
9590: 7c 20 77 69 6e 64 6f 77 2e 77 65 62 6b 69 74 41  | window.webkitA
95a0: 75 64 69 6f 43 6f 6e 74 65 78 74 29 28 29 29 20  udioContext)()) 
95b0: 7b 0a 0a 20 20 20 20 66 75 6e 63 74 69 6f 6e 20  {..    function 
95c0: 6d 61 73 74 65 72 43 68 61 6e 6e 65 6c 28 29 20  masterChannel() 
95d0: 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  {.        const 
95e0: 67 61 69 6e 20 3d 20 61 75 2e 63 72 65 61 74 65  gain = au.create
95f0: 47 61 69 6e 28 29 3b 0a 20 20 20 20 20 20 20 20  Gain();.        
9600: 67 61 69 6e 2e 67 61 69 6e 2e 76 61 6c 75 65 20  gain.gain.value 
9610: 3d 20 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 63  = 0.5;.        c
9620: 6f 6e 73 74 20 6c 69 6d 69 74 65 72 20 3d 20 61  onst limiter = a
9630: 75 2e 63 72 65 61 74 65 44 79 6e 61 6d 69 63 73  u.createDynamics
9640: 43 6f 6d 70 72 65 73 73 6f 72 28 29 3b 0a 20 20  Compressor();.  
9650: 20 20 20 20 20 20 6c 69 6d 69 74 65 72 2e 61 74        limiter.at
9660: 74 61 63 6b 2e 76 61 6c 75 65 20 3d 20 30 2e 30  tack.value = 0.0
9670: 30 35 3b 0a 20 20 20 20 20 20 20 20 6c 69 6d 69  05;.        limi
9680: 74 65 72 2e 72 65 6c 65 61 73 65 2e 76 61 6c 75  ter.release.valu
9690: 65 20 3d 20 30 2e 31 3b 0a 20 20 20 20 20 20 20  e = 0.1;.       
96a0: 20 6c 69 6d 69 74 65 72 2e 72 61 74 69 6f 2e 76   limiter.ratio.v
96b0: 61 6c 75 65 20 3d 20 31 35 2e 30 3b 0a 20 20 20  alue = 15.0;.   
96c0: 20 20 20 20 20 6c 69 6d 69 74 65 72 2e 6b 6e 65       limiter.kne
96d0: 65 2e 76 61 6c 75 65 20 3d 20 30 2e 30 3b 0a 20  e.value = 0.0;. 
96e0: 20 20 20 20 20 20 20 6c 69 6d 69 74 65 72 2e 74         limiter.t
96f0: 68 72 65 73 68 6f 6c 64 2e 76 61 6c 75 65 20 3d  hreshold.value =
9700: 20 2d 30 2e 35 3b 0a 20 20 20 20 20 20 20 20 67   -0.5;.        g
9710: 61 69 6e 2e 63 6f 6e 6e 65 63 74 28 6c 69 6d 69  ain.connect(limi
9720: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 6c 69  ter);.        li
9730: 6d 69 74 65 72 2e 63 6f 6e 6e 65 63 74 28 61 75  miter.connect(au
9740: 2e 64 65 73 74 69 6e 61 74 69 6f 6e 29 3b 0a 20  .destination);. 
9750: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 7b 0a         return {.
9760: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 3a 20              in: 
9770: 67 61 69 6e 0a 20 20 20 20 20 20 20 20 7d 3b 0a  gain.        };.
9780: 20 20 20 20 7d 0a 0a 20 20 20 20 63 6f 6e 73 74      }..    const
9790: 20 6d 61 73 74 65 72 20 3d 20 6d 61 73 74 65 72   master = master
97a0: 43 68 61 6e 6e 65 6c 28 29 3b 0a 0a 20 20 20 20  Channel();..    
97b0: 66 75 6e 63 74 69 6f 6e 20 54 68 72 65 65 4f 68  function ThreeOh
97c0: 28 74 79 70 65 20 3d 20 22 73 61 77 74 6f 6f 74  (type = "sawtoot
97d0: 68 22 2c 20 64 65 66 61 75 6c 74 73 2c 20 6f 75  h", defaults, ou
97e0: 74 20 3d 20 6d 61 73 74 65 72 2e 69 6e 29 20 7b  t = master.in) {
97f0: 0a 20 20 20 20 20 20 20 20 64 65 66 61 75 6c 74  .        default
9800: 73 20 3d 20 64 65 66 61 75 6c 74 73 20 7c 7c 20  s = defaults || 
9810: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 22 63  {.            "c
9820: 75 74 6f 66 66 22 3a 20 34 30 30 2c 0a 20 20 20  utoff": 400,.   
9830: 20 20 20 20 20 20 20 20 20 22 72 65 73 6f 6e 61           "resona
9840: 6e 63 65 22 3a 20 31 35 2c 0a 20 20 20 20 20 20  nce": 15,.      
9850: 20 20 20 20 20 20 22 65 6e 76 4d 6f 64 22 3a 20        "envMod": 
9860: 34 30 30 30 2c 0a 20 20 20 20 20 20 20 20 20 20  4000,.          
9870: 20 20 22 64 65 63 61 79 22 3a 20 30 2e 35 0a 20    "decay": 0.5. 
9880: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9890: 20 63 6f 6e 73 74 20 66 69 6c 74 65 72 20 3d 20   const filter = 
98a0: 61 75 2e 63 72 65 61 74 65 42 69 71 75 61 64 46  au.createBiquadF
98b0: 69 6c 74 65 72 28 29 3b 0a 20 20 20 20 20 20 20  ilter();.       
98c0: 20 66 69 6c 74 65 72 2e 74 79 70 65 20 3d 20 22   filter.type = "
98d0: 6c 6f 77 70 61 73 73 22 3b 0a 20 20 20 20 20 20  lowpass";.      
98e0: 20 20 66 69 6c 74 65 72 2e 51 2e 76 61 6c 75 65    filter.Q.value
98f0: 20 3d 20 64 65 66 61 75 6c 74 73 2e 72 65 73 6f   = defaults.reso
9900: 6e 61 6e 63 65 3b 0a 20 20 20 20 20 20 20 20 66  nance;.        f
9910: 69 6c 74 65 72 2e 66 72 65 71 75 65 6e 63 79 2e  ilter.frequency.
9920: 76 61 6c 75 65 20 3d 20 64 65 66 61 75 6c 74 73  value = defaults
9930: 2e 63 75 74 6f 66 66 3b 0a 20 20 20 20 20 20 20  .cutoff;.       
9940: 20 63 6f 6e 73 74 20 70 52 65 73 6f 6e 61 6e 63   const pResonanc
9950: 65 20 3d 20 66 69 6c 74 65 72 2e 51 3b 0a 20 20  e = filter.Q;.  
9960: 20 20 20 20 20 20 63 6f 6e 73 74 20 70 43 75 74        const pCut
9970: 6f 66 66 20 3d 20 66 69 6c 74 65 72 2e 66 72 65  off = filter.fre
9980: 71 75 65 6e 63 79 3b 0a 0a 20 20 20 20 20 20 20  quency;..       
9990: 20 63 6f 6e 73 74 20 64 65 63 61 79 54 69 6d 65   const decayTime
99a0: 4e 6f 64 65 20 3d 20 61 75 2e 63 72 65 61 74 65  Node = au.create
99b0: 43 6f 6e 73 74 61 6e 74 53 6f 75 72 63 65 28 29  ConstantSource()
99c0: 3b 0a 20 20 20 20 20 20 20 20 64 65 63 61 79 54  ;.        decayT
99d0: 69 6d 65 4e 6f 64 65 2e 6f 66 66 73 65 74 2e 76  imeNode.offset.v
99e0: 61 6c 75 65 20 3d 20 64 65 66 61 75 6c 74 73 2e  alue = defaults.
99f0: 64 65 63 61 79 3b 0a 20 20 20 20 20 20 20 20 64  decay;.        d
9a00: 65 63 61 79 54 69 6d 65 4e 6f 64 65 2e 73 74 61  ecayTimeNode.sta
9a10: 72 74 28 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  rt();.        co
9a20: 6e 73 74 20 70 44 65 63 61 79 20 3d 20 64 65 63  nst pDecay = dec
9a30: 61 79 54 69 6d 65 4e 6f 64 65 2e 6f 66 66 73 65  ayTimeNode.offse
9a40: 74 3b 0a 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  t;..        cons
9a50: 74 20 65 6e 76 20 3d 20 61 75 2e 63 72 65 61 74  t env = au.creat
9a60: 65 43 6f 6e 73 74 61 6e 74 53 6f 75 72 63 65 28  eConstantSource(
9a70: 29 3b 0a 20 20 20 20 20 20 20 20 65 6e 76 2e 73  );.        env.s
9a80: 74 61 72 74 28 29 3b 0a 20 20 20 20 20 20 20 20  tart();.        
9a90: 65 6e 76 2e 6f 66 66 73 65 74 2e 76 61 6c 75 65  env.offset.value
9aa0: 20 3d 20 30 2e 30 3b 0a 0a 20 20 20 20 20 20 20   = 0.0;..       
9ab0: 20 63 6f 6e 73 74 20 73 63 61 6c 65 4e 6f 64 65   const scaleNode
9ac0: 20 3d 20 61 75 2e 63 72 65 61 74 65 47 61 69 6e   = au.createGain
9ad0: 28 29 3b 0a 20 20 20 20 20 20 20 20 73 63 61 6c  ();.        scal
9ae0: 65 4e 6f 64 65 2e 67 61 69 6e 2e 76 61 6c 75 65  eNode.gain.value
9af0: 20 3d 20 64 65 66 61 75 6c 74 73 2e 65 6e 76 4d   = defaults.envM
9b00: 6f 64 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73  od;.        cons
9b10: 74 20 70 45 6e 76 4d 6f 64 20 3d 20 73 63 61 6c  t pEnvMod = scal
9b20: 65 4e 6f 64 65 2e 67 61 69 6e 3b 0a 20 20 20 20  eNode.gain;.    
9b30: 20 20 20 20 65 6e 76 2e 63 6f 6e 6e 65 63 74 28      env.connect(
9b40: 73 63 61 6c 65 4e 6f 64 65 29 3b 0a 20 20 20 20  scaleNode);.    
9b50: 20 20 20 20 73 63 61 6c 65 4e 6f 64 65 2e 63 6f      scaleNode.co
9b60: 6e 6e 65 63 74 28 66 69 6c 74 65 72 2e 64 65 74  nnect(filter.det
9b70: 75 6e 65 29 3b 0a 20 20 20 20 20 20 20 20 63 6f  une);.        co
9b80: 6e 73 74 20 6f 73 63 20 3d 20 61 75 2e 63 72 65  nst osc = au.cre
9b90: 61 74 65 4f 73 63 69 6c 6c 61 74 6f 72 28 29 3b  ateOscillator();
9ba0: 0a 20 20 20 20 20 20 20 20 6f 73 63 2e 74 79 70  .        osc.typ
9bb0: 65 20 3d 20 74 79 70 65 3b 0a 20 20 20 20 20 20  e = type;.      
9bc0: 20 20 6f 73 63 2e 66 72 65 71 75 65 6e 63 79 2e    osc.frequency.
9bd0: 76 61 6c 75 65 20 3d 20 34 34 30 3b 0a 20 20 20  value = 440;.   
9be0: 20 20 20 20 20 6f 73 63 2e 73 74 61 72 74 28 29       osc.start()
9bf0: 3b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20  ;.        const 
9c00: 76 63 61 20 3d 20 61 75 2e 63 72 65 61 74 65 47  vca = au.createG
9c10: 61 69 6e 28 29 3b 0a 20 20 20 20 20 20 20 20 76  ain();.        v
9c20: 63 61 2e 67 61 69 6e 2e 76 61 6c 75 65 20 3d 20  ca.gain.value = 
9c30: 30 2e 30 3b 0a 20 20 20 20 20 20 20 20 6f 73 63  0.0;.        osc
9c40: 2e 63 6f 6e 6e 65 63 74 28 76 63 61 29 3b 0a 20  .connect(vca);. 
9c50: 20 20 20 20 20 20 20 76 63 61 2e 63 6f 6e 6e 65         vca.conne
9c60: 63 74 28 66 69 6c 74 65 72 29 3b 0a 20 20 20 20  ct(filter);.    
9c70: 20 20 20 20 66 69 6c 74 65 72 2e 63 6f 6e 6e 65      filter.conne
9c80: 63 74 28 6f 75 74 29 3b 0a 20 20 20 20 20 20 20  ct(out);.       
9c90: 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 65 4f 6e   function noteOn
9ca0: 28 6e 6f 74 65 2c 20 61 63 63 65 6e 74 20 3d 20  (note, accent = 
9cb0: 66 61 6c 73 65 2c 20 67 6c 69 64 65 20 3d 20 66  false, glide = f
9cc0: 61 6c 73 65 29 20 7b 0a 20 20 20 20 20 20 20 20  alse) {.        
9cd0: 20 20 20 20 69 66 20 28 61 63 63 65 6e 74 29 20      if (accent) 
9ce0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
9cf0: 20 20 65 6e 76 2e 6f 66 66 73 65 74 2e 63 61 6e    env.offset.can
9d00: 63 65 6c 53 63 68 65 64 75 6c 65 64 56 61 6c 75  celScheduledValu
9d10: 65 73 28 61 75 2e 63 75 72 72 65 6e 74 54 69 6d  es(au.currentTim
9d20: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
9d30: 20 20 20 20 2f 2f 65 6e 76 2e 6f 66 66 73 65 74      //env.offset
9d40: 2e 73 65 74 54 61 72 67 65 74 41 74 54 69 6d 65  .setTargetAtTime
9d50: 28 31 2e 30 2c 61 75 2e 63 75 72 72 65 6e 74 54  (1.0,au.currentT
9d60: 69 6d 65 2c 20 30 2e 30 30 31 29 3b 0a 20 20 20  ime, 0.001);.   
9d70: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 76               env
9d80: 2e 6f 66 66 73 65 74 2e 73 65 74 56 61 6c 75 65  .offset.setValue
9d90: 41 74 54 69 6d 65 28 31 2e 30 2c 20 61 75 2e 63  AtTime(1.0, au.c
9da0: 75 72 72 65 6e 74 54 69 6d 65 29 3b 0a 20 20 20  urrentTime);.   
9db0: 20 20 20 20 20 20 20 20 20 20 20 20 20 65 6e 76               env
9dc0: 2e 6f 66 66 73 65 74 2e 65 78 70 6f 6e 65 6e 74  .offset.exponent
9dd0: 69 61 6c 52 61 6d 70 54 6f 56 61 6c 75 65 41 74  ialRampToValueAt
9de0: 54 69 6d 65 28 30 2e 30 31 2c 20 61 75 2e 63 75  Time(0.01, au.cu
9df0: 72 72 65 6e 74 54 69 6d 65 20 2b 20 70 44 65 63  rrentTime + pDec
9e00: 61 79 2e 76 61 6c 75 65 20 2f 20 33 29 3b 0a 20  ay.value / 3);. 
9e10: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
9e20: 20 20 20 20 20 20 20 20 20 65 6c 73 65 20 7b 0a           else {.
9e30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9e40: 65 6e 76 2e 6f 66 66 73 65 74 2e 63 61 6e 63 65  env.offset.cance
9e50: 6c 53 63 68 65 64 75 6c 65 64 56 61 6c 75 65 73  lScheduledValues
9e60: 28 61 75 2e 63 75 72 72 65 6e 74 54 69 6d 65 29  (au.currentTime)
9e70: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
9e80: 20 20 2f 2f 65 6e 76 2e 6f 66 66 73 65 74 2e 73    //env.offset.s
9e90: 65 74 54 61 72 67 65 74 41 74 54 69 6d 65 28 31  etTargetAtTime(1
9ea0: 2e 30 2c 61 75 2e 63 75 72 72 65 6e 74 54 69 6d  .0,au.currentTim
9eb0: 65 2c 20 30 2e 30 30 31 29 3b 0a 20 20 20 20 20  e, 0.001);.     
9ec0: 20 20 20 20 20 20 20 20 20 20 20 65 6e 76 2e 6f             env.o
9ed0: 66 66 73 65 74 2e 73 65 74 56 61 6c 75 65 41 74  ffset.setValueAt
9ee0: 54 69 6d 65 28 31 2e 30 2c 20 61 75 2e 63 75 72  Time(1.0, au.cur
9ef0: 72 65 6e 74 54 69 6d 65 29 3b 0a 20 20 20 20 20  rentTime);.     
9f00: 20 20 20 20 20 20 20 20 20 20 20 65 6e 76 2e 6f             env.o
9f10: 66 66 73 65 74 2e 65 78 70 6f 6e 65 6e 74 69 61  ffset.exponentia
9f20: 6c 52 61 6d 70 54 6f 56 61 6c 75 65 41 74 54 69  lRampToValueAtTi
9f30: 6d 65 28 30 2e 30 31 2c 20 61 75 2e 63 75 72 72  me(0.01, au.curr
9f40: 65 6e 74 54 69 6d 65 20 2b 20 70 44 65 63 61 79  entTime + pDecay
9f50: 2e 76 61 6c 75 65 29 3b 0a 20 20 20 20 20 20 20  .value);.       
9f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
9f70: 20 20 20 6f 73 63 2e 66 72 65 71 75 65 6e 63 79     osc.frequency
9f80: 2e 63 61 6e 63 65 6c 53 63 68 65 64 75 6c 65 64  .cancelScheduled
9f90: 56 61 6c 75 65 73 28 61 75 2e 63 75 72 72 65 6e  Values(au.curren
9fa0: 74 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 20 20  tTime);.        
9fb0: 20 20 20 20 69 66 20 28 74 79 70 65 6f 66 20 6e      if (typeof n
9fc0: 6f 74 65 20 3d 3d 20 22 6e 75 6d 62 65 72 22 29  ote == "number")
9fd0: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
9fe0: 20 20 20 6f 73 63 2e 66 72 65 71 75 65 6e 63 79     osc.frequency
9ff0: 2e 73 65 74 54 61 72 67 65 74 41 74 54 69 6d 65  .setTargetAtTime
a000: 28 6e 6f 74 65 2c 20 61 75 2e 63 75 72 72 65 6e  (note, au.curren
a010: 74 54 69 6d 65 2c 20 67 6c 69 64 65 20 3f 20 30  tTime, glide ? 0
a020: 2e 30 32 20 3a 20 30 2e 30 30 32 29 3b 0a 20 20  .02 : 0.002);.  
a030: 20 20 20 20 20 20 20 20 20 20 7d 20 65 6c 73 65            } else
a040: 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   {.             
a050: 20 20 20 6f 73 63 2e 66 72 65 71 75 65 6e 63 79     osc.frequency
a060: 2e 73 65 74 54 61 72 67 65 74 41 74 54 69 6d 65  .setTargetAtTime
a070: 28 6d 69 64 69 4e 6f 74 65 54 6f 46 72 65 71 75  (midiNoteToFrequ
a080: 65 6e 63 79 28 74 65 78 74 4e 6f 74 65 54 6f 4e  ency(textNoteToN
a090: 75 6d 62 65 72 28 6e 6f 74 65 29 29 2c 20 61 75  umber(note)), au
a0a0: 2e 63 75 72 72 65 6e 74 54 69 6d 65 2c 20 67 6c  .currentTime, gl
a0b0: 69 64 65 20 3f 20 30 2e 30 32 20 3a 20 30 2e 30  ide ? 0.02 : 0.0
a0c0: 30 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  02);.           
a0d0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 76   }.            v
a0e0: 63 61 2e 67 61 69 6e 2e 63 61 6e 63 65 6c 53 63  ca.gain.cancelSc
a0f0: 68 65 64 75 6c 65 64 56 61 6c 75 65 73 28 61 75  heduledValues(au
a100: 2e 63 75 72 72 65 6e 74 54 69 6d 65 29 3b 0a 20  .currentTime);. 
a110: 20 20 20 20 20 20 20 20 20 20 20 76 63 61 2e 67             vca.g
a120: 61 69 6e 2e 73 65 74 56 61 6c 75 65 41 74 54 69  ain.setValueAtTi
a130: 6d 65 28 61 63 63 65 6e 74 20 3f 20 30 2e 32 20  me(accent ? 0.2 
a140: 3a 20 30 2e 31 35 2c 20 61 75 2e 63 75 72 72 65  : 0.15, au.curre
a150: 6e 74 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 20  ntTime);.       
a160: 20 20 20 20 20 2f 2f 76 63 61 2e 67 61 69 6e 2e       //vca.gain.
a170: 73 65 74 54 61 72 67 65 74 41 74 54 69 6d 65 28  setTargetAtTime(
a180: 61 63 63 65 6e 74 20 3f 20 30 2e 35 20 3a 20 30  accent ? 0.5 : 0
a190: 2e 33 2c 61 75 2e 63 75 72 72 65 6e 74 54 69 6d  .3,au.currentTim
a1a0: 65 2c 20 30 2e 30 30 31 29 3b 0a 20 20 20 20 20  e, 0.001);.     
a1b0: 20 20 20 20 20 20 20 2f 2f 76 63 61 2e 67 61 69         //vca.gai
a1c0: 6e 2e 73 65 74 56 61 6c 75 65 41 74 54 69 6d 65  n.setValueAtTime
a1d0: 28 30 2e 32 2c 20 61 75 2e 63 75 72 72 65 6e 74  (0.2, au.current
a1e0: 54 69 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20  Time);.         
a1f0: 20 20 20 76 63 61 2e 67 61 69 6e 2e 6c 69 6e 65     vca.gain.line
a200: 61 72 52 61 6d 70 54 6f 56 61 6c 75 65 41 74 54  arRampToValueAtT
a210: 69 6d 65 28 30 2e 31 2c 20 61 75 2e 63 75 72 72  ime(0.1, au.curr
a220: 65 6e 74 54 69 6d 65 20 2b 20 30 2e 32 29 3b 0a  entTime + 0.2);.
a230: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a240: 20 20 66 75 6e 63 74 69 6f 6e 20 6e 6f 74 65 4f    function noteO
a250: 66 66 28 29 20 7b 0a 20 20 20 20 20 20 20 20 20  ff() {.         
a260: 20 20 20 76 63 61 2e 67 61 69 6e 2e 63 61 6e 63     vca.gain.canc
a270: 65 6c 53 63 68 65 64 75 6c 65 64 56 61 6c 75 65  elScheduledValue
a280: 73 28 61 75 2e 63 75 72 72 65 6e 74 54 69 6d 65  s(au.currentTime
a290: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 76  );.            v
a2a0: 63 61 2e 67 61 69 6e 2e 73 65 74 54 61 72 67 65  ca.gain.setTarge
a2b0: 74 41 74 54 69 6d 65 28 30 2e 30 2c 20 61 75 2e  tAtTime(0.0, au.
a2c0: 63 75 72 72 65 6e 74 54 69 6d 65 2c 20 30 2e 30  currentTime, 0.0
a2d0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
a2e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 7b 0a 20        return {. 
a2f0: 20 20 20 20 20 20 20 20 20 20 20 6e 6f 74 65 4f             noteO
a300: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 6e  n,.            n
a310: 6f 74 65 4f 66 66 2c 0a 20 20 20 20 20 20 20 20  oteOff,.        
a320: 20 20 20 20 70 61 72 61 6d 73 3a 20 7b 0a 20 20      params: {.  
a330: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 75                cu
a340: 74 6f 66 66 3a 20 70 43 75 74 6f 66 66 2c 0a 20  toff: pCutoff,. 
a350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72                 r
a360: 65 73 6f 6e 61 6e 63 65 3a 20 70 52 65 73 6f 6e  esonance: pReson
a370: 61 6e 63 65 2c 0a 20 20 20 20 20 20 20 20 20 20  ance,.          
a380: 20 20 20 20 20 20 65 6e 76 4d 6f 64 3a 20 70 45        envMod: pE
a390: 6e 76 4d 6f 64 2c 0a 20 20 20 20 20 20 20 20 20  nvMod,.         
a3a0: 20 20 20 20 20 20 20 64 65 63 61 79 3a 20 70 44         decay: pD
a3b0: 65 63 61 79 0a 20 20 20 20 20 20 20 20 20 20 20  ecay.           
a3c0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 3b 0a 20 20   }.        };.  
a3d0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 7b    }.    return {
a3e0: 0a 20 20 20 20 20 20 20 20 54 68 72 65 65 4f 68  .        ThreeOh
a3f0: 2c 0a 20 20 20 20 20 20 20 20 6d 61 73 74 65 72  ,.        master
a400: 2c 0a 20 20 20 20 20 20 20 20 63 6f 6e 74 65 78  ,.        contex
a410: 74 3a 20 61 75 0a 20 20 20 20 7d 3b 0a 7d 0a 0a  t: au.    };.}..
a420: 77 69 6e 64 6f 77 2e 41 75 64 69 6f 20 3d 20 41  window.Audio = A
a430: 75 64 69 6f 3b 0a 77 69 6e 64 6f 77 2e 54 68 72  udio;.window.Thr
a440: 65 65 4f 68 55 6e 69 74 20 3d 20 54 68 72 65 65  eeOhUnit = Three
a450: 4f 68 55 6e 69 74 3b 0a 60 60 60 0a 0a 23 23 20  OhUnit;.```..## 
a460: 41 75 74 6f 63 6f 6d 6d 69 74 0a 0a 3c 68 74 74  Autocommit..<htt
a470: 70 73 3a 2f 2f 78 69 61 6f 6f 75 77 61 6e 67 2e  ps://xiaoouwang.
a480: 6d 65 64 69 75 6d 2e 63 6f 6d 2f 74 75 74 6f 72  medium.com/tutor
a490: 69 61 6c 2d 61 64 76 61 6e 63 65 64 2d 75 73 65  ial-advanced-use
a4a0: 2d 6f 66 2d 77 61 74 63 68 64 6f 67 2d 69 6e 2d  -of-watchdog-in-
a4b0: 70 79 74 68 6f 6e 2d 65 78 63 6c 75 64 69 6e 67  python-excluding
a4c0: 2d 66 69 6c 65 73 2d 61 2d 67 69 74 2d 61 75 74  -files-a-git-aut
a4d0: 6f 2d 63 6f 6d 6d 69 74 2d 65 78 61 6d 70 6c 65  o-commit-example
a4e0: 2d 70 61 72 74 2d 37 30 32 34 39 31 33 61 64 35  -part-7024913ad5
a4f0: 61 38 3e 20 20 0a 3c 68 74 74 70 73 3a 2f 2f 67  a8>  .<https://g
a500: 69 74 68 75 62 2e 63 6f 6d 2f 67 69 74 77 61 74  ithub.com/gitwat
a510: 63 68 2f 67 69 74 77 61 74 63 68 3e 20 20 0a 0a  ch/gitwatch>  ..
a520: 60 60 60 70 79 74 68 6f 6e 0a 0a 69 6d 70 6f 72  ```python..impor
a530: 74 20 74 69 6d 65 0a 66 72 6f 6d 20 77 61 74 63  t time.from watc
a540: 68 64 6f 67 2e 6f 62 73 65 72 76 65 72 73 20 69  hdog.observers i
a550: 6d 70 6f 72 74 20 4f 62 73 65 72 76 65 72 0a 66  mport Observer.f
a560: 72 6f 6d 20 77 61 74 63 68 64 6f 67 2e 65 76 65  rom watchdog.eve
a570: 6e 74 73 20 69 6d 70 6f 72 74 20 52 65 67 65 78  nts import Regex
a580: 4d 61 74 63 68 69 6e 67 45 76 65 6e 74 48 61 6e  MatchingEventHan
a590: 64 6c 65 72 0a 69 6d 70 6f 72 74 20 6f 73 0a 0a  dler.import os..
a5a0: 64 65 66 20 6f 6e 5f 63 72 65 61 74 65 64 28 65  def on_created(e
a5b0: 76 65 6e 74 29 3a 0a 20 20 20 20 70 72 69 6e 74  vent):.    print
a5c0: 28 66 22 7b 65 76 65 6e 74 2e 73 72 63 5f 70 61  (f"{event.src_pa
a5d0: 74 68 7d 20 68 61 73 20 62 65 65 6e 20 63 72 65  th} has been cre
a5e0: 61 74 65 64 22 29 0a 20 20 20 20 6f 73 2e 73 79  ated").    os.sy
a5f0: 73 74 65 6d 28 66 22 67 69 74 20 61 64 64 20 7b  stem(f"git add {
a600: 65 76 65 6e 74 2e 73 72 63 5f 70 61 74 68 7d 22  event.src_path}"
a610: 29 0a 20 20 20 20 6f 73 2e 73 79 73 74 65 6d 28  ).    os.system(
a620: 66 22 67 69 74 20 63 6f 6d 6d 69 74 20 2d 6d 20  f"git commit -m 
a630: 27 7b 65 76 65 6e 74 2e 73 72 63 5f 70 61 74 68  '{event.src_path
a640: 7d 20 63 72 65 61 74 65 64 27 22 29 0a 0a 64 65  } created'")..de
a650: 66 20 6f 6e 5f 64 65 6c 65 74 65 64 28 65 76 65  f on_deleted(eve
a660: 6e 74 29 3a 0a 20 20 20 20 70 72 69 6e 74 28 66  nt):.    print(f
a670: 22 44 65 6c 65 74 65 20 7b 65 76 65 6e 74 2e 73  "Delete {event.s
a680: 72 63 5f 70 61 74 68 7d 21 22 29 0a 20 20 20 20  rc_path}!").    
a690: 6f 73 2e 73 79 73 74 65 6d 28 66 22 67 69 74 20  os.system(f"git 
a6a0: 63 6f 6d 6d 69 74 20 2d 6d 20 27 7b 65 76 65 6e  commit -m '{even
a6b0: 74 2e 73 72 63 5f 70 61 74 68 7d 20 64 65 6c 65  t.src_path} dele
a6c0: 74 65 64 27 22 29 0a 0a 0a 64 65 66 20 6f 6e 5f  ted'")...def on_
a6d0: 6d 6f 64 69 66 69 65 64 28 65 76 65 6e 74 29 3a  modified(event):
a6e0: 0a 20 20 20 20 70 72 69 6e 74 28 66 22 7b 65 76  .    print(f"{ev
a6f0: 65 6e 74 2e 73 72 63 5f 70 61 74 68 7d 20 68 61  ent.src_path} ha
a700: 73 20 62 65 65 6e 20 6d 6f 64 69 66 69 65 64 22  s been modified"
a710: 29 0a 20 20 20 20 6f 73 2e 73 79 73 74 65 6d 28  ).    os.system(
a720: 66 22 67 69 74 20 61 64 64 20 2e 22 29 0a 20 20  f"git add .").  
a730: 20 20 6f 73 2e 73 79 73 74 65 6d 28 66 22 67 69    os.system(f"gi
a740: 74 20 63 6f 6d 6d 69 74 20 2d 6d 20 27 7b 65 76  t commit -m '{ev
a750: 65 6e 74 2e 73 72 63 5f 70 61 74 68 7d 20 6d 6f  ent.src_path} mo
a760: 64 69 66 69 65 64 27 22 29 0a 0a 69 66 20 5f 5f  dified'")..if __
a770: 6e 61 6d 65 5f 5f 20 3d 3d 20 22 5f 5f 6d 61 69  name__ == "__mai
a780: 6e 5f 5f 22 3a 0a 20 20 20 20 23 20 63 72 65 61  n__":.    # crea
a790: 74 65 20 74 68 65 20 65 76 65 6e 74 20 68 61 6e  te the event han
a7a0: 64 6c 65 72 0a 20 20 20 20 69 67 6e 6f 72 65 5f  dler.    ignore_
a7b0: 70 61 74 74 65 72 6e 73 20 3d 20 5b 72 22 5e 2e  patterns = [r"^.
a7c0: 2b 2f 5c 2e 67 69 74 2e 2a 22 5d 0a 20 20 20 20  +/\.git.*"].    
a7d0: 69 67 6e 6f 72 65 5f 64 69 72 65 63 74 6f 72 69  ignore_directori
a7e0: 65 73 20 3d 20 46 61 6c 73 65 0a 20 20 20 20 63  es = False.    c
a7f0: 61 73 65 5f 73 65 6e 73 69 74 69 76 65 20 3d 20  ase_sensitive = 
a800: 54 72 75 65 0a 20 20 20 20 6d 79 5f 65 76 65 6e  True.    my_even
a810: 74 5f 68 61 6e 64 6c 65 72 20 3d 20 52 65 67 65  t_handler = Rege
a820: 78 4d 61 74 63 68 69 6e 67 45 76 65 6e 74 48 61  xMatchingEventHa
a830: 6e 64 6c 65 72 28 69 67 6e 6f 72 65 5f 72 65 67  ndler(ignore_reg
a840: 65 78 65 73 3d 69 67 6e 6f 72 65 5f 70 61 74 74  exes=ignore_patt
a850: 65 72 6e 73 2c 20 69 67 6e 6f 72 65 5f 64 69 72  erns, ignore_dir
a860: 65 63 74 6f 72 69 65 73 3d 69 67 6e 6f 72 65 5f  ectories=ignore_
a870: 64 69 72 65 63 74 6f 72 69 65 73 2c 20 63 61 73  directories, cas
a880: 65 5f 73 65 6e 73 69 74 69 76 65 3d 63 61 73 65  e_sensitive=case
a890: 5f 73 65 6e 73 69 74 69 76 65 29 0a 0a 20 20 20  _sensitive)..   
a8a0: 20 6d 79 5f 65 76 65 6e 74 5f 68 61 6e 64 6c 65   my_event_handle
a8b0: 72 2e 6f 6e 5f 63 72 65 61 74 65 64 20 3d 20 6f  r.on_created = o
a8c0: 6e 5f 63 72 65 61 74 65 64 0a 20 20 20 20 6d 79  n_created.    my
a8d0: 5f 65 76 65 6e 74 5f 68 61 6e 64 6c 65 72 2e 6f  _event_handler.o
a8e0: 6e 5f 64 65 6c 65 74 65 64 20 3d 20 6f 6e 5f 64  n_deleted = on_d
a8f0: 65 6c 65 74 65 64 0a 20 20 20 20 6d 79 5f 65 76  eleted.    my_ev
a900: 65 6e 74 5f 68 61 6e 64 6c 65 72 2e 6f 6e 5f 6d  ent_handler.on_m
a910: 6f 64 69 66 69 65 64 20 3d 20 6f 6e 5f 6d 6f 64  odified = on_mod
a920: 69 66 69 65 64 0a 0a 20 20 20 20 23 20 63 72 65  ified..    # cre
a930: 61 74 65 20 61 6e 20 6f 62 73 65 72 76 65 72 0a  ate an observer.
a940: 20 20 20 20 70 61 74 68 20 3d 20 22 2e 22 0a 20      path = ".". 
a950: 20 20 20 67 6f 5f 72 65 63 75 72 73 69 76 65 6c     go_recursivel
a960: 79 20 3d 20 54 72 75 65 0a 20 20 20 20 6d 79 5f  y = True.    my_
a970: 6f 62 73 65 72 76 65 72 20 3d 20 4f 62 73 65 72  observer = Obser
a980: 76 65 72 28 29 0a 20 20 20 20 6d 79 5f 6f 62 73  ver().    my_obs
a990: 65 72 76 65 72 2e 73 63 68 65 64 75 6c 65 28 6d  erver.schedule(m
a9a0: 79 5f 65 76 65 6e 74 5f 68 61 6e 64 6c 65 72 2c  y_event_handler,
a9b0: 20 70 61 74 68 2c 20 72 65 63 75 72 73 69 76 65   path, recursive
a9c0: 3d 67 6f 5f 72 65 63 75 72 73 69 76 65 6c 79 29  =go_recursively)
a9d0: 0a 0a 20 20 20 20 6d 79 5f 6f 62 73 65 72 76 65  ..    my_observe
a9e0: 72 2e 73 74 61 72 74 28 29 0a 20 20 20 20 74 72  r.start().    tr
a9f0: 79 3a 0a 20 20 20 20 20 20 20 20 77 68 69 6c 65  y:.        while
aa00: 20 54 72 75 65 3a 0a 20 20 20 20 20 20 20 20 20   True:.         
aa10: 20 20 20 74 69 6d 65 2e 73 6c 65 65 70 28 35 29     time.sleep(5)
aa20: 0a 20 20 20 20 65 78 63 65 70 74 3a 0a 20 20 20  .    except:.   
aa30: 20 20 20 20 20 6d 79 5f 6f 62 73 65 72 76 65 72       my_observer
aa40: 2e 73 74 6f 70 28 29 0a 20 20 20 20 20 20 20 20  .stop().        
aa50: 70 72 69 6e 74 28 22 4f 62 73 65 72 76 65 72 20  print("Observer 
aa60: 53 74 6f 70 70 65 64 22 29 0a 20 20 20 20 6d 79  Stopped").    my
aa70: 5f 6f 62 73 65 72 76 65 72 2e 6a 6f 69 6e 28 29  _observer.join()
aa80: 0a 60 60 60 0a 0a                                .```..