Skip to content

Instantly share code, notes, and snippets.

@petersalomonsen
Last active April 5, 2021 10:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save petersalomonsen/d71387112368a2692dc1d84c0ab5b1d2 to your computer and use it in GitHub Desktop.
Save petersalomonsen/d71387112368a2692dc1d84c0ab5b1d2 to your computer and use it in GitHub Desktop.
WebAssembly music Revision 2021 Executable music competition entry by Peter Salomonsen
node_modules

WebAssembly Music for Revision 2021 executable music compo

https://pm.revision-party.net/releases?competition_id=13

The final result is in the file petersalomonsen_wasmmusic.html.

The uncompressed HTML and JS file can be found in song.html and main.js.

The Wasm file was compressed to png using encodewasm.py and encoded as base64 before inserting into the HTML file. Decompressing is done by rendering the png to a canvas.

For this player simple chaining of audio chunks was done on the main thread. Normally this is more stable when done using AudioWorklet.

The Wasm file was exported from the WebAssembly music studio, where you can create the sequence in JavaScript and Synth in AssemblyScript.

The source for this particular song can be viewed, edited and played here:

https://petersalomonsen.com/webassemblymusic/livecodev2/?gist=d71387112368a2692dc1d84c0ab5b1d2

/*
* Copyright (c) 2021 - Peter Johan Salomonsen
*/
setBPM(90);
addInstrument('piano');
addInstrument('string');
addInstrument('drums');
addInstrument('brass');
addInstrument('guitar');
addInstrument('bass');
addInstrument('tubelead');
addInstrument('padsynth');
const metronome = () => createTrack(2).steps(1,[fs5,fs5,fs5,fs5]);
const drums = () => createTrack(2,4).steps(6,[
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5,fs5(1/4,10)],
d5,,,[fs5,c5],,fs5(1/4,10),
fs5,,,[c5,fs5],,fs5(1/4,10),
d5,,,fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5,fs5(1/4,10)],
d5,,,[fs5,c5],,fs5(1/4,10),
fs5,,,[c5,fs5],,fs5(1/4,10),
d5,,,fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5,fs5(1/4,10)],
d5,,,[fs5,c5],,fs5(1/4,10),
fs5,,,[c5,fs5],,fs5(1/4,10),
d5,,,fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5,fs5(1/4,10)],
d5,,,[fs5,c5],,fs5(1/4,10),
fs5,,,[c5,fs5],,d5(1/16,10),
d5,,,fs5,,d5(1/16,30)
]);
const drums2 = () => createTrack(2,4).steps(6,[
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
c5,,,[fs5],,,
c5,,,[fs5],,fs5(1/4,10),
c5,,fs5(1/4,10),fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
c5,,,[fs5],,,
c5,,,[fs5],,fs5(1/4,10),
c5,,fs5(1/4,10),fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
c5,,,[fs5],,,
c5,,,[fs5],,fs5(1/4,10),
c5,,fs5(1/4,10),fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
c5,,,[fs5],,,
c5,,,[fs5],,[fs5(1/4,10),c5(1/16,20)],
c5,,fs5(1/4,10),[c5(1/8,90),fs5],,fs5(1/4,30),
]);
const drums3 = () => createTrack(2,4).steps(6,[
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
[c5,d5],,,[fs5],,d5(1/8,30),
c5,,d5(1/8,20),[fs5],,fs5(1/4,10),
[c5,d5],,fs5(1/4,10),fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
[c5,d5],,,[fs5],,d5(1/8,30),
c5,,d5(1/8,10),[fs5],,fs5(1/4,10),
[c5,d5],,fs5(1/4,10),fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
[c5,d5],,,[fs5],,,
c5,,,[fs5],,fs5(1/4,10),
[c5,d5],,fs5(1/4,10),fs5,,fs5(1/4,30),
[c5,fs5(1/4,50)],,fs5(1/4,10),fs5,,[c5(1/16,10),fs5(1/4,10)],
[c5,d5],,,[fs5],,d5(1/8,20),
c5,,,[fs5],,[fs5(1/4,10),c5(1/16,20)],
[c5,d5],,[d5(1/8,20),fs5(1/4,10)],[c5(1/8,90),fs5],,[fs5(1/4,30),d5(1/8,30)],
]);
const strings = () => createTrack(1).play([[ 0.02, d6(3.70, 60) ],
[ 0.02, a6(3.93, 67) ],
[ 0.03, f6(3.94, 65) ],
[ 3.97, c6(3.82, 58) ],
[ 3.99, f4(4.02, 54) ],
[ 3.97, e6(4.05, 52) ],
[ 3.96, g6(4.06, 67) ],
[ 8.04, f6(3.92, 64) ],
[ 8.02, as4(3.95, 64) ],
[ 8.04, d6(3.95, 53) ],
[ 12.00, f4(3.93, 58) ],
[ 8.05, a5(7.91, 58) ],
[ 11.99, c6(3.98, 57) ],
[ 11.97, e6(4.00, 54) ]]);
const piano = () => createTrack(0).play([[ 0.07, controlchange(64, 127) ],
[ 0.00, a6(0.27, 67) ],
[ 0.01, as4(0.42, 63) ],
[ 0.51, a6(0.21, 68) ],
[ 0.52, d5(0.45, 47) ],
[ 1.02, a6(0.18, 77) ],
[ 1.03, f5(0.38, 60) ],
[ 1.51, a6(0.20, 52) ],
[ 1.53, a5(0.39, 57) ],
[ 2.02, as5(0.38, 71) ],
[ 2.03, a6(0.75, 74) ],
[ 2.52, a5(0.34, 49) ],
[ 3.02, f5(0.44, 59) ],
[ 2.78, as6(0.78, 84) ],
[ 3.52, d5(0.14, 59) ],
[ 3.51, c7(0.50, 82) ],
[ 4.03, controlchange(64, 0) ],
[ 4.23, controlchange(64, 127) ],
[ 4.01, g6(0.38, 84) ],
[ 4.03, f4(0.43, 62) ],
[ 4.54, g6(0.19, 87) ],
[ 4.54, a4(0.44, 65) ],
[ 5.04, g6(0.19, 68) ],
[ 5.05, c5(0.42, 59) ],
[ 5.53, g6(0.14, 72) ],
[ 5.54, e5(0.38, 52) ],
[ 5.85, g6(0.15, 59) ],
[ 5.98, a6(0.12, 78) ],
[ 5.99, f5(0.37, 54) ],
[ 6.06, g6(0.75, 48) ],
[ 6.49, e5(0.50, 50) ],
[ 6.80, f6(0.71, 95) ],
[ 7.05, c5(0.49, 74) ],
[ 7.54, a4(0.12, 79) ],
[ 7.51, e6(0.45, 72) ],
[ 8.03, controlchange(64, 0) ],
[ 8.21, controlchange(64, 127) ],
[ 7.99, d6(0.33, 77) ],
[ 8.01, as4(0.50, 69) ],
[ 8.48, d6(0.23, 72) ],
[ 8.51, d5(0.43, 60) ],
[ 8.99, d6(0.23, 79) ],
[ 9.01, f5(0.42, 57) ],
[ 9.50, d6(0.17, 70) ],
[ 9.50, a5(0.39, 69) ],
[ 10.00, as5(0.42, 52) ],
[ 9.98, d6(0.82, 75) ],
[ 10.52, a5(0.40, 68) ],
[ 10.98, f5(0.50, 70) ],
[ 10.78, e6(0.74, 82) ],
[ 11.50, d5(0.14, 64) ],
[ 12.04, controlchange(64, 0) ],
[ 12.24, controlchange(64, 127) ],
[ 12.03, f4(0.45, 58) ],
[ 12.49, a4(0.53, 54) ],
[ 13.02, c5(0.46, 64) ],
[ 13.53, e5(0.42, 63) ],
[ 14.01, f5(0.42, 65) ],
[ 14.54, e5(0.50, 63) ],
[ 15.01, c5(0.50, 70) ],
[ 15.52, a4(0.40, 75) ],
[ 11.5, f6(4.46, 68) ],
[ 12.00, a5(3.95, 69) ],
[ 15.95, controlchange(64, 0) ]]);
const bass = () => createTrack(5).play([[ 0.02, as1(0.52, 88) ],
[ 0.78, as1(0.54, 86) ],
[ 1.50, as1(2.02, 73) ],
[ 3.54, e2(0.38, 75) ],
[ 3.99, f2(0.58, 79) ],
[ 4.75, f2(0.62, 65) ],
[ 5.54, f2(1.33, 88) ],
[ 6.87, c3(0.10, 87) ],
[ 7.06, f3(0.87, 103) ],
[ 8.01, as2(0.58, 91) ],
[ 8.80, as2(0.59, 69) ],
[ 9.55, as2(1.84, 71) ],
[ 11.50, e2(0.39, 79) ],
[ 12.01, f2(0.56, 84) ],
[ 12.80, f2(1.58, 79) ],
[ 14.49, c2(0.64, 89) ],
[ 15.33, c2(0.45, 75) ]]);
const guitar = () => createTrack(4).play([[ 0.08, f5(0.43, 87) ],
[ 0.06, d5(0.50, 84) ],
[ 0.06, a4(0.51, 99) ],
[ 0.82, a4(0.09, 98) ],
[ 0.82, d5(0.10, 78) ],
[ 0.82, f5(0.14, 83) ],
[ 1.54, a4(2.10, 94) ],
[ 1.54, d5(2.16, 75) ],
[ 1.55, f5(2.22, 83) ],
[ 4.04, c5(0.56, 89) ],
[ 4.03, e5(0.58, 74) ],
[ 4.05, g5(0.56, 90) ],
[ 4.78, c5(0.09, 82) ],
[ 4.78, g5(0.10, 87) ],
[ 4.77, e5(0.13, 77) ],
[ 5.51, c5(2.18, 89) ],
[ 5.52, g5(2.19, 88) ],
[ 5.50, e5(2.22, 78) ],
[ 8.03, d5(0.53, 83) ],
[ 8.05, a5(0.52, 89) ],
[ 8.02, f5(0.56, 92) ],
[ 8.80, a5(0.03, 78) ],
[ 8.78, f5(0.10, 89) ],
[ 8.78, d5(0.11, 83) ],
[ 9.50, d5(2.31, 87) ],
[ 9.51, a5(2.33, 89) ],
[ 9.51, f5(2.40, 84) ],
[ 12.06, c5(0.54, 94) ],
[ 12.07, e5(0.54, 79) ],
[ 12.06, g5(0.54, 92) ],
[ 12.78, e5(0.10, 72) ],
[ 12.79, c5(0.10, 77) ],
[ 12.79, g5(0.10, 79) ],
[ 13.54, c5(1.66, 90) ],
[ 13.54, g5(1.70, 88) ],
[ 13.54, e5(1.70, 79) ]]);
const piano2 = () => createTrack(0).play([[ 0.17, controlchange(64, 0) ],
[ 2.62, controlchange(64, 127) ],
[ 2.52, d7(0.28, 93) ],
[ 3.05, d7(0.43, 92) ],
[ 3.52, g6(0.22, 82) ],
[ 3.99, g6(0.18, 64) ],
[ 4.28, controlchange(64, 0) ],
[ 4.96, controlchange(64, 127) ],
[ 4.19, a6(2.26, 70) ],
[ 6.48, g6(0.22, 95) ],
[ 7.00, g6(0.46, 89) ],
[ 7.51, c6(0.18, 77) ],
[ 8.03, controlchange(64, 0) ],
[ 8.23, controlchange(64, 127) ],
[ 8.03, c6(0.25, 65) ],
[ 9.15, controlchange(64, 0) ],
[ 9.24, controlchange(64, 127) ],
[ 8.28, d6(2.25, 54) ],
[ 10.52, e6(0.35, 82) ],
[ 10.97, controlchange(64, 0) ],
[ 11.08, controlchange(64, 127) ],
[ 11.04, e6(0.42, 94) ],
[ 11.52, g5(0.18, 59) ],
[ 12.03, controlchange(64, 0) ],
[ 11.96, g5(0.16, 60) ],
[ 12.16, a5(3.06, 53) ]]);
const guitar2 = () => createTrack(4).play([[ 0.03, controlchange(64, 0) ],
[ 0.08, controlchange(64, 127) ],
[ 0.51, f5(0.55, 68) ],
[ 1.03, g5(0.51, 79) ],
[ 1.56, c5(0.30, 89) ],
[ 1.93, controlchange(64, 0) ],
[ 2.10, controlchange(64, 127) ],
[ 1.88, c6(0.49, 93) ],
[ 2.34, c5(0.17, 65) ],
[ 2.54, f5(0.28, 74) ],
[ 2.84, c5(0.14, 62) ],
[ 3.08, controlchange(64, 0) ],
[ 3.13, controlchange(64, 127) ],
[ 3.03, g5(0.50, 89) ],
[ 0.02, as3(3.69, 73) ],
[ 3.52, f5(0.48, 89) ],
[ 4.00, controlchange(64, 0) ],
[ 4.19, controlchange(64, 127) ],
[ 3.99, c5(0.54, 83) ],
[ 5.03, controlchange(64, 0) ],
[ 4.49, f5(0.55, 77) ],
[ 5.08, controlchange(64, 127) ],
[ 5.02, g5(0.50, 90) ],
[ 5.52, c5(0.26, 69) ],
[ 5.81, c6(0.48, 94) ],
[ 6.32, c5(0.17, 62) ],
[ 6.50, f5(0.32, 82) ],
[ 6.86, c5(0.15, 60) ],
[ 4.00, f3(3.47, 94) ],
[ 7.05, g5(0.48, 94) ],
[ 8.00, controlchange(64, 0) ],
[ 7.52, f5(0.51, 94) ],
[ 8.19, controlchange(64, 127) ],
[ 8.02, c5(0.47, 89) ],
[ 8.49, f5(0.54, 82) ],
[ 9.01, g5(0.51, 87) ],
[ 9.52, c5(0.30, 77) ],
[ 9.90, controlchange(64, 0) ],
[ 9.96, controlchange(64, 127) ],
[ 9.83, c6(0.47, 93) ],
[ 10.32, c5(0.18, 62) ],
[ 10.52, f5(0.28, 87) ],
[ 10.81, c5(0.18, 72) ],
[ 11.04, g5(0.50, 87) ],
[ 8.04, as3(3.54, 81) ],
[ 11.48, c5(0.50, 77) ],
[ 11.99, controlchange(64, 0) ],
[ 12.14, controlchange(64, 127) ],
[ 12.04, c5(0.88, 62) ],
[ 12.52, f5(0.54, 78) ],
[ 13.06, g5(0.49, 87) ],
[ 13.56, c5(0.25, 72) ],
[ 13.85, c6(0.43, 94) ],
[ 14.29, c5(0.22, 69) ],
[ 14.51, f5(0.30, 82) ],
[ 14.82, c5(0.16, 70) ],
[ 15.03, g5(0.46, 82) ],
[ 12.05, f3(3.87, 94) ],
[ 15.48, f5(0.45, 94) ]]);
const strings2 = () => createTrack(1).play([[ 0.12, cs4(0.04, 36) ],
[ 0.07, as4(3.94, 73) ],
[ 0.08, d5(3.94, 67) ],
[ 4.00, a4(3.77, 78) ],
[ 4.03, c5(4.05, 69) ],
[ 7.08, e5(1.06, 83) ],
[ 8.02, as4(3.89, 87) ],
[ 8.04, d5(3.99, 62) ],
[ 0.07, f4(12.29, 64) ],
[ 12.02, f5(3.82, 72) ],
[ 11.98, a4(3.87, 77) ],
[ 11.97, c5(3.89, 78) ]]);
const flute = () => createTrack(6).play([[ 0.51, c6(0.52, 62) ],
[ 1.01, f6(0.41, 84) ],
[ 1.80, g6(0.29, 88) ],
[ 2.32, g6(0.22, 67) ],
[ 2.55, c6(0.06, 44) ],
[ 4.49, c6(0.40, 38) ],
[ 4.99, c7(0.48, 97) ],
[ 5.72, g6(0.28, 82) ],
[ 6.28, g6(0.18, 54) ],
[ 6.53, a6(0.31, 57) ],
[ 6.96, c6(0.24, 49) ],
[ 8.48, c6(0.37, 38) ],
[ 8.95, f6(0.30, 68) ],
[ 9.69, g6(0.34, 57) ],
[ 10.27, g6(0.19, 53) ],
[ 10.47, c6(0.30, 27) ],
[ 12.50, f5(0.31, 55) ],
[ 13.00, c6(0.30, 92) ],
[ 13.76, c6(0.18, 72) ],
[ 14.25, c6(0.21, 63) ],
[ 14.49, d6(0.24, 62) ],
[ 14.99, f6(0.42, 94) ],
[ 15.58, g6(0.18, 100) ]]);
const flute2 = () =>
createTrack(6).play([[ 1.50, c6(0.27, 70) ],
[ 1.82, d6(0.20, 82) ],
[ 2.28, f6(0.12, 70) ],
[ 2.74, g6(0.18, 94) ],
[ 5.50, c6(0.23, 77) ],
[ 5.81, d6(0.19, 87) ],
[ 6.30, f6(0.19, 78) ],
[ 6.74, g6(0.17, 84) ],
[ 7.29, a6(0.18, 70) ],
[ 7.46, f6(0.26, 79) ],
[ 7.81, d6(0.22, 79) ],
[ 9.52, c6(0.20, 74) ],
[ 9.81, d6(0.18, 79) ],
[ 10.28, f6(0.14, 72) ],
[ 10.74, g6(0.13, 84) ],
[ 11.24, d6(0.19, 82) ],
[ 11.78, c6(0.23, 74) ]]);
const bass3 = () => createTrack(5).play([[ 0.0, as2(0.75, 89) ],
[ 0.97, f3(0.77, 90) ],
[ 1.76, a3(0.15, 87) ],
[ 2.28, a3(0.17, 75) ],
[ 2.47, as3(0.27, 71) ],
[ 3.00, a3(0.52, 72) ],
[ 3.51, f3(0.10, 89) ],
[ 4.02, f2(0.98, 84) ],
[ 5.00, c3(0.81, 87) ],
[ 5.81, e3(0.15, 89) ],
[ 6.27, e3(0.10, 79) ],
[ 6.53, f3(0.10, 95) ],
[ 6.99, e3(0.50, 87) ],
[ 7.51, c3(0.20, 87) ],
[ 8.03, as2(0.96, 66) ],
[ 8.99, f3(0.81, 75) ],
[ 9.82, a3(0.14, 87) ],
[ 10.26, a3(0.22, 68) ],
[ 10.49, as3(0.24, 82) ],
[ 11.01, a3(0.54, 72) ],
[ 11.52, f3(0.11, 72) ],
[ 12.03, f2(0.97, 74) ],
[ 13.02, c3(0.74, 82) ],
[ 13.78, e3(0.19, 83) ],
[ 14.26, e3(0.11, 78) ],
[ 14.51, f3(0.10, 88) ],
[ 14.99, e3(0.50, 82) ],
[ 15.50, c3(0.36, 82) ]]);
const strings3 = () => createTrack(1).play([[ 0.10, g6(1.36, 53) ],
[ 0.10, e6(1.44, 50) ],
[ 0.08, as2(3.87, 47) ],
[ 1.52, f6(2.48, 52) ],
[ 1.53, a6(2.48, 49) ],
[ 4.04, e6(1.52, 49) ],
[ 4.06, c6(3.82, 44) ],
[ 4.03, f2(4.06, 50) ],
[ 5.52, f6(2.62, 55) ],
[ 8.10, c6(1.48, 44) ],
[ 8.10, a5(3.64, 49) ],
[ 8.13, as2(3.89, 37) ],
[ 9.54, d6(2.52, 58) ],
[ 12.05, f5(3.86, 49) ],
[ 12.06, f2(3.86, 49) ],
[ 12.03, a5(3.88, 47) ]]);
const piano3 = () => createTrack(0).play([[ 0.08, controlchange(64, 127) ],
[ 0.03, a5(1.23, 58) ],
[ 0.04, as3(3.52, 46) ],
[ 3.54, f5(0.26, 47) ],
[ 1.45, c6(2.53, 69) ],
[ 3.98, controlchange(64, 0) ],
[ 4.18, controlchange(64, 127) ],
[ 4.04, g5(0.76, 78) ],
[ 5.43, g5(0.06, 29) ],
[ 5.55, a5(1.46, 55) ],
[ 4.02, f3(3.38, 67) ],
[ 8.01, controlchange(64, 0) ],
[ 8.25, controlchange(64, 127) ],
[ 8.07, e5(1.43, 48) ],
[ 7.06, c5(3.26, 72) ],
[ 8.09, f4(2.46, 49) ],
[ 8.07, as3(2.65, 53) ],
[ 9.55, f5(1.93, 62) ],
[ 11.58, g4(0.11, 62) ],
[ 12.00, controlchange(64, 0) ],
[ 11.95, g4(0.15, 54) ],
[ 12.24, controlchange(64, 127) ],
[ 12.06, f3(3.63, 34) ],
[ 12.15, a4(3.54, 54) ],
[ 15.83, controlchange(64, 0) ]]);
const bass4 = () => createTrack(5).play([[ 0.04, as2(3.43, 66) ],
[ 3.54, f2(3.39, 78) ],
[ 6.99, c3(0.76, 74) ],
[ 7.81, b2(0.17, 59) ],
[ 7.96, as2(3.50, 51) ],
[ 11.53, f2(2.99, 74) ],
[ 14.55, b1(1.40, 83) ]]);
const guitar3 = () => createTrack(4).play([[ 0.53, c6(0.32, 77) ],
[ 0.83, e6(0.22, 90) ],
[ 1.26, e6(0.17, 69) ],
[ 1.42, f6(0.24, 65) ],
[ 1.74, e6(0.58, 62) ],
[ 2.36, c6(1.81, 72) ],
[ 4.50, c6(0.27, 88) ],
[ 4.80, e6(0.30, 69) ],
[ 5.25, f6(0.21, 75) ],
[ 5.67, f6(0.15, 79) ],
[ 5.80, g6(0.70, 70) ],
[ 6.50, f6(0.46, 77) ],
[ 6.99, e6(0.49, 84) ],
[ 7.50, c6(0.98, 69) ],
[ 8.51, g5(0.22, 79) ],
[ 8.79, a5(0.27, 88) ],
[ 9.26, c6(0.22, 78) ],
[ 9.76, g5(0.78, 84) ],
[ 10.55, f5(0.21, 83) ],
[ 11.02, e5(0.22, 78) ],
[ 11.44, e5(0.18, 47) ],
[ 11.57, f5(0.20, 54) ],
[ 11.84, c5(3.22, 67) ]]);
const emptypattern = () => createTrack(0).steps(1/16,[,]);
emptypattern();
piano();
strings();
await emptypattern();
bass();
guitar();
await drums();
emptypattern();
piano();
bass();
guitar();
await drums();
piano();
strings();
guitar();
bass();
await drums();
piano2();
strings2();
guitar2();
bass();
await drums2();
piano2();
strings2();
guitar2();
bass();
flute();
await drums2();
piano2();
strings2();
guitar2();
bass3();
flute();
await drums3();
piano2();
strings2();
guitar2();
bass3();
flute();
await drums3();
piano3();
await drums2();
piano3();
bass4();
await drums2();
piano3();
guitar3();
bass4();
await drums2();
piano3();
flute2();
bass3();
guitar3();
strings3();
await drums3();
piano3();
flute2();
bass3();
guitar3();
strings2();
await drums3();
piano();
strings();
await emptypattern();
piano3();
await emptypattern();
await createTrack(0).steps(1,[,,]);
/*for (var n=0;n<100;n++) {
emptypattern();
}*/
loopHere();
import numpy as np
from PIL import Image
# From https://github.com/mdn/webassembly-examples/blob/936ab39d0b2f83295966941f7a916c4df65f0f4e/js-api-examples/simple.wasm
filename = 'song.wasm'
with open(filename, 'rb') as infile:
wasm = infile.read()
wasm_np = np.frombuffer(wasm, dtype=np.uint8)
# Encode byte count as first four bytes (32-bit, unsigned, little endian)
length = np.frombuffer(wasm_np.size.to_bytes(4, byteorder='little'), dtype=np.uint8)
wasm_np = np.append(length, wasm_np)
width = 2 ** int(np.ceil(np.sqrt(wasm_np.size))).bit_length()
height = int(np.ceil(wasm_np.size / width))
zero_padding = width * height - wasm_np.size
wasm_np = np.append(wasm_np, np.zeros(zero_padding, dtype=np.uint8))
wasm_np = wasm_np.reshape((height, width))
img = Image.fromarray(wasm_np)
img.save(filename.rsplit('.', 1)[0] + '.png')
const duration = 164000;
const wasmbuffersize = 128;
const wasmdata = 'data:image/png;base64,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';
if (typeof AudioContext !== 'function') {
window.AudioContext = window.webkitAudioContext;
}
function decode_wasm_png(src) {
const img = new Image();
const ctx = document.createElement('canvas').getContext('2d');
img.src = src;
return img.decode().then(() => {
// Draw image to canvas
ctx.width = img.width;
ctx.height = img.height;
ctx.drawImage(img, 0, 0);
// Retrieve RGBA data
let data = ctx.getImageData(0, 0, img.width, img.height).data;
// Only return R channel (identical to G and B channels)
data = data.filter((_, idx) => {return idx % 4 === 0});
// Extract byte count from first 4 bytes (32-bit, unsigned, little endian)
//const length = data[0] + (data[1] << 8) + (data[1] << 16) + (data[1] << 24);
// Return WASM binary
return data.slice(4, 23211 + 4).buffer;
});
}
const getWasm = async (samplerate) => (await WebAssembly.instantiate(
await decode_wasm_png(wasmdata),
{ environment: { SAMPLERATE: samplerate } })).instance.exports;
const updateCurrentTime = (time) => {
document.getElementById('currenttime').innerHTML = `${(time).toFixed(2)}s`;
}
const disablebuttons = () => document.querySelectorAll('button').forEach(b => b.disabled = true);
window.play = async () => {
disablebuttons();
const ctx = new AudioContext();
ctx.resume();
const wasm = await getWasm(ctx.sampleRate);
let chunkStartTime = 0.2;
const numbuffers = 50;
const chunkInterval = wasmbuffersize * numbuffers / ctx.sampleRate;
while (wasm.currentTimeMillis.value < duration) {
const processorBuffer = ctx.createBuffer(2, wasmbuffersize * numbuffers, ctx.sampleRate);
for (let n = 0; n < numbuffers; n++) {
wasm.playEventsAndFillSampleBuffer();
processorBuffer.getChannelData(0).set(new Float32Array(wasm.memory.buffer,
wasm.samplebuffer,
wasmbuffersize), wasmbuffersize * n);
processorBuffer.getChannelData(1).set(new Float32Array(wasm.memory.buffer,
wasm.samplebuffer + (wasmbuffersize * 4),
wasmbuffersize), wasmbuffersize * n);
}
const bufferSource = ctx.createBufferSource();
bufferSource.buffer = processorBuffer;
bufferSource.connect(ctx.destination);
bufferSource.start(chunkStartTime);
chunkStartTime += chunkInterval;
updateCurrentTime(ctx.currentTime);
await new Promise((r) => setTimeout(r, chunkInterval));
}
while(ctx.currentTime < duration / 1000) {
updateCurrentTime(ctx.currentTime);
await new Promise((r) => setTimeout(r, chunkInterval));
}
};
window.exportwav = async () => {
disablebuttons();
const numbuffers = 100;
const bitDepth = 16;
const numChannels = 2;
const sampleRate = 44100;
var bytesPerSample = bitDepth / 8
var blockAlign = numChannels * bytesPerSample
const chunklength = numChannels * bytesPerSample * (duration * 0.001 * sampleRate + numbuffers * wasmbuffersize);
var buffer = new ArrayBuffer(44 + chunklength)
var view = new DataView(buffer)
function writeString(view, offset, string) {
for (var i = 0; i < string.length; i++) {
view.setUint8(offset + i, string.charCodeAt(i))
}
}
/* RIFF identifier */
writeString(view, 0, 'RIFF')
/* RIFF chunk length */
view.setUint32(4, 36 + chunklength, true)
/* RIFF type */
writeString(view, 8, 'WAVE')
/* format chunk identifier */
writeString(view, 12, 'fmt ')
/* format chunk length */
view.setUint32(16, 16, true)
/* sample format (raw) */
view.setUint16(20, 1, true)
/* channel count */
view.setUint16(22, numChannels, true)
/* sample rate */
view.setUint32(24, sampleRate, true)
/* byte rate (sample rate * block align) */
view.setUint32(28, sampleRate * blockAlign, true)
/* block align (channel count * bytes per sample) */
view.setUint16(32, blockAlign, true)
/* bits per sample */
view.setUint16(34, bitDepth, true)
/* data chunk identifier */
writeString(view, 36, 'data')
/* data chunk length */
view.setUint32(40, chunklength, true)
const wasm = await getWasm(sampleRate);
let offset = 44;
while (wasm.currentTimeMillis.value < duration) {
for (let n = 0; n < numbuffers; n++) {
wasm.playEventsAndFillSampleBuffer();
const samples = new Float32Array(wasm.memory.buffer,wasm.samplebuffer,wasmbuffersize*2);
for (var i = 0; i < wasmbuffersize; i++) {
const writeSample = (sample) => {
var s = Math.max(-1, Math.min(1, sample));
view.setInt16(offset, s < 0 ? s * 0x8000 : s * 0x7FFF, true);
offset+=2;
}
writeSample(samples[i]);
writeSample(samples[i + 128]);
}
}
updateCurrentTime(wasm.currentTimeMillis.value / 1000);
await new Promise((r) => setTimeout(r, 0));
}
const blob = new Blob([buffer], {
type: "application/octet-stream"
});
const url = URL.createObjectURL(blob);
const a = document.createElement("a");
document.body.appendChild(a);
a.style = "display: none";
a.href = url;
a.download = "petersalomonsen-wasmmusic.wav";
a.click();
window.URL.revokeObjectURL(url);
}
const duration=164e3,wasmbuffersize=128,wasmdata="data:image/png;base64,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";"function"!=typeof AudioContext&&(window.AudioContext=window.webkitAudioContext);function decode_wasm_png(a){const b=new Image,c=document.createElement("canvas").getContext("2d");return b.src=a,b.decode().then(()=>{c.width=b.width,c.height=b.height,c.drawImage(b,0,0);let a=c.getImageData(0,0,b.width,b.height).data;return a=a.filter((a,b)=>0==b%4),a.slice(4,23215).buffer})}const getWasm=async a=>(await WebAssembly.instantiate(await decode_wasm_png(wasmdata),{environment:{SAMPLERATE:a}})).instance.exports,updateCurrentTime=a=>{document.getElementById("currenttime").innerHTML=`${a.toFixed(2)}s`},disablebuttons=()=>document.querySelectorAll("button").forEach(a=>a.disabled=!0);window.play=async()=>{disablebuttons();const a=new AudioContext;a.resume();const b=await getWasm(a.sampleRate);let c=.2;const d=50,e=wasmbuffersize*50/a.sampleRate;for(;b.currentTimeMillis.value<duration;){const f=a.createBuffer(2,wasmbuffersize*d,a.sampleRate);for(let a=0;a<d;a++)b.playEventsAndFillSampleBuffer(),f.getChannelData(0).set(new Float32Array(b.memory.buffer,b.samplebuffer,wasmbuffersize),wasmbuffersize*a),f.getChannelData(1).set(new Float32Array(b.memory.buffer,b.samplebuffer+4*wasmbuffersize,wasmbuffersize),wasmbuffersize*a);const g=a.createBufferSource();g.buffer=f,g.connect(a.destination),g.start(c),c+=e,updateCurrentTime(a.currentTime),await new Promise(a=>setTimeout(a,e))}for(;a.currentTime<164;)updateCurrentTime(a.currentTime),await new Promise(a=>setTimeout(a,e))},window.exportwav=async()=>{function b(a,b,c){for(var d=0;d<c.length;d++)a.setUint8(b+d,c.charCodeAt(d))}disablebuttons();const c=16,d=2,e=44100;var f=c/8,g=d*f;const h=d*f*(164*e+100*wasmbuffersize);var j=new ArrayBuffer(44+h),k=new DataView(j);b(k,0,"RIFF"),k.setUint32(4,36+h,!0),b(k,8,"WAVE"),b(k,12,"fmt "),k.setUint32(16,16,!0),k.setUint16(20,1,!0),k.setUint16(22,d,!0),k.setUint32(24,e,!0),k.setUint32(28,e*g,!0),k.setUint16(32,g,!0),k.setUint16(34,c,!0),b(k,36,"data"),k.setUint32(40,h,!0);const l=await getWasm(e);for(let a=44;l.currentTimeMillis.value<duration;){for(let b=0;b<100;b++){l.playEventsAndFillSampleBuffer();const b=new Float32Array(l.memory.buffer,l.samplebuffer,2*wasmbuffersize);for(var m=0;m<wasmbuffersize;m++){const c=b=>{var c=Math.max(-1,Math.min(1,b));k.setInt16(a,0>c?32768*c:32767*c,!0),a+=2};c(b[m]),c(b[m+128])}}updateCurrentTime(l.currentTimeMillis.value/1e3),await new Promise(a=>setTimeout(a,0))}const n=new Blob([j],{type:"application/octet-stream"}),o=URL.createObjectURL(n),p=document.createElement("a");document.body.appendChild(p),p.style="display: none",p.href=o,p.download="petersalomonsen-wasmmusic.wav",p.click(),window.URL.revokeObjectURL(o)};
{
"name": "wasmexe",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"devDependencies": {
"babel-minify": "^0.5.1"
}
},
"node_modules/@babel/code-frame": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
"integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
"dev": true,
"dependencies": {
"@babel/highlight": "^7.12.13"
}
},
"node_modules/@babel/compat-data": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz",
"integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==",
"dev": true
},
"node_modules/@babel/core": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz",
"integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@babel/generator": "^7.13.9",
"@babel/helper-compilation-targets": "^7.13.13",
"@babel/helper-module-transforms": "^7.13.14",
"@babel/helpers": "^7.13.10",
"@babel/parser": "^7.13.13",
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.13",
"@babel/types": "^7.13.14",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.1.2",
"semver": "^6.3.0",
"source-map": "^0.5.0"
},
"engines": {
"node": ">=6.9.0"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/babel"
}
},
"node_modules/@babel/generator": {
"version": "7.13.9",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz",
"integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.13.0",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
},
"node_modules/@babel/helper-compilation-targets": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz",
"integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==",
"dev": true,
"dependencies": {
"@babel/compat-data": "^7.13.12",
"@babel/helper-validator-option": "^7.12.17",
"browserslist": "^4.14.5",
"semver": "^6.3.0"
},
"peerDependencies": {
"@babel/core": "^7.0.0"
}
},
"node_modules/@babel/helper-function-name": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
"integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
"dev": true,
"dependencies": {
"@babel/helper-get-function-arity": "^7.12.13",
"@babel/template": "^7.12.13",
"@babel/types": "^7.12.13"
}
},
"node_modules/@babel/helper-get-function-arity": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
"integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.12.13"
}
},
"node_modules/@babel/helper-member-expression-to-functions": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
"integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
"dev": true,
"dependencies": {
"@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-module-imports": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
"integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
"dev": true,
"dependencies": {
"@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-module-transforms": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz",
"integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==",
"dev": true,
"dependencies": {
"@babel/helper-module-imports": "^7.13.12",
"@babel/helper-replace-supers": "^7.13.12",
"@babel/helper-simple-access": "^7.13.12",
"@babel/helper-split-export-declaration": "^7.12.13",
"@babel/helper-validator-identifier": "^7.12.11",
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.13",
"@babel/types": "^7.13.14"
}
},
"node_modules/@babel/helper-optimise-call-expression": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
"integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
"dev": true,
"dependencies": {
"@babel/types": "^7.12.13"
}
},
"node_modules/@babel/helper-replace-supers": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
"integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
"dev": true,
"dependencies": {
"@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
"@babel/traverse": "^7.13.0",
"@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-simple-access": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
"integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
"dev": true,
"dependencies": {
"@babel/types": "^7.13.12"
}
},
"node_modules/@babel/helper-split-export-declaration": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
"integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
"dev": true,
"dependencies": {
"@babel/types": "^7.12.13"
}
},
"node_modules/@babel/helper-validator-identifier": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"dev": true
},
"node_modules/@babel/helper-validator-option": {
"version": "7.12.17",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
"integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
"dev": true
},
"node_modules/@babel/helpers": {
"version": "7.13.10",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz",
"integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==",
"dev": true,
"dependencies": {
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.0",
"@babel/types": "^7.13.0"
}
},
"node_modules/@babel/highlight": {
"version": "7.13.10",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
"integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.12.11",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
},
"node_modules/@babel/parser": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
"integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
"dev": true,
"bin": {
"parser": "bin/babel-parser.js"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@babel/template": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
"integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@babel/parser": "^7.12.13",
"@babel/types": "^7.12.13"
}
},
"node_modules/@babel/traverse": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz",
"integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==",
"dev": true,
"dependencies": {
"@babel/code-frame": "^7.12.13",
"@babel/generator": "^7.13.9",
"@babel/helper-function-name": "^7.12.13",
"@babel/helper-split-export-declaration": "^7.12.13",
"@babel/parser": "^7.13.13",
"@babel/types": "^7.13.13",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"node_modules/@babel/types": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz",
"integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==",
"dev": true,
"dependencies": {
"@babel/helper-validator-identifier": "^7.12.11",
"lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
"node_modules/ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"dependencies": {
"color-convert": "^1.9.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/babel-helper-evaluate-path": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz",
"integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==",
"dev": true
},
"node_modules/babel-helper-flip-expressions": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz",
"integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=",
"dev": true
},
"node_modules/babel-helper-is-nodes-equiv": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
"integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
"dev": true
},
"node_modules/babel-helper-is-void-0": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz",
"integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=",
"dev": true
},
"node_modules/babel-helper-mark-eval-scopes": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz",
"integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=",
"dev": true
},
"node_modules/babel-helper-remove-or-void": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz",
"integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=",
"dev": true
},
"node_modules/babel-helper-to-multiple-sequence-expressions": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz",
"integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==",
"dev": true
},
"node_modules/babel-minify": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-minify/-/babel-minify-0.5.1.tgz",
"integrity": "sha512-ftEYu5OCDXEqaX/eINIaekPgkCaVPJNwFHzXKKARnRLggK8g4a9dEOflLKDgRNYOwhcLVoicUchZG6FYyOpqSA==",
"dev": true,
"dependencies": {
"@babel/core": "^7.1.0",
"babel-preset-minify": "^0.5.1",
"fs-readdir-recursive": "^1.1.0",
"lodash": "^4.17.11",
"mkdirp": "^0.5.1",
"util.promisify": "^1.0.0",
"yargs-parser": "^10.0.0"
},
"bin": {
"babel-minify": "bin/minify.js",
"minify": "bin/minify.js"
}
},
"node_modules/babel-plugin-minify-builtins": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz",
"integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==",
"dev": true
},
"node_modules/babel-plugin-minify-constant-folding": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz",
"integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==",
"dev": true,
"dependencies": {
"babel-helper-evaluate-path": "^0.5.0"
}
},
"node_modules/babel-plugin-minify-dead-code-elimination": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz",
"integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==",
"dev": true,
"dependencies": {
"babel-helper-evaluate-path": "^0.5.0",
"babel-helper-mark-eval-scopes": "^0.4.3",
"babel-helper-remove-or-void": "^0.4.3",
"lodash": "^4.17.11"
}
},
"node_modules/babel-plugin-minify-flip-comparisons": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz",
"integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=",
"dev": true,
"dependencies": {
"babel-helper-is-void-0": "^0.4.3"
}
},
"node_modules/babel-plugin-minify-guarded-expressions": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz",
"integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==",
"dev": true,
"dependencies": {
"babel-helper-evaluate-path": "^0.5.0",
"babel-helper-flip-expressions": "^0.4.3"
}
},
"node_modules/babel-plugin-minify-infinity": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz",
"integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=",
"dev": true
},
"node_modules/babel-plugin-minify-mangle-names": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz",
"integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==",
"dev": true,
"dependencies": {
"babel-helper-mark-eval-scopes": "^0.4.3"
}
},
"node_modules/babel-plugin-minify-numeric-literals": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz",
"integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=",
"dev": true
},
"node_modules/babel-plugin-minify-replace": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz",
"integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==",
"dev": true
},
"node_modules/babel-plugin-minify-simplify": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz",
"integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==",
"dev": true,
"dependencies": {
"babel-helper-evaluate-path": "^0.5.0",
"babel-helper-flip-expressions": "^0.4.3",
"babel-helper-is-nodes-equiv": "^0.0.1",
"babel-helper-to-multiple-sequence-expressions": "^0.5.0"
}
},
"node_modules/babel-plugin-minify-type-constructors": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz",
"integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=",
"dev": true,
"dependencies": {
"babel-helper-is-void-0": "^0.4.3"
}
},
"node_modules/babel-plugin-transform-inline-consecutive-adds": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz",
"integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=",
"dev": true
},
"node_modules/babel-plugin-transform-member-expression-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz",
"integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=",
"dev": true
},
"node_modules/babel-plugin-transform-merge-sibling-variables": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz",
"integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=",
"dev": true
},
"node_modules/babel-plugin-transform-minify-booleans": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz",
"integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=",
"dev": true
},
"node_modules/babel-plugin-transform-property-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz",
"integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=",
"dev": true,
"dependencies": {
"esutils": "^2.0.2"
}
},
"node_modules/babel-plugin-transform-regexp-constructors": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz",
"integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=",
"dev": true
},
"node_modules/babel-plugin-transform-remove-console": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
"integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=",
"dev": true
},
"node_modules/babel-plugin-transform-remove-debugger": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz",
"integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=",
"dev": true
},
"node_modules/babel-plugin-transform-remove-undefined": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz",
"integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==",
"dev": true,
"dependencies": {
"babel-helper-evaluate-path": "^0.5.0"
}
},
"node_modules/babel-plugin-transform-simplify-comparison-operators": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz",
"integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=",
"dev": true
},
"node_modules/babel-plugin-transform-undefined-to-void": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz",
"integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=",
"dev": true
},
"node_modules/babel-preset-minify": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz",
"integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==",
"dev": true,
"dependencies": {
"babel-plugin-minify-builtins": "^0.5.0",
"babel-plugin-minify-constant-folding": "^0.5.0",
"babel-plugin-minify-dead-code-elimination": "^0.5.1",
"babel-plugin-minify-flip-comparisons": "^0.4.3",
"babel-plugin-minify-guarded-expressions": "^0.4.4",
"babel-plugin-minify-infinity": "^0.4.3",
"babel-plugin-minify-mangle-names": "^0.5.0",
"babel-plugin-minify-numeric-literals": "^0.4.3",
"babel-plugin-minify-replace": "^0.5.0",
"babel-plugin-minify-simplify": "^0.5.1",
"babel-plugin-minify-type-constructors": "^0.4.3",
"babel-plugin-transform-inline-consecutive-adds": "^0.4.3",
"babel-plugin-transform-member-expression-literals": "^6.9.4",
"babel-plugin-transform-merge-sibling-variables": "^6.9.4",
"babel-plugin-transform-minify-booleans": "^6.9.4",
"babel-plugin-transform-property-literals": "^6.9.4",
"babel-plugin-transform-regexp-constructors": "^0.4.3",
"babel-plugin-transform-remove-console": "^6.9.4",
"babel-plugin-transform-remove-debugger": "^6.9.4",
"babel-plugin-transform-remove-undefined": "^0.5.0",
"babel-plugin-transform-simplify-comparison-operators": "^6.9.4",
"babel-plugin-transform-undefined-to-void": "^6.9.4",
"lodash": "^4.17.11"
}
},
"node_modules/browserslist": {
"version": "4.16.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
"integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
"dev": true,
"dependencies": {
"caniuse-lite": "^1.0.30001181",
"colorette": "^1.2.1",
"electron-to-chromium": "^1.3.649",
"escalade": "^3.1.1",
"node-releases": "^1.1.70"
},
"bin": {
"browserslist": "cli.js"
},
"engines": {
"node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7"
},
"funding": {
"type": "opencollective",
"url": "https://opencollective.com/browserslist"
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/caniuse-lite": {
"version": "1.0.30001205",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz",
"integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==",
"dev": true
},
"node_modules/chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"dependencies": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"node_modules/colorette": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
"dev": true
},
"node_modules/convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
"integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
"dev": true,
"dependencies": {
"safe-buffer": "~5.1.1"
}
},
"node_modules/debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"dependencies": {
"ms": "2.1.2"
},
"engines": {
"node": ">=6.0"
},
"peerDependenciesMeta": {
"supports-color": {
"optional": true
}
}
},
"node_modules/define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"dependencies": {
"object-keys": "^1.0.12"
},
"engines": {
"node": ">= 0.4"
}
},
"node_modules/electron-to-chromium": {
"version": "1.3.703",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.703.tgz",
"integrity": "sha512-SVBVhNB+4zPL+rvtWLw7PZQkw/Eqj1HQZs22xtcqW36+xoifzEOEEDEpkxSMfB6RFeSIOcG00w6z5mSqLr1Y6w==",
"dev": true
},
"node_modules/es-abstract": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
"integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"get-intrinsic": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.2",
"is-callable": "^1.2.3",
"is-negative-zero": "^2.0.1",
"is-regex": "^1.1.2",
"is-string": "^1.0.5",
"object-inspect": "^1.9.0",
"object-keys": "^1.1.1",
"object.assign": "^4.1.2",
"string.prototype.trimend": "^1.0.4",
"string.prototype.trimstart": "^1.0.4",
"unbox-primitive": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/es-to-primitive": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"dependencies": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true,
"engines": {
"node": ">=6"
}
},
"node_modules/escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true,
"engines": {
"node": ">=0.8.0"
}
},
"node_modules/esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
"dependencies": {
"is-callable": "^1.1.3"
}
},
"node_modules/fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
"integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
"dev": true
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"node_modules/gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true,
"engines": {
"node": ">=6.9.0"
}
},
"node_modules/get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-bigints": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-bigint": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz",
"integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-boolean-object": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
"integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-callable": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-date-object": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
"integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-negative-zero": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-number-object": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
"integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-regex": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
"integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"has-symbols": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-string": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
"integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
"dev": true,
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/is-symbol": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
"integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
"dev": true,
"dependencies": {
"has-symbols": "^1.0.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"node_modules/jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true,
"bin": {
"jsesc": "bin/jsesc"
},
"engines": {
"node": ">=4"
}
},
"node_modules/json5": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
"dev": true,
"dependencies": {
"minimist": "^1.2.5"
},
"bin": {
"json5": "lib/cli.js"
},
"engines": {
"node": ">=6"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"node_modules/minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"node_modules/mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"dependencies": {
"minimist": "^1.2.5"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node_modules/node-releases": {
"version": "1.1.71",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
"integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
"dev": true
},
"node_modules/object-inspect": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
"integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
"dev": true,
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true,
"engines": {
"node": ">= 0.4"
}
},
"node_modules/object.assign": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
},
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/object.getownpropertydescriptors": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
"integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.18.0-next.2"
},
"engines": {
"node": ">= 0.8"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"node_modules/semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true,
"bin": {
"semver": "bin/semver.js"
}
},
"node_modules/source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true,
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/string.prototype.trimend": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/string.prototype.trimstart": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"dependencies": {
"has-flag": "^3.0.0"
},
"engines": {
"node": ">=4"
}
},
"node_modules/to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true,
"engines": {
"node": ">=4"
}
},
"node_modules/unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
"integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
"dev": true,
"dependencies": {
"function-bind": "^1.1.1",
"has-bigints": "^1.0.1",
"has-symbols": "^1.0.2",
"which-boxed-primitive": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/util.promisify": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
"integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
"dev": true,
"dependencies": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"for-each": "^0.3.3",
"has-symbols": "^1.0.1",
"object.getownpropertydescriptors": "^2.1.1"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/which-boxed-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"dependencies": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/yargs-parser": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
"integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
"dev": true,
"dependencies": {
"camelcase": "^4.1.0"
}
}
},
"dependencies": {
"@babel/code-frame": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz",
"integrity": "sha512-HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==",
"dev": true,
"requires": {
"@babel/highlight": "^7.12.13"
}
},
"@babel/compat-data": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.13.12.tgz",
"integrity": "sha512-3eJJ841uKxeV8dcN/2yGEUy+RfgQspPEgQat85umsE1rotuquQ2AbIub4S6j7c50a2d+4myc+zSlnXeIHrOnhQ==",
"dev": true
},
"@babel/core": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/core/-/core-7.13.14.tgz",
"integrity": "sha512-wZso/vyF4ki0l0znlgM4inxbdrUvCb+cVz8grxDq+6C9k6qbqoIJteQOKicaKjCipU3ISV+XedCqpL2RJJVehA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
"@babel/generator": "^7.13.9",
"@babel/helper-compilation-targets": "^7.13.13",
"@babel/helper-module-transforms": "^7.13.14",
"@babel/helpers": "^7.13.10",
"@babel/parser": "^7.13.13",
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.13",
"@babel/types": "^7.13.14",
"convert-source-map": "^1.7.0",
"debug": "^4.1.0",
"gensync": "^1.0.0-beta.2",
"json5": "^2.1.2",
"semver": "^6.3.0",
"source-map": "^0.5.0"
}
},
"@babel/generator": {
"version": "7.13.9",
"resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.13.9.tgz",
"integrity": "sha512-mHOOmY0Axl/JCTkxTU6Lf5sWOg/v8nUa+Xkt4zMTftX0wqmb6Sh7J8gvcehBw7q0AhrhAR+FDacKjCZ2X8K+Sw==",
"dev": true,
"requires": {
"@babel/types": "^7.13.0",
"jsesc": "^2.5.1",
"source-map": "^0.5.0"
}
},
"@babel/helper-compilation-targets": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.13.13.tgz",
"integrity": "sha512-q1kcdHNZehBwD9jYPh3WyXcsFERi39X4I59I3NadciWtNDyZ6x+GboOxncFK0kXlKIv6BJm5acncehXWUjWQMQ==",
"dev": true,
"requires": {
"@babel/compat-data": "^7.13.12",
"@babel/helper-validator-option": "^7.12.17",
"browserslist": "^4.14.5",
"semver": "^6.3.0"
}
},
"@babel/helper-function-name": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.12.13.tgz",
"integrity": "sha512-TZvmPn0UOqmvi5G4vvw0qZTpVptGkB1GL61R6lKvrSdIxGm5Pky7Q3fpKiIkQCAtRCBUwB0PaThlx9vebCDSwA==",
"dev": true,
"requires": {
"@babel/helper-get-function-arity": "^7.12.13",
"@babel/template": "^7.12.13",
"@babel/types": "^7.12.13"
}
},
"@babel/helper-get-function-arity": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.12.13.tgz",
"integrity": "sha512-DjEVzQNz5LICkzN0REdpD5prGoidvbdYk1BVgRUOINaWJP2t6avB27X1guXK1kXNrX0WMfsrm1A/ZBthYuIMQg==",
"dev": true,
"requires": {
"@babel/types": "^7.12.13"
}
},
"@babel/helper-member-expression-to-functions": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.13.12.tgz",
"integrity": "sha512-48ql1CLL59aKbU94Y88Xgb2VFy7a95ykGRbJJaaVv+LX5U8wFpLfiGXJJGUozsmA1oEh/o5Bp60Voq7ACyA/Sw==",
"dev": true,
"requires": {
"@babel/types": "^7.13.12"
}
},
"@babel/helper-module-imports": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.13.12.tgz",
"integrity": "sha512-4cVvR2/1B693IuOvSI20xqqa/+bl7lqAMR59R4iu39R9aOX8/JoYY1sFaNvUMyMBGnHdwvJgUrzNLoUZxXypxA==",
"dev": true,
"requires": {
"@babel/types": "^7.13.12"
}
},
"@babel/helper-module-transforms": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.13.14.tgz",
"integrity": "sha512-QuU/OJ0iAOSIatyVZmfqB0lbkVP0kDRiKj34xy+QNsnVZi/PA6BoSoreeqnxxa9EHFAIL0R9XOaAR/G9WlIy5g==",
"dev": true,
"requires": {
"@babel/helper-module-imports": "^7.13.12",
"@babel/helper-replace-supers": "^7.13.12",
"@babel/helper-simple-access": "^7.13.12",
"@babel/helper-split-export-declaration": "^7.12.13",
"@babel/helper-validator-identifier": "^7.12.11",
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.13",
"@babel/types": "^7.13.14"
}
},
"@babel/helper-optimise-call-expression": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.12.13.tgz",
"integrity": "sha512-BdWQhoVJkp6nVjB7nkFWcn43dkprYauqtk++Py2eaf/GRDFm5BxRqEIZCiHlZUGAVmtwKcsVL1dC68WmzeFmiA==",
"dev": true,
"requires": {
"@babel/types": "^7.12.13"
}
},
"@babel/helper-replace-supers": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.13.12.tgz",
"integrity": "sha512-Gz1eiX+4yDO8mT+heB94aLVNCL+rbuT2xy4YfyNqu8F+OI6vMvJK891qGBTqL9Uc8wxEvRW92Id6G7sDen3fFw==",
"dev": true,
"requires": {
"@babel/helper-member-expression-to-functions": "^7.13.12",
"@babel/helper-optimise-call-expression": "^7.12.13",
"@babel/traverse": "^7.13.0",
"@babel/types": "^7.13.12"
}
},
"@babel/helper-simple-access": {
"version": "7.13.12",
"resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.13.12.tgz",
"integrity": "sha512-7FEjbrx5SL9cWvXioDbnlYTppcZGuCY6ow3/D5vMggb2Ywgu4dMrpTJX0JdQAIcRRUElOIxF3yEooa9gUb9ZbA==",
"dev": true,
"requires": {
"@babel/types": "^7.13.12"
}
},
"@babel/helper-split-export-declaration": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.12.13.tgz",
"integrity": "sha512-tCJDltF83htUtXx5NLcaDqRmknv652ZWCHyoTETf1CXYJdPC7nohZohjUgieXhv0hTJdRf2FjDueFehdNucpzg==",
"dev": true,
"requires": {
"@babel/types": "^7.12.13"
}
},
"@babel/helper-validator-identifier": {
"version": "7.12.11",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz",
"integrity": "sha512-np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==",
"dev": true
},
"@babel/helper-validator-option": {
"version": "7.12.17",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.12.17.tgz",
"integrity": "sha512-TopkMDmLzq8ngChwRlyjR6raKD6gMSae4JdYDB8bByKreQgG0RBTuKe9LRxW3wFtUnjxOPRKBDwEH6Mg5KeDfw==",
"dev": true
},
"@babel/helpers": {
"version": "7.13.10",
"resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.13.10.tgz",
"integrity": "sha512-4VO883+MWPDUVRF3PhiLBUFHoX/bsLTGFpFK/HqvvfBZz2D57u9XzPVNFVBTc0PW/CWR9BXTOKt8NF4DInUHcQ==",
"dev": true,
"requires": {
"@babel/template": "^7.12.13",
"@babel/traverse": "^7.13.0",
"@babel/types": "^7.13.0"
}
},
"@babel/highlight": {
"version": "7.13.10",
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz",
"integrity": "sha512-5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.12.11",
"chalk": "^2.0.0",
"js-tokens": "^4.0.0"
}
},
"@babel/parser": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.13.13.tgz",
"integrity": "sha512-OhsyMrqygfk5v8HmWwOzlYjJrtLaFhF34MrfG/Z73DgYCI6ojNUTUp2TYbtnjo8PegeJp12eamsNettCQjKjVw==",
"dev": true
},
"@babel/template": {
"version": "7.12.13",
"resolved": "https://registry.npmjs.org/@babel/template/-/template-7.12.13.tgz",
"integrity": "sha512-/7xxiGA57xMo/P2GVvdEumr8ONhFOhfgq2ihK3h1e6THqzTAkHbkXgB0xI9yeTfIUoH3+oAeHhqm/I43OTbbjA==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
"@babel/parser": "^7.12.13",
"@babel/types": "^7.12.13"
}
},
"@babel/traverse": {
"version": "7.13.13",
"resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.13.13.tgz",
"integrity": "sha512-CblEcwmXKR6eP43oQGG++0QMTtCjAsa3frUuzHoiIJWpaIIi8dwMyEFUJoXRLxagGqCK+jALRwIO+o3R9p/uUg==",
"dev": true,
"requires": {
"@babel/code-frame": "^7.12.13",
"@babel/generator": "^7.13.9",
"@babel/helper-function-name": "^7.12.13",
"@babel/helper-split-export-declaration": "^7.12.13",
"@babel/parser": "^7.13.13",
"@babel/types": "^7.13.13",
"debug": "^4.1.0",
"globals": "^11.1.0"
}
},
"@babel/types": {
"version": "7.13.14",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.13.14.tgz",
"integrity": "sha512-A2aa3QTkWoyqsZZFl56MLUsfmh7O0gN41IPvXAE/++8ojpbz12SszD7JEGYVdn4f9Kt4amIei07swF1h4AqmmQ==",
"dev": true,
"requires": {
"@babel/helper-validator-identifier": "^7.12.11",
"lodash": "^4.17.19",
"to-fast-properties": "^2.0.0"
}
},
"ansi-styles": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
"integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
"dev": true,
"requires": {
"color-convert": "^1.9.0"
}
},
"babel-helper-evaluate-path": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-helper-evaluate-path/-/babel-helper-evaluate-path-0.5.0.tgz",
"integrity": "sha512-mUh0UhS607bGh5wUMAQfOpt2JX2ThXMtppHRdRU1kL7ZLRWIXxoV2UIV1r2cAeeNeU1M5SB5/RSUgUxrK8yOkA==",
"dev": true
},
"babel-helper-flip-expressions": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-flip-expressions/-/babel-helper-flip-expressions-0.4.3.tgz",
"integrity": "sha1-NpZzahKKwYvCUlS19AoizrPB0/0=",
"dev": true
},
"babel-helper-is-nodes-equiv": {
"version": "0.0.1",
"resolved": "https://registry.npmjs.org/babel-helper-is-nodes-equiv/-/babel-helper-is-nodes-equiv-0.0.1.tgz",
"integrity": "sha1-NOmzALFHnd2Y7HfqC76TQt/jloQ=",
"dev": true
},
"babel-helper-is-void-0": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-is-void-0/-/babel-helper-is-void-0-0.4.3.tgz",
"integrity": "sha1-fZwBtFYee5Xb2g9u7kj1tg5nMT4=",
"dev": true
},
"babel-helper-mark-eval-scopes": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-mark-eval-scopes/-/babel-helper-mark-eval-scopes-0.4.3.tgz",
"integrity": "sha1-0kSjvvmESHJgP/tG4izorN9VFWI=",
"dev": true
},
"babel-helper-remove-or-void": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-helper-remove-or-void/-/babel-helper-remove-or-void-0.4.3.tgz",
"integrity": "sha1-pPA7QAd6D/6I5F0HAQ3uJB/1rmA=",
"dev": true
},
"babel-helper-to-multiple-sequence-expressions": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-helper-to-multiple-sequence-expressions/-/babel-helper-to-multiple-sequence-expressions-0.5.0.tgz",
"integrity": "sha512-m2CvfDW4+1qfDdsrtf4dwOslQC3yhbgyBFptncp4wvtdrDHqueW7slsYv4gArie056phvQFhT2nRcGS4bnm6mA==",
"dev": true
},
"babel-minify": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-minify/-/babel-minify-0.5.1.tgz",
"integrity": "sha512-ftEYu5OCDXEqaX/eINIaekPgkCaVPJNwFHzXKKARnRLggK8g4a9dEOflLKDgRNYOwhcLVoicUchZG6FYyOpqSA==",
"dev": true,
"requires": {
"@babel/core": "^7.1.0",
"babel-preset-minify": "^0.5.1",
"fs-readdir-recursive": "^1.1.0",
"lodash": "^4.17.11",
"mkdirp": "^0.5.1",
"util.promisify": "^1.0.0",
"yargs-parser": "^10.0.0"
}
},
"babel-plugin-minify-builtins": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-builtins/-/babel-plugin-minify-builtins-0.5.0.tgz",
"integrity": "sha512-wpqbN7Ov5hsNwGdzuzvFcjgRlzbIeVv1gMIlICbPj0xkexnfoIDe7q+AZHMkQmAE/F9R5jkrB6TLfTegImlXag==",
"dev": true
},
"babel-plugin-minify-constant-folding": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-constant-folding/-/babel-plugin-minify-constant-folding-0.5.0.tgz",
"integrity": "sha512-Vj97CTn/lE9hR1D+jKUeHfNy+m1baNiJ1wJvoGyOBUx7F7kJqDZxr9nCHjO/Ad+irbR3HzR6jABpSSA29QsrXQ==",
"dev": true,
"requires": {
"babel-helper-evaluate-path": "^0.5.0"
}
},
"babel-plugin-minify-dead-code-elimination": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-dead-code-elimination/-/babel-plugin-minify-dead-code-elimination-0.5.1.tgz",
"integrity": "sha512-x8OJOZIrRmQBcSqxBcLbMIK8uPmTvNWPXH2bh5MDCW1latEqYiRMuUkPImKcfpo59pTUB2FT7HfcgtG8ZlR5Qg==",
"dev": true,
"requires": {
"babel-helper-evaluate-path": "^0.5.0",
"babel-helper-mark-eval-scopes": "^0.4.3",
"babel-helper-remove-or-void": "^0.4.3",
"lodash": "^4.17.11"
}
},
"babel-plugin-minify-flip-comparisons": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-flip-comparisons/-/babel-plugin-minify-flip-comparisons-0.4.3.tgz",
"integrity": "sha1-AMqHDLjxO0XAOLPB68DyJyk8llo=",
"dev": true,
"requires": {
"babel-helper-is-void-0": "^0.4.3"
}
},
"babel-plugin-minify-guarded-expressions": {
"version": "0.4.4",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-guarded-expressions/-/babel-plugin-minify-guarded-expressions-0.4.4.tgz",
"integrity": "sha512-RMv0tM72YuPPfLT9QLr3ix9nwUIq+sHT6z8Iu3sLbqldzC1Dls8DPCywzUIzkTx9Zh1hWX4q/m9BPoPed9GOfA==",
"dev": true,
"requires": {
"babel-helper-evaluate-path": "^0.5.0",
"babel-helper-flip-expressions": "^0.4.3"
}
},
"babel-plugin-minify-infinity": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-infinity/-/babel-plugin-minify-infinity-0.4.3.tgz",
"integrity": "sha1-37h2obCKBldjhO8/kuZTumB7Oco=",
"dev": true
},
"babel-plugin-minify-mangle-names": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-mangle-names/-/babel-plugin-minify-mangle-names-0.5.0.tgz",
"integrity": "sha512-3jdNv6hCAw6fsX1p2wBGPfWuK69sfOjfd3zjUXkbq8McbohWy23tpXfy5RnToYWggvqzuMOwlId1PhyHOfgnGw==",
"dev": true,
"requires": {
"babel-helper-mark-eval-scopes": "^0.4.3"
}
},
"babel-plugin-minify-numeric-literals": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-numeric-literals/-/babel-plugin-minify-numeric-literals-0.4.3.tgz",
"integrity": "sha1-jk/VYcefeAEob/YOjF/Z3u6TwLw=",
"dev": true
},
"babel-plugin-minify-replace": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-replace/-/babel-plugin-minify-replace-0.5.0.tgz",
"integrity": "sha512-aXZiaqWDNUbyNNNpWs/8NyST+oU7QTpK7J9zFEFSA0eOmtUNMU3fczlTTTlnCxHmq/jYNFEmkkSG3DDBtW3Y4Q==",
"dev": true
},
"babel-plugin-minify-simplify": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-simplify/-/babel-plugin-minify-simplify-0.5.1.tgz",
"integrity": "sha512-OSYDSnoCxP2cYDMk9gxNAed6uJDiDz65zgL6h8d3tm8qXIagWGMLWhqysT6DY3Vs7Fgq7YUDcjOomhVUb+xX6A==",
"dev": true,
"requires": {
"babel-helper-evaluate-path": "^0.5.0",
"babel-helper-flip-expressions": "^0.4.3",
"babel-helper-is-nodes-equiv": "^0.0.1",
"babel-helper-to-multiple-sequence-expressions": "^0.5.0"
}
},
"babel-plugin-minify-type-constructors": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-minify-type-constructors/-/babel-plugin-minify-type-constructors-0.4.3.tgz",
"integrity": "sha1-G8bxW4f3qxCF1CszC3F2V6IVZQA=",
"dev": true,
"requires": {
"babel-helper-is-void-0": "^0.4.3"
}
},
"babel-plugin-transform-inline-consecutive-adds": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-inline-consecutive-adds/-/babel-plugin-transform-inline-consecutive-adds-0.4.3.tgz",
"integrity": "sha1-Mj1Ho+pjqDp6w8gRro5pQfrysNE=",
"dev": true
},
"babel-plugin-transform-member-expression-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-member-expression-literals/-/babel-plugin-transform-member-expression-literals-6.9.4.tgz",
"integrity": "sha1-NwOcmgwzE6OUlfqsL/OmtbnQOL8=",
"dev": true
},
"babel-plugin-transform-merge-sibling-variables": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-merge-sibling-variables/-/babel-plugin-transform-merge-sibling-variables-6.9.4.tgz",
"integrity": "sha1-hbQi/DN3tEnJ0c3kQIcgNTJAHa4=",
"dev": true
},
"babel-plugin-transform-minify-booleans": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-minify-booleans/-/babel-plugin-transform-minify-booleans-6.9.4.tgz",
"integrity": "sha1-rLs+VqNVXdI5KOS1gtKFFi3SsZg=",
"dev": true
},
"babel-plugin-transform-property-literals": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-property-literals/-/babel-plugin-transform-property-literals-6.9.4.tgz",
"integrity": "sha1-mMHSHiVXNlc/k+zlRFn2ziSYXTk=",
"dev": true,
"requires": {
"esutils": "^2.0.2"
}
},
"babel-plugin-transform-regexp-constructors": {
"version": "0.4.3",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-regexp-constructors/-/babel-plugin-transform-regexp-constructors-0.4.3.tgz",
"integrity": "sha1-WLd3W2OvzzMyj66aX4j71PsLSWU=",
"dev": true
},
"babel-plugin-transform-remove-console": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-console/-/babel-plugin-transform-remove-console-6.9.4.tgz",
"integrity": "sha1-uYA2DAZzhOJLNXpYjYB9PINSd4A=",
"dev": true
},
"babel-plugin-transform-remove-debugger": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-debugger/-/babel-plugin-transform-remove-debugger-6.9.4.tgz",
"integrity": "sha1-QrcnYxyXl44estGZp67IShgznvI=",
"dev": true
},
"babel-plugin-transform-remove-undefined": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-remove-undefined/-/babel-plugin-transform-remove-undefined-0.5.0.tgz",
"integrity": "sha512-+M7fJYFaEE/M9CXa0/IRkDbiV3wRELzA1kKQFCJ4ifhrzLKn/9VCCgj9OFmYWwBd8IB48YdgPkHYtbYq+4vtHQ==",
"dev": true,
"requires": {
"babel-helper-evaluate-path": "^0.5.0"
}
},
"babel-plugin-transform-simplify-comparison-operators": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-simplify-comparison-operators/-/babel-plugin-transform-simplify-comparison-operators-6.9.4.tgz",
"integrity": "sha1-9ir+CWyrDh9ootdT/fKDiIRxzrk=",
"dev": true
},
"babel-plugin-transform-undefined-to-void": {
"version": "6.9.4",
"resolved": "https://registry.npmjs.org/babel-plugin-transform-undefined-to-void/-/babel-plugin-transform-undefined-to-void-6.9.4.tgz",
"integrity": "sha1-viQcqBQEAwZ4t0hxcyK4nQyP4oA=",
"dev": true
},
"babel-preset-minify": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/babel-preset-minify/-/babel-preset-minify-0.5.1.tgz",
"integrity": "sha512-1IajDumYOAPYImkHbrKeiN5AKKP9iOmRoO2IPbIuVp0j2iuCcj0n7P260z38siKMZZ+85d3mJZdtW8IgOv+Tzg==",
"dev": true,
"requires": {
"babel-plugin-minify-builtins": "^0.5.0",
"babel-plugin-minify-constant-folding": "^0.5.0",
"babel-plugin-minify-dead-code-elimination": "^0.5.1",
"babel-plugin-minify-flip-comparisons": "^0.4.3",
"babel-plugin-minify-guarded-expressions": "^0.4.4",
"babel-plugin-minify-infinity": "^0.4.3",
"babel-plugin-minify-mangle-names": "^0.5.0",
"babel-plugin-minify-numeric-literals": "^0.4.3",
"babel-plugin-minify-replace": "^0.5.0",
"babel-plugin-minify-simplify": "^0.5.1",
"babel-plugin-minify-type-constructors": "^0.4.3",
"babel-plugin-transform-inline-consecutive-adds": "^0.4.3",
"babel-plugin-transform-member-expression-literals": "^6.9.4",
"babel-plugin-transform-merge-sibling-variables": "^6.9.4",
"babel-plugin-transform-minify-booleans": "^6.9.4",
"babel-plugin-transform-property-literals": "^6.9.4",
"babel-plugin-transform-regexp-constructors": "^0.4.3",
"babel-plugin-transform-remove-console": "^6.9.4",
"babel-plugin-transform-remove-debugger": "^6.9.4",
"babel-plugin-transform-remove-undefined": "^0.5.0",
"babel-plugin-transform-simplify-comparison-operators": "^6.9.4",
"babel-plugin-transform-undefined-to-void": "^6.9.4",
"lodash": "^4.17.11"
}
},
"browserslist": {
"version": "4.16.3",
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.16.3.tgz",
"integrity": "sha512-vIyhWmIkULaq04Gt93txdh+j02yX/JzlyhLYbV3YQCn/zvES3JnY7TifHHvvr1w5hTDluNKMkV05cs4vy8Q7sw==",
"dev": true,
"requires": {
"caniuse-lite": "^1.0.30001181",
"colorette": "^1.2.1",
"electron-to-chromium": "^1.3.649",
"escalade": "^3.1.1",
"node-releases": "^1.1.70"
}
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"camelcase": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz",
"integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=",
"dev": true
},
"caniuse-lite": {
"version": "1.0.30001205",
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001205.tgz",
"integrity": "sha512-TL1GrS5V6LElbitPazidkBMD9sa448bQDDLrumDqaggmKFcuU2JW1wTOHJPukAcOMtEmLcmDJEzfRrf+GjM0Og==",
"dev": true
},
"chalk": {
"version": "2.4.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
"integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
"dev": true,
"requires": {
"ansi-styles": "^3.2.1",
"escape-string-regexp": "^1.0.5",
"supports-color": "^5.3.0"
}
},
"color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"dev": true,
"requires": {
"color-name": "1.1.3"
}
},
"color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
"dev": true
},
"colorette": {
"version": "1.2.2",
"resolved": "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz",
"integrity": "sha512-MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==",
"dev": true
},
"convert-source-map": {
"version": "1.7.0",
"resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
"integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
"dev": true,
"requires": {
"safe-buffer": "~5.1.1"
}
},
"debug": {
"version": "4.3.1",
"resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz",
"integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==",
"dev": true,
"requires": {
"ms": "2.1.2"
}
},
"define-properties": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
"integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
"dev": true,
"requires": {
"object-keys": "^1.0.12"
}
},
"electron-to-chromium": {
"version": "1.3.703",
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.703.tgz",
"integrity": "sha512-SVBVhNB+4zPL+rvtWLw7PZQkw/Eqj1HQZs22xtcqW36+xoifzEOEEDEpkxSMfB6RFeSIOcG00w6z5mSqLr1Y6w==",
"dev": true
},
"es-abstract": {
"version": "1.18.0",
"resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.18.0.tgz",
"integrity": "sha512-LJzK7MrQa8TS0ja2w3YNLzUgJCGPdPOV1yVvezjNnS89D+VR08+Szt2mz3YB2Dck/+w5tfIq/RoUAFqJJGM2yw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"es-to-primitive": "^1.2.1",
"function-bind": "^1.1.1",
"get-intrinsic": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.2",
"is-callable": "^1.2.3",
"is-negative-zero": "^2.0.1",
"is-regex": "^1.1.2",
"is-string": "^1.0.5",
"object-inspect": "^1.9.0",
"object-keys": "^1.1.1",
"object.assign": "^4.1.2",
"string.prototype.trimend": "^1.0.4",
"string.prototype.trimstart": "^1.0.4",
"unbox-primitive": "^1.0.0"
}
},
"es-to-primitive": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
"integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
"dev": true,
"requires": {
"is-callable": "^1.1.4",
"is-date-object": "^1.0.1",
"is-symbol": "^1.0.2"
}
},
"escalade": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz",
"integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==",
"dev": true
},
"escape-string-regexp": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
"integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
"dev": true
},
"esutils": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
"integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
"dev": true
},
"for-each": {
"version": "0.3.3",
"resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz",
"integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==",
"dev": true,
"requires": {
"is-callable": "^1.1.3"
}
},
"fs-readdir-recursive": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fs-readdir-recursive/-/fs-readdir-recursive-1.1.0.tgz",
"integrity": "sha512-GNanXlVr2pf02+sPN40XN8HG+ePaNcvM0q5mZBd668Obwb0yD5GiUbZOFgwn8kGMY6I3mdyDJzieUy3PTYyTRA==",
"dev": true
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
"dev": true
},
"gensync": {
"version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz",
"integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==",
"dev": true
},
"get-intrinsic": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.1.tgz",
"integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.1"
}
},
"globals": {
"version": "11.12.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
"integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
"dev": true
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1"
}
},
"has-bigints": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.1.tgz",
"integrity": "sha512-LSBS2LjbNBTf6287JEbEzvJgftkF5qFkmCo9hDRpAzKhUOlJ+hx8dd4USs00SgsUNwc4617J9ki5YtEClM2ffA==",
"dev": true
},
"has-flag": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
"integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
"dev": true
},
"has-symbols": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz",
"integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==",
"dev": true
},
"is-bigint": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.1.tgz",
"integrity": "sha512-J0ELF4yHFxHy0cmSxZuheDOz2luOdVvqjwmEcj8H/L1JHeuEDSDbeRP+Dk9kFVk5RTFzbucJ2Kb9F7ixY2QaCg==",
"dev": true
},
"is-boolean-object": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.0.tgz",
"integrity": "sha512-a7Uprx8UtD+HWdyYwnD1+ExtTgqQtD2k/1yJgtXP6wnMm8byhkoTZRl+95LLThpzNZJ5aEvi46cdH+ayMFRwmA==",
"dev": true,
"requires": {
"call-bind": "^1.0.0"
}
},
"is-callable": {
"version": "1.2.3",
"resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.3.tgz",
"integrity": "sha512-J1DcMe8UYTBSrKezuIUTUwjXsho29693unXM2YhJUTR2txK/eG47bvNa/wipPFmZFgr/N6f1GA66dv0mEyTIyQ==",
"dev": true
},
"is-date-object": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
"integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
"dev": true
},
"is-negative-zero": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.1.tgz",
"integrity": "sha512-2z6JzQvZRa9A2Y7xC6dQQm4FSTSTNWjKIYYTt4246eMTJmIo0Q+ZyOsU66X8lxK1AbB92dFeglPLrhwpeRKO6w==",
"dev": true
},
"is-number-object": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.4.tgz",
"integrity": "sha512-zohwelOAur+5uXtk8O3GPQ1eAcu4ZX3UwxQhUlfFFMNpUd83gXgjbhJh6HmB6LUNV/ieOLQuDwJO3dWJosUeMw==",
"dev": true
},
"is-regex": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.2.tgz",
"integrity": "sha512-axvdhb5pdhEVThqJzYXwMlVuZwC+FF2DpcOhTS+y/8jVq4trxyPgfcwIxIKiyeuLlSQYKkmUaPQJ8ZE4yNKXDg==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"has-symbols": "^1.0.1"
}
},
"is-string": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.5.tgz",
"integrity": "sha512-buY6VNRjhQMiF1qWDouloZlQbRhDPCebwxSjxMjxgemYT46YMd2NR0/H+fBhEfWX4A/w9TBJ+ol+okqJKFE6vQ==",
"dev": true
},
"is-symbol": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
"integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
"dev": true,
"requires": {
"has-symbols": "^1.0.1"
}
},
"js-tokens": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
"dev": true
},
"jsesc": {
"version": "2.5.2",
"resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
"integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
"dev": true
},
"json5": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.0.tgz",
"integrity": "sha512-f+8cldu7X/y7RAJurMEJmdoKXGB/X550w2Nr3tTbezL6RwEE/iMcm+tZnXeoZtKuOq6ft8+CqzEkrIgx1fPoQA==",
"dev": true,
"requires": {
"minimist": "^1.2.5"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"dev": true
},
"minimist": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
"integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
"dev": true
},
"mkdirp": {
"version": "0.5.5",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
"integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
"dev": true,
"requires": {
"minimist": "^1.2.5"
}
},
"ms": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
"integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
"dev": true
},
"node-releases": {
"version": "1.1.71",
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz",
"integrity": "sha512-zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==",
"dev": true
},
"object-inspect": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.9.0.tgz",
"integrity": "sha512-i3Bp9iTqwhaLZBxGkRfo5ZbE07BQRT7MGu8+nNgwW9ItGp1TzCTw2DLEoWwjClxBjOFI/hWljTAmYGCEwmtnOw==",
"dev": true
},
"object-keys": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
"integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
"dev": true
},
"object.assign": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.2.tgz",
"integrity": "sha512-ixT2L5THXsApyiUPYKmW+2EHpXXe5Ii3M+f4e+aJFAHao5amFRW6J0OO6c/LU8Be47utCx2GL89hxGB6XSmKuQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"has-symbols": "^1.0.1",
"object-keys": "^1.1.1"
}
},
"object.getownpropertydescriptors": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.2.tgz",
"integrity": "sha512-WtxeKSzfBjlzL+F9b7M7hewDzMwy+C8NRssHd1YrNlzHzIDrXcXiNOMrezdAEM4UXixgV+vvnyBeN7Rygl2ttQ==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3",
"es-abstract": "^1.18.0-next.2"
}
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
"dev": true
},
"semver": {
"version": "6.3.0",
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
"dev": true
},
"source-map": {
"version": "0.5.7",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
"dev": true
},
"string.prototype.trimend": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.4.tgz",
"integrity": "sha512-y9xCjw1P23Awk8EvTpcyL2NIr1j7wJ39f+k6lvRnSMz+mz9CGz9NYPelDk42kOz6+ql8xjfK8oYzy3jAP5QU5A==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
}
},
"string.prototype.trimstart": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.4.tgz",
"integrity": "sha512-jh6e984OBfvxS50tdY2nRZnoC5/mLFKOREQfw8t5yytkoUsJRNxvI/E39qu1sD0OtWI3OC0XgKSmcWwziwYuZw==",
"dev": true,
"requires": {
"call-bind": "^1.0.2",
"define-properties": "^1.1.3"
}
},
"supports-color": {
"version": "5.5.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
"integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
"dev": true,
"requires": {
"has-flag": "^3.0.0"
}
},
"to-fast-properties": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
"integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
"dev": true
},
"unbox-primitive": {
"version": "1.0.1",
"resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.1.tgz",
"integrity": "sha512-tZU/3NqK3dA5gpE1KtyiJUrEB0lxnGkMFHptJ7q6ewdZ8s12QrODwNbhIJStmJkd1QDXa1NRA8aF2A1zk/Ypyw==",
"dev": true,
"requires": {
"function-bind": "^1.1.1",
"has-bigints": "^1.0.1",
"has-symbols": "^1.0.2",
"which-boxed-primitive": "^1.0.2"
}
},
"util.promisify": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.1.1.tgz",
"integrity": "sha512-/s3UsZUrIfa6xDhr7zZhnE9SLQ5RIXyYfiVnMMyMDzOc8WhWN4Nbh36H842OyurKbCDAesZOJaVyvmSl6fhGQw==",
"dev": true,
"requires": {
"call-bind": "^1.0.0",
"define-properties": "^1.1.3",
"for-each": "^0.3.3",
"has-symbols": "^1.0.1",
"object.getownpropertydescriptors": "^2.1.1"
}
},
"which-boxed-primitive": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz",
"integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==",
"dev": true,
"requires": {
"is-bigint": "^1.0.1",
"is-boolean-object": "^1.1.0",
"is-number-object": "^1.0.4",
"is-string": "^1.0.5",
"is-symbol": "^1.0.3"
}
},
"yargs-parser": {
"version": "10.1.0",
"resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz",
"integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==",
"dev": true,
"requires": {
"camelcase": "^4.1.0"
}
}
}
}
{
"devDependencies": {
"babel-minify": "^0.5.1"
}
}
<html>
<head></head>
<body>
<h1>WebAssembly Music by Peter Salomonsen</h1>
<p>Physical modeling synthesis implemented in a WebAssembly binary, compressed as a PNG image and embedded in one HTML file.</p>
<p>Play directly or export wav, you can't do both at the same time (reload the page if you need to start over)</p>
<button onclick="play()">play</button>
<button onclick="exportwav()">export wav</button>
<p>Current time: <span id="currenttime">0.0s</span>,
Total length: 164 secs
</p>
<p>Copyright (c) 2021 - Peter Salomonsen</p>
<script>const duration=164e3,wasmbuffersize=128,wasmdata="data:image/png;base64,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";"function"!=typeof AudioContext&&(window.AudioContext=window.webkitAudioContext);function decode_wasm_png(a){const b=new Image,c=document.createElement("canvas").getContext("2d");return b.src=a,b.decode().then(()=>{c.width=b.width,c.height=b.height,c.drawImage(b,0,0);let a=c.getImageData(0,0,b.width,b.height).data;return a=a.filter((a,b)=>0==b%4),a.slice(4,23215).buffer})}const getWasm=async a=>(await WebAssembly.instantiate(await decode_wasm_png(wasmdata),{environment:{SAMPLERATE:a}})).instance.exports,updateCurrentTime=a=>{document.getElementById("currenttime").innerHTML=`${a.toFixed(2)}s`},disablebuttons=()=>document.querySelectorAll("button").forEach(a=>a.disabled=!0);window.play=async()=>{disablebuttons();const a=new AudioContext;a.resume();const b=await getWasm(a.sampleRate);let c=.2;const d=50,e=wasmbuffersize*50/a.sampleRate;for(;b.currentTimeMillis.value<duration;){const f=a.createBuffer(2,wasmbuffersize*d,a.sampleRate);for(let a=0;a<d;a++)b.playEventsAndFillSampleBuffer(),f.getChannelData(0).set(new Float32Array(b.memory.buffer,b.samplebuffer,wasmbuffersize),wasmbuffersize*a),f.getChannelData(1).set(new Float32Array(b.memory.buffer,b.samplebuffer+4*wasmbuffersize,wasmbuffersize),wasmbuffersize*a);const g=a.createBufferSource();g.buffer=f,g.connect(a.destination),g.start(c),c+=e,updateCurrentTime(a.currentTime),await new Promise(a=>setTimeout(a,e))}for(;a.currentTime<164;)updateCurrentTime(a.currentTime),await new Promise(a=>setTimeout(a,e))},window.exportwav=async()=>{function b(a,b,c){for(var d=0;d<c.length;d++)a.setUint8(b+d,c.charCodeAt(d))}disablebuttons();const c=16,d=2,e=44100;var f=c/8,g=d*f;const h=d*f*(164*e+100*wasmbuffersize);var j=new ArrayBuffer(44+h),k=new DataView(j);b(k,0,"RIFF"),k.setUint32(4,36+h,!0),b(k,8,"WAVE"),b(k,12,"fmt "),k.setUint32(16,16,!0),k.setUint16(20,1,!0),k.setUint16(22,d,!0),k.setUint32(24,e,!0),k.setUint32(28,e*g,!0),k.setUint16(32,g,!0),k.setUint16(34,c,!0),b(k,36,"data"),k.setUint32(40,h,!0);const l=await getWasm(e);for(let a=44;l.currentTimeMillis.value<duration;){for(let b=0;b<100;b++){l.playEventsAndFillSampleBuffer();const b=new Float32Array(l.memory.buffer,l.samplebuffer,2*wasmbuffersize);for(var m=0;m<wasmbuffersize;m++){const c=b=>{var c=Math.max(-1,Math.min(1,b));k.setInt16(a,0>c?32768*c:32767*c,!0),a+=2};c(b[m]),c(b[m+128])}}updateCurrentTime(l.currentTimeMillis.value/1e3),await new Promise(a=>setTimeout(a,0))}const n=new Blob([j],{type:"application/octet-stream"}),o=URL.createObjectURL(n),p=document.createElement("a");document.body.appendChild(p),p.style="display: none",p.href=o,p.download="petersalomonsen-wasmmusic.wav",p.click(),window.URL.revokeObjectURL(o)};</script>
</body>
</html>
<html>
<head></head>
<body>
<h1>Music by Peter Salomonsen</h1>
<button onclick="play()">play</button>
<button onclick="exportwav()">export wav</button>
<p>Current time: <span id="currenttime">0.0s</span>,
Total length: 164 secs
</p>
<script src="main.js"></script>
</body>
</html>
/*
* (c) Peter Johan Salomonsen 2021
*/
import { cos, outputline, Limiter, TriangleOscillator, PI, sin, cos, FFT, EQBand, TriBandEQ, EnvelopeState, Pan, SineOscillator, IFFTOscillator, BiQuadFilter, FilterType, Q_BUTTERWORTH, DelayLine, BandPass,SawOscillator,softclip, midichannels, MidiChannel, MidiVoice, StereoSignal, Freeverb, SineOscillator, Envelope } from '../mixes/globalimports';
import { SAMPLERATE } from '../environment';
function notefreq(note: f32): f32 {
return 440 * Mathf.pow(2, (-69 + note) / 12);
}
let seed: i32 = 1;
function noise() : f32 {
seed = (seed * 1103515245 + 12345) & 0x7fffffff;
return ((seed as f32 % 1000000 / 1000000) - 0.5) as f32;
}
const delayframes = (SAMPLERATE * (6/8) * 60 / 120) as usize;
const echoLeft = new DelayLine(delayframes);
const echoRight = new DelayLine(delayframes);
const echoline = new StereoSignal();
function filterPhase(freq: f32, sampleRate: f32, a0: f32, a1: f32, a2: f32, b1: f32, b2: f32): f32 {
const w: f32 = 2 * Mathf.PI * freq / sampleRate;
const cos1: f32 = Mathf.cos(-1 * w);
const cos2: f32 = Mathf.cos(-2 * w);
const sin1: f32 = Mathf.sin(-1 * w);
const sin2: f32 = Mathf.sin(-2 * w);
const realZeros: f32 = a0 + a1 * cos1 + a2 * cos2;
const imagZeros: f32 = a1 * sin1 + a2 * sin2;
const realPoles: f32 = 1 + b1 * cos1 + b2 * cos2;
const imagPoles: f32 = b1 * sin1 + b2 * sin2;
const divider: f32 = realPoles * realPoles + imagPoles * imagPoles;
const realHw: f32 = (realZeros * realPoles + imagZeros * imagPoles) / divider;
const imagHw: f32 = (imagZeros * realPoles - realZeros * imagPoles) / divider;
const magnitude: f32 = Mathf.sqrt(realHw * realHw + imagHw * imagHw);
const phase: f32 = Mathf.atan2(imagHw, realHw);
//return magnitude; //gain in Au
//return 20 * Math.Log10(magnitude); // gain in dB
return -(phase / (2*Mathf.PI)) * (SAMPLERATE / freq); //phase in samples
}
export class AllPass {
coeff: f32;
previousinput: f32;
previousoutput: f32;
setDelta(delta: f32): void {
this.coeff = (1 - delta) / (1 + delta);
}
process(input: f32): f32 {
const output = this.coeff * (input
- this.previousoutput)
+ this.previousinput;
this.previousoutput = output;
this.previousinput = input;
return output;
}
}
export class DelayLineFloat {
buffer: StaticArray<f32>;
frame: f64 = 0;
numframes: f64 = 1;
previous: f32;
allpass: AllPass = new AllPass();
constructor(private buffersizeframes: i32) {
this.buffer = new StaticArray<f32>(buffersizeframes);
}
read(): f32 {
const index = this.frame as i32 % this.buffer.length;
return this.allpass.process(this.buffer[index]);
}
setNumFramesAndClear(numframes: f64): void {
this.numframes = Math.floor(numframes);
this.allpass.previousoutput = 0;
this.allpass.previousinput = 0;
this.allpass.setDelta ( (numframes - this.numframes) as f32 );
this.frame = 0;
for (let n = 0; n < numframes;n++) {
this.buffer[n] = 0;
}
}
write_and_advance(value: f32): void {
const index = ((this.frame++) + this.numframes) as i32 % this.buffer.length;
this.buffer[index] = value;
}
}
class WaveGuide {
envExciter: Envelope;
filterExciter: BiQuadFilter = new BiQuadFilter();
delay: DelayLineFloat = new DelayLineFloat((SAMPLERATE / notefreq(1)) as i32);
filterFeedback: BiQuadFilter = new BiQuadFilter();
feedbackLevel: f32;
feedbackFilterFreq: f32;
freq: f32;
exciterenvlevel: f32;
constructor(exciterAttack: f32, exciterRelease: f32, exciterFilterFreq : f32, feedbackLevel: f32) {
this.envExciter = new Envelope(exciterAttack,
exciterRelease, 0,
exciterRelease);
this.filterExciter.update_coeffecients(FilterType.LowPass, SAMPLERATE,
exciterFilterFreq, Q_BUTTERWORTH);
this.feedbackLevel = feedbackLevel;
}
setFilterExciterFreq(freq: f32): void {
this.filterExciter.update_coeffecients(FilterType.LowPass, SAMPLERATE,
freq, Q_BUTTERWORTH);
}
start(freq: f32, feedbackFilterFreq: f32): void {
if (freq != this.freq) {
this.freq = freq;
const maxFeedbackFilterFreq: f32= 20000;
if (feedbackFilterFreq > maxFeedbackFilterFreq as f32) {
feedbackFilterFreq = maxFeedbackFilterFreq as f32;
} else if (feedbackFilterFreq < 10) {
feedbackFilterFreq = 10;
}
this.filterFeedback.update_coeffecients(FilterType.LowPass, SAMPLERATE,
feedbackFilterFreq, Q_BUTTERWORTH);
this.filterFeedback.y1 = 0;
this.filterFeedback.y2 = 0;
this.filterFeedback.x1 = 0;
this.filterFeedback.x2 = 0;
this.filterFeedback.s1 = 0;
this.filterFeedback.s2 = 0;
const filterphase: f32 = filterPhase(freq,
SAMPLERATE,
this.filterFeedback.coeffs.b0,
this.filterFeedback.coeffs.b1,
this.filterFeedback.coeffs.b2,
this.filterFeedback.coeffs.a1,
this.filterFeedback.coeffs.a2);
this.filterExciter.y1 = 0;
this.filterExciter.y2 = 0;
this.filterExciter.x1 = 0;
this.filterExciter.x2 = 0;
this.filterExciter.s1 = 0;
this.filterExciter.s2 = 0;
this.feedbackFilterFreq = feedbackFilterFreq;
this.delay.setNumFramesAndClear(
(SAMPLERATE /
(freq)
) - filterphase
);
this.envExciter.val = 0;
}
this.exciterenvlevel = 1;
this.envExciter.attack();
}
process(): f32 {
const envexciter = this.envExciter.next() * this.exciterenvlevel;
let exciterSignal: f32 = noise() * envexciter;
exciterSignal = this.filterExciter.process(exciterSignal);
const feedback = this.delay.read();
let signal = exciterSignal + feedback;
signal = this.filterFeedback.processForm2(signal);
this.delay.write_and_advance(
signal * this.feedbackLevel
);
return signal;
}
}
class AuxExciterWaveGuide {
delay: DelayLineFloat = new DelayLineFloat((SAMPLERATE / notefreq(1)) as i32);
filterFeedback: BiQuadFilter = new BiQuadFilter();
feedbackFilterFreq: f32;
feedbackLevel: f32;
freq: f32;
constructor(public exciter: WaveGuide) {
}
start(freq: f32, feedbackFilterFreq: f32): void {
if (freq != this.freq) {
this.freq = freq;
const maxFeedbackFilterFreq: f32= 20000;
if (feedbackFilterFreq > maxFeedbackFilterFreq as f32) {
feedbackFilterFreq = maxFeedbackFilterFreq as f32;
} else if (feedbackFilterFreq < 10) {
feedbackFilterFreq = 10;
}
this.filterFeedback.update_coeffecients(FilterType.LowPass, SAMPLERATE,
feedbackFilterFreq, Q_BUTTERWORTH);
this.filterFeedback.y1 = 0;
this.filterFeedback.y2 = 0;
this.filterFeedback.x1 = 0;
this.filterFeedback.x2 = 0;
this.filterFeedback.s1 = 0;
this.filterFeedback.s2 = 0;
const filterphase: f32 = filterPhase(freq,
SAMPLERATE,
this.filterFeedback.coeffs.b0,
this.filterFeedback.coeffs.b1,
this.filterFeedback.coeffs.b2,
this.filterFeedback.coeffs.a1,
this.filterFeedback.coeffs.a2);
this.feedbackFilterFreq = feedbackFilterFreq;
this.delay.setNumFramesAndClear(
(SAMPLERATE /
(freq)
) - filterphase
);
}
}
process(): f32 {
let exciterSignal: f32 = this.exciter.process();
const feedback = this.delay.read();
let signal = exciterSignal + feedback;
signal = this.filterFeedback.processForm2(signal);
this.delay.write_and_advance(
signal * this.feedbackLevel
);
return signal;
}
}
class Piano extends MidiVoice {
env: Envelope = new Envelope(0.005, 0.2, 1.0, 0.23);
waveguide1: AuxExciterWaveGuide = new AuxExciterWaveGuide(new WaveGuide(0.005, 0.07, 60, 0.1));
waveguide2: AuxExciterWaveGuide = new AuxExciterWaveGuide(new WaveGuide(0.005, 0.07, 60, 0.1));
waveguide3: AuxExciterWaveGuide = new AuxExciterWaveGuide(new WaveGuide(0.005, 0.07, 60, 0.1));
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq = notefreq(note);
const feedbackfreq: f32 = 5000 + Mathf.log(freq * 0.1) * 1000;
const feedbacklevel: f32 = 0.999 * (-(1/(freq + 25)) + 1.00000) as f32;
this.waveguide1.feedbackLevel = feedbacklevel;
this.waveguide2.feedbackLevel = feedbacklevel;
this.waveguide3.feedbackLevel = feedbacklevel;
this.waveguide1.exciter.setFilterExciterFreq(20 + 300 * (velocity as f32/ 127));
this.waveguide2.exciter.setFilterExciterFreq(20 + 300 * (velocity as f32/ 127 ));
this.waveguide3.exciter.setFilterExciterFreq(20 + 300 * (velocity as f32/ 127 ));
const exciterFeedbackFreq = (200 + freq * 1.5) as f32;
const exciterfreq: f32 = 40 + (note as f32 * 0.01);
this.waveguide1.exciter.start(exciterfreq, exciterFeedbackFreq);
this.waveguide2.exciter.start(exciterfreq, exciterFeedbackFreq);
this.waveguide3.exciter.start(exciterfreq, exciterFeedbackFreq);
this.waveguide1.start(freq* 1.00015, feedbackfreq);
this.waveguide2.start(freq, feedbackfreq);
this.waveguide3.start(freq* 0.99995, feedbackfreq);
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next() * 8;
const wg1: f32 = this.waveguide1.process();
const wg2: f32 = this.waveguide2.process();
const wg3: f32 = this.waveguide3.process();
this.channel.signal.add(
env * (wg1 * 0.0 + wg2 + wg3) ,
env * (wg1 + wg2 + wg3 * 0.0)
);
}
}
class PianoChannel extends MidiChannel {
lopassl: BiQuadFilter = new BiQuadFilter();
lopassr: BiQuadFilter = new BiQuadFilter();
hipassl: BiQuadFilter = new BiQuadFilter();
hipassr: BiQuadFilter = new BiQuadFilter();
constructor(chs: i32, instr: (ch: MidiChannel, num: i32) => MidiVoice) {
super(chs,instr);
this.lopassl.update_coeffecients(FilterType.LowPass, SAMPLERATE,
20000, Q_BUTTERWORTH);
this.lopassr.update_coeffecients(FilterType.LowPass, SAMPLERATE,
20000, Q_BUTTERWORTH);
this.hipassl.update_coeffecients(FilterType.HighPass, SAMPLERATE,
150, Q_BUTTERWORTH);
this.hipassr.update_coeffecients(FilterType.HighPass, SAMPLERATE,
150, Q_BUTTERWORTH);
}
preprocess(): void {
let left = this.lopassl.process(this.signal.left);
let right = this.lopassr.process(this.signal.right);
left = this.hipassl.process(left);
right = this.hipassr.process(right);
left*=2;
right*=2;
this.signal.left = left;
this.signal.right = right;
}
}
class String extends MidiVoice {
env: Envelope = new Envelope(0.001, 1, 0.9, 0.5);
waveguide1: WaveGuide = new WaveGuide(0.1, 20.0, 800, 0.99);
waveguide2: WaveGuide = new WaveGuide(0.1, 20.0, 800, 0.99);
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq = notefreq(note);
this.waveguide1.start(freq, freq * 4000 / Mathf.pow(note, 1.3) );
this.waveguide2.start(freq, freq * 4000 / Mathf.pow(note, 1.3) );
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env:f32 = this.env.next() * this.velocity * 0.02;
const left =
this.waveguide1.process()
* env;
const right =
this.waveguide2.process()
* env;
this.channel.signal.add(
left, right
);
}
}
/*
class Brass extends MidiVoice {
env: Envelope = new Envelope(0.01, 1.0, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.02, 0.15, 1000, 0.99999);
waveguide2: WaveGuide = new WaveGuide(0.03, 0.2, 5000, 1.0);
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq = notefreq(note);
this.waveguide1.start(freq, freq * 10);
this.waveguide2.start(freq, freq * 8);
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next();
let signal = (
this.waveguide1.process() +
this.waveguide2.process()
)
* env * this.velocity / 24 as f32;
this.channel.signal.add(
signal, signal
);
}
}
*/
class Guitar extends MidiVoice {
env: Envelope = new Envelope(0.001, 1, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.005, 0.005, 1600, 0.995);
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq = notefreq(note);
this.waveguide1.start(freq, freq * 3500 / Mathf.pow(note, 1.3) );
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next();
const signal = ((
this.waveguide1.process()
)
* env * this.velocity * 0.05) as f32;
this.channel.signal.add(
signal, signal
);
}
}
class GuitarChannel extends MidiChannel {
bandpass: BandPass = new BandPass(210,3000);
feedback: f32 = 0;
preprocess(): void {
let signal = this.signal.left;
const feedback = this.feedback;
signal = softclip(signal * 1.2);
this.feedback += this.bandpass.process(signal * 1.8);
signal += feedback;
signal *= 0.1;
echoline.left += (signal) * this.volume;
echoline.right += (signal) * this.volume;
this.signal.left = signal;
this.signal.right = signal;
}
}
class Bass extends MidiVoice {
env: Envelope = new Envelope(0.001, 1, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.001, 0.01, 200, 0.999);
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq = notefreq(note);
this.waveguide1.start(freq, freq * 8000 / Mathf.pow(note, 1.7));
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next();
const signal = (
this.waveguide1.process()
)
* env * this.velocity * 0.3 as f32;
this.channel.signal.add(
signal, signal
);
}
}
class TubeLead extends MidiVoice {
env: Envelope = new Envelope(0.01, 1, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.005, 0.5,2300, -0.999);
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq = notefreq(note+12);
this.waveguide1.start(freq, freq * 3000 / Mathf.pow(note, 1.6));
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next();
const signal = (
this.waveguide1.process()
)
* env * this.velocity * 0.02 as f32;
this.channel.signal.add(
signal, signal
);
}
}
class TubeLeadChannel extends MidiChannel {
preprocess(): void {
let signal = this.signal.left;
echoline.left += (signal) * this.volume;
echoline.right += (signal) * this.volume;
this.signal.left = signal;
this.signal.right = signal;
}
}
export class Hihat extends MidiVoice {
env: Envelope = new Envelope(0.0001, 1, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.008, 0.05, 20000, 0.05);
constructor(channel: MidiChannel) {
super(channel);
this.minnote = 66;
this.maxnote = 66;
}
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq: f32 = 8000;
this.waveguide1.start(freq, 20000);
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next();
const signal = (
this.waveguide1.process()
)
* env * this.velocity * 0.0018 as f32;
this.channel.signal.add(
signal, signal
);
}
}
export class Kick2 extends MidiVoice {
env: Envelope = new Envelope(0.0001, 1, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.005, 0.06, 60, 0.1);
constructor(channel: MidiChannel) {
super(channel);
this.minnote = 60;
this.maxnote = 60;
}
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq: f32 = 40;
this.waveguide1.start(freq, 300);
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next() * 1.3;
const signal = (
this.waveguide1.process()
)
* env * this.velocity as f32;
this.channel.signal.add(
signal, signal
);
}
}
export class Snare2 extends MidiVoice {
env: Envelope = new Envelope(0.0001, 1, 1.0, 0.1);
waveguide1: WaveGuide = new WaveGuide(0.005, 0.1, 15000, 0.1);
constructor(channel: MidiChannel) {
super(channel);
this.minnote = 62;
this.maxnote = 62;
}
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
const freq: f32 = 450;
this.waveguide1.start(freq, 1270);
this.env.attack();
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
return this.env.isDone();
}
nextframe(): void {
const env = this.env.next();
const signal = (
this.waveguide1.process()
)
* env * this.velocity * 0.05 as f32;
this.channel.signal.add(
signal, signal
);
}
}
/*
const fft: FFT = new FFT(11);
for (let n=1; n< (fft.buffer.length / 2) - 1; n+=1) {
let v = Mathf.exp((-n as f32 ) * 0.2) * 1023 * cos((n * 5) as f32);
//fft.buffer[n].re = v;
//fft.buffer[fft.buffer.length - n].re = -v;
fft.buffer[n].im = -v;
fft.buffer[fft.buffer.length - n].im = v;
}
fft.calculateInverse();
class PadSynth extends MidiVoice {
env: Envelope = new Envelope(0.001, 1.5, 0.01, 0.2);
t: f64 = 0;
freq: f32 = 0;
spread: i32 = 9;
hprofile: StaticArray<f32> = new StaticArray<f32>(this.spread);
phase: StaticArray<f32> = new StaticArray<f32>(this.spread);
freqs: StaticArray<f32> = new StaticArray<f32>(this.spread);
level: f32 = 1.0;
constructor(channel: MidiChannel) {
super(channel);
const halfspread: f32 = (this.spread / 2) as f32;
for(let n=0;n<this.spread;n++) {
const v: f32 = 2 as f32 * (
n as f32 - halfspread);
this.hprofile[n] = Mathf.exp(v * -v);
this.phase[n] = noise() * 0x800 as f32;
}
}
noteon(note: u8, velocity: u8): void {
super.noteon(note, velocity);
this.env.attack();
const halfspread: f32 = (this.spread / 2) as f32;
for (let n = 0;n<this.freqs.length; n++) {
const v: f32 = 0.04 as f32 * (n as f32 - halfspread);
this.freqs[n] = notefreq((note + v));
}
this.level = (-(1/(notefreq(note)-200)) + 1) as f32;
}
noteoff(): void {
this.env.release();
}
isDone(): boolean {
const ret = this.env.isDone();
return ret;
}
nextframe(): void {
const env = this.env.next() * this.level;
let left: f32 = 0;
let right: f32 = 0;
const t = this.t;
const freq = this.freq;
for(let n = 0;n < this.spread ; n++) {
const f = this.freqs[n];
const bufferpos = t * 0x800 * f + this.phase[n];
const floorbufferpos = Math.floor(bufferpos);
const delta = (bufferpos - floorbufferpos) as f32;
const v1 = fft.buffer[((bufferpos as i64) & 0x7ff) as i32].re;
const v = v1;
const leftlevel: f32 = (((n) / 2) + 0.5) as f32;
const rightlevel: f32 = (((this.hprofile.length - n) / 2) + 0.5) as f32;
left += v* leftlevel;
right += v* rightlevel;
}
left *= env * 0.8;
right *= env * 0.8;
this.t += 1 / SAMPLERATE;
this.channel.signal.add(
left, right
);
}
}
class PadSynthChannel extends MidiChannel {
lopassleft: BiQuadFilter = new BiQuadFilter();
lopassright: BiQuadFilter = new BiQuadFilter();
constructor(numvoices: i32, factoryFunc: (channel: MidiChannel, voiceindex: i32) => MidiVoice) {
super(numvoices, factoryFunc);
this.lopassleft.update_coeffecients(FilterType.LowPass, SAMPLERATE,
500, 0.3);
this.lopassright.update_coeffecients(FilterType.LowPass, SAMPLERATE,
500, 0.3);
}
preprocess(): void {
let left = this.signal.left;
let right = this.signal.right;
const gain:f32 = 0.3;
left*=gain;
right*=gain;
left = this.lopassleft.process(left);
right = this.lopassright.process(right);
echoline.left += (left * 0.8);
echoline.right += (right * 0.8);
this.signal.left = left;
this.signal.right = right;
}
}
*/
export function initializeMidiSynth(): void {
midichannels[0] = new PianoChannel(15, (ch) => new Piano(ch));
midichannels[0].controlchange(7, 100);
midichannels[0].controlchange(10, 64);
midichannels[0].controlchange(91, 70);
midichannels[1] = new MidiChannel(15, (ch) => new String(ch));
midichannels[1].controlchange(7,45);
midichannels[1].controlchange(10, 64);
midichannels[1].controlchange(91, 80);
midichannels[2] = new MidiChannel(4, (ch, ndx) => {
switch(ndx) {
case 1:
return new Hihat(ch);
case 2:
return new Snare2(ch);
default:
return new Kick2(ch);
}
});
midichannels[2].controlchange(7, 122);
midichannels[2].controlchange(91, 30);
/* midichannels[3] = new MidiChannel(4, (ch) => new Brass(ch));
midichannels[3].controlchange(7, 52);
midichannels[3].controlchange(10, 50);
midichannels[3].controlchange(91, 30);*/
midichannels[4] = new GuitarChannel(10, (ch) => new Guitar(ch));
midichannels[4].controlchange(7, 80);
midichannels[4].controlchange(10, 45);
midichannels[4].controlchange(91, 30);
midichannels[5] = new MidiChannel(2, (ch) => new Bass(ch));
midichannels[5].controlchange(7, 110);
midichannels[5].controlchange(10, 80);
midichannels[5].controlchange(91, 20);
midichannels[6] = new TubeLeadChannel(5, (ch) => new TubeLead(ch));
midichannels[6].controlchange(7, 50);
midichannels[6].controlchange(10, 40);
midichannels[6].controlchange(91, 90);
/*midichannels[7] = new PadSynthChannel(15, (ch) => new PadSynth(ch));
midichannels[7].controlchange(7, 110);
midichannels[7].controlchange(10, 64);
midichannels[7].controlchange(91, 80);*/
}
export class MultiBandEQ {
bands: StaticArray<EQBand>;
constructor(freqs: f32[]) {
this.bands = new StaticArray<EQBand>(freqs.length - 1);
for ( let n=1; n<freqs.length; n++) {
this.bands[n-1] = new EQBand(freqs[n-1], freqs[n]);
}
}
process(signal: f32, levels: f32[]): f32 {
let ret: f32 = 0;
for (let n = 0;n<this.bands.length; n++) {
ret += this.bands[n].process(signal) * levels[n];
}
return ret;
}
}
const eqfreqs: f32[] = [20,60,150,600,12000,19000]
//const eqlevels: f32[] = [1.0, 1.0, 1.0, 1.0];
const eqlevels: f32[] = [0.80, 1.0, 0.8, 1.0, 0.9];
const eqleft = new MultiBandEQ(eqfreqs);
const eqright = new MultiBandEQ(eqfreqs);
export function postprocess(): void {
const gain: f32 = 0.41;
let left = outputline.left;
let right = outputline.right;
const echol = echoLeft.read() * 0.2;
const echor = echoRight.read() * 0.2;
echoLeft.write_and_advance(echol + echoline.left);
echoRight.write_and_advance(echor + echoline.right);
left+=echol;
right+=echor;
left = eqleft.process(left, eqlevels);
right = eqright.process(right, eqlevels);
left*=gain;
right*=gain;
outputline.left = left;
outputline.right = right;
echoline.clear();
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment