Exemplo n.º 1
0
 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);
     }
 }
Exemplo n.º 2
0
        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);
            }
        }