{ "name": "twinkling random colors", "id": "SjRfgcSSYXWAunFjZ", "sources": { "main": "/* \n Static random colors\n \n What if you need a sequence of random numbers? Well, you could set up a loop\n that runs once and populates an array with random values. \n \n var a = array(n)\n for(i = 0; i < n; i++) a[i] = random(1)\n \n They would be a different sequence of random values each time you restarted\n the pattern. But what if you need to be able to access the same sequence of\n random numbers each time you run your program? You need a pseudorandom number\n generator (PRNG) that accepts a seed. The same random sequence is repeatably\n generated when the PRNG is given a particular seed. \n\n This pattern generates random colors each time it's loaded. With a simple\n tweak, it can render the same random sequence on each restart.\n*/\n\n// This seed will be set to a random value each time the pattern is loaded.\n// Change to a constant to freeze a particular pseudorandom sequence.\nvar seed = random(0xffff) \n\n// 16 bit xorshift from \n// http://www.retroprogramming.com/2017/07/xorshift-pseudorandom-numbers-in-z80.html\nvar xs\nfunction xorshift() {\n xs ^= xs << 7\n xs ^= xs >> 9\n xs ^= xs << 8\n return xs\n}\n\n// Return a pseudorandom value between 0 and 1\nfunction pseudorandomFraction() {\n return xorshift() / 100 % 1\n}\n\nexport function beforeRender(delta) {\n /*\n Reset the initial shift register for each render frame so that each frame\n renders the same random sequence. Need repeatability across power cycles?\n Set this to a particular constant. Like 42.\n */\n xs = seed \n \n t1 = time(5.4 / 65.536) // Used to fade each pixel in and out\n}\n\nexport function render(index) {\n h = pseudorandomFraction()\n\n /*\n s will be a different random 0..1 value from h, and is not correlated with\n the prior output, but it is dependent on the state of the shift register\n that just generated h. Each result from pseudorandomFraction() is random,\n yet dependent on the seed and all prior states of the shift register.\n\n Put another way, you'll see there are three calls to pseudorandomFraction(),\n so each one is consuming a value from the deterministic random sequence,\n then on the next render() they consume the next three values, etc.\n */ \n s = pseudorandomFraction()\n\n // Adjust saturation to favor vibrant colors, but still allow whites/pastels\n s = 1 - s * s * s \n\n // Each pixel is faded in and out with a random phase. To make it truly\n // static, set v to be 1.\n v = wave(t1 + pseudorandomFraction())\n \n hsv(h, s, v * v)\n}\n" }, "preview": "/9j/4AAQSkZJRgABAQAAAQABAAD/4gIoSUNDX1BST0ZJTEUAAQEAAAIYAAAAAAIQAABtbnRyUkdCIFhZWiAAAAAAAAAAAAAAAABhY3NwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAA9tYAAQAAAADTLQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAlkZXNjAAAA8AAAAHRyWFlaAAABZAAAABRnWFlaAAABeAAAABRiWFlaAAABjAAAABRyVFJDAAABoAAAAChnVFJDAAABoAAAAChiVFJDAAABoAAAACh3dHB0AAAByAAAABRjcHJ0AAAB3AAAADxtbHVjAAAAAAAAAAEAAAAMZW5VUwAAAFgAAAAcAHMAUgBHAEIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAAAABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+EAAC2z3BhcmEAAAAAAAQAAAACZmYAAPKnAAANWQAAE9AAAApbAAAAAAAAAABYWVogAAAAAAAA9tYAAQAAAADTLW1sdWMAAAAAAAAAAQAAAAxlblVTAAAAIAAAABwARwBvAG8AZwBsAGUAIABJAG4AYwAuACAAMgAwADEANv/bAEMAAwICAwICAwMDAwQDAwQFCAUFBAQFCgcHBggMCgwMCwoLCw0OEhANDhEOCwsQFhARExQVFRUMDxcYFhQYEhQVFP/bAEMBAwQEBQQFCQUFCRQNCw0UFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFBQUFP/AABEIAJYAZAMBIgACEQEDEQH/xAAdAAACAwEBAQEBAAAAAAAAAAAGBwAFCAQDAQIJ/8QAYxAAAAMGAQcDDAoJDg8AAAAAAQIDAAQFBgcRCBITFCExkcFxksIJFSJBUVNhgaSl0dIWIyUyM1JUhaGiJCYnQkOChKOmGERFYmNyc3WDk5SxtMMoNDZGR1VXZWZnhpWWtuH/xAAbAQEBAAMBAQEAAAAAAAAAAAAGBQMEBwECAP/EAEgRAAAFAQIKBQkFAw0AAAAAAAABAgMEBRESBiEiUWFisbKz0RNjcqHBJDRScXORoqPDJTNBtMIUgvAjMTI1QlNkdIGD0tPh/9oADAMBAAIRAxEAPwDK1QFfuQzkIBfIdHA/OOgRr1IwIYQjH7akJPr/AJsrD81lF8pJPqZdZgg0IUAOV9RK1xEVMxg0hw7M5ClP7UQvBnlYO9UXyzm/3tSuYUVwrFK9knjt8w5phVztIppDu1Df1t7mqyqr9FbzHLatw/yvfjX+Z4QHFmI/vWdpVMpb7ZteFt7ooyIr9Fcl8ltW9wGan0bh/FcEKDBX27KbCTrK/KQwZwkaxQy15vEb5DR2J10FClYGAAu7xyIrfnXkOgz6ra7Ati5p+v3iZ4ufdCIX6rJ/FS7WpTHgt8C8vyu98iReizuqomDziRgLx8njUcUv3LQhy9VqNaxtSizOPbUcxkq2J5o+uc4aQnndyBeoM3Da+XHI2bmTDCi8GR0KII0poq8BsNUaw6ttnt5H+sgNoqAO+en2Pjb4SKTOfmzNDw6LICDpfcAosv3KhqG3Lv48G26Aq9AUnSnfVzBWuq6OalGZLO5JCSxBlEhzFABGyUXSsH7WPrG4s7oF2NMKYJ/KZQf0+Wzu9+syexCoAESWJb9dTEnzYmc/Fm5BTfaVQlPv8vxJLydT1m13l3YMg8xp+oPaW3bAh2/37J/CsW9Anfre61LIP38Omwea8Q8eLe9PxFzpJSt4EMnJlCNojftDcprfS3VT9262vE+hsA0Knb6FIWPFuNxNoNBKdK7MiERxDyZM3FokpN5qJ7RfAMb9RyqLKLOUU/ehJi6eYZ16fokrbKzcSf0/LFh6TRiqlcO69uEwrWysiPxAl/5YR6TRp0XE3/qreMK5mVJdPWVtMZjTu/U8nxK3+bkCPvjCJW7oqoIYRJPTDas45O+KFK3jJaQv8lzmQAuJpXgA25I+gHFv2/8AZ4Y6aO/fXO1vnsQ4N0arL8ucXodP3tP8xVrVhrWXVN8VowwSv2cprHyX2xcVt7qo2f64vukQ6AK397MT6fzfBg4M3nGIZciRol9opLb3czIKqz4LzKkNOA9kWLPp7/kcKDgx2am7DiFmUf5aKXgJ+EDN44hZlzO9wuQ37inSvSmextfMuz0rvicZL0Wb05H0qsDw9bdHe48pfue5SIdFlTiaKC1K6pB3uDLKb41Hi8GZD286ZNM4PV76OSPqX7nuYYOi2SrHeTMLrXNrQjVf7xo+vc4aAISanlzs+X1515nJTX4JpdfVbPcGABwvUdW+LPS59x4mPBtESMYBnN0HvqE8K7poTHotnmXiithEpaqA/ATa8rDui7ZMGz8mWnSW9/6CGEyrKkfYZ3ZQU1fkM5MCpO7GJrT5qwH4sxYGoAwDDQmOoVnKKI2/kC6vrMKVscQeI48HsA5E0TenyWdiHt9LEsDLb9Syle9niKu9+77W7B0mmzXSTAllms2OGENLZIoEQ8zjZ+5DgYua62vM6drKhs8h9WFCw7MSmhYbJMU2Zs8bd/NyRmKqgFCGvczhsy3CeQ/MQoWCaqK6HhYggh+Djkad98HRFvFJvtRe2fBMakw7aW8nO3DP5aQ+sJzj16lCblrZWTNUQJ9JB4tGvOp8u4RemM7re+yZzfy/mnceLRozWJBEFzuU6s9J7RjihKQxKX5lSHshPKMFHX27TE7tXkNl0Po4699QEP0hUDg1/hRdxf04snqEqkowwADwlmJ29LDcNMKskUFccnslExuHJMizM6s7aTruqrhO8xRqi7zrhdW3vNGP3CYjlSpFCX2w11V3oj6WS85KC+SK4qhryX56MPjRh4X+ox9BIkPWN/TMa5vY84qD40wBgUyYvVM3U46zAD0oI27eQkHQbVqeTFY0H9FgvAZawm8pnQqV3uK5D+iGIJUHimVYy3uJJZMpvmCYA4MXwB+0xxqq9XvmIfHD37l3B4Dosv6yLaRTitxttpOAf0lmD0tdU3iWl0+ro83vmYLGD35XR+DotinneKb7Zf0AUquMmj69zhoHXIjz9t0vD32Dz4rumUw9FkVKntmDKSzd5i7yt9SKizhkx5BKapJsPwkqz0rvj65uDJqRz53BbCf3DPr8ntcT9LZMHMSHC0lvEBeEp3pji9Rndkgdqc5aS+xJS17TnORfNKR26IIPutheT+LMMUQ/sIcWtJrcdId4wrbbPc5B+jqJuDU0DP8AbbhqTD8HO8RRHwe2Q4OLGak7ZGmp0H3IVzDmK30cBksy07iuYaVfAFweY4fYAu06EH8ZxhZuDL6uiuj4W3UofeTxFnfkvA0RZgYrjaIhFjBqyvZQTnwuHjwZbYhlAJhlfSX1o1NiSXJeBoNaZymmdB/RUD8jHDSn0mYfDSNa9SzTGI0Vn1UQuHs5fwD+jOg8WjdHUiQB4w+zuptyp4fhv+SObRopfzEFxY8YyNghd9Mf83a+dlhAvNj7mPFg2VQ0iIYe3PtmIpq/6ieh4Mwup8pA9zDCiWvnICuTmRlxMy8pxd5qfh2c9oZK2r5+fR4NZrDl2lSXsyD4Tg+pjl6Qr2bf0gsoe95tB/LfbLLj9BS+luaXXMXumRCB8keTbxVDoNWg+Zs74W+r2NOobsz6WMabOQvchlJa4dalTh4zv/qNlqy/JE6CI/gbLwFaprtV6jeP3uLGvahvWl0zrYADcTSYH/s0b9ZvlF4qLxRHEY8AICZOXIkYL+F3iQcGo44/6VTesYXvlSeUP0mivrNWYb4rpeHnEqcR1hLj0G8sULwbyQd5Eo87ytkcFagVrLSuuXuIBxLj/mplpwN7ZciTopzos9m4Mr5CUEcGL+QNYu8HWWsP8E/+lipwiOYmClg399Teaj858fzcGDqZnzuE+bkO8yodW3cum9es21QiudJ2k7SA2tJ6Rt13UZ3XwTvjlpcsxdcO1Pc4CPjlZMWBpfC870JEB1u9SnxHxGeoUDNOCO2l02jq1r2naaxvyykQWVsrhlz1TEPk1V1y8n2dCmCVNeTMTqq7my5h86fRQPU4kvDxDKxnKg7w59Ne2U8xknPgzmPBljiRUBLDrMpNglq4+kDxwZAvBj3HE9AlAlT/ABom8k58CRHosAYiyaRRSbEB2FrI8AIeAYakXgy2Mqxgjzf9Rgu7YbUVJ/2mYnclsvEbE6js85eGubTjqE85vZt7m5NGrOpBL6JhmmDtZybHo/kjmHBo0lVl47ArbVakjGfOpvkBWcZTJ32FxMvNiMPNxZX0bu8YiMPLsA9iArhb54iJuAM2epqkvPUgh8d2jyfNWhp2VOHwukYrqDpDrAgvOrkiMRM21XcnBmoueiky+W5yGq4u2UZaie4mwg4ipmHqJpa7pwNBIb+DMs6KMwrOSsKdhG0FOGvwKxj1WTE1l0d7i42/AAju0b0tpiiEKvDBSybe4p9Vv3SPehvqouXoSz1C/SKc97KdLUdP5h8wWOz1plNKmiAhlLyxmr8kyPg/3jD2F2JCbDriU1hY0uFtymGKelv1KT8LzTOcNetaDHS5bR8w9NhjCq8Ww5YgEb2FWAuiV+Uz+HSbMpVsd9R/i8rdYEmXlRmvaKP4UA6eYlmI5Scb2vS6Pm5x4gZq2ka2cw6VIQ71IpVN5Dh0mpI5FBJGKSn2fcpiIiHcy0IgZuyja96OVed+9U5SPblzYdJrFLSaCWeujafIE5iekpTrmozuu8w7pEdwXolHVwD302TIoI8so24MnJJEFZ5gQgOtzq8co+C8QhvoZ30tICuHCMrd2PRxXnSsoXgyRkEmTOMSN8mq8U3JeJOIdFua1A7XJSc6XOGjmGVRVchPFmfQXxpLxBJjeVz8rKGv+zTsH85AC+hhWtg6TTmeEPi1hUG3K7Jla6xhPGlSY8DttHoKHPgRvQ1NU4oPEuTwiAazVXFQfDcwE4MvZVdiqP8Aj7kwbkFY3T9LUcvcbBeI0r1LF8CHYbH8o6s5MLyp+Ydw4NGHup6RIIVh6TJe2cia6n1Ew4NG0jLKV6z2mFCDsTYALqbZRQnymhTBYTKzQmP4qUNOyqwzFBTGLRdMNYJi9D5RED8Wa/U/B0WoVLe0AxGbya/BD4YZlZhaDLxn0t/ctL8XYPxm28I02YJVjRe7m3+QlmozlkWpsuBC1DQFFeMG2AD88I83Rm17Q+GZLzmRL+wptX40xDwbLNVnTMucfPstM7+huKg206NQwEpjTTydZoSJfqzELSZDt+mLPU/4n4j6nPZb3snd9PMI6nD7naYRPX8O7rp+enc3TalwuPObotWh3EbCq5QxO375R69YG8qTvwqUth4jcBeF3lPdEoYbpt54dru0hVFSvqeusaYBymN67VVHZCcM/wAXVbrPIbLuOM2WsexA+z2+aLHqYDcQzVK1A1ftnCIDxYroornZUrY5DrtTV11drWo6h0mAKnr5EckQb/B00QT50Meh6TGlCTiLzW93Eb3p24lAB/h4aHSZZGTdZNXWN7XOQOpTfwbcWfos7jg0lR42XhUiavdfomrzpdeC8GSkhlvMc9H7TtVRBTkvFHf1WcVGFv8ABBfj32keledB3wnBlFTkucitYj2vo9RHZXk90g1/VblkpN6Q+WdDm42LdYXZFkl/i2y+agcOJxcYhIb2IdlkzFK1/wAaCK+huiYiaaeckNuVUIy1vy05eDVNXluuVPYwO3Ij0mDvhDwDXjinp0yzOjty5rMvb53WLf6GQmq7FX6z4JiPNOyPTjzJbL3KjA+wkRAYFRKFICIFEyyx9X7+3RaML0uiPWSnEvo3yctNY9vylUODRsacpSz1175hOs7q1FpPaLHBEfQp3pcbZ7uTkTzLDTMssKBAPjEklUb+0Eeh8kfDcWYWFNbrdNdMziNrTLOJQ1/8OQ83BgfCcW2KCFL7AQK8eL3MeDdJreEiLMFq2jS6XublchLVilJVqK3kkFZWVxyYLMJsm/3QYqgPiIiPBtv0wccxObmna2U5HJ+YmAeLZDrNDrSvM57bKrRxLcimLbZk91B1qPDk7WASqkt+SRsekwwzto5nnQfchs/ER57hkbij/Fp7uWzzGEaVPOTTaVSgbUeNPyIhbtg9QQ3Sa7pMkWFw+NulskHiJQBAA8aFg+uw1TkooU1kIb2z02v5PrwA3FjeW3PQ5qc3S1tImSAJ27tgh49JkDuTAP2i91vkErn3aE6T/SAKrK+RHJU7WbkKGp86FKj0mPqHHyZyrAhb4SQXAvlkHDiy/rWmITS6F7bvKkHSDX2xhYBb67H1FAEtS6nl7Sknw5HzhBgZq15kSusa2viNGTbguoj9FnccD+ow85vBovcbj1sMpcfC5P5ODL6nRMgte1O9zY7L+cVh6LFVK3zMYPFi3t7gJn39cicGGJA7GG4iT21FiLo8X/L34ei3NlNXn3D1VbrY/Vdy8xIPPOaL5qAExl46502mYb5QkjEjGHxw54KxhIRdMqFGEtoKRBR48/vJeDAcoCEWpzOxtZgK/wAim19qzm8hxZgUcSB6q2uG3OuSq+6ZXsG2njNMX1rVwDGtUsmFDP0bC+ZGFI/xDrJLcqoXycpwXP5c9BwaMN1ofjQj2HIAOTeErm2/7zfg4NG+o529Ieu5xFBRJyX3C1lbTDGoWpoEWp4rszc0zcO+WHFhnCwTNVvO997TeRv8zKDxa5p+voCcoq7M3M0zDzpYcvQ1VhuDMTpE3zZm3d5G/wAyj6WXYStW0WtNZ1v9zcwacpN19J6iuKRCrrRD/tJmw9tlZo+nudyjwbYLgQHWqkHLsu8rk8gio9Jsv1jcsunc4HANlcphL5J/8bT8UUB1q1AQ2XibwTzY+j025yRfYqNKVcGOfiClVO6ktLcjuVH5j+f0oBmaZ0r7WcnaIl/Ny+LM94ctCrLKLpa2fnGCp25EYQPSZcppGc5CpMAAAFCoUVTH+jQAQ/qZyVBcwh+JulTrbJF4nuGF5cl2gfrMnnJuQT7buxJBk/iNKdJ7EhKVpQA05xELDdGFwN31hq/xF0D+8Yyo72FUp2Dv0FhyPL7owRqqr8Py53mULayBBk9zvDS8WuKWkzFUYqb5Si4JbopBQ4MwYK2mXusa3nxJYycHyRnSzw3QxJEf8xhKOS9rys7m3vkUI3lJJciVMQ63xkHZbc9xMeDUkGfNBwyGdwEdUou23+OIqRruVzZqnFe1QC4ngSS4eGy0XHgw1tq1az0H3knkJU5fSR1mX4z2eIR+AXVFC6dTmoQbcl6k03NQXLxZj4fCaRVqGiOvOy29LbpnemXmGQunSFU0u3JNLB+YCoMxsNQCeq8rj96pIr8sP/k7006cd2Mgs7i+ANiql9moV6Ki345+AR+Lx8XhcySWikYCl6xrjYSgOvrxEg4NG+42081O0oE7kDeQ88xNo33DxoWeu5xFBTOxS3i11bxhmOS+gQSBqXtkTFHTc6WnUODedBjZh2mJ72ZDouN/mUnpbnja2iyQmrszMXiSnOgTsVvekX2NTaYn0R7I0OWMJvD1oTK3QcIm7Y9VazrkcOaPai3dWR5mz73yBlV1yy6WTea3+nKYh8kMztnd60arMtje1469E80qD02VdUXbOUjnEf8AndHzb3M7G9VX8HeqcsGva8zPhfM6frty9KLKLH0kr8rEPxAmuouts6Uyy9y44yrM0PB2p1SkbWyaiRUfJoP6rPCr0KzGMSiydrZU+u30OMBFllUxx0OnFNdVsioMVN5PD/UZ91zhuaxr0RJbbPt+bDYCLKKqm7DWWZb3gFszJeQWuovhSM8VQcM7Ps6Bb3j9DE93WkvFvkhpCnOzgsAiGfiMPQ1dv3WhXqsST7DTLVBn/sdkcdCByFeYKXiLU8npZEXlJfv0yuaV+SKOI9FksJV6lfvt7z4jqV0dPba0Mbj/ACFY/vWh0OXSva8ou5d0wxYvFjyXBtS+r1/1xKBFA8NjRkeDKme30XOk6qRR1+xkpLX7kzxIOLNaBABaSTqp23qRzGv3bFjA8Whst2NrV6v47hBvdJFbPPOYP4jMAuDtAV5IqqJtZgShFw7mbUEOkzIwyIgE+SG8W1q05iI35JjeDcWCMGTtkydVcgh+tyG5i5A4seYaRtFKYvAhbOU0io7o2qbixqolbHj6XXOAYtVUvsV1WZaO82j8AiMc4ZNQ5YL8WDvQeeom0bvxswdaJVHgZ0zABSQ57T1gP+uIiPFo3sEy6JXbc4ignqKT/bX+2reMX09KGSpdFzlEQMm8vBwEO6aFu5WsJJU0PD3H3kAuYISsNvm9MGjRun10iN6eWvI4U0bVX/pf7X10hu1CIClHpvv/ALY42fe5KN+62v5kqjysYL39lb6HmZz9Zo0bmBkRUiJ+9+UhgThERXIvrm8RgL+t7iCVNpGMUQ9qnmKqW7vtKAdEGfuIF1KTHFRIO5PL0bmwqBjwaNGQ1nzV7tvbSCGoecI9ovcSFJM7gVeoU/Xtrj4/VicGKDAstkAjlTlbtqTo7EHxRJD1WjRrdKO2lH2kb7ogzcSGyL0WNyQFtVhQUpNXQD3vWBUu6aIh6Wc0JuNGXsAHW8SG8X5QRivpaNG0EebuHpT+oRYvmMf/ADbH6hW4QUCoy7VYgbBcX4eY8O9v62KKAfY7nSdUNo02jIbomY3Fo0YrUcTEX2rnAMX6p/UcrtM7EAHxNOBH+d3MxtpEn0gf91fh4tGjRsEE/wCSV2l76gmqBeWv9tW8Y//Z" }