codeformat
This commit is contained in:
parent
1909caf769
commit
6ca99e33ab
4 changed files with 24 additions and 45 deletions
|
|
@ -1197,7 +1197,7 @@ const generic_params = [
|
||||||
];
|
];
|
||||||
// TODO: slice / splice https://www.youtube.com/watch?v=hKhPdO0RKDQ&list=PL2lW1zNIIwj3bDkh-Y3LUGDuRcoUigoDs&index=13
|
// TODO: slice / splice https://www.youtube.com/watch?v=hKhPdO0RKDQ&list=PL2lW1zNIIwj3bDkh-Y3LUGDuRcoUigoDs&index=13
|
||||||
|
|
||||||
controls.createParam = function(names) {
|
controls.createParam = function (names) {
|
||||||
const name = Array.isArray(names) ? names[0] : names;
|
const name = Array.isArray(names) ? names[0] : names;
|
||||||
|
|
||||||
var withVal;
|
var withVal;
|
||||||
|
|
@ -1221,7 +1221,7 @@ controls.createParam = function(names) {
|
||||||
|
|
||||||
const func = (...pats) => sequence(...pats).withValue(withVal);
|
const func = (...pats) => sequence(...pats).withValue(withVal);
|
||||||
|
|
||||||
const setter = function(...pats) {
|
const setter = function (...pats) {
|
||||||
if (!pats.length) {
|
if (!pats.length) {
|
||||||
return this.fmap(withVal);
|
return this.fmap(withVal);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -2,13 +2,7 @@ import reverbGen from './reverbGen.mjs';
|
||||||
|
|
||||||
if (typeof AudioContext !== 'undefined') {
|
if (typeof AudioContext !== 'undefined') {
|
||||||
AudioContext.prototype.generateReverb = reverbGen.generateReverb;
|
AudioContext.prototype.generateReverb = reverbGen.generateReverb;
|
||||||
AudioContext.prototype.createReverb = function(
|
AudioContext.prototype.createReverb = function (audioContext, duration, fade, revlp, revdim) {
|
||||||
audioContext,
|
|
||||||
duration,
|
|
||||||
fade,
|
|
||||||
revlp,
|
|
||||||
revdim
|
|
||||||
) {
|
|
||||||
const convolver = this.createConvolver();
|
const convolver = this.createConvolver();
|
||||||
convolver.setDuration = (d, fade, revlp, revdim) => {
|
convolver.setDuration = (d, fade, revlp, revdim) => {
|
||||||
this.generateReverb(
|
this.generateReverb(
|
||||||
|
|
@ -23,7 +17,7 @@ if (typeof AudioContext !== 'undefined') {
|
||||||
},
|
},
|
||||||
(buffer) => {
|
(buffer) => {
|
||||||
convolver.buffer = buffer;
|
convolver.buffer = buffer;
|
||||||
}
|
},
|
||||||
);
|
);
|
||||||
convolver.duration = d;
|
convolver.duration = d;
|
||||||
convolver.fade = fade;
|
convolver.fade = fade;
|
||||||
|
|
|
||||||
|
|
@ -12,9 +12,6 @@
|
||||||
// See the License for the specific language governing permissions and
|
// See the License for the specific language governing permissions and
|
||||||
// limitations under the License.
|
// limitations under the License.
|
||||||
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
|
|
||||||
var reverbGen = {};
|
var reverbGen = {};
|
||||||
|
|
||||||
/** Generates a reverb impulse response.
|
/** Generates a reverb impulse response.
|
||||||
|
|
@ -24,7 +21,7 @@ var reverbGen = {};
|
||||||
the impulse response has been generated. The impulse response
|
the impulse response has been generated. The impulse response
|
||||||
is passed to this function as its parameter. May be called
|
is passed to this function as its parameter. May be called
|
||||||
immediately within the current execution context, or later. */
|
immediately within the current execution context, or later. */
|
||||||
reverbGen.generateReverb = function(params, callback) {
|
reverbGen.generateReverb = function (params, callback) {
|
||||||
var audioContext = params.audioContext || new AudioContext();
|
var audioContext = params.audioContext || new AudioContext();
|
||||||
var sampleRate = params.sampleRate || 44100;
|
var sampleRate = params.sampleRate || 44100;
|
||||||
var numChannels = params.numChannels || 2;
|
var numChannels = params.numChannels || 2;
|
||||||
|
|
@ -42,7 +39,7 @@ reverbGen.generateReverb = function(params, callback) {
|
||||||
chan[j] = randomSample() * Math.pow(decayBase, j);
|
chan[j] = randomSample() * Math.pow(decayBase, j);
|
||||||
}
|
}
|
||||||
for (var j = 0; j < fadeInSampleFrames; j++) {
|
for (var j = 0; j < fadeInSampleFrames; j++) {
|
||||||
chan[j] *= (j / fadeInSampleFrames);
|
chan[j] *= j / fadeInSampleFrames;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -57,7 +54,7 @@ reverbGen.generateReverb = function(params, callback) {
|
||||||
@param {number} min Minimum value of data for the graph (lower edge).
|
@param {number} min Minimum value of data for the graph (lower edge).
|
||||||
@param {number} max Maximum value of data in the graph (upper edge).
|
@param {number} max Maximum value of data in the graph (upper edge).
|
||||||
@return {!CanvasElement} The generated canvas element. */
|
@return {!CanvasElement} The generated canvas element. */
|
||||||
reverbGen.generateGraph = function(data, width, height, min, max) {
|
reverbGen.generateGraph = function (data, width, height, min, max) {
|
||||||
var canvas = document.createElement('canvas');
|
var canvas = document.createElement('canvas');
|
||||||
canvas.width = width;
|
canvas.width = width;
|
||||||
canvas.height = height;
|
canvas.height = height;
|
||||||
|
|
@ -71,7 +68,7 @@ reverbGen.generateGraph = function(data, width, height, min, max) {
|
||||||
gc.fillRect(i * xscale, height - (data[i] - min) * yscale, 1, 1);
|
gc.fillRect(i * xscale, height - (data[i] - min) * yscale, 1, 1);
|
||||||
}
|
}
|
||||||
return canvas;
|
return canvas;
|
||||||
}
|
};
|
||||||
|
|
||||||
/** Saves an AudioBuffer as a 16-bit WAV file on the client's host
|
/** Saves an AudioBuffer as a 16-bit WAV file on the client's host
|
||||||
file system. Normalizes it to peak at +-32767, and optionally
|
file system. Normalizes it to peak at +-32767, and optionally
|
||||||
|
|
@ -85,7 +82,7 @@ reverbGen.generateGraph = function(data, width, height, min, max) {
|
||||||
is truncated at that point. This is expressed as an integer,
|
is truncated at that point. This is expressed as an integer,
|
||||||
applying to the post-normalized and integer-converted
|
applying to the post-normalized and integer-converted
|
||||||
buffer. The default is 0, meaning don't truncate. */
|
buffer. The default is 0, meaning don't truncate. */
|
||||||
reverbGen.saveWavFile = function(buffer, name, opt_minTail) {
|
reverbGen.saveWavFile = function (buffer, name, opt_minTail) {
|
||||||
var bitsPerSample = 16;
|
var bitsPerSample = 16;
|
||||||
var bytesPerSample = 2;
|
var bytesPerSample = 2;
|
||||||
var sampleRate = buffer.sampleRate;
|
var sampleRate = buffer.sampleRate;
|
||||||
|
|
@ -124,23 +121,22 @@ reverbGen.saveWavFile = function(buffer, name, opt_minTail) {
|
||||||
dataView.setUint32(4, fileBytes - 8, true); // file length
|
dataView.setUint32(4, fileBytes - 8, true); // file length
|
||||||
dataView.setUint32(8, 1163280727, true); // "WAVE"
|
dataView.setUint32(8, 1163280727, true); // "WAVE"
|
||||||
dataView.setUint32(12, 544501094, true); // "fmt "
|
dataView.setUint32(12, 544501094, true); // "fmt "
|
||||||
dataView.setUint32(16, 16, true) // fmt chunk length
|
dataView.setUint32(16, 16, true); // fmt chunk length
|
||||||
dataView.setUint16(20, 1, true); // PCM format
|
dataView.setUint16(20, 1, true); // PCM format
|
||||||
dataView.setUint16(22, numChannels, true); // NumChannels
|
dataView.setUint16(22, numChannels, true); // NumChannels
|
||||||
dataView.setUint32(24, sampleRate, true); // SampleRate
|
dataView.setUint32(24, sampleRate, true); // SampleRate
|
||||||
var bytesPerSampleFrame = numChannels * bytesPerSample;
|
var bytesPerSampleFrame = numChannels * bytesPerSample;
|
||||||
dataView.setUint32(28, sampleRate * bytesPerSampleFrame, true); // ByteRate
|
dataView.setUint32(28, sampleRate * bytesPerSampleFrame, true); // ByteRate
|
||||||
dataView.setUint16(32, bytesPerSampleFrame, true); // BlockAlign
|
dataView.setUint16(32, bytesPerSampleFrame, true); // BlockAlign
|
||||||
dataView.setUint16(34, bitsPerSample, true); // BitsPerSample
|
dataView.setUint16(34, bitsPerSample, true); // BitsPerSample
|
||||||
dataView.setUint32(36, 1635017060, true); // "data"
|
dataView.setUint32(36, 1635017060, true); // "data"
|
||||||
dataView.setUint32(40, sampleDataBytes, true);
|
dataView.setUint32(40, sampleDataBytes, true);
|
||||||
for (var j = 0; j < numSampleFrames; j++) {
|
for (var j = 0; j < numSampleFrames; j++) {
|
||||||
for (var i = 0; i < numChannels; i++) {
|
for (var i = 0; i < numChannels; i++) {
|
||||||
dataView.setInt16(44 + j * bytesPerSampleFrame + i * bytesPerSample,
|
dataView.setInt16(44 + j * bytesPerSampleFrame + i * bytesPerSample, Math.round(scale * channels[i][j]), true);
|
||||||
Math.round(scale * channels[i][j]), true);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var blob = new Blob([arrayBuffer], { 'type': 'audio/wav' });
|
var blob = new Blob([arrayBuffer], { type: 'audio/wav' });
|
||||||
var url = window.URL.createObjectURL(blob);
|
var url = window.URL.createObjectURL(blob);
|
||||||
var linkEl = document.createElement('a');
|
var linkEl = document.createElement('a');
|
||||||
linkEl.href = url;
|
linkEl.href = url;
|
||||||
|
|
@ -159,7 +155,7 @@ reverbGen.saveWavFile = function(buffer, name, opt_minTail) {
|
||||||
@param {number} lpFreqEndAt
|
@param {number} lpFreqEndAt
|
||||||
@param {!function(!AudioBuffer)} callback May be called
|
@param {!function(!AudioBuffer)} callback May be called
|
||||||
immediately within the current execution context, or later.*/
|
immediately within the current execution context, or later.*/
|
||||||
var applyGradualLowpass = function(input, lpFreqStart, lpFreqEnd, lpFreqEndAt, callback) {
|
var applyGradualLowpass = function (input, lpFreqStart, lpFreqEnd, lpFreqEndAt, callback) {
|
||||||
if (lpFreqStart == 0) {
|
if (lpFreqStart == 0) {
|
||||||
callback(input);
|
callback(input);
|
||||||
return;
|
return;
|
||||||
|
|
@ -173,7 +169,7 @@ var applyGradualLowpass = function(input, lpFreqStart, lpFreqEnd, lpFreqEndAt, c
|
||||||
lpFreqStart = Math.min(lpFreqStart, input.sampleRate / 2);
|
lpFreqStart = Math.min(lpFreqStart, input.sampleRate / 2);
|
||||||
lpFreqEnd = Math.min(lpFreqEnd, input.sampleRate / 2);
|
lpFreqEnd = Math.min(lpFreqEnd, input.sampleRate / 2);
|
||||||
|
|
||||||
filter.type = "lowpass";
|
filter.type = 'lowpass';
|
||||||
filter.Q.value = 0.0001;
|
filter.Q.value = 0.0001;
|
||||||
filter.frequency.setValueAtTime(lpFreqStart, 0);
|
filter.frequency.setValueAtTime(lpFreqStart, 0);
|
||||||
filter.frequency.linearRampToValueAtTime(lpFreqEnd, lpFreqEndAt);
|
filter.frequency.linearRampToValueAtTime(lpFreqEnd, lpFreqEndAt);
|
||||||
|
|
@ -181,7 +177,7 @@ var applyGradualLowpass = function(input, lpFreqStart, lpFreqEnd, lpFreqEndAt, c
|
||||||
player.connect(filter);
|
player.connect(filter);
|
||||||
filter.connect(context.destination);
|
filter.connect(context.destination);
|
||||||
player.start();
|
player.start();
|
||||||
context.oncomplete = function(event) {
|
context.oncomplete = function (event) {
|
||||||
callback(event.renderedBuffer);
|
callback(event.renderedBuffer);
|
||||||
};
|
};
|
||||||
context.startRendering();
|
context.startRendering();
|
||||||
|
|
@ -192,7 +188,7 @@ var applyGradualLowpass = function(input, lpFreqStart, lpFreqEnd, lpFreqEndAt, c
|
||||||
/** @private
|
/** @private
|
||||||
@param {!AudioBuffer} buffer
|
@param {!AudioBuffer} buffer
|
||||||
@return {!Array.<!Float32Array>} An array containing the Float32Array of each channel's samples. */
|
@return {!Array.<!Float32Array>} An array containing the Float32Array of each channel's samples. */
|
||||||
var getAllChannelData = function(buffer) {
|
var getAllChannelData = function (buffer) {
|
||||||
var channels = [];
|
var channels = [];
|
||||||
for (var i = 0; i < buffer.numberOfChannels; i++) {
|
for (var i = 0; i < buffer.numberOfChannels; i++) {
|
||||||
channels[i] = buffer.getChannelData(i);
|
channels[i] = buffer.getChannelData(i);
|
||||||
|
|
@ -202,7 +198,7 @@ var getAllChannelData = function(buffer) {
|
||||||
|
|
||||||
/** @private
|
/** @private
|
||||||
@return {number} A random number from -1 to 1. */
|
@return {number} A random number from -1 to 1. */
|
||||||
var randomSample = function() {
|
var randomSample = function () {
|
||||||
return Math.random() * 2 - 1;
|
return Math.random() * 2 - 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -109,20 +109,12 @@ function getDelay(orbit, delaytime, delayfeedback, t) {
|
||||||
let reverbs = {};
|
let reverbs = {};
|
||||||
|
|
||||||
function getReverb(orbit, duration = 2, fade, revlp, revdim) {
|
function getReverb(orbit, duration = 2, fade, revlp, revdim) {
|
||||||
|
|
||||||
// If no reverb has been created for a given orbit, create one
|
// If no reverb has been created for a given orbit, create one
|
||||||
if (!reverbs[orbit]) {
|
if (!reverbs[orbit]) {
|
||||||
const ac = getAudioContext();
|
const ac = getAudioContext();
|
||||||
const reverb = ac.createReverb(
|
const reverb = ac.createReverb(getAudioContext(), duration, fade, revlp, revdim);
|
||||||
getAudioContext(),
|
|
||||||
duration,
|
|
||||||
fade,
|
|
||||||
revlp,
|
|
||||||
revdim,
|
|
||||||
);
|
|
||||||
reverb.connect(getDestination());
|
reverb.connect(getDestination());
|
||||||
reverbs[orbit] = reverb;
|
reverbs[orbit] = reverb;
|
||||||
console.log(reverbs[orbit]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (
|
if (
|
||||||
|
|
@ -131,14 +123,11 @@ function getReverb(orbit, duration = 2, fade, revlp, revdim) {
|
||||||
reverbs[orbit].revlp !== revlp ||
|
reverbs[orbit].revlp !== revlp ||
|
||||||
reverbs[orbit].revdim !== revdim
|
reverbs[orbit].revdim !== revdim
|
||||||
) {
|
) {
|
||||||
reverbs[orbit] = reverbs[orbit].setDuration(
|
reverbs[orbit] = reverbs[orbit].setDuration(duration, fade, revlp, revdim);
|
||||||
duration, fade, revlp, revdim
|
|
||||||
);
|
|
||||||
reverbs[orbit].duration = duration;
|
reverbs[orbit].duration = duration;
|
||||||
reverbs[orbit].fade = fade;
|
reverbs[orbit].fade = fade;
|
||||||
reverbs[orbit].revlp = revlp;
|
reverbs[orbit].revlp = revlp;
|
||||||
reverbs[orbit].revdim = revdim;
|
reverbs[orbit].revdim = revdim;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return reverbs[orbit];
|
return reverbs[orbit];
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue