diff --git a/pulsecircle.lua b/pulsecircle.lua new file mode 100644 index 0000000..58b0fbe --- /dev/null +++ b/pulsecircle.lua @@ -0,0 +1,99 @@ +COOLDOWN_FACTOR = 0.9998 +FADE_FACTOR = 0.985 + +num_modules = 20 +center_module = 10 + +-- maximum energy values for each band +maxRedEnergy = 1 +maxGreenEnergy = 1 +maxBlueEnergy = 1 + +-- output color buffers +red = {} +green = {} +blue = {} + +tmpRed = {} +tmpGreen = {} +tmpBlue = {} + +function periodic() + local redEnergy = get_energy_in_band(0, 400); + local greenEnergy = get_energy_in_band(400, 4000); + local blueEnergy = get_energy_in_band(4000, 22000); + local centerIndex = 2 * center_module + 1; + + maxRedEnergy = maxRedEnergy * COOLDOWN_FACTOR + if redEnergy > maxRedEnergy then + maxRedEnergy = redEnergy + end + + maxGreenEnergy = maxGreenEnergy * COOLDOWN_FACTOR + if greenEnergy > maxGreenEnergy then + maxGreenEnergy = greenEnergy + end + + maxBlueEnergy = maxBlueEnergy * COOLDOWN_FACTOR + if blueEnergy > maxBlueEnergy then + maxBlueEnergy = blueEnergy + end + + -- move the color buffers on by one + for i = num_modules-1,1,-1 do + tmpRed[i+1] = FADE_FACTOR * tmpRed[i] + tmpGreen[i+1] = FADE_FACTOR * tmpGreen[i] + tmpBlue[i+1] = FADE_FACTOR * tmpBlue[i] + end + + -- set the new value for the center module + newRed = redEnergy / maxRedEnergy + if newRed > tmpRed[num_modules] then + tmpRed[1] = newRed + else + tmpRed[1] = tmpRed[num_modules] + end + + newGreen = greenEnergy / maxGreenEnergy + if newGreen > tmpGreen[num_modules] then + tmpGreen[1] = newGreen + else + tmpGreen[1] = tmpGreen[num_modules] + end + + newBlue = blueEnergy / maxBlueEnergy + if newBlue > tmpBlue[num_modules] then + tmpBlue[1] = newBlue + else + tmpBlue[1] = tmpBlue[num_modules] + end + + for i = 1,num_modules do + red[i] = tmpRed[i] + green[i] = tmpGreen[i] + blue[i] = tmpBlue[i] + end + + -- return the 3 color arrays + return red, green, blue +end + +function init(nmod, cmod) + num_modules = nmod + center_module = cmod + + for i = 1,nmod do + red[i] = 0 + green[i] = 0 + blue[i] = 0 + end + + for i = 1,nmod do + tmpRed[i] = 0 + tmpGreen[i] = 0 + tmpBlue[i] = 0 + end + + -- don't use fading + return 0 +end