PlotDialog.cs 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. using BeatLyrics.Tool.Utils;
  2. using System;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using System.Windows.Forms;
  6. using System.Windows.Forms.DataVisualization.Charting;
  7. namespace BeatLyrics.Tool.Dialogs
  8. {
  9. internal partial class PlotDialog : Form
  10. {
  11. private readonly SpectrumAnalyzer.SaResult[] _items;
  12. private readonly int _blockInMs;
  13. public PlotDialog(SpectrumAnalyzer.SaResult[] items, int blockInMs)
  14. {
  15. _items = items;
  16. _blockInMs = blockInMs;
  17. InitializeComponent();
  18. SelectTrackBar.Maximum = items.Length - 1;
  19. UpdateChart();
  20. }
  21. private void UpdateChart()
  22. {
  23. MainChart.Series["Series1"].Points.Clear();
  24. var item = _items[SelectTrackBar.Value];
  25. var maxFreq = item.FreqAxis.Max();
  26. var rngFreqMax = maxFreq * (MaxFreqTrackBar.Value / 10000.0);
  27. var rngFreqMin = maxFreq * (MinFreqTrackBar.Value / 10000.0);
  28. var minValue = item.Values.Min();
  29. var rngValue = item.Values.Max() - minValue;
  30. var rngValueMin = minValue + rngValue * (MinValueTrackBar.Value / 10000.0);
  31. var rngValueMax = minValue + rngValue * (MaxValueTrackBar.Value / 10000.0);
  32. var axis = new List<double>();
  33. var values = new List<double>();
  34. for (var i = 0; i < item.FreqAxis.Length; i++)
  35. {
  36. if (item.FreqAxis[i] >= rngFreqMin && item.FreqAxis[i] <= rngFreqMax
  37. && item.Values[i] >= rngValueMin && item.Values[i] <= rngValueMax)
  38. {
  39. axis.Add(item.FreqAxis[i]);
  40. values.Add(item.Values[i]);
  41. }
  42. }
  43. InfoLabel.Text = $"Pos:{TimeSpan.FromMilliseconds(SelectTrackBar.Value * _blockInMs)}";
  44. MainChart.Series["Series1"].Points.DataBindXY(axis, values);
  45. }
  46. private void SelectTrackBar_Scroll(object sender, EventArgs e)
  47. {
  48. UpdateChart();
  49. OggAudioPlayer.Position = TimeSpan.FromMilliseconds(_blockInMs * SelectTrackBar.Value);
  50. }
  51. private void MaxTrackBar_Scroll(object sender, EventArgs e) => UpdateChart();
  52. private void MinTrackBar_Scroll(object sender, EventArgs e) => UpdateChart();
  53. private void MinValueTrackBar_Scroll(object sender, EventArgs e) => UpdateChart();
  54. private void MaxValueTrackBar_Scroll(object sender, EventArgs e) => UpdateChart();
  55. private void SelectTrackBar_MouseDown(object sender, MouseEventArgs e) => OggAudioPlayer.Play();
  56. private void SelectTrackBar_MouseUp(object sender, MouseEventArgs e) => OggAudioPlayer.Stop();
  57. private void MainChart_Click(object sender, EventArgs e) =>
  58. MainChart.Series["Series1"].ChartType = MainChart.Series["Series1"].ChartType == SeriesChartType.Line
  59. ? SeriesChartType.Column
  60. : SeriesChartType.Line;
  61. }
  62. }