From 9855f8451abe331a862f518f17ffaea36a378b0e Mon Sep 17 00:00:00 2001 From: arx-ein Date: Fri, 26 Sep 2025 09:00:23 +0900 Subject: [PATCH 1/3] Add warning when resulting merged part contains overlapping notes --- OpenUtau/Strings/Strings.axaml | 1 + OpenUtau/Views/MainWindow.axaml.cs | 18 +++++++++++++----- 2 files changed, 14 insertions(+), 5 deletions(-) diff --git a/OpenUtau/Strings/Strings.axaml b/OpenUtau/Strings/Strings.axaml index d0d52472b..380eb73e6 100644 --- a/OpenUtau/Strings/Strings.axaml +++ b/OpenUtau/Strings/Strings.axaml @@ -44,6 +44,7 @@ OpenUtau aims to be an open source editing environment for UTAU community, with Installing Merging Parts Parts on different tracks cannot be merged. + Merged part will contain overlapping notes. Are you sure to continue? Cancel Copy error to clipboard No diff --git a/OpenUtau/Views/MainWindow.axaml.cs b/OpenUtau/Views/MainWindow.axaml.cs index 57c883109..fe6e36ede 100644 --- a/OpenUtau/Views/MainWindow.axaml.cs +++ b/OpenUtau/Views/MainWindow.axaml.cs @@ -81,7 +81,7 @@ public MainWindow() { PartGotoFileCommand = ReactiveCommand.Create(part => GotoFile(part)); PartReplaceAudioCommand = ReactiveCommand.Create(part => ReplaceAudio(part)); PartTranscribeCommand = ReactiveCommand.Create(part => Transcribe(part)); - PartMergeCommand = ReactiveCommand.Create(part => MergePart(part)); + PartMergeCommand = ReactiveCommand.Create(async part => await MergePart(part)); AddHandler(DragDrop.DropEvent, OnDrop); @@ -1302,10 +1302,11 @@ public void OnWelcomeRecovery(object sender, RoutedEventArgs args) { viewModel.OpenProject(new string[] { viewModel.RecoveryPath }); viewModel.Page = 1; } - - void MergePart(UPart part) { + + async Task MergePart(UPart part) { List selectedParts = viewModel.TracksViewModel.SelectedParts; - if (!selectedParts.All(p => p.trackNo.Equals(part.trackNo))) { + if (selectedParts.Count <= 1) { return; } + if (selectedParts.Any(p => p.trackNo != part.trackNo)) { _ = MessageBox.Show( this, ThemeManager.GetString("dialogs.merge.multitracks"), @@ -1313,7 +1314,6 @@ void MergePart(UPart part) { MessageBox.MessageBoxButtons.Ok); return; } - if (selectedParts.Count() <= 1) { return; } List voiceParts = []; foreach (UPart p in selectedParts) { if (p is UVoicePart vp) { @@ -1360,6 +1360,14 @@ void MergePart(UPart part) { SkipPhonemizer = false }; mergedPart.Validate(options, DocManager.Inst.Project, DocManager.Inst.Project.tracks[part.trackNo]); + if (mergedPart.notes.Any(n => n.OverlapError)) { + var res = await MessageBox.Show( + this, + ThemeManager.GetString("dialogs.merge.overlap"), + ThemeManager.GetString("dialogs.merge.caption"), + MessageBox.MessageBoxButtons.YesNo); + if (res == MessageBox.MessageBoxResult.No) { return; } + } DocManager.Inst.StartUndoGroup(); for (int i = selectedParts.Count - 1; i >= 0; i--) { // The index will shift by removing a part on each loop From 8938028a604cf8077eb035fda2f6ce508f86cb45 Mon Sep 17 00:00:00 2001 From: arx-ein Date: Sat, 6 Dec 2025 20:39:32 +0900 Subject: [PATCH 2/3] Change string name for clarity --- OpenUtau/Strings/Strings.axaml | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenUtau/Strings/Strings.axaml b/OpenUtau/Strings/Strings.axaml index 380eb73e6..52f7cf864 100644 --- a/OpenUtau/Strings/Strings.axaml +++ b/OpenUtau/Strings/Strings.axaml @@ -42,9 +42,9 @@ OpenUtau aims to be an open source editing environment for UTAU community, with Installing Installing phonemizer Installing - Merging Parts - Parts on different tracks cannot be merged. - Merged part will contain overlapping notes. Are you sure to continue? + Merging Parts + Parts on different tracks cannot be merged. + Merged part will contain overlapping notes. Are you sure to continue? Cancel Copy error to clipboard No From 1461733f2fef12a98dd4beb7ef7eab5c19005db4 Mon Sep 17 00:00:00 2001 From: arx-ein Date: Tue, 9 Jun 2026 21:41:16 +0900 Subject: [PATCH 3/3] Fix string keys not matching --- OpenUtau/Views/MainWindow.axaml.cs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/OpenUtau/Views/MainWindow.axaml.cs b/OpenUtau/Views/MainWindow.axaml.cs index 966276105..1ffc9ca50 100644 --- a/OpenUtau/Views/MainWindow.axaml.cs +++ b/OpenUtau/Views/MainWindow.axaml.cs @@ -1574,8 +1574,8 @@ async Task MergePart(UPart part) { if (selectedParts.Any(p => p.trackNo != part.trackNo)) { _ = MessageBox.Show( this, - ThemeManager.GetString("dialogs.merge.multitracks"), - ThemeManager.GetString("dialogs.merge.caption"), + ThemeManager.GetString("dialogs.mergeparts.multitracks"), + ThemeManager.GetString("dialogs.mergeparts.caption"), MessageBox.MessageBoxButtons.Ok); return; } @@ -1628,8 +1628,8 @@ async Task MergePart(UPart part) { if (mergedPart.notes.Any(n => n.OverlapError)) { var res = await MessageBox.Show( this, - ThemeManager.GetString("dialogs.merge.overlap"), - ThemeManager.GetString("dialogs.merge.caption"), + ThemeManager.GetString("dialogs.mergeparts.overlap"), + ThemeManager.GetString("dialogs.mergeparts.caption"), MessageBox.MessageBoxButtons.YesNo); if (res == MessageBox.MessageBoxResult.No) { return; } }