@@ -8,22 +8,22 @@ The CV is split into 120 intervals, each corresponding to a permutation of the i | |||||
*/ | */ | ||||
function permutation(arr, k) { | function permutation(arr, k) { | ||||
var n = arr.length | |||||
let n = arr.length | |||||
// Clone array | // Clone array | ||||
arr = arr.slice(0) | arr = arr.slice(0) | ||||
// Compute n! | // Compute n! | ||||
var factorial = 1 | |||||
for (var i = 2; i <= n; i++) { | |||||
let factorial = 1 | |||||
for (let i = 2; i <= n; i++) { | |||||
factorial *= i | factorial *= i | ||||
} | } | ||||
// Build permutation array by selecting the j'th element from the remaining elements until all are chosen. | // Build permutation array by selecting the j'th element from the remaining elements until all are chosen. | ||||
var perm = [] | |||||
for (var i = n; i >= 1; i--) { | |||||
let perm = [] | |||||
for (let i = n; i >= 1; i--) { | |||||
factorial /= i | factorial /= i | ||||
var j = Math.floor(k / factorial) | |||||
let j = Math.floor(k / factorial) | |||||
k %= factorial | k %= factorial | ||||
var el = arr[j] | |||||
let el = arr[j] | |||||
arr.splice(j, 1) | arr.splice(j, 1) | ||||
perm.push(el) | perm.push(el) | ||||
} | } | ||||
@@ -35,14 +35,14 @@ config.bufferSize = 16 | |||||
function process(block) { | function process(block) { | ||||
// Get factorial index from input 6 | // Get factorial index from input 6 | ||||
var k = Math.floor(block.inputs[5][0] / 10 * 120) | |||||
let k = Math.floor(block.inputs[5][0] / 10 * 120) | |||||
k = Math.min(Math.max(k, 0), 120 - 1) | k = Math.min(Math.max(k, 0), 120 - 1) | ||||
// Get index set permutation | // Get index set permutation | ||||
var perm = permutation([1, 2, 3, 4, 5], k) | |||||
let perm = permutation([1, 2, 3, 4, 5], k) | |||||
display(perm.join(", ")) | display(perm.join(", ")) | ||||
for (var i = 0; i < 5; i++) { | |||||
for (let i = 0; i < 5; i++) { | |||||
// Permute input i | // Permute input i | ||||
for (var j = 0; j < block.bufferSize; j++) { | |||||
for (let j = 0; j < block.bufferSize; j++) { | |||||
block.outputs[i][j] = block.inputs[perm[i] - 1][j] | block.outputs[i][j] = block.inputs[perm[i] - 1][j] | ||||
} | } | ||||
} | } | ||||
@@ -1,21 +1,20 @@ | |||||
// Simplest possible script using all variables | |||||
// Simplest possible script using all variables, demonstrating buffering | |||||
// by Andrew Belt | // by Andrew Belt | ||||
config.frameDivider = 1 | |||||
config.bufferSize = 32 | |||||
function process(block) { | function process(block) { | ||||
// Loop through each column | // Loop through each column | ||||
for (let i = 0; i < 6; i++) { | for (let i = 0; i < 6; i++) { | ||||
// Get input | |||||
let x = block.inputs[i][0] | |||||
// Get gain knob | // Get gain knob | ||||
let gain = block.knobs[i] | let gain = block.knobs[i] | ||||
// Apply gain to input | |||||
let y = x * gain | |||||
// Set gain light (red = 0) | // Set gain light (red = 0) | ||||
block.lights[i][0] = gain | block.lights[i][0] = gain | ||||
// Check mute switch | // Check mute switch | ||||
if (block.switches[i]) { | if (block.switches[i]) { | ||||
// Mute output | // Mute output | ||||
y = 0 | |||||
gain = 0 | |||||
// Enable mute light (red = 0) | // Enable mute light (red = 0) | ||||
block.switchLights[i][0] = 1 | block.switchLights[i][0] = 1 | ||||
} | } | ||||
@@ -23,7 +22,14 @@ function process(block) { | |||||
// Disable mute light | // Disable mute light | ||||
block.switchLights[i][0] = 0 | block.switchLights[i][0] = 0 | ||||
} | } | ||||
// Set output | |||||
block.outputs[i][0] = y | |||||
// Iterate input/output buffer | |||||
for (let j = 0; j < block.bufferSize; j++) { | |||||
// Get input | |||||
let x = block.inputs[i][j] | |||||
// Apply gain to input | |||||
let y = x * gain | |||||
// Set output | |||||
block.outputs[i][j] = y | |||||
} | |||||
} | } | ||||
} | } |
@@ -1,28 +1,34 @@ | |||||
-- Simplest possible script using all variables, demonstrating buffering | |||||
-- by Andrew Belt | -- by Andrew Belt | ||||
config.frameDivider = 1 | |||||
config.bufferSize = 32 | |||||
function process(block) | function process(block) | ||||
-- Loop through each column | -- Loop through each column | ||||
for i=1,6 do | for i=1,6 do | ||||
-- Get input | |||||
x = block.inputs[i][1] | |||||
-- Get gain knob | -- Get gain knob | ||||
gain = block.knobs[i] | gain = block.knobs[i] | ||||
-- Apply gain to input | |||||
y = x * gain | |||||
-- Set gain light (red = 0) | |||||
-- Set gain light (red = 1) | |||||
block.lights[i][1] = gain | block.lights[i][1] = gain | ||||
-- Check mute switch | -- Check mute switch | ||||
if block.switches[i] then | if block.switches[i] then | ||||
-- Mute output | -- Mute output | ||||
y = 0 | |||||
-- Enable mute light (red = 0) | |||||
gain = 0 | |||||
-- Enable mute light (red = 1) | |||||
block.switchLights[i][1] = 1 | block.switchLights[i][1] = 1 | ||||
else | else | ||||
-- Disable mute light | -- Disable mute light | ||||
block.switchLights[i][1] = 0 | block.switchLights[i][1] = 0 | ||||
end | end | ||||
-- Set output | |||||
block.outputs[i][1] = y | |||||
-- Iterate input/output buffer | |||||
for j=1,block.bufferSize do | |||||
-- Get input | |||||
x = block.inputs[i][j] | |||||
-- Apply gain to input | |||||
y = x * gain | |||||
-- Set output | |||||
block.outputs[i][j] = y | |||||
end | |||||
end | end | ||||
end | end |
@@ -8,16 +8,16 @@ config.frameDivider = 256 | |||||
// From https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB | // From https://en.wikipedia.org/wiki/HSL_and_HSV#HSV_to_RGB | ||||
function hsvToRgb(h, s, v) { | function hsvToRgb(h, s, v) { | ||||
h *= 6 | h *= 6 | ||||
var c = v * s | |||||
var x = c * (1 - Math.abs(h % 2 - 1)) | |||||
var rgb; | |||||
let c = v * s | |||||
let x = c * (1 - Math.abs(h % 2 - 1)) | |||||
let rgb; | |||||
if (h < 1) rgb = [c, x, 0] | if (h < 1) rgb = [c, x, 0] | ||||
else if (h < 2) rgb = [x, c, 0] | else if (h < 2) rgb = [x, c, 0] | ||||
else if (h < 3) rgb = [0, c, x] | else if (h < 3) rgb = [0, c, x] | ||||
else if (h < 4) rgb = [0, x, c] | else if (h < 4) rgb = [0, x, c] | ||||
else if (h < 5) rgb = [x, 0, c] | else if (h < 5) rgb = [x, 0, c] | ||||
else rgb = [c, 0, x] | else rgb = [c, 0, x] | ||||
var m = v - c | |||||
let m = v - c | |||||
rgb[0] += m | rgb[0] += m | ||||
rgb[1] += m | rgb[1] += m | ||||
rgb[2] += m | rgb[2] += m | ||||
@@ -25,15 +25,15 @@ function hsvToRgb(h, s, v) { | |||||
} | } | ||||
var phase = 0 | |||||
let phase = 0 | |||||
function process(block) { | function process(block) { | ||||
phase += block.sampleTime * config.frameDivider * 0.5 | phase += block.sampleTime * config.frameDivider * 0.5 | ||||
phase %= 1 | phase %= 1 | ||||
for (var i = 0; i < 6; i++) { | |||||
var h = (1 - i / 6 + phase) % 1 | |||||
var rgb = hsvToRgb(h, 1, 1) | |||||
for (var c = 0; c < 3; c++) { | |||||
for (let i = 0; i < 6; i++) { | |||||
let h = (1 - i / 6 + phase) % 1 | |||||
let rgb = hsvToRgb(h, 1, 1) | |||||
for (let c = 0; c < 3; c++) { | |||||
block.lights[i][c] = rgb[c] | block.lights[i][c] = rgb[c] | ||||
block.switchLights[i][c] = rgb[c] | block.switchLights[i][c] = rgb[c] | ||||
} | } | ||||
@@ -6,22 +6,22 @@ | |||||
config.frameDivider = 1 | config.frameDivider = 1 | ||||
config.bufferSize = 16 | config.bufferSize = 16 | ||||
var phase = 0 | |||||
let phase = 0 | |||||
function process(block) { | function process(block) { | ||||
// Knob ranges from -5 to 5 octaves | // Knob ranges from -5 to 5 octaves | ||||
var pitch = block.knobs[0] * 10 - 5 | |||||
let pitch = block.knobs[0] * 10 - 5 | |||||
// Input follows 1V/oct standard | // Input follows 1V/oct standard | ||||
pitch += block.inputs[0][0] | pitch += block.inputs[0][0] | ||||
// The relationship between 1V/oct pitch and frequency is `freq = 2^pitch`. | // The relationship between 1V/oct pitch and frequency is `freq = 2^pitch`. | ||||
// Default frequency is middle C (C4) in Hz. | // Default frequency is middle C (C4) in Hz. | ||||
// https://vcvrack.com/manual/VoltageStandards.html#pitch-and-frequencies | // https://vcvrack.com/manual/VoltageStandards.html#pitch-and-frequencies | ||||
var freq = 261.6256 * Math.pow(2, pitch) | |||||
let freq = 261.6256 * Math.pow(2, pitch) | |||||
display("Freq: " + freq.toFixed(3) + " Hz") | display("Freq: " + freq.toFixed(3) + " Hz") | ||||
// Set all samples in output buffer | // Set all samples in output buffer | ||||
var deltaPhase = config.frameDivider * block.sampleTime * freq | |||||
for (var i = 0; i < block.bufferSize; i++) { | |||||
let deltaPhase = config.frameDivider * block.sampleTime * freq | |||||
for (let i = 0; i < block.bufferSize; i++) { | |||||
// Accumulate phase | // Accumulate phase | ||||
phase += deltaPhase | phase += deltaPhase | ||||
// Wrap phase around range [0, 1] | // Wrap phase around range [0, 1] | ||||