wavesurfer.js 6.3.0 → 6.4.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.
- package/README.md +1 -0
- package/dist/plugin/wavesurfer.cursor.js +29 -49
- package/dist/plugin/wavesurfer.cursor.js.map +1 -1
- package/dist/plugin/wavesurfer.cursor.min.js +2 -2
- package/dist/plugin/wavesurfer.cursor.min.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.js +19 -49
- package/dist/plugin/wavesurfer.elan.js.map +1 -1
- package/dist/plugin/wavesurfer.elan.min.js +1 -1
- package/dist/plugin/wavesurfer.elan.min.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.js +57 -72
- package/dist/plugin/wavesurfer.markers.js.map +1 -1
- package/dist/plugin/wavesurfer.markers.min.js +2 -2
- package/dist/plugin/wavesurfer.markers.min.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.js +5 -15
- package/dist/plugin/wavesurfer.mediasession.js.map +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js +1 -1
- package/dist/plugin/wavesurfer.mediasession.min.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.js +44 -62
- package/dist/plugin/wavesurfer.microphone.js.map +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js +1 -1
- package/dist/plugin/wavesurfer.microphone.min.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.js +16 -68
- package/dist/plugin/wavesurfer.minimap.js.map +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js +1 -1
- package/dist/plugin/wavesurfer.minimap.min.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.js +2 -29
- package/dist/plugin/wavesurfer.playhead.js.map +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js +1 -1
- package/dist/plugin/wavesurfer.playhead.min.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.js +98 -252
- package/dist/plugin/wavesurfer.regions.js.map +1 -1
- package/dist/plugin/wavesurfer.regions.min.js +1 -1
- package/dist/plugin/wavesurfer.regions.min.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.js +51 -146
- package/dist/plugin/wavesurfer.spectrogram.js.map +1 -1
- package/dist/plugin/wavesurfer.spectrogram.min.js +1 -1
- package/dist/plugin/wavesurfer.spectrogram.min.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.js +42 -85
- package/dist/plugin/wavesurfer.timeline.js.map +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js +1 -1
- package/dist/plugin/wavesurfer.timeline.min.js.map +1 -1
- package/dist/wavesurfer-html-init.js +31 -53
- package/dist/wavesurfer-html-init.js.map +1 -1
- package/dist/wavesurfer-html-init.min.js +1 -1
- package/dist/wavesurfer-html-init.min.js.map +1 -1
- package/dist/wavesurfer.js +419 -982
- 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 +6 -6
- package/src/plugin/cursor/index.js +15 -3
- package/src/plugin/markers/index.js +39 -0
- package/CHANGES.md +0 -482
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wavesurfer.spectrogram.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/before-startup","webpack://WaveSurfer/webpack/startup","webpack://WaveSurfer/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, () => {\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__(\"./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","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","dispScale","window","devicePixelRatio","scale","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
|
+
{"version":3,"file":"wavesurfer.spectrogram.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/before-startup","webpack://WaveSurfer/webpack/startup","webpack://WaveSurfer/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, () => {\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__(\"./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","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","dispScale","window","devicePixelRatio","scale","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 +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","SpectrogramPlugin","params","ws","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","name","deferInit","staticProps","FFT","instance","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","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","getMaxY","labelIndex","freqStart","step","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","y","font","fillText","x","scrollLeft","target","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._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","SpectrogramPlugin","params","ws","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","name","deferInit","staticProps","FFT","instance","isReady","once","unAll","un","removeEventListener","parentNode","removeChild","prevSpectrogram","wsParams","createElement","labels","labelsEl","classList","add","style","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","getMaxY","labelIndex","freqStart","step","ctx","dispScale","window","devicePixelRatio","scale","fillStyle","fillRect","fill","textBaseline","label","freqType","units","unitType","y","font","fillText","x","scrollLeft","target","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":""}
|