Last active
November 8, 2024 18:27
-
-
Save aike/0d7aabbc1039a1658d56d121e8220443 to your computer and use it in GitHub Desktop.
1D Perlin Noise Modulator for Cubase ModScripter
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| // | |
| // 1D Perlin Noise Modulator for Cubase ModScripter | |
| // by aike | |
| // MIT License | |
| // | |
| getDescription = function () { | |
| return "Perlin Noise"; | |
| } | |
| var x = 0; | |
| // params | |
| var speed = 0.01; | |
| var octaves = 1; | |
| var persistence = 0.5; | |
| processModulation = function (inputValue, numSamples) { | |
| x += speed * 0.003 + 0.0003; | |
| return inputValue + OctavePerlin(x, octaves + 1, persistence) - 0.5; | |
| } | |
| onParamChange = function(paramIndex, paramValue) { | |
| if (paramIndex == 1) { | |
| speed = paramValue; | |
| } | |
| if (paramIndex == 2) { | |
| octaves = Math.round(paramValue * 10); | |
| } | |
| if (paramIndex == 3) { | |
| persistence = paramValue; | |
| } | |
| } | |
| paramValueToString = function(paramIndex, paramValue) { | |
| if (paramIndex == 2) { | |
| return (paramValue * 5).toFixed(0); | |
| } | |
| if (paramIndex == 1 || paramIndex == 3) { | |
| return aramValue.toFixed(2) | |
| } | |
| } | |
| stringToParamValue = function(paramIndex, string) { | |
| if (paramIndex == 2) { | |
| value = parseInt(string); | |
| if (!isNaN(value)) { | |
| return value / 5; | |
| } | |
| } | |
| if (paramIndex == 1 || paramIndex == 3) { | |
| value = parseFloat(string); | |
| if (!isNaN (value)) { | |
| return value; | |
| } | |
| } | |
| } | |
| getParamStepCount = function (paramIndex) { | |
| if (paramIndex == 2) { | |
| return 5; | |
| } | |
| return 0; | |
| } | |
| getParamTitle = function (paramIndex) { | |
| if (paramIndex == 1) | |
| return "Speed"; | |
| if (paramIndex == 2) | |
| return "Octaves"; | |
| if (paramIndex == 3) | |
| return "Persistence"; | |
| } | |
| //////////////////////////////////////////////////////// | |
| var repeat = 256; | |
| function OctavePerlin(x, octaves, persistence) { | |
| var total = 0; | |
| var frequency = 1; | |
| var amplitude = 1; | |
| var maxValue = 0; | |
| for (var i = 0; i < octaves; i++) { | |
| total += perlin(x * frequency) * amplitude; | |
| maxValue += amplitude; | |
| amplitude *= persistence; | |
| frequency *= 2; | |
| } | |
| return total / maxValue; | |
| } | |
| var permutation = [ 151,160,137,91,90,15, | |
| 131,13,201,95,96,53,194,233,7,225,140,36,103,30,69,142,8,99,37,240,21,10,23, | |
| 190, 6,148,247,120,234,75,0,26,197,62,94,252,219,203,117,35,11,32,57,177,33, | |
| 88,237,149,56,87,174,20,125,136,171,168, 68,175,74,165,71,134,139,48,27,166, | |
| 77,146,158,231,83,111,229,122,60,211,133,230,220,105,92,41,55,46,245,40,244, | |
| 102,143,54, 65,25,63,161, 1,216,80,73,209,76,132,187,208, 89,18,169,200,196, | |
| 135,130,116,188,159,86,164,100,109,198,173,186, 3,64,52,217,226,250,124,123, | |
| 5,202,38,147,118,126,255,82,85,212,207,206,59,227,47,16,58,17,182,189,28,42, | |
| 223,183,170,213,119,248,152, 2,44,154,163, 70,221,153,101,155,167, 43,172,9, | |
| 129,22,39,253, 19,98,108,110,79,113,224,232,178,185, 112,104,218,246,97,228, | |
| 251,34,242,193,238,210,144,12,191,179,162,241, 81,51,145,235,249,14,239,107, | |
| 49,192,214, 31,181,199,106,157,184, 84,204,176,115,121,50,45,127, 4,150,254, | |
| 138,236,205,93,222,114,67,29,24,72,243,141,128,195,78,66,215,61,156,180 | |
| ]; | |
| var p = Array(512); | |
| for (var x = 0; x < 512; x++) { | |
| p[x] = permutation[x % 256]; | |
| } | |
| function perlin(x) { | |
| if(repeat > 0) { | |
| x = x % repeat; | |
| } | |
| var xi = Math.floor(x) & 255; | |
| var xf = x - Math.floor(x); | |
| var u = fade(xf); | |
| var aaa, baa; | |
| aaa = p[p[p[xi]]]; | |
| baa = p[p[p[(xi + 1) % repeat]]]; | |
| var x1 = lerp(grad(aaa, xf), grad(baa, xf - 1), u); | |
| return (x1 + 1) / 2; | |
| } | |
| function grad(hash, x) { | |
| switch (hash & 0xF) { | |
| case 0x0: return x; | |
| case 0x1: return -x; | |
| case 0x2: return x; | |
| case 0x3: return -x; | |
| case 0x4: return x; | |
| case 0x5: return -x; | |
| case 0x6: return x; | |
| case 0x7: return -x; | |
| case 0x8: | |
| case 0x9: | |
| case 0xA: | |
| case 0xB: return 0; | |
| case 0xC: return x; | |
| case 0xD: return 0; | |
| case 0xE: return -x; | |
| case 0xF: return 0; | |
| } | |
| return 0; | |
| } | |
| function fade(t) { | |
| return t * t * t * (t * (t * 6 - 15) + 10); | |
| } | |
| function lerp(a, b, x) { | |
| return a + x * (b - a); | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment