wavesurfer.js 6.0.3 → 6.0.4
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.
- package/CHANGES.md +8 -0
- package/dist/plugin/wavesurfer.cursor.js +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js +1 -1
- package/dist/plugin/wavesurfer.elan.js +1 -1
- package/dist/plugin/wavesurfer.elan.min.js +1 -1
- package/dist/plugin/wavesurfer.markers.js +1 -1
- package/dist/plugin/wavesurfer.markers.min.js +1 -1
- package/dist/plugin/wavesurfer.mediasession.js +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js +1 -1
- package/dist/plugin/wavesurfer.microphone.js +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js +1 -1
- package/dist/plugin/wavesurfer.minimap.js +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js +1 -1
- package/dist/plugin/wavesurfer.playhead.js +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js +1 -1
- package/dist/plugin/wavesurfer.regions.js +1 -1
- package/dist/plugin/wavesurfer.regions.min.js +1 -1
- package/dist/plugin/wavesurfer.spectrogram.js +28 -9
- package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.min.js +2 -2
- package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.js +5 -3
- package/dist/plugin/wavesurfer.timeline.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +2 -2
- package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
- package/dist/wavesurfer-html-init.js +1 -1
- package/dist/wavesurfer-html-init.min.js +1 -1
- package/dist/wavesurfer.js +2 -2
- package/dist/wavesurfer.min.js +2 -2
- package/package.json +3 -3
- package/src/plugin/spectrogram/index.js +23 -10
- package/src/plugin/timeline/index.js +7 -1
package/CHANGES.md
CHANGED
|
@@ -1,6 +1,14 @@
|
|
|
1
1
|
wavesurfer.js changelog
|
|
2
2
|
=======================
|
|
3
3
|
|
|
4
|
+
6.0.4 (09.03.2022)
|
|
5
|
+
------------------
|
|
6
|
+
- Spectrogram plugin:
|
|
7
|
+
- Add `frequencyMin`, `frequencyMax` option to scale frequency axis.
|
|
8
|
+
And set default 12kHz range to draw spectrogram like 5.x (#2455)
|
|
9
|
+
- Timeline plugin:
|
|
10
|
+
- Fix rendering issue for negative `offset` values (#2463)
|
|
11
|
+
|
|
4
12
|
6.0.3 (01.03.2022)
|
|
5
13
|
------------------
|
|
6
14
|
- Cursor plugin:
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* wavesurfer.js spectrogram plugin 6.0.
|
|
2
|
+
* wavesurfer.js spectrogram plugin 6.0.4 (2022-03-08)
|
|
3
3
|
* https://wavesurfer-js.org
|
|
4
4
|
* @license BSD-3-Clause
|
|
5
5
|
*/
|
|
@@ -280,6 +280,9 @@ function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _d
|
|
|
280
280
|
* @property {number} pixelRatio=wavesurfer.params.pixelRatio to control the
|
|
281
281
|
* size of the spectrogram in relation with its canvas. 1 = Draw on the whole
|
|
282
282
|
* canvas. 2 = Draw on a quarter (1/2 the length and 1/2 the width)
|
|
283
|
+
* @property {number} frequencyMin=0 Min frequency to scale spectrogram.
|
|
284
|
+
* @property {number} frequencyMax=12000 Max frequency to scale spectrogram.
|
|
285
|
+
* Set this to samplerate/2 to draw whole range of spectrogram.
|
|
283
286
|
* @property {?boolean} deferInit Set to true to manually call
|
|
284
287
|
* `initPlugin('spectrogram')`
|
|
285
288
|
* @property {?number[][]} colorMap A 256 long array of 4-element arrays.
|
|
@@ -375,7 +378,11 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
375
378
|
_this.windowFunc = params.windowFunc;
|
|
376
379
|
_this.alpha = params.alpha;
|
|
377
380
|
_this.splitChannels = params.splitChannels;
|
|
378
|
-
_this.channels = _this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;
|
|
381
|
+
_this.channels = _this.splitChannels ? ws.backend.buffer.numberOfChannels : 1; // Getting file's original samplerate is difficult(#1248).
|
|
382
|
+
// So set 12kHz default to render like wavesurfer.js 5.x.
|
|
383
|
+
|
|
384
|
+
_this.frequencyMin = params.frequencyMin || 0;
|
|
385
|
+
_this.frequencyMax = params.frequencyMax || 12000;
|
|
379
386
|
|
|
380
387
|
_this.createWrapper();
|
|
381
388
|
|
|
@@ -508,15 +515,18 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
508
515
|
var spectrCc = my.spectrCc;
|
|
509
516
|
var height = my.height;
|
|
510
517
|
var width = my.width;
|
|
518
|
+
var freqFrom = my.buffer.sampleRate / 2;
|
|
519
|
+
var freqMin = my.frequencyMin;
|
|
520
|
+
var freqMax = my.frequencyMax;
|
|
511
521
|
|
|
512
522
|
if (!spectrCc) {
|
|
513
523
|
return;
|
|
514
524
|
}
|
|
515
525
|
|
|
516
|
-
|
|
526
|
+
var _loop = function _loop(c) {
|
|
517
527
|
// for each channel
|
|
518
528
|
var pixels = my.resample(frequenciesData[c]);
|
|
519
|
-
var imageData =
|
|
529
|
+
var imageData = new ImageData(width, height);
|
|
520
530
|
|
|
521
531
|
for (var i = 0; i < pixels.length; i++) {
|
|
522
532
|
for (var j = 0; j < pixels[i].length; j++) {
|
|
@@ -527,10 +537,20 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
527
537
|
imageData.data[redIndex + 2] = colorMap[2] * 255;
|
|
528
538
|
imageData.data[redIndex + 3] = colorMap[3] * 255;
|
|
529
539
|
}
|
|
530
|
-
} // stack spectrograms
|
|
540
|
+
} // scale and stack spectrograms
|
|
541
|
+
|
|
531
542
|
|
|
543
|
+
createImageBitmap(imageData).then(function (renderer) {
|
|
544
|
+
return spectrCc.drawImage(renderer, 0, height * (1 - freqMax / freqFrom), // source x, y
|
|
545
|
+
width, height * (freqMax - freqMin) / freqFrom, // source width, height
|
|
546
|
+
0, height * c, // destination x, y
|
|
547
|
+
width, height // destination width, height
|
|
548
|
+
);
|
|
549
|
+
});
|
|
550
|
+
};
|
|
532
551
|
|
|
533
|
-
|
|
552
|
+
for (var c = 0; c < frequenciesData.length; c++) {
|
|
553
|
+
_loop(c);
|
|
534
554
|
}
|
|
535
555
|
}
|
|
536
556
|
}, {
|
|
@@ -624,8 +644,8 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
624
644
|
var bgWidth = 55;
|
|
625
645
|
var getMaxY = frequenciesHeight || 512;
|
|
626
646
|
var labelIndex = 5 * (getMaxY / 256);
|
|
627
|
-
var freqStart =
|
|
628
|
-
var step = (this.
|
|
647
|
+
var freqStart = this.frequencyMin;
|
|
648
|
+
var step = (this.frequencyMax - freqStart) / labelIndex; // prepare canvas element for labels
|
|
629
649
|
|
|
630
650
|
var ctx = this.labelsEl.getContext('2d');
|
|
631
651
|
this.labelsEl.height = this.height * this.channels;
|
|
@@ -647,7 +667,6 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
647
667
|
ctx.textAlign = textAlign;
|
|
648
668
|
ctx.textBaseline = 'middle';
|
|
649
669
|
var freq = freqStart + step * i;
|
|
650
|
-
var index = Math.round(freq / (this.sampleRate / 2) * this.fftSamples);
|
|
651
670
|
var label = this.freqType(freq);
|
|
652
671
|
var units = this.unitType(freq);
|
|
653
672
|
var yLabelOffset = 2;
|
|
@@ -1 +1 @@
|
|
|
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
|
+
{"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} 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 {number} frequencyMin=0 Min frequency to scale spectrogram.\n * @property {number} frequencyMax=12000 Max frequency to scale spectrogram.\n * Set this to samplerate/2 to draw whole range of spectrogram.\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 // Getting file's original samplerate is difficult(#1248).\n // So set 12kHz default to render like wavesurfer.js 5.x.\n this.frequencyMin = params.frequencyMin || 0;\n this.frequencyMax = params.frequencyMax || 12000;\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 const freqFrom = my.buffer.sampleRate / 2;\n const freqMin = my.frequencyMin;\n const freqMax = my.frequencyMax;\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 = new ImageData(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 // scale and stack spectrograms\n createImageBitmap(imageData).then(renderer =>\n spectrCc.drawImage(renderer,\n 0, height * (1 - freqMax / freqFrom), // source x, y\n width, height * (freqMax - freqMin) / freqFrom, // source width, height\n 0, height * c, // destination x, y\n width, height // destination width, height\n )\n );\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 = this.frequencyMin;\n const step = (this.frequencyMax - freqStart) / 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 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","frequencyMin","frequencyMax","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","freqFrom","freqMin","freqMax","c","pixels","resample","imageData","ImageData","j","redIndex","data","createImageBitmap","then","renderer","drawImage","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","ctx","fillStyle","fillRect","fill","textBaseline","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 6.0.
|
|
2
|
+
* wavesurfer.js spectrogram plugin 6.0.4 (2022-03-08)
|
|
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,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})()}));
|
|
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,n=1,s=e>>1;for(;n<e;){for(i=0;i<n;i++)this.reverseTable[i+n]=this.reverseTable[i]+s;n<<=1,s>>=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,n=this.cosTable,s=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,y,b,m,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=n[k],v=s[k],w=1,y=0;for(var S=0;S<k;S++){for(x=S;x<i;)m=w*l[b=x+k]-y*h[b],M=w*h[b]+y*l[b],l[b]=l[x]-m,h[b]=h[x]-M,l[x]+=m,h[x]+=M,x+=k<<1;w=(g=w)*d-y*v,y=g*v+y*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 n(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 s=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 n=0;n<256;n++){var s=(255-n)/256;r.colorMap.push([s,s,s,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.frequencyMin=t.frequencyMin||0,r.frequencyMax=t.frequencyMax||12e3,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,n=t.buffer.sampleRate/2,s=t.frequencyMin,o=t.frequencyMax;if(a)for(var l=function(l){for(var h=t.resample(e[l]),f=new ImageData(i,r),c=0;c<h.length;c++)for(var u=0;u<h[c].length;u++){var p=t.colorMap[h[c][u]],d=4*((r-u)*i+c);f.data[d]=255*p[0],f.data[d+1]=255*p[1],f.data[d+2]=255*p[2],f.data[d+3]=255*p[3]}createImageBitmap(f).then((function(e){return a.drawImage(e,0,r*(1-o/n),i,r*(o-s)/n,0,r*l,i,r)}))},h=0;h<e.length;h++)l(h)}},{key:"getFrequencies",value:function(e){var t=this.fftSamples,a=this.buffer=this.wavesurfer.backend.buffer,r=this.channels;if(a){var n=a.sampleRate,s=[],o=this.noverlap;if(!o){var l=a.length/this.canvas.width;o=Math.max(0,Math.round(t-l))}for(var h=new i.default(t,n,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),y=void 0;for(y=0;y<t/2;y++)w[y]=Math.max(-255,45*Math.log10(v[y]));u.push(w),p+=t-o}s.push(u)}e(s,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,n,s,o){e=e||"rgba(68,68,68,0)",t=t||"12px",a=a||"10px",r=r||"Helvetica",i=i||"#fff",n=n||"#fff",s=s||"center",o=o||"#specLabels";var l=this.height||512,h=l/256*5,f=this.frequencyMin,c=(this.frequencyMax-f)/h,u=this.labelsEl.getContext("2d");if(this.labelsEl.height=this.height*this.channels,this.labelsEl.width=55,u)for(var p=0;p<this.channels;p++){u.fillStyle=e,u.fillRect(0,p*l,55,(1+p)*l),u.fill();var d=void 0;for(d=0;d<=h;d++){u.textAlign=s,u.textBaseline="middle";var v=f+c*d,w=this.freqType(v),y=this.unitType(v),b=void 0;0==d?(b=(1+p)*l+d-10,u.fillStyle=n,u.font=a+" "+r,u.fillText(y,40,b),u.fillStyle=i,u.font=t+" "+r,u.fillText(w,16,b)):(b=(1+p)*l-50*d+2,u.fillStyle=n,u.font=a+" "+r,u.fillText(y,40,b),u.fillStyle=i,u.font=t+" "+r,u.fillText(w,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,n=1/a;for(t=0;t<a;t++){var s=new Array(e[0].length),o=void 0;for(o=0;o<e.length;o++){var l=o*i,h=l+i,f=t*n,c=f+n,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==s[p]&&(s[p]=0),s[p]+=u/n*e[o][p]}var d=new Uint8Array(e[0].length),v=void 0;for(v=0;v<e[0].length;v++)d[v]=s[v];r.push(d)}return r}}])&&n(t.prototype,a),r&&n(t,r),Object.defineProperty(t,"prototype",{writable:!1}),e}();t.default=s,e.exports=t.default}},t={};var a=function a(r){var i=t[r];if(void 0!==i)return i.exports;var n=t[r]={exports:{}};return e[r](n,n.exports,a),n.exports}(943);return a})()}));
|
|
7
7
|
//# sourceMappingURL=wavesurfer.spectrogram.min.js.map
|