wavesurfer.js 6.6.0 → 6.6.2
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/README.md +3 -1
- 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 +34 -128
- 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 +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +1 -1
- package/dist/wavesurfer-html-init.js +1 -1
- package/dist/wavesurfer-html-init.min.js +1 -1
- package/dist/wavesurfer.js +6 -160
- package/dist/wavesurfer.js.map +1 -1
- package/dist/wavesurfer.min.js +2 -2
- package/dist/wavesurfer.min.js.map +1 -1
- package/package.json +1 -1
- package/src/drawer.canvasentry.js +0 -43
- package/src/drawer.js +4 -0
- package/src/drawer.multicanvas.js +1 -71
- package/src/plugin/spectrogram/index.js +30 -121
- package/src/wavesurfer.js +0 -33
package/README.md
CHANGED
|
@@ -8,7 +8,9 @@ Interactive navigable audio visualization using Web Audio and Canvas.
|
|
|
8
8
|
|
|
9
9
|
[](https://wavesurfer-js.org)
|
|
10
10
|
|
|
11
|
-
See
|
|
11
|
+
See [docs](https://wavesurfer-js.org/docs) and [examples](https://wavesurfer-js.org/examples) on [wavesurfer-js.org](https://wavesurfer-js.org).
|
|
12
|
+
|
|
13
|
+
For a video tutorial, watch this [series by Live Blogger on YouTube](https://www.youtube.com/watch?v=yCmnDWCF8m0). 📺
|
|
12
14
|
|
|
13
15
|
## Questions
|
|
14
16
|
Have a question about integrating wavesurfer.js on your website? Feel free to ask in our forum: https://github.com/wavesurfer-js/wavesurfer.js/discussions/categories/q-a
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/*!
|
|
2
|
-
* wavesurfer.js spectrogram plugin 6.6.
|
|
2
|
+
* wavesurfer.js spectrogram plugin 6.6.2 (2023-03-26)
|
|
3
3
|
* https://wavesurfer-js.org
|
|
4
4
|
* @license BSD-3-Clause
|
|
5
5
|
*/
|
|
@@ -284,9 +284,6 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
284
284
|
this._onRender = function () {
|
|
285
285
|
_this.render();
|
|
286
286
|
};
|
|
287
|
-
this._onZoom = function () {
|
|
288
|
-
_this.stretchCanvases();
|
|
289
|
-
};
|
|
290
287
|
this._onWrapperClick = function (e) {
|
|
291
288
|
_this._wrapperClickHandler(e);
|
|
292
289
|
};
|
|
@@ -323,19 +320,15 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
323
320
|
_this.alpha = params.alpha;
|
|
324
321
|
_this.splitChannels = params.splitChannels;
|
|
325
322
|
_this.channels = _this.splitChannels ? ws.backend.buffer.numberOfChannels : 1;
|
|
326
|
-
_this.canvases = [];
|
|
327
|
-
_this.canvasesTimeouts = [];
|
|
328
|
-
_this.scrollLeftTracker = 0; //Tracks the desired scrollLeft value
|
|
329
323
|
|
|
330
324
|
// Getting file's original samplerate is difficult(#1248).
|
|
331
325
|
// So set 12kHz default to render like wavesurfer.js 5.x.
|
|
332
326
|
_this.frequencyMin = params.frequencyMin || 0;
|
|
333
327
|
_this.frequencyMax = params.frequencyMax || 12000;
|
|
334
328
|
_this.createWrapper();
|
|
335
|
-
_this.
|
|
329
|
+
_this.createCanvas();
|
|
336
330
|
_this.render();
|
|
337
331
|
drawer.wrapper.addEventListener('scroll', _this._onScroll);
|
|
338
|
-
ws.on('zoom', _this._onZoom);
|
|
339
332
|
ws.on('redraw', _this._onRender);
|
|
340
333
|
};
|
|
341
334
|
}
|
|
@@ -411,49 +404,15 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
411
404
|
var relX = 'offsetX' in event ? event.offsetX : event.layerX;
|
|
412
405
|
this.fireEvent('click', relX / this.width || 0);
|
|
413
406
|
}
|
|
414
|
-
|
|
415
|
-
/**
|
|
416
|
-
* Add a canvas to this.canvases
|
|
417
|
-
*/
|
|
418
407
|
}, {
|
|
419
|
-
key: "
|
|
420
|
-
value: function
|
|
421
|
-
var canvas = this.wrapper.appendChild(document.createElement('canvas'));
|
|
408
|
+
key: "createCanvas",
|
|
409
|
+
value: function createCanvas() {
|
|
410
|
+
var canvas = this.canvas = this.wrapper.appendChild(document.createElement('canvas'));
|
|
411
|
+
this.spectrCc = canvas.getContext('2d');
|
|
422
412
|
this.util.style(canvas, {
|
|
423
413
|
position: 'absolute',
|
|
424
414
|
zIndex: 4
|
|
425
415
|
});
|
|
426
|
-
this.canvases.push(canvas);
|
|
427
|
-
this.canvasesTimeouts.push(null);
|
|
428
|
-
}
|
|
429
|
-
|
|
430
|
-
/**
|
|
431
|
-
* Remove a canvas from this.canvases
|
|
432
|
-
*/
|
|
433
|
-
}, {
|
|
434
|
-
key: "removeCanvas",
|
|
435
|
-
value: function removeCanvas() {
|
|
436
|
-
//Stop drawing (if drawing)
|
|
437
|
-
clearTimeout(this.canvasesTimeouts[this.canvasesTimeouts.length - 1]);
|
|
438
|
-
var lastEntry = this.canvases[this.canvases.length - 1];
|
|
439
|
-
lastEntry.parentElement.removeChild(lastEntry);
|
|
440
|
-
this.canvases.pop();
|
|
441
|
-
this.canvasesTimeouts.pop();
|
|
442
|
-
}
|
|
443
|
-
|
|
444
|
-
/**
|
|
445
|
-
* Ensure the correct number of canvases for the size of the spectrogram
|
|
446
|
-
*/
|
|
447
|
-
}, {
|
|
448
|
-
key: "updateCanvases",
|
|
449
|
-
value: function updateCanvases() {
|
|
450
|
-
var canvasesRequired = Math.ceil(this.width / 4000);
|
|
451
|
-
while (this.canvases.length < canvasesRequired) {
|
|
452
|
-
this.addCanvas();
|
|
453
|
-
}
|
|
454
|
-
while (this.canvases.length > canvasesRequired) {
|
|
455
|
-
this.removeCanvas();
|
|
456
|
-
}
|
|
457
416
|
}
|
|
458
417
|
}, {
|
|
459
418
|
key: "render",
|
|
@@ -468,14 +427,11 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
468
427
|
}, {
|
|
469
428
|
key: "updateCanvasStyle",
|
|
470
429
|
value: function updateCanvasStyle() {
|
|
471
|
-
this.
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
this.canvases[i].style.width = Math.round(this.canvases[i].width / this.pixelRatio) + 'px';
|
|
477
|
-
this.canvases[i].style.height = this.height + 'px';
|
|
478
|
-
}
|
|
430
|
+
var width = Math.round(this.width / this.pixelRatio) + 'px';
|
|
431
|
+
this.canvas.width = this.width;
|
|
432
|
+
this.canvas.height = this.fftSamples / 2 * this.channels;
|
|
433
|
+
this.canvas.style.width = width;
|
|
434
|
+
this.canvas.style.height = this.height + 'px';
|
|
479
435
|
}
|
|
480
436
|
}, {
|
|
481
437
|
key: "drawSpectrogram",
|
|
@@ -485,58 +441,23 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
485
441
|
// to [channel, sample, freq] format
|
|
486
442
|
frequenciesData = [frequenciesData];
|
|
487
443
|
}
|
|
488
|
-
my.
|
|
489
|
-
|
|
490
|
-
//Stop canvases still being drawn
|
|
491
|
-
for (var i = 0; i < my.canvasesTimeouts.length; i++) {
|
|
492
|
-
clearTimeout(my.canvasesTimeouts[i]);
|
|
493
|
-
}
|
|
494
|
-
var view = [my.scrollLeftTracker, my.scrollLeftTracker + my.wrapper.clientWidth];
|
|
495
|
-
for (var canvasNum = 0; canvasNum < my.canvases.length; canvasNum++) {
|
|
496
|
-
var canvasLeft = canvasNum * Math.floor(my.width / my.canvases.length / my.pixelRatio);
|
|
497
|
-
var canvasRight = (canvasNum + 1) * Math.floor(my.width / my.canvases.length / my.pixelRatio);
|
|
498
|
-
var canvasBound = [canvasLeft, canvasRight];
|
|
499
|
-
my.canvases[canvasNum].style['left'] = canvasLeft + 'px';
|
|
500
|
-
|
|
501
|
-
//Optimise drawing for the view
|
|
502
|
-
var priority = 0;
|
|
503
|
-
if (canvasBound[0] > view[1]) {
|
|
504
|
-
//Canvas is to the right of view window
|
|
505
|
-
var distance = canvasBound[0] - view[1];
|
|
506
|
-
priority = Math.ceil(distance / (view[1] - view[0]));
|
|
507
|
-
} else if (canvasBound[1] < view[0]) {
|
|
508
|
-
//Canvas is to the left of the view window
|
|
509
|
-
var _distance = view[0] - canvasBound[1];
|
|
510
|
-
priority = Math.ceil(_distance / (view[1] - view[0]));
|
|
511
|
-
}
|
|
512
|
-
|
|
513
|
-
//delay = 25ms * number of viewport widths away the canvas is
|
|
514
|
-
my.canvasesTimeouts[canvasNum] = setTimeout(my.drawToCanvas, 25 * priority, frequenciesData, my, canvasNum);
|
|
515
|
-
}
|
|
516
|
-
}
|
|
517
|
-
|
|
518
|
-
/**
|
|
519
|
-
* Draw spectrogram channel to a specific canvas
|
|
520
|
-
* @param {[Number, Number, Number]} frequenciesData spectrogram data in [channel, sample, freq] format
|
|
521
|
-
* @param {SpectrogramPlugin} my variable with 'this' in it
|
|
522
|
-
* @param {Number} canvasNum Canvas to draw to
|
|
523
|
-
*/
|
|
524
|
-
}, {
|
|
525
|
-
key: "drawToCanvas",
|
|
526
|
-
value: function drawToCanvas(frequenciesData, my, canvasNum) {
|
|
444
|
+
var spectrCc = my.spectrCc;
|
|
527
445
|
var height = my.fftSamples / 2;
|
|
446
|
+
var width = my.width;
|
|
528
447
|
var freqFrom = my.buffer.sampleRate / 2;
|
|
529
448
|
var freqMin = my.frequencyMin;
|
|
530
449
|
var freqMax = my.frequencyMax;
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
450
|
+
if (!spectrCc) {
|
|
451
|
+
return;
|
|
452
|
+
}
|
|
453
|
+
var _loop = function _loop(c) {
|
|
454
|
+
// for each channel
|
|
455
|
+
var pixels = my.resample(frequenciesData[c]);
|
|
456
|
+
var imageData = new ImageData(width, height);
|
|
536
457
|
for (var i = 0; i < pixels.length; i++) {
|
|
537
458
|
for (var j = 0; j < pixels[i].length; j++) {
|
|
538
459
|
var colorMap = my.colorMap[pixels[i][j]];
|
|
539
|
-
var redIndex = ((height - j) *
|
|
460
|
+
var redIndex = ((height - j) * width + i) * 4;
|
|
540
461
|
imageData.data[redIndex] = colorMap[0] * 255;
|
|
541
462
|
imageData.data[redIndex + 1] = colorMap[1] * 255;
|
|
542
463
|
imageData.data[redIndex + 2] = colorMap[2] * 255;
|
|
@@ -544,26 +465,21 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
544
465
|
}
|
|
545
466
|
}
|
|
546
467
|
|
|
547
|
-
//
|
|
468
|
+
// scale and stack spectrograms
|
|
548
469
|
createImageBitmap(imageData).then(function (renderer) {
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
my.canvases[canvasNum].width, height // destination width, height
|
|
558
|
-
);
|
|
559
|
-
}
|
|
470
|
+
return spectrCc.drawImage(renderer, 0, height * (1 - freqMax / freqFrom),
|
|
471
|
+
// source x, y
|
|
472
|
+
width, height * (freqMax - freqMin) / freqFrom,
|
|
473
|
+
// source width, height
|
|
474
|
+
0, height * c,
|
|
475
|
+
// destination x, y
|
|
476
|
+
width, height // destination width, height
|
|
477
|
+
);
|
|
560
478
|
});
|
|
561
479
|
};
|
|
562
|
-
for (var
|
|
563
|
-
_loop(
|
|
480
|
+
for (var c = 0; c < frequenciesData.length; c++) {
|
|
481
|
+
_loop(c);
|
|
564
482
|
}
|
|
565
|
-
//Drawing is finished
|
|
566
|
-
my.canvasesTimeouts[canvasNum] = null;
|
|
567
483
|
}
|
|
568
484
|
}, {
|
|
569
485
|
key: "getFrequencies",
|
|
@@ -581,7 +497,7 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
581
497
|
var frequencies = [];
|
|
582
498
|
var noverlap = this.noverlap;
|
|
583
499
|
if (!noverlap) {
|
|
584
|
-
var uniqueSamplesPerPx = buffer.length / this.width;
|
|
500
|
+
var uniqueSamplesPerPx = buffer.length / this.canvas.width;
|
|
585
501
|
noverlap = Math.max(0, Math.round(fftSamples - uniqueSamplesPerPx));
|
|
586
502
|
}
|
|
587
503
|
var fft = new _fft.default(fftSamples, sampleRate, this.windowFunc, this.alpha);
|
|
@@ -707,14 +623,13 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
707
623
|
key: "updateScroll",
|
|
708
624
|
value: function updateScroll(e) {
|
|
709
625
|
if (this.wrapper) {
|
|
710
|
-
this.scrollLeftTracker = e.target.scrollLeft;
|
|
711
626
|
this.wrapper.scrollLeft = e.target.scrollLeft;
|
|
712
627
|
}
|
|
713
628
|
}
|
|
714
629
|
}, {
|
|
715
630
|
key: "resample",
|
|
716
631
|
value: function resample(oldMatrix) {
|
|
717
|
-
var columnsNumber =
|
|
632
|
+
var columnsNumber = this.width;
|
|
718
633
|
var newMatrix = [];
|
|
719
634
|
var oldPiece = 1 / oldMatrix.length;
|
|
720
635
|
var newPiece = 1 / columnsNumber;
|
|
@@ -750,15 +665,6 @@ var SpectrogramPlugin = /*#__PURE__*/function () {
|
|
|
750
665
|
}
|
|
751
666
|
return newMatrix;
|
|
752
667
|
}
|
|
753
|
-
}, {
|
|
754
|
-
key: "stretchCanvases",
|
|
755
|
-
value: function stretchCanvases() {
|
|
756
|
-
for (var i = 0; i < this.canvases.length; i++) {
|
|
757
|
-
this.canvases[i].style.width = Math.round(this.drawer.width / this.canvases.length / this.pixelRatio) + 'px';
|
|
758
|
-
var canvasLeft = i * Math.floor(this.drawer.width / this.canvases.length / this.pixelRatio);
|
|
759
|
-
this.canvases[i].style['left'] = canvasLeft + 'px';
|
|
760
|
-
}
|
|
761
|
-
}
|
|
762
668
|
}], [{
|
|
763
669
|
key: "create",
|
|
764
670
|
value:
|