MainForm.cs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. using NAudio.Wave;
  2. using SongVocalSectionAnalyser.AudioAnalysis;
  3. using SongVocalSectionAnalyser.Common;
  4. using SongVocalSectionAnalyser.UI;
  5. using System;
  6. using System.IO;
  7. using System.Windows.Forms;
  8. namespace SongVocalSectionAnalyser
  9. {
  10. public partial class MainForm : Form
  11. {
  12. //Manual PreProcess: vocal isolate by invert instrumental ver.
  13. //Load and parse audio file
  14. //Split audio sample data by 10ms chunks
  15. //Extract volume from every chunk
  16. //Extract MA from continuous per 10 chunks
  17. //Debouncing chunks by threshold and
  18. //Looking chunks segment continuous by threshold
  19. public MainForm()
  20. {
  21. InitializeComponent();
  22. }
  23. private SongData _songData;
  24. private WaveOut _waveOut;
  25. private void LoadButton_Click(object sender, System.EventArgs e)
  26. {
  27. var filePath = FilePathTextBox.Text;
  28. if (string.IsNullOrEmpty(filePath)) throw new InvalidOperationException("File path are required");
  29. var fileExtension = Path.GetExtension(filePath);
  30. Func<string, int, float, int, int, SongData> loaderFunc;
  31. switch (fileExtension.TrimStart('.').ToUpper())
  32. {
  33. case "MP3":
  34. loaderFunc = SongLoader.LoadFromMp3File;
  35. break;
  36. case "WAV":
  37. loaderFunc = SongLoader.LoadFromWavFile;
  38. break;
  39. default: throw new NotSupportedException("File extension no supported");
  40. }
  41. _songData = loaderFunc(filePath, (int)MsPerChunkUpDown.Value, (float)ChunkThresholdUpDown.Value, (int)ChunkDebounceUpDown.Value, (int)ChunksPerMaUpDown.Value);
  42. MainChart.SetData(_songData);
  43. }
  44. private void ReChunkButton_Click(object sender, EventArgs e)
  45. {
  46. _songData = new SongData(_songData, (int)MsPerChunkUpDown.Value, (float)ChunkThresholdUpDown.Value, (int)ChunkDebounceUpDown.Value, (int)ChunksPerMaUpDown.Value);
  47. MainChart.SetData(_songData);
  48. }
  49. private void ReBuildChartButton_Click(object sender, EventArgs e)
  50. {
  51. MainSplitContainer.Panel1.Controls.Remove(MainChart);
  52. MainChart.Dispose();
  53. MainChart = new InteractiveChart
  54. {
  55. Dock = DockStyle.Fill
  56. };
  57. MainSplitContainer.Panel1.Controls.Add(MainChart);
  58. MainChart.SetData(_songData);
  59. MainChart.TimelineClicked += MainChart_TimelineClicked;
  60. }
  61. private void MainChart_TimelineClicked(TimeSpan arg1, ChunkGroup arg2)
  62. {
  63. RightRichTextBox.AppendText($"Timeline Clicked pos[{arg1.ToStringH2M2S2F2()}] group[{arg2.Begin.ToStringH2M2S2F2()}]-[{arg2.End.ToStringH2M2S2F2()}]{Environment.NewLine}");
  64. _waveOut?.Dispose();
  65. _waveOut = new WaveOut();
  66. var songDataWaveProvider = PlayChunkRadioButton.Checked
  67. ? new SongDataWaveProvider(_songData, arg2.Begin, arg2.End)
  68. : new SongDataWaveProvider(_songData, arg1);
  69. songDataWaveProvider.Playing+= i => Invoke(new Action(() => MainChart.PlayingSample = i));
  70. _waveOut.Init(songDataWaveProvider);
  71. _waveOut.Play();
  72. }
  73. private void StopPlayButton_Click(object sender, EventArgs e)
  74. {
  75. _waveOut?.Dispose();
  76. MainChart.PlayingSample = null;
  77. }
  78. }
  79. }