private async void Callback(Object state) { double redLowVolume = 0; double greenLowVolume = 0; double blueLowVolume = 0; double redHighVolume = 0; double greenHighVolume = 0; double blueHighVolume = 0; // Long running operation await FFTProcessor.ControlLightStrip((double[])echoProperties["Data"]); var data = echoProperties["Data"] as double[]; double lowRangeVal = 1, highRangeVal = 1; for (int i = 2; i < data.Length / 5; i++) { lowRangeVal += Math.Abs(data[i]); } for (int j = 0; j < data.Length / 3 / 3 + 15; j++) { redLowVolume += Math.Abs(data[j]); } for (int j = data.Length / 3 / 3; j < 2 * (data.Length / 3 / 3) + 15; j++) { greenLowVolume += Math.Abs(data[j]); } for (int j = 2 * (data.Length / 3 / 3); j < data.Length / 3 - 10; j++) { blueLowVolume += Math.Abs(data[j]); } for (int i = (4 * data.Length) / 5; i < data.Length; i++) { highRangeVal += Math.Abs(data[i]); } for (int j = (2 * data.Length) / 3 - 20; j < ((2 * data.Length) / 3) + (3 / 18) * data.Length + 10; j++) { redHighVolume += Math.Abs(data[j]); } for (int j = ((2 * data.Length) / 3) + (1 / 9) * data.Length - 20; j < ((2 * data.Length) / 3) + (5 / 18) * data.Length + 10; j++) { greenHighVolume += Math.Abs(data[j]); } for (int j = ((2 * data.Length) / 3) + (2 / 9) * data.Length; j < data.Length; j++) { blueHighVolume += Math.Abs(data[j]); } maxLowVolume = Math.Max(maxLowVolume, lowRangeVal); maxHighVolume = Math.Max(maxHighVolume, highRangeVal); redLowVolume = 6 * redLowVolume > 255 ? 255 : 6 * redLowVolume; greenLowVolume = 6 * greenLowVolume > 255 ? 255 : 6 * greenLowVolume; blueLowVolume = 5 * blueLowVolume > 255 ? 255 : 5 * blueLowVolume; redHighVolume = 9 * redHighVolume > 255 ? 255 : 9 * redHighVolume; greenHighVolume = 9 * greenHighVolume > 255 ? 255 : 9 * greenHighVolume; blueHighVolume = 6 * blueHighVolume > 255 ? 255 : 4 * blueHighVolume; // Lowers other volumes double maxColor = Math.Max(Math.Max(redLowVolume, greenLowVolume), blueLowVolume); if (Math.Abs(maxColor - redLowVolume) > 0.0001) { redLowVolume *= 1.2; blueLowVolume *= 0.3; greenLowVolume *= 0.3; } else if (Math.Abs(maxColor - greenLowVolume) > 0.0001) { greenLowVolume *= 1.2; blueLowVolume *= 0.3; redLowVolume *= 0.3; } else if (Math.Abs(maxColor - blueLowVolume) > 0.0001) { blueLowVolume *= 1.1; redLowVolume *= 0.3; greenLowVolume *= 0.3; } redHighVolume = rand.NextDouble() * 255; greenHighVolume = 255 - redHighVolume; // Lowers other volumes double maxColorHigh = Math.Max(Math.Max(redHighVolume, greenHighVolume), blueHighVolume); if (Math.Abs(maxColorHigh - redHighVolume) > 0.0001) { redHighVolume += 20; blueHighVolume *= 0.3; greenHighVolume *= 0.1; } else if (Math.Abs(maxColorHigh - greenHighVolume) > 0.0001) { greenHighVolume += 20; blueHighVolume *= 0.5; redHighVolume *= 0.1; } else if (Math.Abs(maxColorHigh - blueHighVolume) > 0.0001) { blueHighVolume *= 5.0; redHighVolume *= 0.2; greenHighVolume *= 0.5; } SetPixelRange(15 - (int)(lowRangeVal / maxLowVolume * 15), 15, redLowVolume, greenLowVolume, blueLowVolume); SetPixelRange(0, 15 - (int)(lowRangeVal / maxLowVolume * 15), 0, 0, 0); SetPixelRange(15, 15 + (int)(highRangeVal / maxHighVolume * 15), redHighVolume, greenHighVolume, blueHighVolume); SetPixelRange(15 + (int)(highRangeVal / maxHighVolume * 15), 30, 0, 0, 0); UpdateStrip(); audioTimer.Change(50, 0); }