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 .```..