{video: true, audio: true}
var d = document, w = window, context = null, dest = null, source = null; var init = function () { try { var audioContext = w.AudioContext || w.webkitAudioContext; navigator.getMedia = navigator.getUserMedia || navigator.webkitGetUserMedia || navigator.mozGetUserMedia || navigator.msGetUserMedia; // context = new audioContext(); // dest = context.destination; var bufferLoader = new BufferLoader(context, ["effects/reverb.wav"], function (buffers) { navigator.getMedia({ audio: true }, function (striam) { // source = context.createMediaStreamSource(striam); }, function (e) { alert(e); }); }); bufferLoader.load(); } catch (e) { alert (e.message); } };
// var BufferLoader = function (context, urlList, callback) { this.context = context; this.urlList = urlList; this.onload = callback; this.bufferList = new Array(); this.loadCount = 0; }; BufferLoader.prototype.load = function () { for (var i = 0; i < this.urlList.length; ++i) { this.loadBuffer(this.urlList[i], i); } }; BufferLoader.prototype.loadBuffer = function (url, index) { var request = new XMLHttpRequest(); request.open("GET", url, true); request.responseType = "arraybuffer"; var loader = this; request.onload = function () { loader.context.decodeAudioData( request.response, function (buffer) { if (!buffer) { alert('error decoding file data: ' + url); return; } loader.bufferList[index] = buffer; if (++loader.loadCount == loader.urlList.length) { loader.onload(loader.bufferList); } }, function (error) { console.error('decodeAudioData error', error); } ); } request.onerror = function () { alert('BufferLoader: XHR error'); } request.send(); };
var AudioModulation = function (buffers, source) { var am = this; // var sourceGain = context.createGain(); sourceGain.gain.value = 2; // var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; // var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; // source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); // sourceCompressor.connect(dest); }
var AudioModulation = function (buffers, source) { var am = this; // var sourceGain = context.createGain(); sourceGain.gain.value = 2; // var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; // var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; // source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); // var ringGain = this.ringModulation(); sourceCompressor.connect(ringGain); // ringGain.connect(dest); } AudioModulation.prototype.ringModulation = function () { //, var ringGain = context.createGain(); ringGain.gain.value = 1; // ringCarrier = context.createOscillator(); // 40 ringCarrier.type = ringCarrier.SINE; ringCarrier.frequency.value = 40; // ringCarrier.detune.value = 600; // , 10 var ngHigpass = context.createBiquadFilter(); ngHigpass.type = ngHigpass.HIGHPASS; ngHigpass.frequency.value = 10; // , ringCarrier.connect(ngHigpass); ngHigpass.connect(ringGain.gain); return ringGain; };
var filters = [{gain: 1,frequency: 40},{gain: 3,frequency: 120},....,{gain: -2,frequency: 16000}];
AudioModulation.prototype.setFilters = function (source) { var fil = [{ gain: 1, frequency: 40 }, { gain: 3, frequency: 120 }, { gain: -2, frequency: 16000}], out = null, ln = fil.length; for (var i = 0; i < ln; i++) { var loc = fil[i], currFilter = null; currFilter = context.createBiquadFilter(); currFilter.type = currFilter.HIGHSHELF; currFilter.gain.value = loc.gain; currFilter.Q.value = 1; currFilter.frequency.value = loc.frequency; if (!out) { source.connect(currFilter); out = currFilter; } else { out.connect(currFilter); out = currFilter; } } return out; };
var AudioModulation = function (buffers, source) { var am = this; // var sourceGain = context.createGain(); sourceGain.gain.value = 2; // var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; // var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; // source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); // var ringGain = this.ringModulation(); sourceCompressor.connect(ringGain); // var outFilters = this.setFilters(sourceCompressor); // outFilters.connect(dest); } // AudioModulation.prototype.ringModulation = function () { //, var ringGain = context.createGain(); ringGain.gain.value = 1; // ringCarrier = context.createOscillator(); // 40 ringCarrier.type = ringCarrier.SINE; ringCarrier.frequency.value = 40; // ringCarrier.detune.value = 600; // , 10 var ngHigpass = context.createBiquadFilter(); ngHigpass.type = ngHigpass.HIGHPASS; ngHigpass.frequency.value = 10; // , ringCarrier.connect(ngHigpass); ngHigpass.connect(ringGain.gain); return ringGain; }; // AudioModulation.prototype.setFilters = function (source) { var fil = [{ gain: 1, frequency: 40 }, { gain: 3, frequency: 120 }, { gain: -2, frequency: 16000}], out = null, ln = fil.length; while (ln--) { var loc = fil[ln], currFilter = null; currFilter = context.createBiquadFilter(); currFilter.type = currFilter.HIGHSHELF; currFilter.gain.value = loc.gain; currFilter.Q.value = 1; currFilter.frequency.value = loc.frequency; if (!out) { source.connect(currFilter); out = currFilter; } else { out.connect(currFilter); out = currFilter; } } return out; };
var currentGrainSize = 512 var currentOverLap = 0.50; var currentShiftRatio = 0.77; var node = context.createScriptProcessor(currentGrainSize, 1, 1); // - ( ) node.grainWindow = hannWindow(currentGrainSize); // , node.buffer = new Float32Array(currentGrainSize* 2); node.onaudioprocess = function (event) { // var input = event.inputBuffer.getChannelData(0); // output = event.outputBuffer.getChannelData(0), ln = input.length; for (i = 0; i < ln; i++) { // input[i] *= this.grainWindow[i]; // this.buffer[i] = this.buffer[i + currentGrainSize]; // this.buffer[i + currentGrainSize] = 0.0; } // var grainData = new Float32Array(currentGrainSize * 2); for (var i = 0, j = 0.0; i < currentGrainSize; i++, j += currentShiftRatio) { var index = Math.floor(j) % currentGrainSize; var a = input[index]; var b = input[(index + 1) % currentGrainSize]; grainData[i] += linearInterpolation(a, b, j % 1.0) * this.grainWindow[i]; } // for (i = 0; i < currentGrainSize; i += Math.round(currentGrainSize * (1 - currentOverLap))) { for (j = 0; j <= currentGrainSize; j++) { this.buffer[i + j] += grainData[j]; } } // for (i = 0; i < currentGrainSize; i++) { output[i] = this.buffer[i]; } }
var AudioModulation = function (buffers, source) { var am = this, currentGrainSize = 512, currentOverLap = 0.50, currentShiftRatio = 0.77, node = context.createScriptProcessor(currentGrainSize, 1, 1); // var sourceGain = context.createGain(); sourceGain.gain.value = 2; // var sourceConvolver = context.createConvolver(); sourceConvolver.buffer = buffers[0]; // var sourceCompressor = context.createDynamicsCompressor(); sourceCompressor.threshold.value = -18.2; sourceCompressor.ratio.value = 4; // source.connect(sourceGain); sourceGain.connect(sourceConvolver); sourceConvolver.connect(sourceCompressor); // var ringGain = this.ringModulation(); sourceCompressor.connect(ringGain); // var outFilters = this.setFilters(sourceCompressor); // outFilters.connect(dest); // - ( ) node.grainWindow = this.hannWindow(currentGrainSize); // , node.buffer = new Float32Array(currentGrainSize* 2); node.onaudioprocess = function (event) { // var input = event.inputBuffer.getChannelData(0); // output = event.outputBuffer.getChannelData(0), ln = input.length; for (i = 0; i < ln; i++) { // input[i] *= this.grainWindow[i]; // this.buffer[i] = this.buffer[i + currentGrainSize]; // this.buffer[i + currentGrainSize] = 0.0; } // var grainData = new Float32Array(currentGrainSize * 2); for (var i = 0, j = 0.0; i < currentGrainSize; i++, j += currentShiftRatio) { var index = Math.floor(j) % currentGrainSize; var a = input[index]; var b = input[(index + 1) % currentGrainSize]; grainData[i] += am.linearInterpolation(a, b, j % 1.0) * this.grainWindow[i]; } // for (i = 0; i < currentGrainSize; i += Math.round(currentGrainSize * (1 - currentOverLap))) { for (j = 0; j <= currentGrainSize; j++) { this.buffer[i + j] += grainData[j]; } } // for (i = 0; i < currentGrainSize; i++) { output[i] = this.buffer[i]; } } } AudioModulation.prototype.hannWindow = function (length) { var window = new Float32Array(length); for (var i = 0; i < length; i++) { window[i] = 0.5 * (1 - Math.cos(2 * Math.PI * i / (length - 1))); } return window; }; AudioModulation.prototype.linearInterpolation = function (a, b, t) { return a + (b - a) * t; }; // AudioModulation.prototype.ringModulation = function () { //, var ringGain = context.createGain(); ringGain.gain.value = 1; // ringCarrier = context.createOscillator(); // 40 ringCarrier.type = ringCarrier.SINE; ringCarrier.frequency.value = 40; // ringCarrier.detune.value = 600; // , 10 var ngHigpass = context.createBiquadFilter(); ngHigpass.type = ngHigpass.HIGHPASS; ngHigpass.frequency.value = 10; // , ringCarrier.connect(ngHigpass); ngHigpass.connect(ringGain.gain); return ringGain; }; // AudioModulation.prototype.setFilters = function (source) { var fil = [{ gain: 1, frequency: 40 }, { gain: 3, frequency: 120 }, { gain: -2, frequency: 16000}], out = null, ln = fil.length; while (ln--) { var loc = fil[ln], currFilter = null; currFilter = context.createBiquadFilter(); currFilter.type = currFilter.HIGHSHELF; currFilter.gain.value = loc.gain; currFilter.Q.value = 1; currFilter.frequency.value = loc.frequency; if (!out) { source.connect(currFilter); out = currFilter; } else { out.connect(currFilter); out = currFilter; } } return out; };
Source: https://habr.com/ru/post/211905/
All Articles