wavesurfer.js 6.5.2 → 6.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/README.md +16 -2
  2. package/dist/plugin/wavesurfer.cursor.js +1 -1
  3. package/dist/plugin/wavesurfer.cursor.min.js +1 -1
  4. package/dist/plugin/wavesurfer.elan.js +1 -1
  5. package/dist/plugin/wavesurfer.elan.min.js +1 -1
  6. package/dist/plugin/wavesurfer.markers.js +1 -1
  7. package/dist/plugin/wavesurfer.markers.min.js +1 -1
  8. package/dist/plugin/wavesurfer.mediasession.js +1 -1
  9. package/dist/plugin/wavesurfer.mediasession.min.js +1 -1
  10. package/dist/plugin/wavesurfer.microphone.js +1 -1
  11. package/dist/plugin/wavesurfer.microphone.min.js +1 -1
  12. package/dist/plugin/wavesurfer.minimap.js +1 -1
  13. package/dist/plugin/wavesurfer.minimap.min.js +1 -1
  14. package/dist/plugin/wavesurfer.playhead.js +1 -1
  15. package/dist/plugin/wavesurfer.playhead.min.js +1 -1
  16. package/dist/plugin/wavesurfer.regions.js +1 -1
  17. package/dist/plugin/wavesurfer.regions.min.js +1 -1
  18. package/dist/plugin/wavesurfer.spectrogram.js +128 -34
  19. package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
  20. package/dist/plugin/wavesurfer.spectrogram.min.js +2 -2
  21. package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
  22. package/dist/plugin/wavesurfer.timeline.js +1 -1
  23. package/dist/plugin/wavesurfer.timeline.min.js +1 -1
  24. package/dist/wavesurfer-html-init.js +1 -1
  25. package/dist/wavesurfer-html-init.min.js +1 -1
  26. package/dist/wavesurfer.js +160 -6
  27. package/dist/wavesurfer.js.map +1 -1
  28. package/dist/wavesurfer.min.js +2 -2
  29. package/dist/wavesurfer.min.js.map +1 -1
  30. package/package.json +4 -3
  31. package/src/drawer.canvasentry.js +43 -0
  32. package/src/drawer.js +0 -4
  33. package/src/drawer.multicanvas.js +71 -1
  34. package/src/plugin/spectrogram/index.js +121 -30
  35. package/src/wavesurfer.js +33 -0
@@ -1 +1 @@
1
- {"version":3,"file":"wavesurfer.spectrogram.min.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer/./src/plugin/spectrogram/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/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, () => {\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 {number} height=fftSamples/2 Height of the spectrogram view in CSS\n * pixels\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.params.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 position: 'absolute',\n zIndex: 9,\n height: `${this.height * this.channels}px`,\n width: `55px`\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}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.fftSamples / 2 * this.channels;\n this.canvas.style.width = width;\n this.canvas.style.height = this.height + 'px';\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.fftSamples / 2;\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 const dispScale = window.devicePixelRatio;\n this.labelsEl.height = this.height * this.channels * dispScale;\n this.labelsEl.width = bgWidth * dispScale;\n ctx.scale(dispScale, dispScale);\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__(943);\n"],"names":["root","factory","exports","module","define","amd","self","bufferSize","sampleRate","windowFunc","alpha","this","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","rval","ival","mag","real","imag","bSi","sqrt","spectrum","k","floor","log","LN2","length","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","halfSize","fftStep","N","default","obj","_fft","require","__esModule","_typeof","Symbol","iterator","constructor","prototype","_defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","arg","key","input","hint","prim","toPrimitive","res","call","TypeError","String","Number","_toPrimitive","SpectrogramPlugin","params","ws","_this","instance","Constructor","_classCallCheck","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","val","push","width","pixelRatio","fftSamples","height","noverlap","splitChannels","channels","backend","numberOfChannels","frequencyMin","frequencyMax","createWrapper","createCanvas","wrapper","addEventListener","on","protoProps","staticProps","value","name","deferInit","FFT","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","position","zIndex","concat","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","_loop","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","_this2","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","getMaxY","labelIndex","freqStart","step","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","y","font","fillText","x","scrollLeft","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
1
+ {"version":3,"file":"wavesurfer.spectrogram.min.js","mappings":"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","sources":["webpack://WaveSurfer/webpack/universalModuleDefinition","webpack://WaveSurfer/./src/plugin/spectrogram/fft.js","webpack://WaveSurfer/./src/plugin/spectrogram/index.js","webpack://WaveSurfer/webpack/bootstrap","webpack://WaveSurfer/webpack/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, () => {\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 {number} height=fftSamples/2 Height of the spectrogram view in CSS\n * pixels\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._onZoom = () => {\n this.stretchCanvases();\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.params.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 this.canvases = [];\n this.canvasesTimeouts = [];\n this.scrollLeftTracker = 0; //Tracks the desired scrollLeft value\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.addCanvas();\n this.render();\n\n drawer.wrapper.addEventListener('scroll', this._onScroll);\n ws.on('zoom', this._onZoom);\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 position: 'absolute',\n zIndex: 9,\n height: `${this.height * this.channels}px`,\n width: `55px`\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}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 /**\n * Add a canvas to this.canvases\n */\n addCanvas() {\n const canvas = (this.wrapper.appendChild(\n document.createElement('canvas')\n ));\n\n this.util.style(canvas, {\n position: 'absolute',\n zIndex: 4\n });\n\n this.canvases.push(canvas);\n this.canvasesTimeouts.push(null);\n }\n\n /**\n * Remove a canvas from this.canvases\n */\n removeCanvas() {\n //Stop drawing (if drawing)\n clearTimeout(this.canvasesTimeouts[this.canvasesTimeouts.length - 1]);\n\n let lastEntry = this.canvases[this.canvases.length - 1];\n lastEntry.parentElement.removeChild(lastEntry);\n\n this.canvases.pop();\n this.canvasesTimeouts.pop();\n }\n\n /**\n * Ensure the correct number of canvases for the size of the spectrogram\n */\n updateCanvases() {\n let canvasesRequired = Math.ceil(this.width / 4000);\n\n while (this.canvases.length < canvasesRequired) {\n this.addCanvas();\n }\n while (this.canvases.length > canvasesRequired) {\n this.removeCanvas();\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 this.updateCanvases();\n //width per canvas\n for (let i = 0; i < this.canvases.length; i++) {\n this.canvases[i].width = Math.round(this.width / this.canvases.length);\n this.canvases[i].height = this.fftSamples / 2 * this.channels;\n this.canvases[i].style.width = Math.round(this.canvases[i].width / this.pixelRatio) + 'px';\n this.canvases[i].style.height = this.height + 'px';\n }\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 my.updateCanvasStyle();\n\n //Stop canvases still being drawn\n for (let i = 0; i < my.canvasesTimeouts.length; i++) {\n clearTimeout(my.canvasesTimeouts[i]);\n }\n\n const view = [my.scrollLeftTracker, my.scrollLeftTracker + my.wrapper.clientWidth];\n\n for (let canvasNum = 0; canvasNum < my.canvases.length; canvasNum++) {\n const canvasLeft = canvasNum * Math.floor(my.width / my.canvases.length / my.pixelRatio);\n const canvasRight = (canvasNum + 1) * Math.floor(my.width / my.canvases.length / my.pixelRatio);\n const canvasBound = [canvasLeft, canvasRight];\n my.canvases[canvasNum].style['left'] = canvasLeft + 'px';\n\n //Optimise drawing for the view\n let priority = 0;\n if (canvasBound[0] > view[1]) {\n //Canvas is to the right of view window\n let distance = canvasBound[0] - view[1];\n priority = Math.ceil(distance / (view[1] - view[0]));\n } else if (canvasBound[1] < view[0]) {\n //Canvas is to the left of the view window\n let distance = view[0] - canvasBound[1];\n priority = Math.ceil(distance / (view[1] - view[0]));\n }\n\n //delay = 25ms * number of viewport widths away the canvas is\n my.canvasesTimeouts[canvasNum] = setTimeout(my.drawToCanvas, 25 * priority, frequenciesData, my, canvasNum);\n }\n }\n\n /**\n * Draw spectrogram channel to a specific canvas\n * @param {[Number, Number, Number]} frequenciesData spectrogram data in [channel, sample, freq] format\n * @param {SpectrogramPlugin} my variable with 'this' in it\n * @param {Number} canvasNum Canvas to draw to\n */\n drawToCanvas(frequenciesData, my, canvasNum) {\n const height = my.fftSamples / 2;\n const freqFrom = my.buffer.sampleRate / 2;\n const freqMin = my.frequencyMin;\n const freqMax = my.frequencyMax;\n\n for (let channel = 0; channel < frequenciesData.length; channel++) {\n\n //Get pixels from frequency data and apply to image\n const relevantFreqs = frequenciesData[channel].slice(canvasNum * Math.round(frequenciesData[channel].length / my.canvases.length), (canvasNum + 1) * Math.round(frequenciesData[channel].length / my.canvases.length));\n const pixels = my.resample(relevantFreqs);\n const imageData = new ImageData(pixels.length, 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) * imageData.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 //Draw image to canvas\n createImageBitmap(imageData).then(renderer => {\n if (my.canvases[canvasNum]) { //Check canvas still exists after creating image\n my.canvases[canvasNum].getContext('2d').drawImage(renderer,\n 0, height * (1 - freqMax / freqFrom), // source x, y\n imageData.width, height * (freqMax - freqMin) / freqFrom, // source width, height\n 0, height * channel, // destination x, y\n my.canvases[canvasNum].width, height // destination width, height\n );\n }\n });\n }\n //Drawing is finished\n my.canvasesTimeouts[canvasNum] = null;\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.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 const dispScale = window.devicePixelRatio;\n this.labelsEl.height = this.height * this.channels * dispScale;\n this.labelsEl.width = bgWidth * dispScale;\n ctx.scale(dispScale, dispScale);\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.scrollLeftTracker = e.target.scrollLeft;\n this.wrapper.scrollLeft = e.target.scrollLeft;\n }\n }\n\n resample(oldMatrix) {\n const columnsNumber = oldMatrix.length;\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 stretchCanvases() {\n for (let i = 0; i < this.canvases.length; i++) {\n this.canvases[i].style.width = Math.round(this.drawer.width / this.canvases.length / this.pixelRatio) + 'px';\n const canvasLeft = i * Math.floor(this.drawer.width / this.canvases.length / this.pixelRatio);\n this.canvases[i].style['left'] = canvasLeft + 'px';\n }\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__(943);\n"],"names":["root","factory","exports","module","define","amd","self","bufferSize","sampleRate","windowFunc","alpha","this","bandwidth","sinTable","Float32Array","cosTable","windowValues","reverseTable","Uint32Array","peakBand","peak","i","Math","abs","cos","PI","pow","E","undefined","sin","Error","limit","bit","calculateSpectrum","buffer","rval","ival","mag","real","imag","bSi","sqrt","spectrum","k","floor","log","LN2","length","phaseShiftStepReal","phaseShiftStepImag","currentPhaseShiftReal","currentPhaseShiftImag","off","tr","ti","tmpReal","halfSize","fftStep","N","default","obj","_fft","require","__esModule","_typeof","Symbol","iterator","constructor","prototype","_defineProperties","target","props","descriptor","enumerable","configurable","writable","Object","defineProperty","arg","key","input","hint","prim","toPrimitive","res","call","TypeError","String","Number","_toPrimitive","SpectrogramPlugin","params","ws","_this","instance","Constructor","_classCallCheck","wavesurfer","util","frequenciesDataUrl","_onScroll","e","updateScroll","_onRender","render","_onZoom","stretchCanvases","_onWrapperClick","_wrapperClickHandler","_onReady","drawer","container","document","querySelector","colorMap","val","push","width","pixelRatio","fftSamples","height","noverlap","splitChannels","channels","backend","numberOfChannels","canvases","canvasesTimeouts","scrollLeftTracker","frequencyMin","frequencyMax","createWrapper","addCanvas","wrapper","addEventListener","on","protoProps","staticProps","value","name","deferInit","FFT","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","position","zIndex","concat","appendChild","loadLabels","display","userSelect","webkitUserSelect","fillParent","scrollParent","overflowX","overflowY","event","preventDefault","relX","offsetX","layerX","fireEvent","canvas","clearTimeout","lastEntry","parentElement","pop","canvasesRequired","ceil","removeCanvas","updateCanvasStyle","loadFrequenciesData","getFrequencies","drawSpectrogram","updateCanvases","round","frequenciesData","my","isNaN","view","clientWidth","canvasNum","canvasLeft","canvasBound","priority","distance","setTimeout","drawToCanvas","freqFrom","freqMin","freqMax","_loop","channel","relevantFreqs","slice","pixels","resample","imageData","ImageData","j","redIndex","data","createImageBitmap","then","renderer","getContext","drawImage","callback","frequencies","uniqueSamplesPerPx","max","fft","c","channelData","getChannelData","channelFreq","currentOffset","segment","array","Uint8Array","log10","url","_this2","request","fetchFile","JSON","parse","freq","toFixed","bgFill","fontSizeFreq","fontSizeUnit","fontType","textColorFreq","textColorUnit","textAlign","getMaxY","labelIndex","freqStart","step","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","y","font","fillText","x","scrollLeft","oldMatrix","columnsNumber","newMatrix","oldPiece","newPiece","column","Array","oldStart","oldEnd","newStart","newEnd","overlap","min","intColumn","m","__webpack_module_cache__","__webpack_exports__","__webpack_require__","moduleId","cachedModule","__webpack_modules__"],"sourceRoot":""}
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wavesurfer.js timeline plugin 6.5.2 (2023-03-12)
2
+ * wavesurfer.js timeline plugin 6.6.0 (2023-03-14)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wavesurfer.js timeline plugin 6.5.2 (2023-03-12)
2
+ * wavesurfer.js timeline plugin 6.6.0 (2023-03-14)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wavesurfer.js 6.5.2 (2023-03-12)
2
+ * wavesurfer.js 6.6.0 (2023-03-14)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wavesurfer.js 6.5.2 (2023-03-12)
2
+ * wavesurfer.js 6.6.0 (2023-03-14)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
@@ -1,5 +1,5 @@
1
1
  /*!
2
- * wavesurfer.js 6.5.2 (2023-03-12)
2
+ * wavesurfer.js 6.6.0 (2023-03-14)
3
3
  * https://wavesurfer-js.org
4
4
  * @license BSD-3-Clause
5
5
  */
@@ -96,6 +96,10 @@ var CanvasEntry = /*#__PURE__*/function () {
96
96
  * @type {object}
97
97
  */
98
98
  this.canvasContextAttributes = {};
99
+ /**
100
+ * The Timeout id used to track this canvas entry.
101
+ */
102
+ this.drawTimeout = null;
99
103
  }
100
104
 
101
105
  /**
@@ -161,11 +165,17 @@ var CanvasEntry = /*#__PURE__*/function () {
161
165
  key: "clearWave",
162
166
  value: function clearWave() {
163
167
  // wave
168
+ this.waveCtx.save();
169
+ this.waveCtx.setTransform(1, 0, 0, 1, 0, 0);
164
170
  this.waveCtx.clearRect(0, 0, this.waveCtx.canvas.width, this.waveCtx.canvas.height);
171
+ this.waveCtx.restore();
165
172
 
166
173
  // progress
167
174
  if (this.hasProgressCanvas) {
175
+ this.progressCtx.save();
176
+ this.progressCtx.setTransform(1, 0, 0, 1, 0, 0);
168
177
  this.progressCtx.clearRect(0, 0, this.progressCtx.canvas.width, this.progressCtx.canvas.height);
178
+ this.progressCtx.restore();
169
179
  }
170
180
  }
171
181
 
@@ -423,6 +433,48 @@ var CanvasEntry = /*#__PURE__*/function () {
423
433
  return this.wave.toDataURL(format, quality);
424
434
  }
425
435
  }
436
+
437
+ /**
438
+ * Stretches existing canvas
439
+ * @param {Number} newTotalWidth total width of wave in pixels
440
+ */
441
+ }, {
442
+ key: "stretchCanvas",
443
+ value: function stretchCanvas(newTotalWidth) {
444
+ //Calculate the start and width of this canvas
445
+ var start = Math.round(this.start * newTotalWidth);
446
+ var width = Math.round(this.end * newTotalWidth - start);
447
+
448
+ //Stretch canvas
449
+ var elementSize = {
450
+ width: width + 'px'
451
+ };
452
+ var elementStart = {
453
+ left: start + 'px'
454
+ };
455
+ (0, _style.default)(this.wave, elementSize);
456
+ (0, _style.default)(this.wave, elementStart);
457
+ if (this.hasProgressCanvas) {
458
+ (0, _style.default)(this.progress, elementSize);
459
+ (0, _style.default)(this.progress, elementStart);
460
+ }
461
+ }
462
+
463
+ /**
464
+ * Set the left offset of the canvas
465
+ * @param {Number} position in px for the canvas to start
466
+ */
467
+ }, {
468
+ key: "setLeft",
469
+ value: function setLeft(position) {
470
+ var elementStart = {
471
+ left: position + 'px'
472
+ };
473
+ (0, _style.default)(this.wave, elementStart);
474
+ if (this.hasProgressCanvas) {
475
+ (0, _style.default)(this.progress, elementStart);
476
+ }
477
+ }
426
478
  }]);
427
479
  return CanvasEntry;
428
480
  }();
@@ -730,9 +782,6 @@ var Drawer = /*#__PURE__*/function (_util$Observer) {
730
782
  }, {
731
783
  key: "setWidth",
732
784
  value: function setWidth(width) {
733
- if (this.width == width) {
734
- return false;
735
- }
736
785
  this.width = width;
737
786
  if (this.params.fillParent || this.params.scrollParent) {
738
787
  this.style(this.wrapper, {
@@ -1004,6 +1053,14 @@ var MultiCanvas = /*#__PURE__*/function (_Drawer) {
1004
1053
  * @type {boolean}
1005
1054
  */
1006
1055
  _this.vertical = params.vertical;
1056
+
1057
+ /**
1058
+ * Whether to use the optimsized zoom rendering
1059
+ * Automatically toggles to true if stretchCanvases() function is called
1060
+ *
1061
+ * @type {boolean}
1062
+ */
1063
+ _this.optimiseZoom = false;
1007
1064
  return _this;
1008
1065
  }
1009
1066
 
@@ -1075,10 +1132,15 @@ var MultiCanvas = /*#__PURE__*/function (_Drawer) {
1075
1132
  }
1076
1133
  var canvasWidth = this.maxCanvasWidth + this.overlap;
1077
1134
  var lastCanvas = this.canvases.length - 1;
1135
+ var leftOffset = 0;
1078
1136
  this.canvases.forEach(function (entry, i) {
1079
1137
  if (i == lastCanvas) {
1080
1138
  canvasWidth = _this2.width - _this2.maxCanvasWidth * lastCanvas;
1081
1139
  }
1140
+
1141
+ //Set left offset and add to next entry
1142
+ entry.setLeft(leftOffset);
1143
+ leftOffset += canvasWidth / _this2.params.pixelRatio;
1082
1144
  _this2.updateDimensions(entry, canvasWidth, _this2.height);
1083
1145
  entry.clearWave();
1084
1146
  });
@@ -1324,7 +1386,38 @@ var MultiCanvas = /*#__PURE__*/function (_Drawer) {
1324
1386
  this.canvases.forEach(function (entry, i) {
1325
1387
  _this6.setFillStyles(entry, waveColor, progressColor);
1326
1388
  _this6.applyCanvasTransforms(entry, _this6.params.vertical);
1327
- entry.drawLines(peaks, absmax, halfH, offsetY, start, end);
1389
+ if (_this6.optimiseZoom) {
1390
+ //Optimising zoom functionality
1391
+ //If there's a wrapper, optimise for the view
1392
+ var priority = 0;
1393
+ if (_this6.wrapper) {
1394
+ var canvasRect = entry.wave.getBoundingClientRect();
1395
+ var wrapperRect = _this6.wrapper.getBoundingClientRect();
1396
+
1397
+ //Determine whether canvas is in viewframe or not and assign priority
1398
+ if (Math.floor(canvasRect['left']) > Math.ceil(wrapperRect['right'])) {
1399
+ //Canvas is to the right of view window
1400
+ var distance = canvasRect['left'] - wrapperRect['right'];
1401
+ priority = Math.ceil(distance / wrapperRect['width']);
1402
+ } else if (Math.ceil(canvasRect['right']) < Math.floor(wrapperRect['left'])) {
1403
+ //Canvas is to the left of the view window
1404
+ var _distance = wrapperRect['left'] - canvasRect['right'];
1405
+ priority = Math.ceil(_distance / wrapperRect['width']);
1406
+ }
1407
+ } else {
1408
+ //Everything is equal priority
1409
+ }
1410
+
1411
+ //This staggers the drawing of canvases so they don't all draw at once
1412
+ entry.clearWave();
1413
+ clearTimeout(entry.drawTimeout);
1414
+ entry.drawTimeout = setTimeout(function () {
1415
+ entry.drawLines(peaks, absmax, halfH, offsetY, start, end);
1416
+ entry.drawTimeout = null;
1417
+ }, 25 * priority);
1418
+ } else {
1419
+ entry.drawLines(peaks, absmax, halfH, offsetY, start, end);
1420
+ }
1328
1421
  });
1329
1422
  }
1330
1423
 
@@ -1517,6 +1610,31 @@ var MultiCanvas = /*#__PURE__*/function (_Drawer) {
1517
1610
  }
1518
1611
  }
1519
1612
 
1613
+ /**
1614
+ * Stretches the canvases to mimic zoom without recalculation
1615
+ *
1616
+ * @param {Number} desiredWidth new width of the wave display
1617
+ * @param {Number} progress Value between 0 and 1 for wave progress
1618
+ */
1619
+ }, {
1620
+ key: "stretchCanvases",
1621
+ value: function stretchCanvases(desiredWidth, progress) {
1622
+ if (!this.optimiseZoom) {
1623
+ //Enable optimsed zooming
1624
+ this.optimiseZoom = true;
1625
+ }
1626
+ var totalCanvasWidth = Math.round(desiredWidth / this.params.pixelRatio);
1627
+ this.width = desiredWidth;
1628
+ for (var i = 0; i < this.canvases.length; i++) {
1629
+ this.canvases[i].stretchCanvas(totalCanvasWidth);
1630
+ }
1631
+
1632
+ //Update progress
1633
+ var progressPos = progress * totalCanvasWidth;
1634
+ this.updateProgress(progressPos);
1635
+ this.recenterOnPosition(progressPos, true);
1636
+ }
1637
+
1520
1638
  /**
1521
1639
  * Render the new progress
1522
1640
  *
@@ -4646,6 +4764,23 @@ var WaveSurfer = /*#__PURE__*/function (_util$Observer) {
4646
4764
  this.drawBuffer();
4647
4765
  }
4648
4766
 
4767
+ /**
4768
+ * Calls getPeaks() and drawPeaks()
4769
+ * @param {WaveSurfer} wavesurfer the Wavesurfer to get/draw peaks from/to
4770
+ * @param {number} width The width of the area that should be drawn
4771
+ * @param {number} start The x-offset of the beginning of the area that
4772
+ * should be rendered
4773
+ * @param {number} end The x-offset of the end of the area that should be
4774
+ * rendered
4775
+ */
4776
+ }, {
4777
+ key: "getAndDrawPeaks",
4778
+ value: function getAndDrawPeaks(wavesurfer, width, start, end) {
4779
+ var peaks;
4780
+ peaks = wavesurfer.backend.getPeaks(width, start, end);
4781
+ wavesurfer.drawer.drawPeaks(peaks, width, start, end);
4782
+ }
4783
+
4649
4784
  /**
4650
4785
  * Get the correct peaks for current wave view-port and render wave
4651
4786
  *
@@ -4708,6 +4843,25 @@ var WaveSurfer = /*#__PURE__*/function (_util$Observer) {
4708
4843
  this.fireEvent('zoom', pxPerSec);
4709
4844
  }
4710
4845
 
4846
+ /**
4847
+ * Call this function while moving the zoom slider to stretch the canvases
4848
+ * of the wave without recalculating
4849
+ *
4850
+ * @param {Number} pxPerSec value returned from the zoom slider
4851
+ */
4852
+ }, {
4853
+ key: "zooming",
4854
+ value: function zooming(pxPerSec) {
4855
+ //Calculate the new width, this cannot be smaller than the parent container width
4856
+ var desiredWidth = Math.round(this.getDuration() * pxPerSec * this.params.pixelRatio);
4857
+ var parentWidth = this.drawer.getWidth();
4858
+ desiredWidth = Math.max(parentWidth, desiredWidth);
4859
+
4860
+ //Stretch canvases
4861
+ this.drawer.stretchCanvases(desiredWidth, this.backend.getPlayedPercents());
4862
+ this.fireEvent('zoom', pxPerSec);
4863
+ }
4864
+
4711
4865
  /**
4712
4866
  * Decode buffer and load
4713
4867
  *
@@ -5181,7 +5335,7 @@ var WaveSurfer = /*#__PURE__*/function (_util$Observer) {
5181
5335
  return WaveSurfer;
5182
5336
  }(util.Observer);
5183
5337
  exports["default"] = WaveSurfer;
5184
- _defineProperty(WaveSurfer, "VERSION", "6.5.2");
5338
+ _defineProperty(WaveSurfer, "VERSION", "6.6.0");
5185
5339
  /**
5186
5340
  * Functions in the `util` property are available as a static property of the
5187
5341
  * WaveSurfer class