TimelineEditDialog.cs 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251
  1. using BeatLyrics.Common;
  2. using BeatLyrics.Tool.Models;
  3. using BeatLyrics.Tool.UserControls;
  4. using BeatLyrics.Tool.Utils;
  5. using Newtonsoft.Json;
  6. using System;
  7. using System.IO;
  8. using System.Linq;
  9. using System.Threading.Tasks;
  10. using System.Windows.Forms;
  11. using BeatLyrics.Tool.RefLibs;
  12. namespace BeatLyrics.Tool.Dialogs
  13. {
  14. internal partial class TimelineEditForm : BaseForm
  15. {
  16. //TODO: range select control for Spectrum visualize
  17. private readonly LevelInfo _levelInfo;
  18. private readonly string _filename;
  19. private string _filePath;
  20. private int _blockInMs;
  21. private SpectrumAnalyzer.SaResult[] _sa;
  22. private DSP.Window.Type _windowType;
  23. public TimelineEditForm(LevelInfo levelInfo, string filename)
  24. {
  25. _levelInfo = levelInfo;
  26. _filename = filename;
  27. InitializeComponent();
  28. }
  29. private void EditForm_Shown(object sender, EventArgs e)
  30. {
  31. OggAudioPlayer.LoadOggFile(_levelInfo.MediaPath);
  32. PlayPosTrackBar.Maximum = (int)OggAudioPlayer.Length.TotalMilliseconds;
  33. _filePath = Path.Combine(DirProvider.GetLyricDir(_levelInfo.Hash), _filename);
  34. var json = File.ReadAllText(_filePath);
  35. var lli = JsonConvert.DeserializeObject<LyricFileExt>(json);
  36. EditorControl1.Items = lli.Main.ToList();
  37. if (lli.Subtitle != null) EditorControl2.Items = lli.Subtitle.ToList();
  38. SaWindoeTypeComboBox.DataSource = Enum.GetValues(typeof(RefLibs.DSP.Window.Type));
  39. SaWindoeTypeComboBox.SelectedItem = RefLibs.DSP.Window.Type.Rectangular;
  40. Task.Factory.StartNew(() =>
  41. {
  42. _blockInMs = (int)SaMsUpDown.Value;
  43. _sa = SpectrumAnalyzer.RunOgg(_levelInfo.MediaPath, _blockInMs, _windowType);
  44. RunOnUiThread(UpdateSaResult);
  45. RunOnUiThread(delegate
  46. {
  47. FreqRangeBar.RangeMinimum = 30000;
  48. FreqRangeBar.RangeMaximum = 200000;
  49. ValueRangeBar.RangeMinimum = -4000;
  50. ValueRangeBar.RangeMaximum = 0;
  51. RangeBar_RangeChanging(null, null);
  52. });
  53. });
  54. }
  55. private void UpdateSaResult()
  56. {
  57. ViewSpectrumButton.Enabled = true;
  58. FreqRangeBar.TotalMaximum = (int)(_sa.Max(p => p.FreqAxis.Max()) * 100);
  59. FreqRangeBar.TotalMinimum = (int)(_sa.Min(p => p.FreqAxis.Min()) * 100);
  60. ValueRangeBar.TotalMaximum = (int)(_sa.Max(p => p.Values.Max()) * 100);
  61. ValueRangeBar.TotalMinimum = -20000; // ValueRangeBar.TotalMinimum = (int)(_sa.Min(p => p.Values.Min()) * 100);
  62. EditorControl1.SetSpectrumData(_sa, _blockInMs);
  63. EditorControl2.SetSpectrumData(_sa, _blockInMs);
  64. ReSpectrumButton.Enabled = true;
  65. }
  66. private void UpdatePos()
  67. {
  68. var timeSpan = OggAudioPlayer.Position;
  69. var ms = (int)timeSpan.TotalMilliseconds;
  70. PlayPosTrackBar.Value = ms > PlayPosTrackBar.Maximum
  71. ? PlayPosTrackBar.Value = PlayPosTrackBar.Maximum
  72. : PlayPosTrackBar.Value = ms;
  73. EditorControl1.PlayPos = PlayPosTrackBar.Value;
  74. EditorControl2.PlayPos = PlayPosTrackBar.Value;
  75. PosLabel.Text = timeSpan.FormatToTotalMinuteAndSecondsAndMs();
  76. TextLabel1.Text = EditorControl1.GetPlayText();
  77. TextLabel2.Text = EditorControl2.GetPlayText();
  78. }
  79. private void SetPosSafe(int ms)
  80. {
  81. var position = TimeSpan.FromMilliseconds(ms);
  82. var len = OggAudioPlayer.Length;
  83. if (position >= len) position = len - TimeSpan.FromMilliseconds(1);
  84. OggAudioPlayer.Position = position;
  85. }
  86. private void PlayPosTrackBar_Scroll(object sender, EventArgs e)
  87. {
  88. SetPosSafe(PlayPosTrackBar.Value);
  89. UpdatePos();
  90. }
  91. private void PlayButton_Click(object sender, EventArgs e)
  92. {
  93. if (!OggAudioPlayer.IsPlaying)
  94. {
  95. OggAudioPlayer.Play();
  96. UpdateTimer.Start();
  97. EditorControl1.LockDown = true;
  98. EditorControl2.LockDown = true;
  99. }
  100. else
  101. {
  102. OggAudioPlayer.Stop();
  103. EditorControl1.LockDown = false;
  104. EditorControl2.LockDown = false;
  105. }
  106. }
  107. private void UpdateTimer_Tick(object sender, EventArgs e)
  108. {
  109. UpdatePos();
  110. }
  111. private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
  112. {
  113. UpdateTimer.Stop();
  114. OggAudioPlayer.Stop();
  115. }
  116. private void EditForm_KeyDown(object sender, KeyEventArgs e)
  117. {
  118. if (e.KeyCode == Keys.Space)
  119. {
  120. PlayButton_Click(null, null);
  121. }
  122. }
  123. private void EditorControl_PosChangeBegin(object sender, EventArgs e)
  124. {
  125. if (((EditorUserControl)sender).LockDown) return;
  126. UpdateTimer.Stop();
  127. EditorControl1.LockDown = false;
  128. EditorControl2.LockDown = false;
  129. OggAudioPlayer.Play();
  130. }
  131. private void EditorControl_PosChange(object sender, int e)
  132. {
  133. SetPosSafe(e);
  134. UpdatePos();
  135. }
  136. private void EditorControl_PosChangeEnd(object sender, EventArgs e)
  137. {
  138. if (((EditorUserControl)sender).LockDown) return;
  139. OggAudioPlayer.Stop();
  140. SetPosSafe(((EditorUserControl)sender).PlayPos);
  141. UpdatePos();
  142. }
  143. private void ScaleTrackBar_Scroll(object sender, EventArgs e)
  144. {
  145. var value = ScaleTrackBar.Value / 1000f;
  146. ScaleLabel.Text = $"Scale: {value} * 1ms/1px";
  147. EditorControl1.DisplayScale = value;
  148. EditorControl2.DisplayScale = value;
  149. }
  150. private void SaveAndCloseButton_Click(object sender, EventArgs e)
  151. {
  152. var json = JsonConvert.SerializeObject(new LyricFileExt
  153. {
  154. Main = EditorControl1.Items.OrderBy(p => p.TimeMs).ToList(),
  155. Subtitle = EditorControl2.Items.OrderBy(p => p.TimeMs).ToList(),
  156. });
  157. File.WriteAllText(_filePath, json);
  158. Close();
  159. }
  160. private void PlayPosTrackBar_MouseDown(object sender, MouseEventArgs e)
  161. {
  162. if (OggAudioPlayer.IsPlaying) return;
  163. OggAudioPlayer.Play();
  164. PlayPosTrackBar.Tag = "Stop";
  165. }
  166. private void PlayPosTrackBar_MouseUp(object sender, MouseEventArgs e)
  167. {
  168. if (PlayPosTrackBar.Tag is string tag && tag == "Stop")
  169. {
  170. OggAudioPlayer.Stop();
  171. PlayPosTrackBar.Tag = null;
  172. }
  173. }
  174. private void ReSpectrumButton_Click(object sender, EventArgs e)
  175. {
  176. ReSpectrumButton.Enabled = false;
  177. Task.Factory.StartNew(() =>
  178. {
  179. _blockInMs = (int)SaMsUpDown.Value;
  180. _sa = SpectrumAnalyzer.RunOgg(_levelInfo.MediaPath, _blockInMs, _windowType);
  181. RunOnUiThread(UpdateSaResult);
  182. });
  183. }
  184. private void ViewSpectrumButton_Click(object sender, EventArgs e)
  185. {
  186. new PlotDialog(_sa, _blockInMs).Show();
  187. }
  188. private void RangeBar_RangeChanging(object sender, EventArgs e)
  189. {
  190. EditorControl1.MinSaFreq = FreqRangeBar.RangeMinimum / 100.0;
  191. EditorControl1.MaxSaFreq = FreqRangeBar.RangeMaximum / 100.0;
  192. EditorControl1.MinSaValue = ValueRangeBar.RangeMinimum / 100.0;
  193. EditorControl1.MaxSaValue = ValueRangeBar.RangeMaximum / 100.0;
  194. EditorControl2.MinSaFreq = FreqRangeBar.RangeMinimum / 100.0;
  195. EditorControl2.MaxSaFreq = FreqRangeBar.RangeMaximum / 100.0;
  196. EditorControl2.MinSaValue = ValueRangeBar.RangeMinimum / 100.0;
  197. EditorControl2.MaxSaValue = ValueRangeBar.RangeMaximum / 100.0;
  198. EditorControl1.Invalidate();
  199. EditorControl2.Invalidate();
  200. }
  201. private void SaWindoeTypeComboBox_SelectedValueChanged(object sender, EventArgs e)
  202. {
  203. _windowType = (DSP.Window.Type)SaWindoeTypeComboBox.SelectedValue;
  204. }
  205. }
  206. }