public async Task WriteAsync(TransferMode _Input) { if (_Input is NoneMode) { await SendDataAsync("0;" + (_Input as NoneMode).Data); } if (_Input is FadeColorsMode) { FadeColorsMode Data = (_Input as FadeColorsMode); await SendDataAsync("1;" + Data.Red + ";" + Data.Green + ";" + Data.Blue + ";" + Data.FadeSpeed + ";" + Math.Round(Data.FadeFactor * 100, 0)); } if (_Input is VisualizerBeat) { VisualizerBeat Data = (_Input as VisualizerBeat); await SendDataAsync("2;" + Data.BeatValue.ToString().Replace(',', '.')); } if (_Input is VisualizerWave) { VisualizerWave Data = (_Input as VisualizerWave); await SendDataAsync("3;" + Data.Red + ";" + Data.Green + ";" + Data.Blue); } if (_Input is IndividualLEDs) { IndividualLEDs Data = (_Input as IndividualLEDs); await SendDataAsync("4;" + Data.PinID + ";" + Data.HardwareID + ";" + Data.Red + ";" + Data.Green + ";" + Data.Blue); } if (_Input is VisualizerFullSpectrum) { VisualizerFullSpectrum Data = (_Input as VisualizerFullSpectrum); await SendDataAsync("5;" + Data.SpectrumSplit + ";" + Data.SpectrumValues); } if (_Input is Ranges) { Ranges Data = (_Input as Ranges); await SendDataAsync("6;" + Data.FromID + ";" + Data.ToID); } if (_Input is Ambilight) { Ambilight Data = (_Input as Ambilight); await SendDataAsync("7;" + Data.FromID + ";" + Data.ToID + ";" + Data.LEDsPrBlock + ";" + Data.Values); } if (_Input is Animation) { Animation Data = (_Input as Animation); await SendDataAsync("8;" + Data.LineCount + ";" + Convert.ToInt32(Data.UseCompression) + ";" + Convert.ToInt32(Data.ShowNow) + ";" + Data.Values); } }
private void AudioDataThread() { DateTime VisualizerRPSCounter = new DateTime(); DateTime CalibrateRefreshRate = new DateTime(); int VisualizerUpdatesCounter = 0; List <List <int> > AudioDataPointStore = new List <List <int> >(); float[] AudioData = { }; int VisualSamles = 0; int Smoothness = 0; int Sensitivity = 0; int BASSDataRate = 0; int BeatZoneFrom = 0; int BeatZoneTo = 0; int SelectedIndex = 0; int TriggerHeight = 0; int SpectrumSplit = 0; int RefreshTime = 0; MainFormClass.VisualizerPanel.Invoke((MethodInvoker) delegate { VisualSamles = (int)MainFormClass.VisualSamplesNumericUpDown.Value; Smoothness = MainFormClass.SmoothnessTrackBar.Value; Sensitivity = MainFormClass.SensitivityTrackBar.Value; BASSDataRate = Int32.Parse(MainFormClass.AudioSampleRateComboBox.SelectedItem.ToString()); BeatZoneFrom = MainFormClass.BeatZoneFromTrackBar.Value; BeatZoneTo = MainFormClass.BeatZoneToTrackBar.Value; AudioData = new float[Int32.Parse(MainFormClass.AudioSampleRateComboBox.SelectedItem.ToString())]; SelectedIndex = MainFormClass.VisualizationTypeComboBox.SelectedIndex; TriggerHeight = MainFormClass.BeatZoneTriggerHeight.Value; RefreshTime = MainFormClass.SampleTimeTrackBar.Value; SpectrumSplit = (int)MainFormClass.FullSpectrumNumericUpDown.Value; for (int i = 0; i < MainFormClass.VisualSamplesNumericUpDown.Value; i++) { AudioDataPointStore.Add(new List <int>(new int[Smoothness])); } }); while (RunVisualizerThread) { CalibrateRefreshRate = DateTime.Now; MainFormClass.BeatZoneTriggerHeight.Invoke((MethodInvoker) delegate { TriggerHeight = MainFormClass.BeatZoneTriggerHeight.Value; }); Series BeatZoneSeries = new Series { IsVisibleInLegend = false, IsXValueIndexed = false, ChartType = SeriesChartType.Column, Color = Color.FromArgb(0, 122, 217) }; int ReturnValue = BassWasapi.BASS_WASAPI_GetData(AudioData, (int)(BASSData)Enum.Parse(typeof(BASSData), "BASS_DATA_FFT" + BASSDataRate)); if (ReturnValue < -1) { return; } int X, Y; int B0 = 0; for (X = BeatZoneFrom; X < BeatZoneTo; X++) { float Peak = 0; int B1 = (int)Math.Pow(2, X * 10.0 / ((int)VisualSamles - 1)); if (B1 > 1023) { B1 = 1023; } if (B1 <= B0) { B1 = B0 + 1; } for (; B0 < B1; B0++) { if (Peak < AudioData[1 + B0]) { Peak = AudioData[1 + B0]; } } Y = (int)(Math.Sqrt(Peak) * Sensitivity * 255 - 4); if (Y > 255) { Y = 255; } if (Y < 1) { Y = 1; } if (X >= BeatZoneFrom) { if (X <= BeatZoneTo) { AudioDataPointStore[X].Add((byte)Y); while (AudioDataPointStore[X].Count > Smoothness) { AudioDataPointStore[X].RemoveAt(0); } int AverageValue = 0; if (Smoothness > 1) { for (int s = 0; s < Smoothness; s++) { AverageValue += AudioDataPointStore[X][s]; } AverageValue = AverageValue / Smoothness; } else { AverageValue = AudioDataPointStore[X][0]; } if (AverageValue > 255) { AverageValue = 255; } if (AverageValue < 0) { AverageValue = 0; } BeatZoneSeries.Points.AddXY(X, AverageValue); } } } if (SelectedIndex == 0) { double Hit = 0; for (int i = 0; i < BeatZoneSeries.Points.Count; i++) { if (BeatZoneSeries.Points[i].YValues[0] >= TriggerHeight) { Hit++; } } double OutValue = Math.Round(Math.Round((Hit / ((double)BeatZoneTo - (double)BeatZoneFrom)), 2) * 99, 0); AutoTrigger((OutValue / 99) * (255 * 3)); if (OutValue > 99) { OutValue = 99; } MainFormClass.Serial.Write(new VisualizerBeat((int)OutValue)); } if (SelectedIndex == 1 | SelectedIndex == 2) { double EndR = 0; double EndG = 0; double EndB = 0; int CountR = 0; int CountG = 0; int CountB = 0; int Hit = 0; for (int i = 0; i < BeatZoneSeries.Points.Count; i++) { if (BeatZoneSeries.Points[i].YValues[0] >= TriggerHeight) { try { if (MainFormClass.SpectrumChart.Series[0].Points[i].YValues[0] <= 255) { if (MainFormClass.SpectrumChart.Series[0].Points[i].YValues[0] >= 0) { EndR += MainFormClass.SpectrumChart.Series[0].Points[i].YValues[0]; CountR++; } } } catch { EndR += 0; CountR++; } try { if (MainFormClass.SpectrumChart.Series[1].Points[i].YValues[0] <= 255) { if (MainFormClass.SpectrumChart.Series[1].Points[i].YValues[0] >= 0) { EndG += MainFormClass.SpectrumChart.Series[1].Points[i].YValues[0]; CountG++; } } } catch { EndG += 0; CountG++; } try { if (MainFormClass.SpectrumChart.Series[2].Points[i].YValues[0] <= 255) { if (MainFormClass.SpectrumChart.Series[2].Points[i].YValues[0] >= 0) { EndB += MainFormClass.SpectrumChart.Series[2].Points[i].YValues[0]; CountB++; } } } catch { EndB += 0; CountB++; } Hit++; } } AutoTrigger(((float)Hit / ((float)BeatZoneTo - (float)BeatZoneFrom)) * (255 * 3)); if (CountR > 0) { EndR = EndR / CountR; } if (CountG > 0) { EndG = EndG / CountG; } if (CountB > 0) { EndB = EndB / CountB; } Color AfterShuffel = MainFormClass.ShuffleColors(Color.FromArgb((int)Math.Round(EndR, 0), (int)Math.Round(EndG, 0), (int)Math.Round(EndB, 0))); if (SelectedIndex == 1) { MainFormClass.Serial.Write(new FadeColorsMode(AfterShuffel.R, AfterShuffel.G, AfterShuffel.B, 0, 0)); } if (SelectedIndex == 2) { MainFormClass.Serial.Write(new VisualizerWave(AfterShuffel.R, AfterShuffel.G, AfterShuffel.B)); } } if (SelectedIndex == 3 | SelectedIndex == 4) { int EndR = 0; int EndG = 0; int EndB = 0; int Hit = 0; for (int i = 0; i < BeatZoneSeries.Points.Count; i++) { if (BeatZoneSeries.Points[i].YValues[0] >= TriggerHeight) { Hit++; } } int EndValue = (int)(((float)255 * (float)3) * ((float)Hit / ((float)BeatZoneTo - (float)BeatZoneFrom))); if (EndValue >= 765) { EndValue = 764; } if (EndValue < 0) { EndValue = 0; } MainFormClass.BeatWaveProgressBar.Invoke((MethodInvoker) delegate { MainFormClass.BeatWaveProgressBar.Value = EndValue; }); try { EndR = (int)MainFormClass.WaveChart.Series[0].Points[EndValue].YValues[0]; EndG = (int)MainFormClass.WaveChart.Series[1].Points[EndValue].YValues[0]; EndB = (int)MainFormClass.WaveChart.Series[2].Points[EndValue].YValues[0]; } catch { EndR = 0; EndG = 0; EndB = 0; } AutoTrigger(((float)Hit / ((float)BeatZoneTo - (float)BeatZoneFrom)) * (255 * 3)); if (EndR > 255) { EndR = 0; } if (EndG > 255) { EndG = 0; } if (EndB > 255) { EndB = 0; } if (EndR < 0) { EndR = 0; } if (EndG < 0) { EndG = 0; } if (EndB < 0) { EndB = 0; } Color AfterShuffel = MainFormClass.ShuffleColors(Color.FromArgb(EndR, EndG, EndB)); if (SelectedIndex == 4) { MainFormClass.Serial.Write(new FadeColorsMode(AfterShuffel.R, AfterShuffel.G, AfterShuffel.B, 0, 0)); } if (SelectedIndex == 3) { MainFormClass.Serial.Write(new VisualizerWave(AfterShuffel.R, AfterShuffel.G, AfterShuffel.B)); } } if (SelectedIndex == 5) { int Hit = 0; VisualizerFullSpectrum newSpec = new VisualizerFullSpectrum("", SpectrumSplit); for (int i = 0; i < BeatZoneSeries.Points.Count; i++) { if (BeatZoneSeries.Points[i].YValues[0] >= TriggerHeight) { newSpec.SpectrumValues += Math.Round((BeatZoneSeries.Points[i].YValues[0] / 255) * (double)SpectrumSplit, 0) + ";"; Hit++; } else { newSpec.SpectrumValues += "0;"; } } AutoTrigger(((float)Hit / ((float)BeatZoneTo - (float)BeatZoneFrom)) * (255 * 3)); MainFormClass.Serial.Write(newSpec); } VisualizerUpdatesCounter++; if ((DateTime.Now - VisualizerRPSCounter).TotalSeconds >= 1) { MainFormClass.VisualizerRPSLabel.Invoke((MethodInvoker) delegate { MainFormClass.VisualizerRPSLabel.Text = "RPS: " + VisualizerUpdatesCounter; }); VisualizerUpdatesCounter = 0; VisualizerRPSCounter = DateTime.Now; } MainFormClass.BeatZoneChart.Invoke((MethodInvoker) delegate { MainFormClass.BeatZoneChart.Series.Clear(); MainFormClass.BeatZoneChart.Series.Add(BeatZoneSeries); }); int ExectuionTime = (int)(DateTime.Now - CalibrateRefreshRate).TotalMilliseconds; int ActuralRefreshTime = RefreshTime - ExectuionTime; if (ActuralRefreshTime < 0) { ActuralRefreshTime = 0; } Thread.Sleep(ActuralRefreshTime); } }