123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251 |
- using BeatLyrics.Common;
- using BeatLyrics.Tool.Models;
- using BeatLyrics.Tool.UserControls;
- using BeatLyrics.Tool.Utils;
- using Newtonsoft.Json;
- using System;
- using System.IO;
- using System.Linq;
- using System.Threading.Tasks;
- using System.Windows.Forms;
- using BeatLyrics.Tool.RefLibs;
- namespace BeatLyrics.Tool.Dialogs
- {
- internal partial class TimelineEditForm : BaseForm
- {
- //TODO: range select control for Spectrum visualize
- private readonly LevelInfo _levelInfo;
- private readonly string _filename;
- private string _filePath;
- private int _blockInMs;
- private SpectrumAnalyzer.SaResult[] _sa;
- private DSP.Window.Type _windowType;
- public TimelineEditForm(LevelInfo levelInfo, string filename)
- {
- _levelInfo = levelInfo;
- _filename = filename;
- InitializeComponent();
- }
- private void EditForm_Shown(object sender, EventArgs e)
- {
- OggAudioPlayer.LoadOggFile(_levelInfo.MediaPath);
- PlayPosTrackBar.Maximum = (int)OggAudioPlayer.Length.TotalMilliseconds;
- _filePath = Path.Combine(DirProvider.GetLyricDir(_levelInfo.Hash), _filename);
- var json = File.ReadAllText(_filePath);
- var lli = JsonConvert.DeserializeObject<LyricFileExt>(json);
- EditorControl1.Items = lli.Main.ToList();
- if (lli.Subtitle != null) EditorControl2.Items = lli.Subtitle.ToList();
- SaWindoeTypeComboBox.DataSource = Enum.GetValues(typeof(RefLibs.DSP.Window.Type));
- SaWindoeTypeComboBox.SelectedItem = RefLibs.DSP.Window.Type.Rectangular;
- Task.Factory.StartNew(() =>
- {
- _blockInMs = (int)SaMsUpDown.Value;
- _sa = SpectrumAnalyzer.RunOgg(_levelInfo.MediaPath, _blockInMs, _windowType);
- RunOnUiThread(UpdateSaResult);
- RunOnUiThread(delegate
- {
- FreqRangeBar.RangeMinimum = 30000;
- FreqRangeBar.RangeMaximum = 200000;
- ValueRangeBar.RangeMinimum = -4000;
- ValueRangeBar.RangeMaximum = 0;
- RangeBar_RangeChanging(null, null);
- });
- });
- }
- private void UpdateSaResult()
- {
- ViewSpectrumButton.Enabled = true;
- FreqRangeBar.TotalMaximum = (int)(_sa.Max(p => p.FreqAxis.Max()) * 100);
- FreqRangeBar.TotalMinimum = (int)(_sa.Min(p => p.FreqAxis.Min()) * 100);
- ValueRangeBar.TotalMaximum = (int)(_sa.Max(p => p.Values.Max()) * 100);
- ValueRangeBar.TotalMinimum = -20000; // ValueRangeBar.TotalMinimum = (int)(_sa.Min(p => p.Values.Min()) * 100);
- EditorControl1.SetSpectrumData(_sa, _blockInMs);
- EditorControl2.SetSpectrumData(_sa, _blockInMs);
- ReSpectrumButton.Enabled = true;
- }
- private void UpdatePos()
- {
- var timeSpan = OggAudioPlayer.Position;
- var ms = (int)timeSpan.TotalMilliseconds;
- PlayPosTrackBar.Value = ms > PlayPosTrackBar.Maximum
- ? PlayPosTrackBar.Value = PlayPosTrackBar.Maximum
- : PlayPosTrackBar.Value = ms;
- EditorControl1.PlayPos = PlayPosTrackBar.Value;
- EditorControl2.PlayPos = PlayPosTrackBar.Value;
- PosLabel.Text = timeSpan.FormatToTotalMinuteAndSecondsAndMs();
- TextLabel1.Text = EditorControl1.GetPlayText();
- TextLabel2.Text = EditorControl2.GetPlayText();
- }
- private void SetPosSafe(int ms)
- {
- var position = TimeSpan.FromMilliseconds(ms);
- var len = OggAudioPlayer.Length;
- if (position >= len) position = len - TimeSpan.FromMilliseconds(1);
- OggAudioPlayer.Position = position;
- }
- private void PlayPosTrackBar_Scroll(object sender, EventArgs e)
- {
- SetPosSafe(PlayPosTrackBar.Value);
- UpdatePos();
- }
- private void PlayButton_Click(object sender, EventArgs e)
- {
- if (!OggAudioPlayer.IsPlaying)
- {
- OggAudioPlayer.Play();
- UpdateTimer.Start();
- EditorControl1.LockDown = true;
- EditorControl2.LockDown = true;
- }
- else
- {
- OggAudioPlayer.Stop();
- EditorControl1.LockDown = false;
- EditorControl2.LockDown = false;
- }
- }
- private void UpdateTimer_Tick(object sender, EventArgs e)
- {
- UpdatePos();
- }
- private void EditForm_FormClosed(object sender, FormClosedEventArgs e)
- {
- UpdateTimer.Stop();
- OggAudioPlayer.Stop();
- }
- private void EditForm_KeyDown(object sender, KeyEventArgs e)
- {
- if (e.KeyCode == Keys.Space)
- {
- PlayButton_Click(null, null);
- }
- }
- private void EditorControl_PosChangeBegin(object sender, EventArgs e)
- {
- if (((EditorUserControl)sender).LockDown) return;
- UpdateTimer.Stop();
- EditorControl1.LockDown = false;
- EditorControl2.LockDown = false;
- OggAudioPlayer.Play();
- }
- private void EditorControl_PosChange(object sender, int e)
- {
- SetPosSafe(e);
- UpdatePos();
- }
- private void EditorControl_PosChangeEnd(object sender, EventArgs e)
- {
- if (((EditorUserControl)sender).LockDown) return;
- OggAudioPlayer.Stop();
- SetPosSafe(((EditorUserControl)sender).PlayPos);
- UpdatePos();
- }
- private void ScaleTrackBar_Scroll(object sender, EventArgs e)
- {
- var value = ScaleTrackBar.Value / 1000f;
- ScaleLabel.Text = $"Scale: {value} * 1ms/1px";
- EditorControl1.DisplayScale = value;
- EditorControl2.DisplayScale = value;
- }
- private void SaveAndCloseButton_Click(object sender, EventArgs e)
- {
- var json = JsonConvert.SerializeObject(new LyricFileExt
- {
- Main = EditorControl1.Items.OrderBy(p => p.TimeMs).ToList(),
- Subtitle = EditorControl2.Items.OrderBy(p => p.TimeMs).ToList(),
- });
- File.WriteAllText(_filePath, json);
- Close();
- }
- private void PlayPosTrackBar_MouseDown(object sender, MouseEventArgs e)
- {
- if (OggAudioPlayer.IsPlaying) return;
- OggAudioPlayer.Play();
- PlayPosTrackBar.Tag = "Stop";
- }
- private void PlayPosTrackBar_MouseUp(object sender, MouseEventArgs e)
- {
- if (PlayPosTrackBar.Tag is string tag && tag == "Stop")
- {
- OggAudioPlayer.Stop();
- PlayPosTrackBar.Tag = null;
- }
- }
- private void ReSpectrumButton_Click(object sender, EventArgs e)
- {
- ReSpectrumButton.Enabled = false;
- Task.Factory.StartNew(() =>
- {
- _blockInMs = (int)SaMsUpDown.Value;
- _sa = SpectrumAnalyzer.RunOgg(_levelInfo.MediaPath, _blockInMs, _windowType);
- RunOnUiThread(UpdateSaResult);
- });
- }
- private void ViewSpectrumButton_Click(object sender, EventArgs e)
- {
- new PlotDialog(_sa, _blockInMs).Show();
- }
- private void RangeBar_RangeChanging(object sender, EventArgs e)
- {
- EditorControl1.MinSaFreq = FreqRangeBar.RangeMinimum / 100.0;
- EditorControl1.MaxSaFreq = FreqRangeBar.RangeMaximum / 100.0;
- EditorControl1.MinSaValue = ValueRangeBar.RangeMinimum / 100.0;
- EditorControl1.MaxSaValue = ValueRangeBar.RangeMaximum / 100.0;
- EditorControl2.MinSaFreq = FreqRangeBar.RangeMinimum / 100.0;
- EditorControl2.MaxSaFreq = FreqRangeBar.RangeMaximum / 100.0;
- EditorControl2.MinSaValue = ValueRangeBar.RangeMinimum / 100.0;
- EditorControl2.MaxSaValue = ValueRangeBar.RangeMaximum / 100.0;
- EditorControl1.Invalidate();
- EditorControl2.Invalidate();
- }
- private void SaWindoeTypeComboBox_SelectedValueChanged(object sender, EventArgs e)
- {
- _windowType = (DSP.Window.Type)SaWindoeTypeComboBox.SelectedValue;
- }
- }
- }
|