wavesurfer.js 5.2.0 → 6.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (58) hide show
  1. package/CHANGES.md +22 -0
  2. package/README.md +10 -0
  3. package/dist/plugin/wavesurfer.cursor.js +52 -50
  4. package/dist/plugin/wavesurfer.cursor.js.map +1 -1
  5. package/dist/plugin/wavesurfer.cursor.min.js +2 -2
  6. package/dist/plugin/wavesurfer.cursor.min.js.map +1 -1
  7. package/dist/plugin/wavesurfer.elan.js +9 -6
  8. package/dist/plugin/wavesurfer.elan.js.map +1 -1
  9. package/dist/plugin/wavesurfer.elan.min.js +2 -2
  10. package/dist/plugin/wavesurfer.elan.min.js.map +1 -1
  11. package/dist/plugin/wavesurfer.markers.js +141 -25
  12. package/dist/plugin/wavesurfer.markers.js.map +1 -1
  13. package/dist/plugin/wavesurfer.markers.min.js +2 -2
  14. package/dist/plugin/wavesurfer.markers.min.js.map +1 -1
  15. package/dist/plugin/wavesurfer.mediasession.js +5 -5
  16. package/dist/plugin/wavesurfer.mediasession.min.js +2 -2
  17. package/dist/plugin/wavesurfer.mediasession.min.js.map +1 -1
  18. package/dist/plugin/wavesurfer.microphone.js +4 -4
  19. package/dist/plugin/wavesurfer.microphone.min.js +2 -2
  20. package/dist/plugin/wavesurfer.microphone.min.js.map +1 -1
  21. package/dist/plugin/wavesurfer.minimap.js +25 -22
  22. package/dist/plugin/wavesurfer.minimap.js.map +1 -1
  23. package/dist/plugin/wavesurfer.minimap.min.js +2 -2
  24. package/dist/plugin/wavesurfer.minimap.min.js.map +1 -1
  25. package/dist/plugin/wavesurfer.playhead.js +4 -4
  26. package/dist/plugin/wavesurfer.playhead.min.js +2 -2
  27. package/dist/plugin/wavesurfer.playhead.min.js.map +1 -1
  28. package/dist/plugin/wavesurfer.regions.js +53 -16
  29. package/dist/plugin/wavesurfer.regions.js.map +1 -1
  30. package/dist/plugin/wavesurfer.regions.min.js +2 -2
  31. package/dist/plugin/wavesurfer.regions.min.js.map +1 -1
  32. package/dist/plugin/wavesurfer.spectrogram.js +70 -57
  33. package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
  34. package/dist/plugin/wavesurfer.spectrogram.min.js +2 -2
  35. package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
  36. package/dist/plugin/wavesurfer.timeline.js +39 -44
  37. package/dist/plugin/wavesurfer.timeline.js.map +1 -1
  38. package/dist/plugin/wavesurfer.timeline.min.js +2 -2
  39. package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
  40. package/dist/wavesurfer-html-init.js +5 -5
  41. package/dist/wavesurfer-html-init.min.js +2 -2
  42. package/dist/wavesurfer-html-init.min.js.map +1 -1
  43. package/dist/wavesurfer.js +209 -121
  44. package/dist/wavesurfer.js.map +1 -1
  45. package/dist/wavesurfer.min.js +2 -2
  46. package/dist/wavesurfer.min.js.map +1 -1
  47. package/package.json +23 -23
  48. package/src/drawer.canvasentry.js +30 -6
  49. package/src/drawer.js +1 -0
  50. package/src/drawer.multicanvas.js +19 -8
  51. package/src/mediaelement.js +1 -1
  52. package/src/plugin/cursor/index.js +68 -70
  53. package/src/plugin/markers/index.js +112 -23
  54. package/src/plugin/minimap/index.js +24 -21
  55. package/src/plugin/regions/index.js +30 -3
  56. package/src/plugin/regions/region.js +13 -4
  57. package/src/plugin/spectrogram/index.js +65 -50
  58. package/src/wavesurfer.js +31 -10
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wavesurfer.js spectrogram plugin 5.2.0 (2021-08-16)
2
+ * wavesurfer.js spectrogram plugin 6.0.0 (2022-02-07)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
@@ -28,7 +28,7 @@ return /******/ (() => { // webpackBootstrap
28
28
  Object.defineProperty(exports, "__esModule", ({
29
29
  value: true
30
30
  }));
31
- exports.default = FFT;
31
+ exports["default"] = FFT;
32
32
 
33
33
  /* eslint-disable complexity, no-redeclare, no-var, one-var */
34
34
 
@@ -249,7 +249,7 @@ module.exports = exports.default;
249
249
  Object.defineProperty(exports, "__esModule", ({
250
250
  value: true
251
251
  }));
252
- exports.default = void 0;
252
+ exports["default"] = void 0;
253
253
 
254
254
  var _fft = _interopRequireDefault(__webpack_require__(/*! ./fft */ "./src/plugin/spectrogram/fft.js"));
255
255
 
@@ -259,7 +259,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons
259
259
 
260
260
  function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }
261
261
 
262
- function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }
262
+ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
263
263
 
264
264
  /**
265
265
  * @typedef {Object} SpectrogramPluginParams
@@ -267,6 +267,8 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
267
267
  * which to render
268
268
  * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be
269
269
  * a power of 2.
270
+ * @property {boolean} splitChannels=false Render with separate spectrograms for
271
+ * the channels of the audio
270
272
  * @property {boolean} labels Set to true to display frequency labels.
271
273
  * @property {number} noverlap Size of the overlapping window. Must be <
272
274
  * fftSamples. Auto deduced from canvas size by default.
@@ -372,6 +374,8 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
372
374
  _this.noverlap = params.noverlap;
373
375
  _this.windowFunc = params.windowFunc;
374
376
  _this.alpha = params.alpha;
377
+ _this.splitChannels = params.splitChannels;
378
+ _this.channels = _this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;
375
379
 
376
380
  _this.createWrapper();
377
381
 
@@ -430,7 +434,7 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
430
434
  left: 0,
431
435
  position: 'absolute',
432
436
  zIndex: 9,
433
- height: "".concat(this.height / this.pixelRatio, "px"),
437
+ height: "".concat(this.height * this.channels / this.pixelRatio, "px"),
434
438
  width: "".concat(55 / this.pixelRatio, "px")
435
439
  });
436
440
  this.wrapper.appendChild(labelsEl);
@@ -442,7 +446,7 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
442
446
  position: 'relative',
443
447
  userSelect: 'none',
444
448
  webkitUserSelect: 'none',
445
- height: "".concat(this.height / this.pixelRatio, "px")
449
+ height: "".concat(this.height * this.channels / this.pixelRatio, "px")
446
450
  });
447
451
 
448
452
  if (wsParams.fillParent || wsParams.scrollParent) {
@@ -489,48 +493,44 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
489
493
  value: function updateCanvasStyle() {
490
494
  var width = Math.round(this.width / this.pixelRatio) + 'px';
491
495
  this.canvas.width = this.width;
492
- this.canvas.height = this.height;
496
+ this.canvas.height = this.height * this.channels;
493
497
  this.canvas.style.width = width;
494
498
  }
495
499
  }, {
496
500
  key: "drawSpectrogram",
497
501
  value: function drawSpectrogram(frequenciesData, my) {
502
+ if (!isNaN(frequenciesData[0][0])) {
503
+ // data is 1ch [sample, freq] format
504
+ // to [channel, sample, freq] format
505
+ frequenciesData = [frequenciesData];
506
+ }
507
+
498
508
  var spectrCc = my.spectrCc;
499
509
  var height = my.height;
500
510
  var width = my.width;
501
- var pixels = my.resample(frequenciesData);
502
- var heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;
503
511
 
504
- if (spectrCc) {
512
+ if (!spectrCc) {
513
+ return;
514
+ }
515
+
516
+ for (var c = 0; c < frequenciesData.length; c++) {
517
+ // for each channel
518
+ var pixels = my.resample(frequenciesData[c]);
505
519
  var imageData = spectrCc.createImageData(width, height);
506
- var i;
507
- var j;
508
- var k;
509
520
 
510
- for (i = 0; i < pixels.length; i++) {
511
- for (j = 0; j < pixels[i].length; j++) {
521
+ for (var i = 0; i < pixels.length; i++) {
522
+ for (var j = 0; j < pixels[i].length; j++) {
512
523
  var colorMap = my.colorMap[pixels[i][j]];
513
- /* eslint-disable max-depth */
514
-
515
- for (k = 0; k < heightFactor; k++) {
516
- var y = height - j * heightFactor;
517
-
518
- if (heightFactor === 2 && k === 1) {
519
- y--;
520
- }
521
-
522
- var redIndex = y * (width * 4) + i * 4;
523
- imageData.data[redIndex] = colorMap[0] * 255;
524
- imageData.data[redIndex + 1] = colorMap[1] * 255;
525
- imageData.data[redIndex + 2] = colorMap[2] * 255;
526
- imageData.data[redIndex + 3] = colorMap[3] * 255;
527
- }
528
- /* eslint-enable max-depth */
529
-
524
+ var redIndex = ((height - j) * width + i) * 4;
525
+ imageData.data[redIndex] = colorMap[0] * 255;
526
+ imageData.data[redIndex + 1] = colorMap[1] * 255;
527
+ imageData.data[redIndex + 2] = colorMap[2] * 255;
528
+ imageData.data[redIndex + 3] = colorMap[3] * 255;
530
529
  }
531
- }
530
+ } // stack spectrograms
531
+
532
532
 
533
- spectrCc.putImageData(imageData, 0, 0);
533
+ spectrCc.putImageData(imageData, 0, height * c);
534
534
  }
535
535
  }
536
536
  }, {
@@ -538,16 +538,16 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
538
538
  value: function getFrequencies(callback) {
539
539
  var fftSamples = this.fftSamples;
540
540
  var buffer = this.buffer = this.wavesurfer.backend.buffer;
541
- var channelOne = buffer.getChannelData(0);
542
- var bufferLength = buffer.length;
543
- var sampleRate = buffer.sampleRate;
544
- var frequencies = [];
541
+ var channels = this.channels;
545
542
 
546
543
  if (!buffer) {
547
544
  this.fireEvent('error', 'Web Audio buffer is not available');
548
545
  return;
549
- }
546
+ } // This may differ from file samplerate. Browser resamples audio.
550
547
 
548
+
549
+ var sampleRate = buffer.sampleRate;
550
+ var frequencies = [];
551
551
  var noverlap = this.noverlap;
552
552
 
553
553
  if (!noverlap) {
@@ -556,21 +556,29 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
556
556
  }
557
557
 
558
558
  var fft = new _fft.default(fftSamples, sampleRate, this.windowFunc, this.alpha);
559
- var maxSlicesCount = Math.floor(bufferLength / (fftSamples - noverlap));
560
- var currentOffset = 0;
561
559
 
562
- while (currentOffset + fftSamples < channelOne.length) {
563
- var segment = channelOne.slice(currentOffset, currentOffset + fftSamples);
564
- var spectrum = fft.calculateSpectrum(segment);
565
- var array = new Uint8Array(fftSamples / 2);
566
- var j = void 0;
560
+ for (var c = 0; c < channels; c++) {
561
+ // for each channel
562
+ var channelData = buffer.getChannelData(c);
563
+ var channelFreq = [];
564
+ var currentOffset = 0;
565
+
566
+ while (currentOffset + fftSamples < channelData.length) {
567
+ var segment = channelData.slice(currentOffset, currentOffset + fftSamples);
568
+ var spectrum = fft.calculateSpectrum(segment);
569
+ var array = new Uint8Array(fftSamples / 2);
570
+ var j = void 0;
567
571
 
568
- for (j = 0; j < fftSamples / 2; j++) {
569
- array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);
572
+ for (j = 0; j < fftSamples / 2; j++) {
573
+ array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);
574
+ }
575
+
576
+ channelFreq.push(array); // channelFreq: [sample, freq]
577
+
578
+ currentOffset += fftSamples - noverlap;
570
579
  }
571
580
 
572
- frequencies.push(array);
573
- currentOffset += fftSamples - noverlap;
581
+ frequencies.push(channelFreq); // frequencies: [channel, sample, freq]
574
582
  }
575
583
 
576
584
  callback(frequencies, this);
@@ -620,15 +628,20 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
620
628
  var step = (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) / labelIndex; // prepare canvas element for labels
621
629
 
622
630
  var ctx = this.labelsEl.getContext('2d');
623
- this.labelsEl.height = this.height;
631
+ this.labelsEl.height = this.height * this.channels;
624
632
  this.labelsEl.width = bgWidth;
625
633
 
626
- if (ctx) {
634
+ if (!ctx) {
635
+ return;
636
+ }
637
+
638
+ for (var c = 0; c < this.channels; c++) {
639
+ // for each channel
627
640
  // fill background
628
641
  ctx.fillStyle = bgFill;
629
- ctx.fillRect(0, 0, bgWidth, getMaxY);
642
+ ctx.fillRect(0, c * getMaxY, bgWidth, (1 + c) * getMaxY);
630
643
  ctx.fill();
631
- var i; // render labels
644
+ var i = void 0; // render labels
632
645
 
633
646
  for (i = 0; i <= labelIndex; i++) {
634
647
  ctx.textAlign = textAlign;
@@ -642,7 +655,7 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
642
655
  var y = void 0;
643
656
 
644
657
  if (i == 0) {
645
- y = getMaxY + i - 10; // unit label
658
+ y = (1 + c) * getMaxY + i - 10; // unit label
646
659
 
647
660
  ctx.fillStyle = textColorUnit;
648
661
  ctx.font = fontSizeUnit + ' ' + fontType;
@@ -652,7 +665,7 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
652
665
  ctx.font = fontSizeFreq + ' ' + fontType;
653
666
  ctx.fillText(label, x, y);
654
667
  } else {
655
- y = getMaxY - i * 50 + yLabelOffset; // unit label
668
+ y = (1 + c) * getMaxY - i * 50 + yLabelOffset; // unit label
656
669
 
657
670
  ctx.fillStyle = textColorUnit;
658
671
  ctx.font = fontSizeUnit + ' ' + fontType;
@@ -747,7 +760,7 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
747
760
  return SpectrogramPlugin;
748
761
  }();
749
762
 
750
- exports.default = SpectrogramPlugin;
763
+ exports["default"] = SpectrogramPlugin;
751
764
  module.exports = exports.default;
752
765
 
753
766
  /***/ })
@@ -1 +1 @@
1
- {"version":3,"file":"wavesurfer.spectrogram.js","mappings":"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","sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/index.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/before-startup","webpack://WaveSurfer.[name]/webpack/startup","webpack://WaveSurfer.[name]/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"spectrogram\"] = factory();\n})(self, function() {\nreturn ","/* eslint-disable complexity, no-redeclare, no-var, one-var */\n\n/**\n * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js\n *\n * @param {Number} bufferSize Buffer size\n * @param {Number} sampleRate Sample rate\n * @param {Function} windowFunc Window function\n * @param {Number} alpha Alpha channel\n */\nexport default function FFT(bufferSize, sampleRate, windowFunc, alpha) {\n this.bufferSize = bufferSize;\n this.sampleRate = sampleRate;\n this.bandwidth = (2 / bufferSize) * (sampleRate / 2);\n\n this.sinTable = new Float32Array(bufferSize);\n this.cosTable = new Float32Array(bufferSize);\n this.windowValues = new Float32Array(bufferSize);\n this.reverseTable = new Uint32Array(bufferSize);\n\n this.peakBand = 0;\n this.peak = 0;\n\n var i;\n switch (windowFunc) {\n case 'bartlett':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / (bufferSize - 1)) *\n ((bufferSize - 1) / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n case 'bartlettHann':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.62 -\n 0.48 * Math.abs(i / (bufferSize - 1) - 0.5) -\n 0.38 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'blackman':\n alpha = alpha || 0.16;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (1 - alpha) / 2 -\n 0.5 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1)) +\n (alpha / 2) *\n Math.cos((4 * Math.PI * i) / (bufferSize - 1));\n }\n break;\n case 'cosine':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.cos(\n (Math.PI * i) / (bufferSize - 1) - Math.PI / 2\n );\n }\n break;\n case 'gauss':\n alpha = alpha || 0.25;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.pow(\n Math.E,\n -0.5 *\n Math.pow(\n (i - (bufferSize - 1) / 2) /\n ((alpha * (bufferSize - 1)) / 2),\n 2\n )\n );\n }\n break;\n case 'hamming':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.54 -\n 0.46 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'hann':\n case undefined:\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.5 * (1 - Math.cos((Math.PI * 2 * i) / (bufferSize - 1)));\n }\n break;\n case 'lanczoz':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n Math.sin(Math.PI * ((2 * i) / (bufferSize - 1) - 1)) /\n (Math.PI * ((2 * i) / (bufferSize - 1) - 1));\n }\n break;\n case 'rectangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = 1;\n }\n break;\n case 'triangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / bufferSize) *\n (bufferSize / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n default:\n throw Error(\"No such window function '\" + windowFunc + \"'\");\n }\n\n var limit = 1;\n var bit = bufferSize >> 1;\n var i;\n\n while (limit < bufferSize) {\n for (i = 0; i < limit; i++) {\n this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n }\n\n limit = limit << 1;\n bit = bit >> 1;\n }\n\n for (i = 0; i < bufferSize; i++) {\n this.sinTable[i] = Math.sin(-Math.PI / i);\n this.cosTable[i] = Math.cos(-Math.PI / i);\n }\n\n this.calculateSpectrum = function(buffer) {\n // Locally scope variables for speed up\n var bufferSize = this.bufferSize,\n cosTable = this.cosTable,\n sinTable = this.sinTable,\n reverseTable = this.reverseTable,\n real = new Float32Array(bufferSize),\n imag = new Float32Array(bufferSize),\n bSi = 2 / this.bufferSize,\n sqrt = Math.sqrt,\n rval,\n ival,\n mag,\n spectrum = new Float32Array(bufferSize / 2);\n\n var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n if (Math.pow(2, k) !== bufferSize) {\n throw 'Invalid buffer size, must be a power of 2.';\n }\n if (bufferSize !== buffer.length) {\n throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' +\n bufferSize +\n ' Buffer Size: ' +\n buffer.length;\n }\n\n var halfSize = 1,\n phaseShiftStepReal,\n phaseShiftStepImag,\n currentPhaseShiftReal,\n currentPhaseShiftImag,\n off,\n tr,\n ti,\n tmpReal;\n\n for (var i = 0; i < bufferSize; i++) {\n real[i] =\n buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];\n imag[i] = 0;\n }\n\n while (halfSize < bufferSize) {\n phaseShiftStepReal = cosTable[halfSize];\n phaseShiftStepImag = sinTable[halfSize];\n\n currentPhaseShiftReal = 1;\n currentPhaseShiftImag = 0;\n\n for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n var i = fftStep;\n\n while (i < bufferSize) {\n off = i + halfSize;\n tr =\n currentPhaseShiftReal * real[off] -\n currentPhaseShiftImag * imag[off];\n ti =\n currentPhaseShiftReal * imag[off] +\n currentPhaseShiftImag * real[off];\n\n real[off] = real[i] - tr;\n imag[off] = imag[i] - ti;\n real[i] += tr;\n imag[i] += ti;\n\n i += halfSize << 1;\n }\n\n tmpReal = currentPhaseShiftReal;\n currentPhaseShiftReal =\n tmpReal * phaseShiftStepReal -\n currentPhaseShiftImag * phaseShiftStepImag;\n currentPhaseShiftImag =\n tmpReal * phaseShiftStepImag +\n currentPhaseShiftImag * phaseShiftStepReal;\n }\n\n halfSize = halfSize << 1;\n }\n\n for (var i = 0, N = bufferSize / 2; i < N; i++) {\n rval = real[i];\n ival = imag[i];\n mag = bSi * sqrt(rval * rval + ival * ival);\n\n if (mag > this.peak) {\n this.peakBand = i;\n this.peak = mag;\n }\n spectrum[i] = mag;\n }\n return spectrum;\n };\n}\n","/* eslint-enable complexity, no-redeclare, no-var, one-var */\n\nimport FFT from './fft';\n\n/**\n * @typedef {Object} SpectrogramPluginParams\n * @property {string|HTMLElement} container Selector of element or element in\n * which to render\n * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be\n * a power of 2.\n * @property {boolean} labels Set to true to display frequency labels.\n * @property {number} noverlap Size of the overlapping window. Must be <\n * fftSamples. Auto deduced from canvas size by default.\n * @property {string} windowFunc='hann' The window function to be used. One of\n * these: `'bartlett'`, `'bartlettHann'`, `'blackman'`, `'cosine'`, `'gauss'`,\n * `'hamming'`, `'hann'`, `'lanczoz'`, `'rectangular'`, `'triangular'`\n * @property {?number} alpha Some window functions have this extra value.\n * (Between 0 and 1)\n * @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the\n * size of the spectrogram in relation with its canvas. 1 = Draw on the whole\n * canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('spectrogram')`\n * @property {?number[][]} colorMap A 256 long array of 4-element arrays.\n * Each entry should contain a float between 0 and 1 and specify\n * r, g, b, and alpha.\n */\n\n/**\n * Render a spectrogram visualisation of the audio.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import SpectrogramPlugin from 'wavesurfer.spectrogram.js';\n *\n * // commonjs\n * var SpectrogramPlugin = require('wavesurfer.spectrogram.js');\n *\n * // if you are using <script> tags\n * var SpectrogramPlugin = window.WaveSurfer.spectrogram;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * SpectrogramPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class SpectrogramPlugin {\n /**\n * Spectrogram plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {SpectrogramPluginParams} params Parameters used to initialise the plugin\n * @return {PluginDefinition} An object representing the plugin.\n */\n static create(params) {\n return {\n name: 'spectrogram',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n FFT: FFT\n },\n instance: SpectrogramPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = ws.util;\n\n this.frequenciesDataUrl = params.frequenciesDataUrl;\n this._onScroll = e => {\n this.updateScroll(e);\n };\n this._onRender = () => {\n this.render();\n };\n this._onWrapperClick = e => {\n this._wrapperClickHandler(e);\n };\n this._onReady = () => {\n const drawer = (this.drawer = ws.drawer);\n\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(params.container)\n : params.container;\n\n if (!this.container) {\n throw Error('No container for WaveSurfer spectrogram');\n }\n if (params.colorMap) {\n if (params.colorMap.length < 256) {\n throw new Error('Colormap must contain 256 elements');\n }\n for (let i = 0; i < params.colorMap.length; i++) {\n const cmEntry = params.colorMap[i];\n if (cmEntry.length !== 4) {\n throw new Error(\n 'ColorMap entries must contain 4 values'\n );\n }\n }\n this.colorMap = params.colorMap;\n } else {\n this.colorMap = [];\n for (let i = 0; i < 256; i++) {\n const val = (255 - i) / 256;\n this.colorMap.push([val, val, val, 1]);\n }\n }\n this.width = drawer.width;\n this.pixelRatio = this.params.pixelRatio || ws.params.pixelRatio;\n this.fftSamples =\n this.params.fftSamples || ws.params.fftSamples || 512;\n this.height = this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n\n this.createWrapper();\n this.createCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('redraw', this._onRender);\n };\n }\n\n init() {\n // Check if wavesurfer is ready\n if (this.wavesurfer.isReady) {\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n }\n }\n\n destroy() {\n this.unAll();\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('redraw', this._onRender);\n this.drawer && this.drawer.wrapper.removeEventListener('scroll', this._onScroll);\n this.wavesurfer = null;\n this.util = null;\n this.params = null;\n if (this.wrapper) {\n this.wrapper.removeEventListener('click', this._onWrapperClick);\n this.wrapper.parentNode.removeChild(this.wrapper);\n this.wrapper = null;\n }\n }\n\n createWrapper() {\n const prevSpectrogram = this.container.querySelector('spectrogram');\n if (prevSpectrogram) {\n this.container.removeChild(prevSpectrogram);\n }\n const wsParams = this.wavesurfer.params;\n this.wrapper = document.createElement('spectrogram');\n // if labels are active\n if (this.params.labels) {\n const labelsEl = (this.labelsEl = document.createElement('canvas'));\n labelsEl.classList.add('spec-labels');\n this.drawer.style(labelsEl, {\n left: 0,\n position: 'absolute',\n zIndex: 9,\n height: `${this.height / this.pixelRatio}px`,\n width: `${55 / this.pixelRatio}px`\n });\n this.wrapper.appendChild(labelsEl);\n this.loadLabels(\n 'rgba(68,68,68,0.5)',\n '12px',\n '10px',\n '',\n '#fff',\n '#f7f7f7',\n 'center',\n '#specLabels'\n );\n }\n\n this.drawer.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: `${this.height / this.pixelRatio}px`\n });\n\n if (wsParams.fillParent || wsParams.scrollParent) {\n this.drawer.style(this.wrapper, {\n width: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden'\n });\n }\n this.container.appendChild(this.wrapper);\n\n this.wrapper.addEventListener('click', this._onWrapperClick);\n }\n\n _wrapperClickHandler(event) {\n event.preventDefault();\n const relX = 'offsetX' in event ? event.offsetX : event.layerX;\n this.fireEvent('click', relX / this.width || 0);\n }\n\n createCanvas() {\n const canvas = (this.canvas = this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.spectrCc = canvas.getContext('2d');\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n }\n\n render() {\n this.updateCanvasStyle();\n\n if (this.frequenciesDataUrl) {\n this.loadFrequenciesData(this.frequenciesDataUrl);\n } else {\n this.getFrequencies(this.drawSpectrogram);\n }\n }\n\n updateCanvasStyle() {\n const width = Math.round(this.width / this.pixelRatio) + 'px';\n this.canvas.width = this.width;\n this.canvas.height = this.height;\n this.canvas.style.width = width;\n }\n\n drawSpectrogram(frequenciesData, my) {\n const spectrCc = my.spectrCc;\n const height = my.height;\n const width = my.width;\n const pixels = my.resample(frequenciesData);\n const heightFactor = my.buffer ? 2 / my.buffer.numberOfChannels : 1;\n if (spectrCc) {\n const imageData = spectrCc.createImageData(width, height);\n let i;\n let j;\n let k;\n\n for (i = 0; i < pixels.length; i++) {\n for (j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n /* eslint-disable max-depth */\n for (k = 0; k < heightFactor; k++) {\n let y = height - j * heightFactor;\n if (heightFactor === 2 && k === 1) {\n y--;\n }\n const redIndex = y * (width * 4) + i * 4;\n imageData.data[redIndex] = colorMap[0] * 255;\n imageData.data[redIndex + 1] = colorMap[1] * 255;\n imageData.data[redIndex + 2] = colorMap[2] * 255;\n imageData.data[redIndex + 3] = colorMap[3] * 255;\n }\n /* eslint-enable max-depth */\n }\n }\n spectrCc.putImageData(imageData, 0, 0);\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channelOne = buffer.getChannelData(0);\n const bufferLength = buffer.length;\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n let noverlap = this.noverlap;\n if (!noverlap) {\n const uniqueSamplesPerPx = buffer.length / this.canvas.width;\n noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));\n }\n\n const fft = new FFT(\n fftSamples,\n sampleRate,\n this.windowFunc,\n this.alpha\n );\n const maxSlicesCount = Math.floor(\n bufferLength / (fftSamples - noverlap)\n );\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelOne.length) {\n const segment = channelOne.slice(\n currentOffset,\n currentOffset + fftSamples\n );\n const spectrum = fft.calculateSpectrum(segment);\n const array = new Uint8Array(fftSamples / 2);\n let j;\n for (j = 0; j < fftSamples / 2; j++) {\n array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);\n }\n frequencies.push(array);\n currentOffset += fftSamples - noverlap;\n }\n callback(frequencies, this);\n }\n\n loadFrequenciesData(url) {\n const request = this.util.fetchFile({ url: url });\n\n request.on('success', data =>\n this.drawSpectrogram(JSON.parse(data), this)\n );\n request.on('error', e => this.fireEvent('error', e));\n\n return request;\n }\n\n freqType(freq) {\n return freq >= 1000 ? (freq / 1000).toFixed(1) : Math.round(freq);\n }\n\n unitType(freq) {\n return freq >= 1000 ? 'KHz' : 'Hz';\n }\n\n loadLabels(\n bgFill,\n fontSizeFreq,\n fontSizeUnit,\n fontType,\n textColorFreq,\n textColorUnit,\n textAlign,\n container\n ) {\n const frequenciesHeight = this.height;\n bgFill = bgFill || 'rgba(68,68,68,0)';\n fontSizeFreq = fontSizeFreq || '12px';\n fontSizeUnit = fontSizeUnit || '10px';\n fontType = fontType || 'Helvetica';\n textColorFreq = textColorFreq || '#fff';\n textColorUnit = textColorUnit || '#fff';\n textAlign = textAlign || 'center';\n container = container || '#specLabels';\n const bgWidth = 55;\n const getMaxY = frequenciesHeight || 512;\n const labelIndex = 5 * (getMaxY / 256);\n const freqStart = 0;\n const step =\n (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) /\n labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n this.labelsEl.height = this.height;\n this.labelsEl.width = bgWidth;\n\n if (ctx) {\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, 0, bgWidth, getMaxY);\n ctx.fill();\n let i;\n\n // render labels\n for (i = 0; i <= labelIndex; i++) {\n ctx.textAlign = textAlign;\n ctx.textBaseline = 'middle';\n\n const freq = freqStart + step * i;\n const index = Math.round(\n (freq / (this.sampleRate / 2)) * this.fftSamples\n );\n const label = this.freqType(freq);\n const units = this.unitType(freq);\n const yLabelOffset = 2;\n const x = 16;\n let y;\n\n if (i == 0) {\n y = getMaxY + i - 10;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n } else {\n y = getMaxY - i * 50 + yLabelOffset;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n }\n }\n }\n }\n\n updateScroll(e) {\n if (this.wrapper) {\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = this.width;\n const newMatrix = [];\n\n const oldPiece = 1 / oldMatrix.length;\n const newPiece = 1 / columnsNumber;\n let i;\n\n for (i = 0; i < columnsNumber; i++) {\n const column = new Array(oldMatrix[0].length);\n let j;\n\n for (j = 0; j < oldMatrix.length; j++) {\n const oldStart = j * oldPiece;\n const oldEnd = oldStart + oldPiece;\n const newStart = i * newPiece;\n const newEnd = newStart + newPiece;\n\n const overlap =\n oldEnd <= newStart || newEnd <= oldStart\n ? 0\n : Math.min(\n Math.max(oldEnd, newStart),\n Math.max(newEnd, oldStart)\n ) -\n Math.max(\n Math.min(oldEnd, newStart),\n Math.min(newEnd, oldStart)\n );\n let k;\n /* eslint-disable max-depth */\n if (overlap > 0) {\n for (k = 0; k < oldMatrix[0].length; k++) {\n if (column[k] == null) {\n column[k] = 0;\n }\n column[k] += (overlap / newPiece) * oldMatrix[j][k];\n }\n }\n /* eslint-enable max-depth */\n }\n\n const intColumn = new Uint8Array(oldMatrix[0].length);\n let m;\n\n for (m = 0; m < oldMatrix[0].length; m++) {\n intColumn[m] = column[m];\n }\n\n newMatrix.push(intColumn);\n }\n\n return newMatrix;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/spectrogram/index.js\");\n",""],"names":["FFT","bufferSize","sampleRate","windowFunc","alpha","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","real","imag","bSi","sqrt","rval","ival","mag","spectrum","k","floor","log","LN2","length","halfSize","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","fftStep","N","SpectrogramPlugin","params","ws","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","cmEntry","val","push","width","pixelRatio","fftSamples","height","noverlap","createWrapper","createCanvas","wrapper","addEventListener","on","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","left","position","zIndex","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","spectrCc","getContext","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","round","frequenciesData","my","pixels","resample","heightFactor","numberOfChannels","imageData","createImageData","j","y","redIndex","data","putImageData","callback","backend","channelOne","getChannelData","bufferLength","frequencies","uniqueSamplesPerPx","max","fft","maxSlicesCount","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","frequenciesHeight","bgWidth","getMaxY","labelIndex","freqStart","step","ac","ctx","fillStyle","fillRect","fill","textBaseline","index","label","freqType","units","unitType","yLabelOffset","x","font","fillText","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","name","deferInit","staticProps","instance"],"sourceRoot":""}
1
+ {"version":3,"file":"wavesurfer.spectrogram.js","mappings":";;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,+CAA+C;AAC/C,CAAC;AACD;;;;;;;;;;;;;;;;;ACVA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACe,SAASA,GAAT,CAAaC,UAAb,EAAyBC,UAAzB,EAAqCC,UAArC,EAAiDC,KAAjD,EAAwD;AACnE,OAAKH,UAAL,GAAkBA,UAAlB;AACA,OAAKC,UAAL,GAAkBA,UAAlB;AACA,OAAKG,SAAL,GAAkB,IAAIJ,UAAL,IAAoBC,UAAU,GAAG,CAAjC,CAAjB;AAEA,OAAKI,QAAL,GAAgB,IAAIC,YAAJ,CAAiBN,UAAjB,CAAhB;AACA,OAAKO,QAAL,GAAgB,IAAID,YAAJ,CAAiBN,UAAjB,CAAhB;AACA,OAAKQ,YAAL,GAAoB,IAAIF,YAAJ,CAAiBN,UAAjB,CAApB;AACA,OAAKS,YAAL,GAAoB,IAAIC,WAAJ,CAAgBV,UAAhB,CAApB;AAEA,OAAKW,QAAL,GAAgB,CAAhB;AACA,OAAKC,IAAL,GAAY,CAAZ;AAEA,MAAIC,CAAJ;;AACA,UAAQX,UAAR;AACI,SAAK,UAAL;AACI,WAAKW,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACK,KAAKb,UAAU,GAAG,CAAlB,CAAD,IACC,CAACA,UAAU,GAAG,CAAd,IAAmB,CAAnB,GAAuBc,IAAI,CAACC,GAAL,CAASF,CAAC,GAAG,CAACb,UAAU,GAAG,CAAd,IAAmB,CAAhC,CADxB,CADJ;AAGH;;AACD;;AACJ,SAAK,cAAL;AACI,WAAKa,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACI,OACA,OAAOC,IAAI,CAACC,GAAL,CAASF,CAAC,IAAIb,UAAU,GAAG,CAAjB,CAAD,GAAuB,GAAhC,CADP,GAEA,OAAOc,IAAI,CAACE,GAAL,CAAUF,IAAI,CAACG,EAAL,GAAU,CAAV,GAAcJ,CAAf,IAAqBb,UAAU,GAAG,CAAlC,CAAT,CAHX;AAIH;;AACD;;AACJ,SAAK,UAAL;AACIG,MAAAA,KAAK,GAAGA,KAAK,IAAI,IAAjB;;AACA,WAAKU,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACI,CAAC,IAAIV,KAAL,IAAc,CAAd,GACA,MAAMW,IAAI,CAACE,GAAL,CAAUF,IAAI,CAACG,EAAL,GAAU,CAAV,GAAcJ,CAAf,IAAqBb,UAAU,GAAG,CAAlC,CAAT,CADN,GAECG,KAAK,GAAG,CAAT,GACIW,IAAI,CAACE,GAAL,CAAU,IAAIF,IAAI,CAACG,EAAT,GAAcJ,CAAf,IAAqBb,UAAU,GAAG,CAAlC,CAAT,CAJR;AAKH;;AACD;;AACJ,SAAK,QAAL;AACI,WAAKa,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IAAuBC,IAAI,CAACE,GAAL,CAClBF,IAAI,CAACG,EAAL,GAAUJ,CAAX,IAAiBb,UAAU,GAAG,CAA9B,IAAmCc,IAAI,CAACG,EAAL,GAAU,CAD1B,CAAvB;AAGH;;AACD;;AACJ,SAAK,OAAL;AACId,MAAAA,KAAK,GAAGA,KAAK,IAAI,IAAjB;;AACA,WAAKU,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IAAuBC,IAAI,CAACI,GAAL,CACnBJ,IAAI,CAACK,CADc,EAEnB,CAAC,GAAD,GACIL,IAAI,CAACI,GAAL,CACI,CAACL,CAAC,GAAG,CAACb,UAAU,GAAG,CAAd,IAAmB,CAAxB,KACMG,KAAK,IAAIH,UAAU,GAAG,CAAjB,CAAN,GAA6B,CADlC,CADJ,EAGI,CAHJ,CAHe,CAAvB;AASH;;AACD;;AACJ,SAAK,SAAL;AACI,WAAKa,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACI,OACA,OAAOC,IAAI,CAACE,GAAL,CAAUF,IAAI,CAACG,EAAL,GAAU,CAAV,GAAcJ,CAAf,IAAqBb,UAAU,GAAG,CAAlC,CAAT,CAFX;AAGH;;AACD;;AACJ,SAAK,MAAL;AACA,SAAKoB,SAAL;AACI,WAAKP,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACI,OAAO,IAAIC,IAAI,CAACE,GAAL,CAAUF,IAAI,CAACG,EAAL,GAAU,CAAV,GAAcJ,CAAf,IAAqBb,UAAU,GAAG,CAAlC,CAAT,CAAX,CADJ;AAEH;;AACD;;AACJ,SAAK,SAAL;AACI,WAAKa,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACIC,IAAI,CAACO,GAAL,CAASP,IAAI,CAACG,EAAL,IAAY,IAAIJ,CAAL,IAAWb,UAAU,GAAG,CAAxB,IAA6B,CAAxC,CAAT,KACCc,IAAI,CAACG,EAAL,IAAY,IAAIJ,CAAL,IAAWb,UAAU,GAAG,CAAxB,IAA6B,CAAxC,CADD,CADJ;AAGH;;AACD;;AACJ,SAAK,aAAL;AACI,WAAKa,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IAAuB,CAAvB;AACH;;AACD;;AACJ,SAAK,YAAL;AACI,WAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,aAAKL,YAAL,CAAkBK,CAAlB,IACK,IAAIb,UAAL,IACCA,UAAU,GAAG,CAAb,GAAiBc,IAAI,CAACC,GAAL,CAASF,CAAC,GAAG,CAACb,UAAU,GAAG,CAAd,IAAmB,CAAhC,CADlB,CADJ;AAGH;;AACD;;AACJ;AACI,YAAMsB,KAAK,CAAC,8BAA8BpB,UAA9B,GAA2C,GAA5C,CAAX;AAjFR;;AAoFA,MAAIqB,KAAK,GAAG,CAAZ;AACA,MAAIC,GAAG,GAAGxB,UAAU,IAAI,CAAxB;AACA,MAAIa,CAAJ;;AAEA,SAAOU,KAAK,GAAGvB,UAAf,EAA2B;AACvB,SAAKa,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGU,KAAhB,EAAuBV,CAAC,EAAxB,EAA4B;AACxB,WAAKJ,YAAL,CAAkBI,CAAC,GAAGU,KAAtB,IAA+B,KAAKd,YAAL,CAAkBI,CAAlB,IAAuBW,GAAtD;AACH;;AAEDD,IAAAA,KAAK,GAAGA,KAAK,IAAI,CAAjB;AACAC,IAAAA,GAAG,GAAGA,GAAG,IAAI,CAAb;AACH;;AAED,OAAKX,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGb,UAAhB,EAA4Ba,CAAC,EAA7B,EAAiC;AAC7B,SAAKR,QAAL,CAAcQ,CAAd,IAAmBC,IAAI,CAACO,GAAL,CAAS,CAACP,IAAI,CAACG,EAAN,GAAWJ,CAApB,CAAnB;AACA,SAAKN,QAAL,CAAcM,CAAd,IAAmBC,IAAI,CAACE,GAAL,CAAS,CAACF,IAAI,CAACG,EAAN,GAAWJ,CAApB,CAAnB;AACH;;AAED,OAAKY,iBAAL,GAAyB,UAASC,MAAT,EAAiB;AACtC;AACA,QAAI1B,UAAU,GAAG,KAAKA,UAAtB;AAAA,QACIO,QAAQ,GAAG,KAAKA,QADpB;AAAA,QAEIF,QAAQ,GAAG,KAAKA,QAFpB;AAAA,QAGII,YAAY,GAAG,KAAKA,YAHxB;AAAA,QAIIkB,IAAI,GAAG,IAAIrB,YAAJ,CAAiBN,UAAjB,CAJX;AAAA,QAKI4B,IAAI,GAAG,IAAItB,YAAJ,CAAiBN,UAAjB,CALX;AAAA,QAMI6B,GAAG,GAAG,IAAI,KAAK7B,UANnB;AAAA,QAOI8B,IAAI,GAAGhB,IAAI,CAACgB,IAPhB;AAAA,QAQIC,IARJ;AAAA,QASIC,IATJ;AAAA,QAUIC,GAVJ;AAAA,QAWIC,QAAQ,GAAG,IAAI5B,YAAJ,CAAiBN,UAAU,GAAG,CAA9B,CAXf;AAaA,QAAImC,CAAC,GAAGrB,IAAI,CAACsB,KAAL,CAAWtB,IAAI,CAACuB,GAAL,CAASrC,UAAT,IAAuBc,IAAI,CAACwB,GAAvC,CAAR;;AAEA,QAAIxB,IAAI,CAACI,GAAL,CAAS,CAAT,EAAYiB,CAAZ,MAAmBnC,UAAvB,EAAmC;AAC/B,YAAM,4CAAN;AACH;;AACD,QAAIA,UAAU,KAAK0B,MAAM,CAACa,MAA1B,EAAkC;AAC9B,YAAM,oEACFvC,UADE,GAEF,gBAFE,GAGF0B,MAAM,CAACa,MAHX;AAIH;;AAED,QAAIC,QAAQ,GAAG,CAAf;AAAA,QACIC,kBADJ;AAAA,QAEIC,kBAFJ;AAAA,QAGIC,qBAHJ;AAAA,QAIIC,qBAJJ;AAAA,QAKIC,GALJ;AAAA,QAMIC,EANJ;AAAA,QAOIC,EAPJ;AAAA,QAQIC,OARJ;;AAUA,SAAK,IAAInC,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGb,UAApB,EAAgCa,CAAC,EAAjC,EAAqC;AACjCc,MAAAA,IAAI,CAACd,CAAD,CAAJ,GACIa,MAAM,CAACjB,YAAY,CAACI,CAAD,CAAb,CAAN,GAA0B,KAAKL,YAAL,CAAkBC,YAAY,CAACI,CAAD,CAA9B,CAD9B;AAEAe,MAAAA,IAAI,CAACf,CAAD,CAAJ,GAAU,CAAV;AACH;;AAED,WAAO2B,QAAQ,GAAGxC,UAAlB,EAA8B;AAC1ByC,MAAAA,kBAAkB,GAAGlC,QAAQ,CAACiC,QAAD,CAA7B;AACAE,MAAAA,kBAAkB,GAAGrC,QAAQ,CAACmC,QAAD,CAA7B;AAEAG,MAAAA,qBAAqB,GAAG,CAAxB;AACAC,MAAAA,qBAAqB,GAAG,CAAxB;;AAEA,WAAK,IAAIK,OAAO,GAAG,CAAnB,EAAsBA,OAAO,GAAGT,QAAhC,EAA0CS,OAAO,EAAjD,EAAqD;AACjD,YAAIpC,CAAC,GAAGoC,OAAR;;AAEA,eAAOpC,CAAC,GAAGb,UAAX,EAAuB;AACnB6C,UAAAA,GAAG,GAAGhC,CAAC,GAAG2B,QAAV;AACAM,UAAAA,EAAE,GACEH,qBAAqB,GAAGhB,IAAI,CAACkB,GAAD,CAA5B,GACAD,qBAAqB,GAAGhB,IAAI,CAACiB,GAAD,CAFhC;AAGAE,UAAAA,EAAE,GACEJ,qBAAqB,GAAGf,IAAI,CAACiB,GAAD,CAA5B,GACAD,qBAAqB,GAAGjB,IAAI,CAACkB,GAAD,CAFhC;AAIAlB,UAAAA,IAAI,CAACkB,GAAD,CAAJ,GAAYlB,IAAI,CAACd,CAAD,CAAJ,GAAUiC,EAAtB;AACAlB,UAAAA,IAAI,CAACiB,GAAD,CAAJ,GAAYjB,IAAI,CAACf,CAAD,CAAJ,GAAUkC,EAAtB;AACApB,UAAAA,IAAI,CAACd,CAAD,CAAJ,IAAWiC,EAAX;AACAlB,UAAAA,IAAI,CAACf,CAAD,CAAJ,IAAWkC,EAAX;AAEAlC,UAAAA,CAAC,IAAI2B,QAAQ,IAAI,CAAjB;AACH;;AAEDQ,QAAAA,OAAO,GAAGL,qBAAV;AACAA,QAAAA,qBAAqB,GACjBK,OAAO,GAAGP,kBAAV,GACAG,qBAAqB,GAAGF,kBAF5B;AAGAE,QAAAA,qBAAqB,GACjBI,OAAO,GAAGN,kBAAV,GACAE,qBAAqB,GAAGH,kBAF5B;AAGH;;AAEDD,MAAAA,QAAQ,GAAGA,QAAQ,IAAI,CAAvB;AACH;;AAED,SAAK,IAAI3B,CAAC,GAAG,CAAR,EAAWqC,CAAC,GAAGlD,UAAU,GAAG,CAAjC,EAAoCa,CAAC,GAAGqC,CAAxC,EAA2CrC,CAAC,EAA5C,EAAgD;AAC5CkB,MAAAA,IAAI,GAAGJ,IAAI,CAACd,CAAD,CAAX;AACAmB,MAAAA,IAAI,GAAGJ,IAAI,CAACf,CAAD,CAAX;AACAoB,MAAAA,GAAG,GAAGJ,GAAG,GAAGC,IAAI,CAACC,IAAI,GAAGA,IAAP,GAAcC,IAAI,GAAGA,IAAtB,CAAhB;;AAEA,UAAIC,GAAG,GAAG,KAAKrB,IAAf,EAAqB;AACjB,aAAKD,QAAL,GAAgBE,CAAhB;AACA,aAAKD,IAAL,GAAYqB,GAAZ;AACH;;AACDC,MAAAA,QAAQ,CAACrB,CAAD,CAAR,GAAcoB,GAAd;AACH;;AACD,WAAOC,QAAP;AACH,GA9FD;AA+FH;;;;;;;;;;;;;;;;;;;AC3ND;;;;;;;;;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;IACqBiB;AAsBjB,6BAAYC,MAAZ,EAAoBC,EAApB,EAAwB;AAAA;;AAAA;;AACpB,SAAKD,MAAL,GAAcA,MAAd;AACA,SAAKE,UAAL,GAAkBD,EAAlB;AACA,SAAKE,IAAL,GAAYF,EAAE,CAACE,IAAf;AAEA,SAAKC,kBAAL,GAA0BJ,MAAM,CAACI,kBAAjC;;AACA,SAAKC,SAAL,GAAiB,UAAAC,CAAC,EAAI;AAClB,WAAI,CAACC,YAAL,CAAkBD,CAAlB;AACH,KAFD;;AAGA,SAAKE,SAAL,GAAiB,YAAM;AACnB,WAAI,CAACC,MAAL;AACH,KAFD;;AAGA,SAAKC,eAAL,GAAuB,UAAAJ,CAAC,EAAI;AACxB,WAAI,CAACK,oBAAL,CAA0BL,CAA1B;AACH,KAFD;;AAGA,SAAKM,QAAL,GAAgB,YAAM;AAClB,UAAMC,MAAM,GAAI,KAAI,CAACA,MAAL,GAAcZ,EAAE,CAACY,MAAjC;AAEA,WAAI,CAACC,SAAL,GACI,YAAY,OAAOd,MAAM,CAACc,SAA1B,GACMC,QAAQ,CAACC,aAAT,CAAuBhB,MAAM,CAACc,SAA9B,CADN,GAEMd,MAAM,CAACc,SAHjB;;AAKA,UAAI,CAAC,KAAI,CAACA,SAAV,EAAqB;AACjB,cAAM5C,KAAK,CAAC,yCAAD,CAAX;AACH;;AACD,UAAI8B,MAAM,CAACiB,QAAX,EAAqB;AACjB,YAAIjB,MAAM,CAACiB,QAAP,CAAgB9B,MAAhB,GAAyB,GAA7B,EAAkC;AAC9B,gBAAM,IAAIjB,KAAJ,CAAU,oCAAV,CAAN;AACH;;AACD,aAAK,IAAIT,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGuC,MAAM,CAACiB,QAAP,CAAgB9B,MAApC,EAA4C1B,CAAC,EAA7C,EAAiD;AAC7C,cAAMyD,OAAO,GAAGlB,MAAM,CAACiB,QAAP,CAAgBxD,CAAhB,CAAhB;;AACA,cAAIyD,OAAO,CAAC/B,MAAR,KAAmB,CAAvB,EAA0B;AACtB,kBAAM,IAAIjB,KAAJ,CACF,wCADE,CAAN;AAGH;AACJ;;AACD,aAAI,CAAC+C,QAAL,GAAgBjB,MAAM,CAACiB,QAAvB;AACH,OAbD,MAaO;AACH,aAAI,CAACA,QAAL,GAAgB,EAAhB;;AACA,aAAK,IAAIxD,EAAC,GAAG,CAAb,EAAgBA,EAAC,GAAG,GAApB,EAAyBA,EAAC,EAA1B,EAA8B;AAC1B,cAAM0D,GAAG,GAAG,CAAC,MAAM1D,EAAP,IAAY,GAAxB;;AACA,eAAI,CAACwD,QAAL,CAAcG,IAAd,CAAmB,CAACD,GAAD,EAAMA,GAAN,EAAWA,GAAX,EAAgB,CAAhB,CAAnB;AACH;AACJ;;AACD,WAAI,CAACE,KAAL,GAAaR,MAAM,CAACQ,KAApB;AACA,WAAI,CAACC,UAAL,GAAkB,KAAI,CAACtB,MAAL,CAAYsB,UAAZ,IAA0BrB,EAAE,CAACD,MAAH,CAAUsB,UAAtD;AACA,WAAI,CAACC,UAAL,GACI,KAAI,CAACvB,MAAL,CAAYuB,UAAZ,IAA0BtB,EAAE,CAACD,MAAH,CAAUuB,UAApC,IAAkD,GADtD;AAEA,WAAI,CAACC,MAAL,GAAc,KAAI,CAACD,UAAL,GAAkB,CAAhC;AACA,WAAI,CAACE,QAAL,GAAgBzB,MAAM,CAACyB,QAAvB;AACA,WAAI,CAAC3E,UAAL,GAAkBkD,MAAM,CAAClD,UAAzB;AACA,WAAI,CAACC,KAAL,GAAaiD,MAAM,CAACjD,KAApB;AACA,WAAI,CAAC2E,aAAL,GAAqB1B,MAAM,CAAC0B,aAA5B;AACA,WAAI,CAACC,QAAL,GAAgB,KAAI,CAACD,aAAL,GAAqBzB,EAAE,CAAC2B,OAAH,CAAWtD,MAAX,CAAkBuD,gBAAvC,GAA0D,CAA1E;;AAEA,WAAI,CAACC,aAAL;;AACA,WAAI,CAACC,YAAL;;AACA,WAAI,CAACtB,MAAL;;AAEAI,MAAAA,MAAM,CAACmB,OAAP,CAAeC,gBAAf,CAAgC,QAAhC,EAA0C,KAAI,CAAC5B,SAA/C;AACAJ,MAAAA,EAAE,CAACiC,EAAH,CAAM,QAAN,EAAgB,KAAI,CAAC1B,SAArB;AACH,KAhDD;AAiDH;;;;WAED,gBAAO;AACH;AACA,UAAI,KAAKN,UAAL,CAAgBiC,OAApB,EAA6B;AACzB,aAAKvB,QAAL;AACH,OAFD,MAEO;AACH,aAAKV,UAAL,CAAgBkC,IAAhB,CAAqB,OAArB,EAA8B,KAAKxB,QAAnC;AACH;AACJ;;;WAED,mBAAU;AACN,WAAKyB,KAAL;AACA,WAAKnC,UAAL,CAAgBoC,EAAhB,CAAmB,OAAnB,EAA4B,KAAK1B,QAAjC;AACA,WAAKV,UAAL,CAAgBoC,EAAhB,CAAmB,QAAnB,EAA6B,KAAK9B,SAAlC;AACA,WAAKK,MAAL,IAAe,KAAKA,MAAL,CAAYmB,OAAZ,CAAoBO,mBAApB,CAAwC,QAAxC,EAAkD,KAAKlC,SAAvD,CAAf;AACA,WAAKH,UAAL,GAAkB,IAAlB;AACA,WAAKC,IAAL,GAAY,IAAZ;AACA,WAAKH,MAAL,GAAc,IAAd;;AACA,UAAI,KAAKgC,OAAT,EAAkB;AACd,aAAKA,OAAL,CAAaO,mBAAb,CAAiC,OAAjC,EAA0C,KAAK7B,eAA/C;AACA,aAAKsB,OAAL,CAAaQ,UAAb,CAAwBC,WAAxB,CAAoC,KAAKT,OAAzC;AACA,aAAKA,OAAL,GAAe,IAAf;AACH;AACJ;;;WAED,yBAAgB;AACZ,UAAMU,eAAe,GAAG,KAAK5B,SAAL,CAAeE,aAAf,CAA6B,aAA7B,CAAxB;;AACA,UAAI0B,eAAJ,EAAqB;AACjB,aAAK5B,SAAL,CAAe2B,WAAf,CAA2BC,eAA3B;AACH;;AACD,UAAMC,QAAQ,GAAG,KAAKzC,UAAL,CAAgBF,MAAjC;AACA,WAAKgC,OAAL,GAAejB,QAAQ,CAAC6B,aAAT,CAAuB,aAAvB,CAAf,CANY,CAOZ;;AACA,UAAI,KAAK5C,MAAL,CAAY6C,MAAhB,EAAwB;AACpB,YAAMC,QAAQ,GAAI,KAAKA,QAAL,GAAgB/B,QAAQ,CAAC6B,aAAT,CAAuB,QAAvB,CAAlC;AACAE,QAAAA,QAAQ,CAACC,SAAT,CAAmBC,GAAnB,CAAuB,aAAvB;AACA,aAAKnC,MAAL,CAAYoC,KAAZ,CAAkBH,QAAlB,EAA4B;AACxBI,UAAAA,IAAI,EAAE,CADkB;AAExBC,UAAAA,QAAQ,EAAE,UAFc;AAGxBC,UAAAA,MAAM,EAAE,CAHgB;AAIxB5B,UAAAA,MAAM,YAAK,KAAKA,MAAL,GAAc,KAAKG,QAAnB,GAA8B,KAAKL,UAAxC,OAJkB;AAKxBD,UAAAA,KAAK,YAAK,KAAK,KAAKC,UAAf;AALmB,SAA5B;AAOA,aAAKU,OAAL,CAAaqB,WAAb,CAAyBP,QAAzB;AACA,aAAKQ,UAAL,CACI,oBADJ,EAEI,MAFJ,EAGI,MAHJ,EAII,EAJJ,EAKI,MALJ,EAMI,SANJ,EAOI,QAPJ,EAQI,aARJ;AAUH;;AAED,WAAKzC,MAAL,CAAYoC,KAAZ,CAAkB,KAAKjB,OAAvB,EAAgC;AAC5BuB,QAAAA,OAAO,EAAE,OADmB;AAE5BJ,QAAAA,QAAQ,EAAE,UAFkB;AAG5BK,QAAAA,UAAU,EAAE,MAHgB;AAI5BC,QAAAA,gBAAgB,EAAE,MAJU;AAK5BjC,QAAAA,MAAM,YAAK,KAAKA,MAAL,GAAc,KAAKG,QAAnB,GAA8B,KAAKL,UAAxC;AALsB,OAAhC;;AAQA,UAAIqB,QAAQ,CAACe,UAAT,IAAuBf,QAAQ,CAACgB,YAApC,EAAkD;AAC9C,aAAK9C,MAAL,CAAYoC,KAAZ,CAAkB,KAAKjB,OAAvB,EAAgC;AAC5BX,UAAAA,KAAK,EAAE,MADqB;AAE5BuC,UAAAA,SAAS,EAAE,QAFiB;AAG5BC,UAAAA,SAAS,EAAE;AAHiB,SAAhC;AAKH;;AACD,WAAK/C,SAAL,CAAeuC,WAAf,CAA2B,KAAKrB,OAAhC;AAEA,WAAKA,OAAL,CAAaC,gBAAb,CAA8B,OAA9B,EAAuC,KAAKvB,eAA5C;AACH;;;WAED,8BAAqBoD,KAArB,EAA4B;AACxBA,MAAAA,KAAK,CAACC,cAAN;AACA,UAAMC,IAAI,GAAG,aAAaF,KAAb,GAAqBA,KAAK,CAACG,OAA3B,GAAqCH,KAAK,CAACI,MAAxD;AACA,WAAKC,SAAL,CAAe,OAAf,EAAwBH,IAAI,GAAG,KAAK3C,KAAZ,IAAqB,CAA7C;AACH;;;WAED,wBAAe;AACX,UAAM+C,MAAM,GAAI,KAAKA,MAAL,GAAc,KAAKpC,OAAL,CAAaqB,WAAb,CAC1BtC,QAAQ,CAAC6B,aAAT,CAAuB,QAAvB,CAD0B,CAA9B;AAIA,WAAKyB,QAAL,GAAgBD,MAAM,CAACE,UAAP,CAAkB,IAAlB,CAAhB;AAEA,WAAKnE,IAAL,CAAU8C,KAAV,CAAgBmB,MAAhB,EAAwB;AACpBjB,QAAAA,QAAQ,EAAE,UADU;AAEpBC,QAAAA,MAAM,EAAE;AAFY,OAAxB;AAIH;;;WAED,kBAAS;AACL,WAAKmB,iBAAL;;AAEA,UAAI,KAAKnE,kBAAT,EAA6B;AACzB,aAAKoE,mBAAL,CAAyB,KAAKpE,kBAA9B;AACH,OAFD,MAEO;AACH,aAAKqE,cAAL,CAAoB,KAAKC,eAAzB;AACH;AACJ;;;WAED,6BAAoB;AAChB,UAAMrD,KAAK,GAAG3D,IAAI,CAACiH,KAAL,CAAW,KAAKtD,KAAL,GAAa,KAAKC,UAA7B,IAA2C,IAAzD;AACA,WAAK8C,MAAL,CAAY/C,KAAZ,GAAoB,KAAKA,KAAzB;AACA,WAAK+C,MAAL,CAAY5C,MAAZ,GAAqB,KAAKA,MAAL,GAAc,KAAKG,QAAxC;AACA,WAAKyC,MAAL,CAAYnB,KAAZ,CAAkB5B,KAAlB,GAA0BA,KAA1B;AACH;;;WAED,yBAAgBuD,eAAhB,EAAiCC,EAAjC,EAAqC;AACjC,UAAI,CAACC,KAAK,CAACF,eAAe,CAAC,CAAD,CAAf,CAAmB,CAAnB,CAAD,CAAV,EAAmC;AAAE;AACjC;AACAA,QAAAA,eAAe,GAAG,CAACA,eAAD,CAAlB;AACH;;AAED,UAAMP,QAAQ,GAAGQ,EAAE,CAACR,QAApB;AACA,UAAM7C,MAAM,GAAGqD,EAAE,CAACrD,MAAlB;AACA,UAAMH,KAAK,GAAGwD,EAAE,CAACxD,KAAjB;;AAEA,UAAI,CAACgD,QAAL,EAAe;AACX;AACH;;AAED,WAAK,IAAIU,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGH,eAAe,CAACzF,MAApC,EAA4C4F,CAAC,EAA7C,EAAiD;AAAE;AAC/C,YAAMC,MAAM,GAAGH,EAAE,CAACI,QAAH,CAAYL,eAAe,CAACG,CAAD,CAA3B,CAAf;AACA,YAAMG,SAAS,GAAGb,QAAQ,CAACc,eAAT,CAAyB9D,KAAzB,EAAgCG,MAAhC,CAAlB;;AAEA,aAAK,IAAI/D,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGuH,MAAM,CAAC7F,MAA3B,EAAmC1B,CAAC,EAApC,EAAwC;AACpC,eAAK,IAAI2H,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGJ,MAAM,CAACvH,CAAD,CAAN,CAAU0B,MAA9B,EAAsCiG,CAAC,EAAvC,EAA2C;AACvC,gBAAMnE,QAAQ,GAAG4D,EAAE,CAAC5D,QAAH,CAAY+D,MAAM,CAACvH,CAAD,CAAN,CAAU2H,CAAV,CAAZ,CAAjB;AACA,gBAAMC,QAAQ,GAAG,CAAC,CAAC7D,MAAM,GAAG4D,CAAV,IAAe/D,KAAf,GAAuB5D,CAAxB,IAA6B,CAA9C;AACAyH,YAAAA,SAAS,CAACI,IAAV,CAAeD,QAAf,IAA2BpE,QAAQ,CAAC,CAAD,CAAR,GAAc,GAAzC;AACAiE,YAAAA,SAAS,CAACI,IAAV,CAAeD,QAAQ,GAAG,CAA1B,IAA+BpE,QAAQ,CAAC,CAAD,CAAR,GAAc,GAA7C;AACAiE,YAAAA,SAAS,CAACI,IAAV,CAAeD,QAAQ,GAAG,CAA1B,IAA+BpE,QAAQ,CAAC,CAAD,CAAR,GAAc,GAA7C;AACAiE,YAAAA,SAAS,CAACI,IAAV,CAAeD,QAAQ,GAAG,CAA1B,IAA+BpE,QAAQ,CAAC,CAAD,CAAR,GAAc,GAA7C;AACH;AACJ,SAb4C,CAe7C;;;AACAoD,QAAAA,QAAQ,CAACkB,YAAT,CAAsBL,SAAtB,EAAiC,CAAjC,EAAoC1D,MAAM,GAAGuD,CAA7C;AACH;AACJ;;;WAED,wBAAeS,QAAf,EAAyB;AACrB,UAAMjE,UAAU,GAAG,KAAKA,UAAxB;AACA,UAAMjD,MAAM,GAAI,KAAKA,MAAL,GAAc,KAAK4B,UAAL,CAAgB0B,OAAhB,CAAwBtD,MAAtD;AACA,UAAMqD,QAAQ,GAAG,KAAKA,QAAtB;;AAEA,UAAI,CAACrD,MAAL,EAAa;AACT,aAAK6F,SAAL,CAAe,OAAf,EAAwB,mCAAxB;AACA;AACH,OARoB,CAUrB;;;AACA,UAAMtH,UAAU,GAAGyB,MAAM,CAACzB,UAA1B;AACA,UAAM4I,WAAW,GAAG,EAApB;AAEA,UAAIhE,QAAQ,GAAG,KAAKA,QAApB;;AACA,UAAI,CAACA,QAAL,EAAe;AACX,YAAMiE,kBAAkB,GAAGpH,MAAM,CAACa,MAAP,GAAgB,KAAKiF,MAAL,CAAY/C,KAAvD;AACAI,QAAAA,QAAQ,GAAG/D,IAAI,CAACiI,GAAL,CAAS,CAAT,EAAYjI,IAAI,CAACiH,KAAL,CAAWpD,UAAU,GAAGmE,kBAAxB,CAAZ,CAAX;AACH;;AAED,UAAME,GAAG,GAAG,IAAIjJ,YAAJ,CACR4E,UADQ,EAER1E,UAFQ,EAGR,KAAKC,UAHG,EAIR,KAAKC,KAJG,CAAZ;;AAOA,WAAK,IAAIgI,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAGpD,QAApB,EAA8BoD,CAAC,EAA/B,EAAmC;AAAE;AACjC,YAAMc,WAAW,GAAGvH,MAAM,CAACwH,cAAP,CAAsBf,CAAtB,CAApB;AACA,YAAMgB,WAAW,GAAG,EAApB;AACA,YAAIC,aAAa,GAAG,CAApB;;AAEA,eAAOA,aAAa,GAAGzE,UAAhB,GAA6BsE,WAAW,CAAC1G,MAAhD,EAAwD;AACpD,cAAM8G,OAAO,GAAGJ,WAAW,CAACK,KAAZ,CACZF,aADY,EAEZA,aAAa,GAAGzE,UAFJ,CAAhB;AAIA,cAAMzC,QAAQ,GAAG8G,GAAG,CAACvH,iBAAJ,CAAsB4H,OAAtB,CAAjB;AACA,cAAME,KAAK,GAAG,IAAIC,UAAJ,CAAe7E,UAAU,GAAG,CAA5B,CAAd;AACA,cAAI6D,CAAC,SAAL;;AACA,eAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG7D,UAAU,GAAG,CAA7B,EAAgC6D,CAAC,EAAjC,EAAqC;AACjCe,YAAAA,KAAK,CAACf,CAAD,CAAL,GAAW1H,IAAI,CAACiI,GAAL,CAAS,CAAC,GAAV,EAAejI,IAAI,CAAC2I,KAAL,CAAWvH,QAAQ,CAACsG,CAAD,CAAnB,IAA0B,EAAzC,CAAX;AACH;;AACDW,UAAAA,WAAW,CAAC3E,IAAZ,CAAiB+E,KAAjB,EAXoD,CAYpD;;AAEAH,UAAAA,aAAa,IAAIzE,UAAU,GAAGE,QAA9B;AACH;;AACDgE,QAAAA,WAAW,CAACrE,IAAZ,CAAiB2E,WAAjB,EArB+B,CAsB/B;AACH;;AACDP,MAAAA,QAAQ,CAACC,WAAD,EAAc,IAAd,CAAR;AACH;;;WAED,6BAAoBa,GAApB,EAAyB;AAAA;;AACrB,UAAMC,OAAO,GAAG,KAAKpG,IAAL,CAAUqG,SAAV,CAAoB;AAAEF,QAAAA,GAAG,EAAEA;AAAP,OAApB,CAAhB;AAEAC,MAAAA,OAAO,CAACrE,EAAR,CAAW,SAAX,EAAsB,UAAAoD,IAAI;AAAA,eACtB,MAAI,CAACZ,eAAL,CAAqB+B,IAAI,CAACC,KAAL,CAAWpB,IAAX,CAArB,EAAuC,MAAvC,CADsB;AAAA,OAA1B;AAGAiB,MAAAA,OAAO,CAACrE,EAAR,CAAW,OAAX,EAAoB,UAAA5B,CAAC;AAAA,eAAI,MAAI,CAAC6D,SAAL,CAAe,OAAf,EAAwB7D,CAAxB,CAAJ;AAAA,OAArB;AAEA,aAAOiG,OAAP;AACH;;;WAED,kBAASI,IAAT,EAAe;AACX,aAAOA,IAAI,IAAI,IAAR,GAAe,CAACA,IAAI,GAAG,IAAR,EAAcC,OAAd,CAAsB,CAAtB,CAAf,GAA0ClJ,IAAI,CAACiH,KAAL,CAAWgC,IAAX,CAAjD;AACH;;;WAED,kBAASA,IAAT,EAAe;AACX,aAAOA,IAAI,IAAI,IAAR,GAAe,KAAf,GAAuB,IAA9B;AACH;;;WAED,oBACIE,MADJ,EAEIC,YAFJ,EAGIC,YAHJ,EAIIC,QAJJ,EAKIC,aALJ,EAMIC,aANJ,EAOIC,SAPJ,EAQIrG,SARJ,EASE;AACE,UAAMsG,iBAAiB,GAAG,KAAK5F,MAA/B;AACAqF,MAAAA,MAAM,GAAGA,MAAM,IAAI,kBAAnB;AACAC,MAAAA,YAAY,GAAGA,YAAY,IAAI,MAA/B;AACAC,MAAAA,YAAY,GAAGA,YAAY,IAAI,MAA/B;AACAC,MAAAA,QAAQ,GAAGA,QAAQ,IAAI,WAAvB;AACAC,MAAAA,aAAa,GAAGA,aAAa,IAAI,MAAjC;AACAC,MAAAA,aAAa,GAAGA,aAAa,IAAI,MAAjC;AACAC,MAAAA,SAAS,GAAGA,SAAS,IAAI,QAAzB;AACArG,MAAAA,SAAS,GAAGA,SAAS,IAAI,aAAzB;AACA,UAAMuG,OAAO,GAAG,EAAhB;AACA,UAAMC,OAAO,GAAGF,iBAAiB,IAAI,GAArC;AACA,UAAMG,UAAU,GAAG,KAAKD,OAAO,GAAG,GAAf,CAAnB;AACA,UAAME,SAAS,GAAG,CAAlB;AACA,UAAMC,IAAI,GACN,CAAC,KAAKvH,UAAL,CAAgB0B,OAAhB,CAAwB8F,EAAxB,CAA2B7K,UAA3B,GAAwC,CAAxC,GAA4C2K,SAA7C,IACAD,UAFJ,CAdF,CAkBE;;AACA,UAAMI,GAAG,GAAG,KAAK7E,QAAL,CAAcwB,UAAd,CAAyB,IAAzB,CAAZ;AACA,WAAKxB,QAAL,CAActB,MAAd,GAAuB,KAAKA,MAAL,GAAc,KAAKG,QAA1C;AACA,WAAKmB,QAAL,CAAczB,KAAd,GAAsBgG,OAAtB;;AAEA,UAAI,CAACM,GAAL,EAAU;AACN;AACH;;AAED,WAAK,IAAI5C,CAAC,GAAG,CAAb,EAAgBA,CAAC,GAAG,KAAKpD,QAAzB,EAAmCoD,CAAC,EAApC,EAAwC;AAAE;AACtC;AACA4C,QAAAA,GAAG,CAACC,SAAJ,GAAgBf,MAAhB;AACAc,QAAAA,GAAG,CAACE,QAAJ,CAAa,CAAb,EAAgB9C,CAAC,GAAGuC,OAApB,EAA6BD,OAA7B,EAAsC,CAAC,IAAItC,CAAL,IAAUuC,OAAhD;AACAK,QAAAA,GAAG,CAACG,IAAJ;AACA,YAAIrK,CAAC,SAAL,CALoC,CAOpC;;AACA,aAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,IAAI8J,UAAjB,EAA6B9J,CAAC,EAA9B,EAAkC;AAC9BkK,UAAAA,GAAG,CAACR,SAAJ,GAAgBA,SAAhB;AACAQ,UAAAA,GAAG,CAACI,YAAJ,GAAmB,QAAnB;AAEA,cAAMpB,IAAI,GAAGa,SAAS,GAAGC,IAAI,GAAGhK,CAAhC;AACA,cAAMuK,KAAK,GAAGtK,IAAI,CAACiH,KAAL,CACTgC,IAAI,IAAI,KAAK9J,UAAL,GAAkB,CAAtB,CAAL,GAAiC,KAAK0E,UAD5B,CAAd;AAGA,cAAM0G,KAAK,GAAG,KAAKC,QAAL,CAAcvB,IAAd,CAAd;AACA,cAAMwB,KAAK,GAAG,KAAKC,QAAL,CAAczB,IAAd,CAAd;AACA,cAAM0B,YAAY,GAAG,CAArB;AACA,cAAMC,CAAC,GAAG,EAAV;AACA,cAAIC,CAAC,SAAL;;AAEA,cAAI9K,CAAC,IAAI,CAAT,EAAY;AACR8K,YAAAA,CAAC,GAAG,CAAC,IAAIxD,CAAL,IAAUuC,OAAV,GAAoB7J,CAApB,GAAwB,EAA5B,CADQ,CAER;;AACAkK,YAAAA,GAAG,CAACC,SAAJ,GAAgBV,aAAhB;AACAS,YAAAA,GAAG,CAACa,IAAJ,GAAWzB,YAAY,GAAG,GAAf,GAAqBC,QAAhC;AACAW,YAAAA,GAAG,CAACc,QAAJ,CAAaN,KAAb,EAAoBG,CAAC,GAAG,EAAxB,EAA4BC,CAA5B,EALQ,CAMR;;AACAZ,YAAAA,GAAG,CAACC,SAAJ,GAAgBX,aAAhB;AACAU,YAAAA,GAAG,CAACa,IAAJ,GAAW1B,YAAY,GAAG,GAAf,GAAqBE,QAAhC;AACAW,YAAAA,GAAG,CAACc,QAAJ,CAAaR,KAAb,EAAoBK,CAApB,EAAuBC,CAAvB;AACH,WAVD,MAUO;AACHA,YAAAA,CAAC,GAAG,CAAC,IAAIxD,CAAL,IAAUuC,OAAV,GAAoB7J,CAAC,GAAG,EAAxB,GAA6B4K,YAAjC,CADG,CAEH;;AACAV,YAAAA,GAAG,CAACC,SAAJ,GAAgBV,aAAhB;AACAS,YAAAA,GAAG,CAACa,IAAJ,GAAWzB,YAAY,GAAG,GAAf,GAAqBC,QAAhC;AACAW,YAAAA,GAAG,CAACc,QAAJ,CAAaN,KAAb,EAAoBG,CAAC,GAAG,EAAxB,EAA4BC,CAA5B,EALG,CAMH;;AACAZ,YAAAA,GAAG,CAACC,SAAJ,GAAgBX,aAAhB;AACAU,YAAAA,GAAG,CAACa,IAAJ,GAAW1B,YAAY,GAAG,GAAf,GAAqBE,QAAhC;AACAW,YAAAA,GAAG,CAACc,QAAJ,CAAaR,KAAb,EAAoBK,CAApB,EAAuBC,CAAvB;AACH;AACJ;AACJ;AACJ;;;WAED,sBAAajI,CAAb,EAAgB;AACZ,UAAI,KAAK0B,OAAT,EAAkB;AACd,aAAKA,OAAL,CAAa0G,UAAb,GAA0BpI,CAAC,CAACqI,MAAF,CAASD,UAAnC;AACH;AACJ;;;WAED,kBAASE,SAAT,EAAoB;AAChB,UAAMC,aAAa,GAAG,KAAKxH,KAA3B;AACA,UAAMyH,SAAS,GAAG,EAAlB;AAEA,UAAMC,QAAQ,GAAG,IAAIH,SAAS,CAACzJ,MAA/B;AACA,UAAM6J,QAAQ,GAAG,IAAIH,aAArB;AACA,UAAIpL,CAAJ;;AAEA,WAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGoL,aAAhB,EAA+BpL,CAAC,EAAhC,EAAoC;AAChC,YAAMwL,MAAM,GAAG,IAAIC,KAAJ,CAAUN,SAAS,CAAC,CAAD,CAAT,CAAazJ,MAAvB,CAAf;AACA,YAAIiG,CAAC,SAAL;;AAEA,aAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGwD,SAAS,CAACzJ,MAA1B,EAAkCiG,CAAC,EAAnC,EAAuC;AACnC,cAAM+D,QAAQ,GAAG/D,CAAC,GAAG2D,QAArB;AACA,cAAMK,MAAM,GAAGD,QAAQ,GAAGJ,QAA1B;AACA,cAAMM,QAAQ,GAAG5L,CAAC,GAAGuL,QAArB;AACA,cAAMM,MAAM,GAAGD,QAAQ,GAAGL,QAA1B;AAEA,cAAMO,OAAO,GACTH,MAAM,IAAIC,QAAV,IAAsBC,MAAM,IAAIH,QAAhC,GACM,CADN,GAEMzL,IAAI,CAAC8L,GAAL,CACE9L,IAAI,CAACiI,GAAL,CAASyD,MAAT,EAAiBC,QAAjB,CADF,EAEE3L,IAAI,CAACiI,GAAL,CAAS2D,MAAT,EAAiBH,QAAjB,CAFF,IAIFzL,IAAI,CAACiI,GAAL,CACIjI,IAAI,CAAC8L,GAAL,CAASJ,MAAT,EAAiBC,QAAjB,CADJ,EAEI3L,IAAI,CAAC8L,GAAL,CAASF,MAAT,EAAiBH,QAAjB,CAFJ,CAPR;AAWA,cAAIpK,CAAC,SAAL;AACA;;AACA,cAAIwK,OAAO,GAAG,CAAd,EAAiB;AACb,iBAAKxK,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAG6J,SAAS,CAAC,CAAD,CAAT,CAAazJ,MAA7B,EAAqCJ,CAAC,EAAtC,EAA0C;AACtC,kBAAIkK,MAAM,CAAClK,CAAD,CAAN,IAAa,IAAjB,EAAuB;AACnBkK,gBAAAA,MAAM,CAAClK,CAAD,CAAN,GAAY,CAAZ;AACH;;AACDkK,cAAAA,MAAM,CAAClK,CAAD,CAAN,IAAcwK,OAAO,GAAGP,QAAX,GAAuBJ,SAAS,CAACxD,CAAD,CAAT,CAAarG,CAAb,CAApC;AACH;AACJ;AACD;;AACH;;AAED,YAAM0K,SAAS,GAAG,IAAIrD,UAAJ,CAAewC,SAAS,CAAC,CAAD,CAAT,CAAazJ,MAA5B,CAAlB;AACA,YAAIuK,CAAC,SAAL;;AAEA,aAAKA,CAAC,GAAG,CAAT,EAAYA,CAAC,GAAGd,SAAS,CAAC,CAAD,CAAT,CAAazJ,MAA7B,EAAqCuK,CAAC,EAAtC,EAA0C;AACtCD,UAAAA,SAAS,CAACC,CAAD,CAAT,GAAeT,MAAM,CAACS,CAAD,CAArB;AACH;;AAEDZ,QAAAA,SAAS,CAAC1H,IAAV,CAAeqI,SAAf;AACH;;AAED,aAAOX,SAAP;AACH;;;;AA/bD;AACJ;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACI,oBAAc9I,MAAd,EAAsB;AAClB,aAAO;AACH2J,QAAAA,IAAI,EAAE,aADH;AAEHC,QAAAA,SAAS,EAAE5J,MAAM,IAAIA,MAAM,CAAC4J,SAAjB,GAA6B5J,MAAM,CAAC4J,SAApC,GAAgD,KAFxD;AAGH5J,QAAAA,MAAM,EAAEA,MAHL;AAIH6J,QAAAA,WAAW,EAAE;AACTlN,UAAAA,GAAG,EAAEA;AADI,SAJV;AAOHmN,QAAAA,QAAQ,EAAE/J;AAPP,OAAP;AASH;;;;;;;;;;;;;UC3EL;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;UEtBA;UACA;UACA;UACA","sources":["webpack://WaveSurfer.[name]/webpack/universalModuleDefinition","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer.[name]/./src/plugin/spectrogram/index.js","webpack://WaveSurfer.[name]/webpack/bootstrap","webpack://WaveSurfer.[name]/webpack/before-startup","webpack://WaveSurfer.[name]/webpack/startup","webpack://WaveSurfer.[name]/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine(\"WaveSurfer\", [], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"WaveSurfer\"] = factory();\n\telse\n\t\troot[\"WaveSurfer\"] = root[\"WaveSurfer\"] || {}, root[\"WaveSurfer\"][\"spectrogram\"] = factory();\n})(self, function() {\nreturn ","/* eslint-disable complexity, no-redeclare, no-var, one-var */\n\n/**\n * Calculate FFT - Based on https://github.com/corbanbrook/dsp.js\n *\n * @param {Number} bufferSize Buffer size\n * @param {Number} sampleRate Sample rate\n * @param {Function} windowFunc Window function\n * @param {Number} alpha Alpha channel\n */\nexport default function FFT(bufferSize, sampleRate, windowFunc, alpha) {\n this.bufferSize = bufferSize;\n this.sampleRate = sampleRate;\n this.bandwidth = (2 / bufferSize) * (sampleRate / 2);\n\n this.sinTable = new Float32Array(bufferSize);\n this.cosTable = new Float32Array(bufferSize);\n this.windowValues = new Float32Array(bufferSize);\n this.reverseTable = new Uint32Array(bufferSize);\n\n this.peakBand = 0;\n this.peak = 0;\n\n var i;\n switch (windowFunc) {\n case 'bartlett':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / (bufferSize - 1)) *\n ((bufferSize - 1) / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n case 'bartlettHann':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.62 -\n 0.48 * Math.abs(i / (bufferSize - 1) - 0.5) -\n 0.38 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'blackman':\n alpha = alpha || 0.16;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (1 - alpha) / 2 -\n 0.5 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1)) +\n (alpha / 2) *\n Math.cos((4 * Math.PI * i) / (bufferSize - 1));\n }\n break;\n case 'cosine':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.cos(\n (Math.PI * i) / (bufferSize - 1) - Math.PI / 2\n );\n }\n break;\n case 'gauss':\n alpha = alpha || 0.25;\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = Math.pow(\n Math.E,\n -0.5 *\n Math.pow(\n (i - (bufferSize - 1) / 2) /\n ((alpha * (bufferSize - 1)) / 2),\n 2\n )\n );\n }\n break;\n case 'hamming':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.54 -\n 0.46 * Math.cos((Math.PI * 2 * i) / (bufferSize - 1));\n }\n break;\n case 'hann':\n case undefined:\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n 0.5 * (1 - Math.cos((Math.PI * 2 * i) / (bufferSize - 1)));\n }\n break;\n case 'lanczoz':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n Math.sin(Math.PI * ((2 * i) / (bufferSize - 1) - 1)) /\n (Math.PI * ((2 * i) / (bufferSize - 1) - 1));\n }\n break;\n case 'rectangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] = 1;\n }\n break;\n case 'triangular':\n for (i = 0; i < bufferSize; i++) {\n this.windowValues[i] =\n (2 / bufferSize) *\n (bufferSize / 2 - Math.abs(i - (bufferSize - 1) / 2));\n }\n break;\n default:\n throw Error(\"No such window function '\" + windowFunc + \"'\");\n }\n\n var limit = 1;\n var bit = bufferSize >> 1;\n var i;\n\n while (limit < bufferSize) {\n for (i = 0; i < limit; i++) {\n this.reverseTable[i + limit] = this.reverseTable[i] + bit;\n }\n\n limit = limit << 1;\n bit = bit >> 1;\n }\n\n for (i = 0; i < bufferSize; i++) {\n this.sinTable[i] = Math.sin(-Math.PI / i);\n this.cosTable[i] = Math.cos(-Math.PI / i);\n }\n\n this.calculateSpectrum = function(buffer) {\n // Locally scope variables for speed up\n var bufferSize = this.bufferSize,\n cosTable = this.cosTable,\n sinTable = this.sinTable,\n reverseTable = this.reverseTable,\n real = new Float32Array(bufferSize),\n imag = new Float32Array(bufferSize),\n bSi = 2 / this.bufferSize,\n sqrt = Math.sqrt,\n rval,\n ival,\n mag,\n spectrum = new Float32Array(bufferSize / 2);\n\n var k = Math.floor(Math.log(bufferSize) / Math.LN2);\n\n if (Math.pow(2, k) !== bufferSize) {\n throw 'Invalid buffer size, must be a power of 2.';\n }\n if (bufferSize !== buffer.length) {\n throw 'Supplied buffer is not the same size as defined FFT. FFT Size: ' +\n bufferSize +\n ' Buffer Size: ' +\n buffer.length;\n }\n\n var halfSize = 1,\n phaseShiftStepReal,\n phaseShiftStepImag,\n currentPhaseShiftReal,\n currentPhaseShiftImag,\n off,\n tr,\n ti,\n tmpReal;\n\n for (var i = 0; i < bufferSize; i++) {\n real[i] =\n buffer[reverseTable[i]] * this.windowValues[reverseTable[i]];\n imag[i] = 0;\n }\n\n while (halfSize < bufferSize) {\n phaseShiftStepReal = cosTable[halfSize];\n phaseShiftStepImag = sinTable[halfSize];\n\n currentPhaseShiftReal = 1;\n currentPhaseShiftImag = 0;\n\n for (var fftStep = 0; fftStep < halfSize; fftStep++) {\n var i = fftStep;\n\n while (i < bufferSize) {\n off = i + halfSize;\n tr =\n currentPhaseShiftReal * real[off] -\n currentPhaseShiftImag * imag[off];\n ti =\n currentPhaseShiftReal * imag[off] +\n currentPhaseShiftImag * real[off];\n\n real[off] = real[i] - tr;\n imag[off] = imag[i] - ti;\n real[i] += tr;\n imag[i] += ti;\n\n i += halfSize << 1;\n }\n\n tmpReal = currentPhaseShiftReal;\n currentPhaseShiftReal =\n tmpReal * phaseShiftStepReal -\n currentPhaseShiftImag * phaseShiftStepImag;\n currentPhaseShiftImag =\n tmpReal * phaseShiftStepImag +\n currentPhaseShiftImag * phaseShiftStepReal;\n }\n\n halfSize = halfSize << 1;\n }\n\n for (var i = 0, N = bufferSize / 2; i < N; i++) {\n rval = real[i];\n ival = imag[i];\n mag = bSi * sqrt(rval * rval + ival * ival);\n\n if (mag > this.peak) {\n this.peakBand = i;\n this.peak = mag;\n }\n spectrum[i] = mag;\n }\n return spectrum;\n };\n}\n","/* eslint-enable complexity, no-redeclare, no-var, one-var */\n\nimport FFT from './fft';\n\n/**\n * @typedef {Object} SpectrogramPluginParams\n * @property {string|HTMLElement} container Selector of element or element in\n * which to render\n * @property {number} fftSamples=512 Number of samples to fetch to FFT. Must be\n * a power of 2.\n * @property {boolean} splitChannels=false Render with separate spectrograms for\n * the channels of the audio\n * @property {boolean} labels Set to true to display frequency labels.\n * @property {number} noverlap Size of the overlapping window. Must be <\n * fftSamples. Auto deduced from canvas size by default.\n * @property {string} windowFunc='hann' The window function to be used. One of\n * these: `'bartlett'`, `'bartlettHann'`, `'blackman'`, `'cosine'`, `'gauss'`,\n * `'hamming'`, `'hann'`, `'lanczoz'`, `'rectangular'`, `'triangular'`\n * @property {?number} alpha Some window functions have this extra value.\n * (Between 0 and 1)\n * @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the\n * size of the spectrogram in relation with its canvas. 1 = Draw on the whole\n * canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)\n * @property {?boolean} deferInit Set to true to manually call\n * `initPlugin('spectrogram')`\n * @property {?number[][]} colorMap A 256 long array of 4-element arrays.\n * Each entry should contain a float between 0 and 1 and specify\n * r, g, b, and alpha.\n */\n\n/**\n * Render a spectrogram visualisation of the audio.\n *\n * @implements {PluginClass}\n * @extends {Observer}\n * @example\n * // es6\n * import SpectrogramPlugin from 'wavesurfer.spectrogram.js';\n *\n * // commonjs\n * var SpectrogramPlugin = require('wavesurfer.spectrogram.js');\n *\n * // if you are using <script> tags\n * var SpectrogramPlugin = window.WaveSurfer.spectrogram;\n *\n * // ... initialising wavesurfer with the plugin\n * var wavesurfer = WaveSurfer.create({\n * // wavesurfer options ...\n * plugins: [\n * SpectrogramPlugin.create({\n * // plugin options ...\n * })\n * ]\n * });\n */\nexport default class SpectrogramPlugin {\n /**\n * Spectrogram plugin definition factory\n *\n * This function must be used to create a plugin definition which can be\n * used by wavesurfer to correctly instantiate the plugin.\n *\n * @param {SpectrogramPluginParams} params Parameters used to initialise the plugin\n * @return {PluginDefinition} An object representing the plugin.\n */\n static create(params) {\n return {\n name: 'spectrogram',\n deferInit: params && params.deferInit ? params.deferInit : false,\n params: params,\n staticProps: {\n FFT: FFT\n },\n instance: SpectrogramPlugin\n };\n }\n\n constructor(params, ws) {\n this.params = params;\n this.wavesurfer = ws;\n this.util = ws.util;\n\n this.frequenciesDataUrl = params.frequenciesDataUrl;\n this._onScroll = e => {\n this.updateScroll(e);\n };\n this._onRender = () => {\n this.render();\n };\n this._onWrapperClick = e => {\n this._wrapperClickHandler(e);\n };\n this._onReady = () => {\n const drawer = (this.drawer = ws.drawer);\n\n this.container =\n 'string' == typeof params.container\n ? document.querySelector(params.container)\n : params.container;\n\n if (!this.container) {\n throw Error('No container for WaveSurfer spectrogram');\n }\n if (params.colorMap) {\n if (params.colorMap.length < 256) {\n throw new Error('Colormap must contain 256 elements');\n }\n for (let i = 0; i < params.colorMap.length; i++) {\n const cmEntry = params.colorMap[i];\n if (cmEntry.length !== 4) {\n throw new Error(\n 'ColorMap entries must contain 4 values'\n );\n }\n }\n this.colorMap = params.colorMap;\n } else {\n this.colorMap = [];\n for (let i = 0; i < 256; i++) {\n const val = (255 - i) / 256;\n this.colorMap.push([val, val, val, 1]);\n }\n }\n this.width = drawer.width;\n this.pixelRatio = this.params.pixelRatio || ws.params.pixelRatio;\n this.fftSamples =\n this.params.fftSamples || ws.params.fftSamples || 512;\n this.height = this.fftSamples / 2;\n this.noverlap = params.noverlap;\n this.windowFunc = params.windowFunc;\n this.alpha = params.alpha;\n this.splitChannels = params.splitChannels;\n this.channels = this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;\n\n this.createWrapper();\n this.createCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('redraw', this._onRender);\n };\n }\n\n init() {\n // Check if wavesurfer is ready\n if (this.wavesurfer.isReady) {\n this._onReady();\n } else {\n this.wavesurfer.once('ready', this._onReady);\n }\n }\n\n destroy() {\n this.unAll();\n this.wavesurfer.un('ready', this._onReady);\n this.wavesurfer.un('redraw', this._onRender);\n this.drawer && this.drawer.wrapper.removeEventListener('scroll', this._onScroll);\n this.wavesurfer = null;\n this.util = null;\n this.params = null;\n if (this.wrapper) {\n this.wrapper.removeEventListener('click', this._onWrapperClick);\n this.wrapper.parentNode.removeChild(this.wrapper);\n this.wrapper = null;\n }\n }\n\n createWrapper() {\n const prevSpectrogram = this.container.querySelector('spectrogram');\n if (prevSpectrogram) {\n this.container.removeChild(prevSpectrogram);\n }\n const wsParams = this.wavesurfer.params;\n this.wrapper = document.createElement('spectrogram');\n // if labels are active\n if (this.params.labels) {\n const labelsEl = (this.labelsEl = document.createElement('canvas'));\n labelsEl.classList.add('spec-labels');\n this.drawer.style(labelsEl, {\n left: 0,\n position: 'absolute',\n zIndex: 9,\n height: `${this.height * this.channels / this.pixelRatio}px`,\n width: `${55 / this.pixelRatio}px`\n });\n this.wrapper.appendChild(labelsEl);\n this.loadLabels(\n 'rgba(68,68,68,0.5)',\n '12px',\n '10px',\n '',\n '#fff',\n '#f7f7f7',\n 'center',\n '#specLabels'\n );\n }\n\n this.drawer.style(this.wrapper, {\n display: 'block',\n position: 'relative',\n userSelect: 'none',\n webkitUserSelect: 'none',\n height: `${this.height * this.channels / this.pixelRatio}px`\n });\n\n if (wsParams.fillParent || wsParams.scrollParent) {\n this.drawer.style(this.wrapper, {\n width: '100%',\n overflowX: 'hidden',\n overflowY: 'hidden'\n });\n }\n this.container.appendChild(this.wrapper);\n\n this.wrapper.addEventListener('click', this._onWrapperClick);\n }\n\n _wrapperClickHandler(event) {\n event.preventDefault();\n const relX = 'offsetX' in event ? event.offsetX : event.layerX;\n this.fireEvent('click', relX / this.width || 0);\n }\n\n createCanvas() {\n const canvas = (this.canvas = this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.spectrCc = canvas.getContext('2d');\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n }\n\n render() {\n this.updateCanvasStyle();\n\n if (this.frequenciesDataUrl) {\n this.loadFrequenciesData(this.frequenciesDataUrl);\n } else {\n this.getFrequencies(this.drawSpectrogram);\n }\n }\n\n updateCanvasStyle() {\n const width = Math.round(this.width / this.pixelRatio) + 'px';\n this.canvas.width = this.width;\n this.canvas.height = this.height * this.channels;\n this.canvas.style.width = width;\n }\n\n drawSpectrogram(frequenciesData, my) {\n if (!isNaN(frequenciesData[0][0])) { // data is 1ch [sample, freq] format\n // to [channel, sample, freq] format\n frequenciesData = [frequenciesData];\n }\n\n const spectrCc = my.spectrCc;\n const height = my.height;\n const width = my.width;\n\n if (!spectrCc) {\n return;\n }\n\n for (let c = 0; c < frequenciesData.length; c++) { // for each channel\n const pixels = my.resample(frequenciesData[c]);\n const imageData = spectrCc.createImageData(width, height);\n\n for (let i = 0; i < pixels.length; i++) {\n for (let j = 0; j < pixels[i].length; j++) {\n const colorMap = my.colorMap[pixels[i][j]];\n const redIndex = ((height - j) * width + i) * 4;\n imageData.data[redIndex] = colorMap[0] * 255;\n imageData.data[redIndex + 1] = colorMap[1] * 255;\n imageData.data[redIndex + 2] = colorMap[2] * 255;\n imageData.data[redIndex + 3] = colorMap[3] * 255;\n }\n }\n\n // stack spectrograms\n spectrCc.putImageData(imageData, 0, height * c);\n }\n }\n\n getFrequencies(callback) {\n const fftSamples = this.fftSamples;\n const buffer = (this.buffer = this.wavesurfer.backend.buffer);\n const channels = this.channels;\n\n if (!buffer) {\n this.fireEvent('error', 'Web Audio buffer is not available');\n return;\n }\n\n // This may differ from file samplerate. Browser resamples audio.\n const sampleRate = buffer.sampleRate;\n const frequencies = [];\n\n let noverlap = this.noverlap;\n if (!noverlap) {\n const uniqueSamplesPerPx = buffer.length / this.canvas.width;\n noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));\n }\n\n const fft = new FFT(\n fftSamples,\n sampleRate,\n this.windowFunc,\n this.alpha\n );\n\n for (let c = 0; c < channels; c++) { // for each channel\n const channelData = buffer.getChannelData(c);\n const channelFreq = [];\n let currentOffset = 0;\n\n while (currentOffset + fftSamples < channelData.length) {\n const segment = channelData.slice(\n currentOffset,\n currentOffset + fftSamples\n );\n const spectrum = fft.calculateSpectrum(segment);\n const array = new Uint8Array(fftSamples / 2);\n let j;\n for (j = 0; j < fftSamples / 2; j++) {\n array[j] = Math.max(-255, Math.log10(spectrum[j]) * 45);\n }\n channelFreq.push(array);\n // channelFreq: [sample, freq]\n\n currentOffset += fftSamples - noverlap;\n }\n frequencies.push(channelFreq);\n // frequencies: [channel, sample, freq]\n }\n callback(frequencies, this);\n }\n\n loadFrequenciesData(url) {\n const request = this.util.fetchFile({ url: url });\n\n request.on('success', data =>\n this.drawSpectrogram(JSON.parse(data), this)\n );\n request.on('error', e => this.fireEvent('error', e));\n\n return request;\n }\n\n freqType(freq) {\n return freq >= 1000 ? (freq / 1000).toFixed(1) : Math.round(freq);\n }\n\n unitType(freq) {\n return freq >= 1000 ? 'KHz' : 'Hz';\n }\n\n loadLabels(\n bgFill,\n fontSizeFreq,\n fontSizeUnit,\n fontType,\n textColorFreq,\n textColorUnit,\n textAlign,\n container\n ) {\n const frequenciesHeight = this.height;\n bgFill = bgFill || 'rgba(68,68,68,0)';\n fontSizeFreq = fontSizeFreq || '12px';\n fontSizeUnit = fontSizeUnit || '10px';\n fontType = fontType || 'Helvetica';\n textColorFreq = textColorFreq || '#fff';\n textColorUnit = textColorUnit || '#fff';\n textAlign = textAlign || 'center';\n container = container || '#specLabels';\n const bgWidth = 55;\n const getMaxY = frequenciesHeight || 512;\n const labelIndex = 5 * (getMaxY / 256);\n const freqStart = 0;\n const step =\n (this.wavesurfer.backend.ac.sampleRate / 2 - freqStart) /\n labelIndex;\n\n // prepare canvas element for labels\n const ctx = this.labelsEl.getContext('2d');\n this.labelsEl.height = this.height * this.channels;\n this.labelsEl.width = bgWidth;\n\n if (!ctx) {\n return;\n }\n\n for (let c = 0; c < this.channels; c++) { // for each channel\n // fill background\n ctx.fillStyle = bgFill;\n ctx.fillRect(0, c * getMaxY, bgWidth, (1 + c) * getMaxY);\n ctx.fill();\n let i;\n\n // render labels\n for (i = 0; i <= labelIndex; i++) {\n ctx.textAlign = textAlign;\n ctx.textBaseline = 'middle';\n\n const freq = freqStart + step * i;\n const index = Math.round(\n (freq / (this.sampleRate / 2)) * this.fftSamples\n );\n const label = this.freqType(freq);\n const units = this.unitType(freq);\n const yLabelOffset = 2;\n const x = 16;\n let y;\n\n if (i == 0) {\n y = (1 + c) * getMaxY + i - 10;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n } else {\n y = (1 + c) * getMaxY - i * 50 + yLabelOffset;\n // unit label\n ctx.fillStyle = textColorUnit;\n ctx.font = fontSizeUnit + ' ' + fontType;\n ctx.fillText(units, x + 24, y);\n // freq label\n ctx.fillStyle = textColorFreq;\n ctx.font = fontSizeFreq + ' ' + fontType;\n ctx.fillText(label, x, y);\n }\n }\n }\n }\n\n updateScroll(e) {\n if (this.wrapper) {\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = this.width;\n const newMatrix = [];\n\n const oldPiece = 1 / oldMatrix.length;\n const newPiece = 1 / columnsNumber;\n let i;\n\n for (i = 0; i < columnsNumber; i++) {\n const column = new Array(oldMatrix[0].length);\n let j;\n\n for (j = 0; j < oldMatrix.length; j++) {\n const oldStart = j * oldPiece;\n const oldEnd = oldStart + oldPiece;\n const newStart = i * newPiece;\n const newEnd = newStart + newPiece;\n\n const overlap =\n oldEnd <= newStart || newEnd <= oldStart\n ? 0\n : Math.min(\n Math.max(oldEnd, newStart),\n Math.max(newEnd, oldStart)\n ) -\n Math.max(\n Math.min(oldEnd, newStart),\n Math.min(newEnd, oldStart)\n );\n let k;\n /* eslint-disable max-depth */\n if (overlap > 0) {\n for (k = 0; k < oldMatrix[0].length; k++) {\n if (column[k] == null) {\n column[k] = 0;\n }\n column[k] += (overlap / newPiece) * oldMatrix[j][k];\n }\n }\n /* eslint-enable max-depth */\n }\n\n const intColumn = new Uint8Array(oldMatrix[0].length);\n let m;\n\n for (m = 0; m < oldMatrix[0].length; m++) {\n intColumn[m] = column[m];\n }\n\n newMatrix.push(intColumn);\n }\n\n return newMatrix;\n }\n}\n","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(\"./src/plugin/spectrogram/index.js\");\n",""],"names":["FFT","bufferSize","sampleRate","windowFunc","alpha","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","real","imag","bSi","sqrt","rval","ival","mag","spectrum","k","floor","log","LN2","length","halfSize","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","fftStep","N","SpectrogramPlugin","params","ws","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","cmEntry","val","push","width","pixelRatio","fftSamples","height","noverlap","splitChannels","channels","backend","numberOfChannels","createWrapper","createCanvas","wrapper","addEventListener","on","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","left","position","zIndex","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","spectrCc","getContext","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","round","frequenciesData","my","isNaN","c","pixels","resample","imageData","createImageData","j","redIndex","data","putImageData","callback","frequencies","uniqueSamplesPerPx","max","fft","channelData","getChannelData","channelFreq","currentOffset","segment","slice","array","Uint8Array","log10","url","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","frequenciesHeight","bgWidth","getMaxY","labelIndex","freqStart","step","ac","ctx","fillStyle","fillRect","fill","textBaseline","index","label","freqType","units","unitType","yLabelOffset","x","y","font","fillText","scrollLeft","target","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","name","deferInit","staticProps","instance"],"sourceRoot":""}
@@ -1,7 +1,7 @@
1
1
  /*!
2
- * wavesurfer.js spectrogram plugin 5.2.0 (2021-08-16)
2
+ * wavesurfer.js spectrogram plugin 6.0.0 (2022-02-07)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
6
- !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("WaveSurfer",[],t):"object"==typeof exports?exports.WaveSurfer=t():(e.WaveSurfer=e.WaveSurfer||{},e.WaveSurfer.spectrogram=t())}(self,(function(){return(()=>{"use strict";var e={325:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,r){switch(this.bufferSize=e,this.sampleRate=t,this.bandwidth=2/e*(t/2),this.sinTable=new Float32Array(e),this.cosTable=new Float32Array(e),this.windowValues=new Float32Array(e),this.reverseTable=new Uint32Array(e),this.peakBand=0,this.peak=0,a){case"bartlett":for(i=0;i<e;i++)this.windowValues[i]=2/(e-1)*((e-1)/2-Math.abs(i-(e-1)/2));break;case"bartlettHann":for(i=0;i<e;i++)this.windowValues[i]=.62-.48*Math.abs(i/(e-1)-.5)-.38*Math.cos(2*Math.PI*i/(e-1));break;case"blackman":for(r=r||.16,i=0;i<e;i++)this.windowValues[i]=(1-r)/2-.5*Math.cos(2*Math.PI*i/(e-1))+r/2*Math.cos(4*Math.PI*i/(e-1));break;case"cosine":for(i=0;i<e;i++)this.windowValues[i]=Math.cos(Math.PI*i/(e-1)-Math.PI/2);break;case"gauss":for(r=r||.25,i=0;i<e;i++)this.windowValues[i]=Math.pow(Math.E,-.5*Math.pow((i-(e-1)/2)/(r*(e-1)/2),2));break;case"hamming":for(i=0;i<e;i++)this.windowValues[i]=.54-.46*Math.cos(2*Math.PI*i/(e-1));break;case"hann":case void 0:for(i=0;i<e;i++)this.windowValues[i]=.5*(1-Math.cos(2*Math.PI*i/(e-1)));break;case"lanczoz":for(i=0;i<e;i++)this.windowValues[i]=Math.sin(Math.PI*(2*i/(e-1)-1))/(Math.PI*(2*i/(e-1)-1));break;case"rectangular":for(i=0;i<e;i++)this.windowValues[i]=1;break;case"triangular":for(i=0;i<e;i++)this.windowValues[i]=2/e*(e/2-Math.abs(i-(e-1)/2));break;default:throw Error("No such window function '"+a+"'")}var i,s=1,n=e>>1;for(;s<e;){for(i=0;i<s;i++)this.reverseTable[i+s]=this.reverseTable[i]+n;s<<=1,n>>=1}for(i=0;i<e;i++)this.sinTable[i]=Math.sin(-Math.PI/i),this.cosTable[i]=Math.cos(-Math.PI/i);this.calculateSpectrum=function(e){var t,a,r,i=this.bufferSize,s=this.cosTable,n=this.sinTable,o=this.reverseTable,l=new Float32Array(i),h=new Float32Array(i),f=2/this.bufferSize,c=Math.sqrt,u=new Float32Array(i/2),p=Math.floor(Math.log(i)/Math.LN2);if(Math.pow(2,p)!==i)throw"Invalid buffer size, must be a power of 2.";if(i!==e.length)throw"Supplied buffer is not the same size as defined FFT. FFT Size: "+i+" Buffer Size: "+e.length;for(var d,v,w,b,m,y,M,g,k=1,x=0;x<i;x++)l[x]=e[o[x]]*this.windowValues[o[x]],h[x]=0;for(;k<i;){d=s[k],v=n[k],w=1,b=0;for(var S=0;S<k;S++){for(x=S;x<i;)y=w*l[m=x+k]-b*h[m],M=w*h[m]+b*l[m],l[m]=l[x]-y,h[m]=h[x]-M,l[x]+=y,h[x]+=M,x+=k<<1;w=(g=w)*d-b*v,b=g*v+b*d}k<<=1}x=0;for(var C=i/2;x<C;x++)(r=f*c((t=l[x])*t+(a=h[x])*a))>this.peak&&(this.peakBand=x,this.peak=r),u[x]=r;return u}},e.exports=t.default},943:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r,i=(r=a(325))&&r.__esModule?r:{default:r};function s(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var n=function(){function e(t,a){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.params=t,this.wavesurfer=a,this.util=a.util,this.frequenciesDataUrl=t.frequenciesDataUrl,this._onScroll=function(e){r.updateScroll(e)},this._onRender=function(){r.render()},this._onWrapperClick=function(e){r._wrapperClickHandler(e)},this._onReady=function(){var e=r.drawer=a.drawer;if(r.container="string"==typeof t.container?document.querySelector(t.container):t.container,!r.container)throw Error("No container for WaveSurfer spectrogram");if(t.colorMap){if(t.colorMap.length<256)throw new Error("Colormap must contain 256 elements");for(var i=0;i<t.colorMap.length;i++){if(4!==t.colorMap[i].length)throw new Error("ColorMap entries must contain 4 values")}r.colorMap=t.colorMap}else{r.colorMap=[];for(var s=0;s<256;s++){var n=(255-s)/256;r.colorMap.push([n,n,n,1])}}r.width=e.width,r.pixelRatio=r.params.pixelRatio||a.params.pixelRatio,r.fftSamples=r.params.fftSamples||a.params.fftSamples||512,r.height=r.fftSamples/2,r.noverlap=t.noverlap,r.windowFunc=t.windowFunc,r.alpha=t.alpha,r.createWrapper(),r.createCanvas(),r.render(),e.wrapper.addEventListener("scroll",r._onScroll),a.on("redraw",r._onRender)}}var t,a,r;return t=e,r=[{key:"create",value:function(t){return{name:"spectrogram",deferInit:!(!t||!t.deferInit)&&t.deferInit,params:t,staticProps:{FFT:i.default},instance:e}}}],(a=[{key:"init",value:function(){this.wavesurfer.isReady?this._onReady():this.wavesurfer.once("ready",this._onReady)}},{key:"destroy",value:function(){this.unAll(),this.wavesurfer.un("ready",this._onReady),this.wavesurfer.un("redraw",this._onRender),this.drawer&&this.drawer.wrapper.removeEventListener("scroll",this._onScroll),this.wavesurfer=null,this.util=null,this.params=null,this.wrapper&&(this.wrapper.removeEventListener("click",this._onWrapperClick),this.wrapper.parentNode.removeChild(this.wrapper),this.wrapper=null)}},{key:"createWrapper",value:function(){var e=this.container.querySelector("spectrogram");e&&this.container.removeChild(e);var t=this.wavesurfer.params;if(this.wrapper=document.createElement("spectrogram"),this.params.labels){var a=this.labelsEl=document.createElement("canvas");a.classList.add("spec-labels"),this.drawer.style(a,{left:0,position:"absolute",zIndex:9,height:"".concat(this.height/this.pixelRatio,"px"),width:"".concat(55/this.pixelRatio,"px")}),this.wrapper.appendChild(a),this.loadLabels("rgba(68,68,68,0.5)","12px","10px","","#fff","#f7f7f7","center","#specLabels")}this.drawer.style(this.wrapper,{display:"block",position:"relative",userSelect:"none",webkitUserSelect:"none",height:"".concat(this.height/this.pixelRatio,"px")}),(t.fillParent||t.scrollParent)&&this.drawer.style(this.wrapper,{width:"100%",overflowX:"hidden",overflowY:"hidden"}),this.container.appendChild(this.wrapper),this.wrapper.addEventListener("click",this._onWrapperClick)}},{key:"_wrapperClickHandler",value:function(e){e.preventDefault();var t="offsetX"in e?e.offsetX:e.layerX;this.fireEvent("click",t/this.width||0)}},{key:"createCanvas",value:function(){var e=this.canvas=this.wrapper.appendChild(document.createElement("canvas"));this.spectrCc=e.getContext("2d"),this.util.style(e,{position:"absolute",zIndex:4})}},{key:"render",value:function(){this.updateCanvasStyle(),this.frequenciesDataUrl?this.loadFrequenciesData(this.frequenciesDataUrl):this.getFrequencies(this.drawSpectrogram)}},{key:"updateCanvasStyle",value:function(){var e=Math.round(this.width/this.pixelRatio)+"px";this.canvas.width=this.width,this.canvas.height=this.height,this.canvas.style.width=e}},{key:"drawSpectrogram",value:function(e,t){var a=t.spectrCc,r=t.height,i=t.width,s=t.resample(e),n=t.buffer?2/t.buffer.numberOfChannels:1;if(a){var o,l,h,f=a.createImageData(i,r);for(o=0;o<s.length;o++)for(l=0;l<s[o].length;l++){var c=t.colorMap[s[o][l]];for(h=0;h<n;h++){var u=r-l*n;2===n&&1===h&&u--;var p=u*(4*i)+4*o;f.data[p]=255*c[0],f.data[p+1]=255*c[1],f.data[p+2]=255*c[2],f.data[p+3]=255*c[3]}}a.putImageData(f,0,0)}}},{key:"getFrequencies",value:function(e){var t=this.fftSamples,a=this.buffer=this.wavesurfer.backend.buffer,r=a.getChannelData(0),s=a.length,n=a.sampleRate,o=[];if(a){var l=this.noverlap;if(!l){var h=a.length/this.canvas.width;l=Math.max(0,Math.round(t-h))}for(var f=new i.default(t,n,this.windowFunc,this.alpha),c=(Math.floor(s/(t-l)),0);c+t<r.length;){var u=r.slice(c,c+t),p=f.calculateSpectrum(u),d=new Uint8Array(t/2),v=void 0;for(v=0;v<t/2;v++)d[v]=Math.max(-255,45*Math.log10(p[v]));o.push(d),c+=t-l}e(o,this)}else this.fireEvent("error","Web Audio buffer is not available")}},{key:"loadFrequenciesData",value:function(e){var t=this,a=this.util.fetchFile({url:e});return a.on("success",(function(e){return t.drawSpectrogram(JSON.parse(e),t)})),a.on("error",(function(e){return t.fireEvent("error",e)})),a}},{key:"freqType",value:function(e){return e>=1e3?(e/1e3).toFixed(1):Math.round(e)}},{key:"unitType",value:function(e){return e>=1e3?"KHz":"Hz"}},{key:"loadLabels",value:function(e,t,a,r,i,s,n,o){e=e||"rgba(68,68,68,0)",t=t||"12px",a=a||"10px",r=r||"Helvetica",i=i||"#fff",s=s||"#fff",n=n||"center",o=o||"#specLabels";var l,h=this.height||512,f=h/256*5,c=(this.wavesurfer.backend.ac.sampleRate/2-0)/f,u=this.labelsEl.getContext("2d");if(this.labelsEl.height=this.height,this.labelsEl.width=55,u)for(u.fillStyle=e,u.fillRect(0,0,55,h),u.fill(),l=0;l<=f;l++){u.textAlign=n,u.textBaseline="middle";var p=0+c*l,d=(Math.round(p/(this.sampleRate/2)*this.fftSamples),this.freqType(p)),v=this.unitType(p),w=void 0;0==l?(w=h+l-10,u.fillStyle=s,u.font=a+" "+r,u.fillText(v,40,w),u.fillStyle=i,u.font=t+" "+r,u.fillText(d,16,w)):(w=h-50*l+2,u.fillStyle=s,u.font=a+" "+r,u.fillText(v,40,w),u.fillStyle=i,u.font=t+" "+r,u.fillText(d,16,w))}}},{key:"updateScroll",value:function(e){this.wrapper&&(this.wrapper.scrollLeft=e.target.scrollLeft)}},{key:"resample",value:function(e){var t,a=this.width,r=[],i=1/e.length,s=1/a;for(t=0;t<a;t++){var n=new Array(e[0].length),o=void 0;for(o=0;o<e.length;o++){var l=o*i,h=l+i,f=t*s,c=f+s,u=h<=f||c<=l?0:Math.min(Math.max(h,f),Math.max(c,l))-Math.max(Math.min(h,f),Math.min(c,l)),p=void 0;if(u>0)for(p=0;p<e[0].length;p++)null==n[p]&&(n[p]=0),n[p]+=u/s*e[o][p]}var d=new Uint8Array(e[0].length),v=void 0;for(v=0;v<e[0].length;v++)d[v]=n[v];r.push(d)}return r}}])&&s(t.prototype,a),r&&s(t,r),e}();t.default=n,e.exports=t.default}},t={};return function a(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,a),s.exports}(943)})()}));
6
+ !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define("WaveSurfer",[],t):"object"==typeof exports?exports.WaveSurfer=t():(e.WaveSurfer=e.WaveSurfer||{},e.WaveSurfer.spectrogram=t())}(self,(function(){return(()=>{"use strict";var e={325:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=function(e,t,a,r){switch(this.bufferSize=e,this.sampleRate=t,this.bandwidth=2/e*(t/2),this.sinTable=new Float32Array(e),this.cosTable=new Float32Array(e),this.windowValues=new Float32Array(e),this.reverseTable=new Uint32Array(e),this.peakBand=0,this.peak=0,a){case"bartlett":for(i=0;i<e;i++)this.windowValues[i]=2/(e-1)*((e-1)/2-Math.abs(i-(e-1)/2));break;case"bartlettHann":for(i=0;i<e;i++)this.windowValues[i]=.62-.48*Math.abs(i/(e-1)-.5)-.38*Math.cos(2*Math.PI*i/(e-1));break;case"blackman":for(r=r||.16,i=0;i<e;i++)this.windowValues[i]=(1-r)/2-.5*Math.cos(2*Math.PI*i/(e-1))+r/2*Math.cos(4*Math.PI*i/(e-1));break;case"cosine":for(i=0;i<e;i++)this.windowValues[i]=Math.cos(Math.PI*i/(e-1)-Math.PI/2);break;case"gauss":for(r=r||.25,i=0;i<e;i++)this.windowValues[i]=Math.pow(Math.E,-.5*Math.pow((i-(e-1)/2)/(r*(e-1)/2),2));break;case"hamming":for(i=0;i<e;i++)this.windowValues[i]=.54-.46*Math.cos(2*Math.PI*i/(e-1));break;case"hann":case void 0:for(i=0;i<e;i++)this.windowValues[i]=.5*(1-Math.cos(2*Math.PI*i/(e-1)));break;case"lanczoz":for(i=0;i<e;i++)this.windowValues[i]=Math.sin(Math.PI*(2*i/(e-1)-1))/(Math.PI*(2*i/(e-1)-1));break;case"rectangular":for(i=0;i<e;i++)this.windowValues[i]=1;break;case"triangular":for(i=0;i<e;i++)this.windowValues[i]=2/e*(e/2-Math.abs(i-(e-1)/2));break;default:throw Error("No such window function '"+a+"'")}var i,s=1,n=e>>1;for(;s<e;){for(i=0;i<s;i++)this.reverseTable[i+s]=this.reverseTable[i]+n;s<<=1,n>>=1}for(i=0;i<e;i++)this.sinTable[i]=Math.sin(-Math.PI/i),this.cosTable[i]=Math.cos(-Math.PI/i);this.calculateSpectrum=function(e){var t,a,r,i=this.bufferSize,s=this.cosTable,n=this.sinTable,l=this.reverseTable,o=new Float32Array(i),h=new Float32Array(i),f=2/this.bufferSize,c=Math.sqrt,u=new Float32Array(i/2),p=Math.floor(Math.log(i)/Math.LN2);if(Math.pow(2,p)!==i)throw"Invalid buffer size, must be a power of 2.";if(i!==e.length)throw"Supplied buffer is not the same size as defined FFT. FFT Size: "+i+" Buffer Size: "+e.length;for(var d,v,w,b,m,y,M,g,k=1,x=0;x<i;x++)o[x]=e[l[x]]*this.windowValues[l[x]],h[x]=0;for(;k<i;){d=s[k],v=n[k],w=1,b=0;for(var S=0;S<k;S++){for(x=S;x<i;)y=w*o[m=x+k]-b*h[m],M=w*h[m]+b*o[m],o[m]=o[x]-y,h[m]=h[x]-M,o[x]+=y,h[x]+=M,x+=k<<1;w=(g=w)*d-b*v,b=g*v+b*d}k<<=1}x=0;for(var C=i/2;x<C;x++)(r=f*c((t=o[x])*t+(a=h[x])*a))>this.peak&&(this.peakBand=x,this.peak=r),u[x]=r;return u}},e.exports=t.default},943:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=void 0;var r,i=(r=a(325))&&r.__esModule?r:{default:r};function s(e,t){for(var a=0;a<t.length;a++){var r=t[a];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}var n=function(){function e(t,a){var r=this;!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,e),this.params=t,this.wavesurfer=a,this.util=a.util,this.frequenciesDataUrl=t.frequenciesDataUrl,this._onScroll=function(e){r.updateScroll(e)},this._onRender=function(){r.render()},this._onWrapperClick=function(e){r._wrapperClickHandler(e)},this._onReady=function(){var e=r.drawer=a.drawer;if(r.container="string"==typeof t.container?document.querySelector(t.container):t.container,!r.container)throw Error("No container for WaveSurfer spectrogram");if(t.colorMap){if(t.colorMap.length<256)throw new Error("Colormap must contain 256 elements");for(var i=0;i<t.colorMap.length;i++){if(4!==t.colorMap[i].length)throw new Error("ColorMap entries must contain 4 values")}r.colorMap=t.colorMap}else{r.colorMap=[];for(var s=0;s<256;s++){var n=(255-s)/256;r.colorMap.push([n,n,n,1])}}r.width=e.width,r.pixelRatio=r.params.pixelRatio||a.params.pixelRatio,r.fftSamples=r.params.fftSamples||a.params.fftSamples||512,r.height=r.fftSamples/2,r.noverlap=t.noverlap,r.windowFunc=t.windowFunc,r.alpha=t.alpha,r.splitChannels=t.splitChannels,r.channels=r.splitChannels?a.backend.buffer.numberOfChannels:1,r.createWrapper(),r.createCanvas(),r.render(),e.wrapper.addEventListener("scroll",r._onScroll),a.on("redraw",r._onRender)}}var t,a,r;return t=e,r=[{key:"create",value:function(t){return{name:"spectrogram",deferInit:!(!t||!t.deferInit)&&t.deferInit,params:t,staticProps:{FFT:i.default},instance:e}}}],(a=[{key:"init",value:function(){this.wavesurfer.isReady?this._onReady():this.wavesurfer.once("ready",this._onReady)}},{key:"destroy",value:function(){this.unAll(),this.wavesurfer.un("ready",this._onReady),this.wavesurfer.un("redraw",this._onRender),this.drawer&&this.drawer.wrapper.removeEventListener("scroll",this._onScroll),this.wavesurfer=null,this.util=null,this.params=null,this.wrapper&&(this.wrapper.removeEventListener("click",this._onWrapperClick),this.wrapper.parentNode.removeChild(this.wrapper),this.wrapper=null)}},{key:"createWrapper",value:function(){var e=this.container.querySelector("spectrogram");e&&this.container.removeChild(e);var t=this.wavesurfer.params;if(this.wrapper=document.createElement("spectrogram"),this.params.labels){var a=this.labelsEl=document.createElement("canvas");a.classList.add("spec-labels"),this.drawer.style(a,{left:0,position:"absolute",zIndex:9,height:"".concat(this.height*this.channels/this.pixelRatio,"px"),width:"".concat(55/this.pixelRatio,"px")}),this.wrapper.appendChild(a),this.loadLabels("rgba(68,68,68,0.5)","12px","10px","","#fff","#f7f7f7","center","#specLabels")}this.drawer.style(this.wrapper,{display:"block",position:"relative",userSelect:"none",webkitUserSelect:"none",height:"".concat(this.height*this.channels/this.pixelRatio,"px")}),(t.fillParent||t.scrollParent)&&this.drawer.style(this.wrapper,{width:"100%",overflowX:"hidden",overflowY:"hidden"}),this.container.appendChild(this.wrapper),this.wrapper.addEventListener("click",this._onWrapperClick)}},{key:"_wrapperClickHandler",value:function(e){e.preventDefault();var t="offsetX"in e?e.offsetX:e.layerX;this.fireEvent("click",t/this.width||0)}},{key:"createCanvas",value:function(){var e=this.canvas=this.wrapper.appendChild(document.createElement("canvas"));this.spectrCc=e.getContext("2d"),this.util.style(e,{position:"absolute",zIndex:4})}},{key:"render",value:function(){this.updateCanvasStyle(),this.frequenciesDataUrl?this.loadFrequenciesData(this.frequenciesDataUrl):this.getFrequencies(this.drawSpectrogram)}},{key:"updateCanvasStyle",value:function(){var e=Math.round(this.width/this.pixelRatio)+"px";this.canvas.width=this.width,this.canvas.height=this.height*this.channels,this.canvas.style.width=e}},{key:"drawSpectrogram",value:function(e,t){isNaN(e[0][0])||(e=[e]);var a=t.spectrCc,r=t.height,i=t.width;if(a)for(var s=0;s<e.length;s++){for(var n=t.resample(e[s]),l=a.createImageData(i,r),o=0;o<n.length;o++)for(var h=0;h<n[o].length;h++){var f=t.colorMap[n[o][h]],c=4*((r-h)*i+o);l.data[c]=255*f[0],l.data[c+1]=255*f[1],l.data[c+2]=255*f[2],l.data[c+3]=255*f[3]}a.putImageData(l,0,r*s)}}},{key:"getFrequencies",value:function(e){var t=this.fftSamples,a=this.buffer=this.wavesurfer.backend.buffer,r=this.channels;if(a){var s=a.sampleRate,n=[],l=this.noverlap;if(!l){var o=a.length/this.canvas.width;l=Math.max(0,Math.round(t-o))}for(var h=new i.default(t,s,this.windowFunc,this.alpha),f=0;f<r;f++){for(var c=a.getChannelData(f),u=[],p=0;p+t<c.length;){var d=c.slice(p,p+t),v=h.calculateSpectrum(d),w=new Uint8Array(t/2),b=void 0;for(b=0;b<t/2;b++)w[b]=Math.max(-255,45*Math.log10(v[b]));u.push(w),p+=t-l}n.push(u)}e(n,this)}else this.fireEvent("error","Web Audio buffer is not available")}},{key:"loadFrequenciesData",value:function(e){var t=this,a=this.util.fetchFile({url:e});return a.on("success",(function(e){return t.drawSpectrogram(JSON.parse(e),t)})),a.on("error",(function(e){return t.fireEvent("error",e)})),a}},{key:"freqType",value:function(e){return e>=1e3?(e/1e3).toFixed(1):Math.round(e)}},{key:"unitType",value:function(e){return e>=1e3?"KHz":"Hz"}},{key:"loadLabels",value:function(e,t,a,r,i,s,n,l){e=e||"rgba(68,68,68,0)",t=t||"12px",a=a||"10px",r=r||"Helvetica",i=i||"#fff",s=s||"#fff",n=n||"center",l=l||"#specLabels";var o=this.height||512,h=o/256*5,f=(this.wavesurfer.backend.ac.sampleRate/2-0)/h,c=this.labelsEl.getContext("2d");if(this.labelsEl.height=this.height*this.channels,this.labelsEl.width=55,c)for(var u=0;u<this.channels;u++){c.fillStyle=e,c.fillRect(0,u*o,55,(1+u)*o),c.fill();var p=void 0;for(p=0;p<=h;p++){c.textAlign=n,c.textBaseline="middle";var d=0+f*p,v=(Math.round(d/(this.sampleRate/2)*this.fftSamples),this.freqType(d)),w=this.unitType(d),b=void 0;0==p?(b=(1+u)*o+p-10,c.fillStyle=s,c.font=a+" "+r,c.fillText(w,40,b),c.fillStyle=i,c.font=t+" "+r,c.fillText(v,16,b)):(b=(1+u)*o-50*p+2,c.fillStyle=s,c.font=a+" "+r,c.fillText(w,40,b),c.fillStyle=i,c.font=t+" "+r,c.fillText(v,16,b))}}}},{key:"updateScroll",value:function(e){this.wrapper&&(this.wrapper.scrollLeft=e.target.scrollLeft)}},{key:"resample",value:function(e){var t,a=this.width,r=[],i=1/e.length,s=1/a;for(t=0;t<a;t++){var n=new Array(e[0].length),l=void 0;for(l=0;l<e.length;l++){var o=l*i,h=o+i,f=t*s,c=f+s,u=h<=f||c<=o?0:Math.min(Math.max(h,f),Math.max(c,o))-Math.max(Math.min(h,f),Math.min(c,o)),p=void 0;if(u>0)for(p=0;p<e[0].length;p++)null==n[p]&&(n[p]=0),n[p]+=u/s*e[l][p]}var d=new Uint8Array(e[0].length),v=void 0;for(v=0;v<e[0].length;v++)d[v]=n[v];r.push(d)}return r}}])&&s(t.prototype,a),r&&s(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();t.default=n,e.exports=t.default}},t={};var a=function a(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,a),s.exports}(943);return a})()}));
7
7
  //# sourceMappingURL=wavesurfer.spectrogram.min.js.map