Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions OpenUtau.Core/Commands/ProjectCommands.cs
Original file line number Diff line number Diff line change
Expand Up @@ -167,6 +167,7 @@ public ConfigureExpressionsCommand(
public override string ToString() => "Configure expressions";
public override void Execute() {
project.expressions = newDescriptors.ToDictionary(descriptor => descriptor.abbr);
Format.Ustx.AddDefaultExpressions(project);
project.parts
.Where(part => part is UVoicePart)
.ToList()
Expand All @@ -175,6 +176,7 @@ public override void Execute() {
}
public override void Unexecute() {
project.expressions = oldDescriptors.ToDictionary(descriptor => descriptor.abbr);
Format.Ustx.AddDefaultExpressions(project);
project.parts
.Where(part => part is UVoicePart)
.ToList()
Expand Down
26 changes: 26 additions & 0 deletions OpenUtau.Core/Format/USTx.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,32 @@ public static void AddDefaultExpressions(UProject project) {
project.RegisterExpression(new UExpressionDescriptor("tone shift (curve)", SHFC, -1200, 1200, 0) { type = UExpressionType.Curve });
project.RegisterExpression(new UExpressionDescriptor("tension (curve)", TENC, -100, 100, 0) { type = UExpressionType.Curve });
project.RegisterExpression(new UExpressionDescriptor("voicing (curve)", VOIC, 0, 100, 100) { type = UExpressionType.Curve });

string message = string.Empty;
if (ValidateExpression(project, "g", GEN)) {
message += $"\ng flag -> gender";
}
if (ValidateExpression(project, "B", BRE)) {
message += $"\nB flag -> {BRE}";
}
if (ValidateExpression(project, "H", LPF)) {
message += $"\nH flag-> {LPF}";
}
if (ValidateExpression(project, "P", NORM)) {
message += $"\nP flag-> normalize";
}
if (message != string.Empty) {
var e = new MessageCustomizableException("Expressions have been merged due to duplicate flags", $"<translate:errors.expression.marge>:{message}", new Exception(), false);
DocManager.Inst.ExecuteCmd(new ErrorMessageNotification(e));
}
}
private static bool ValidateExpression(UProject project, string flag, string abbr) {
if (project.expressions.Any(e => e.Value.flag == flag && e.Value.abbr != abbr)) {
var oldExp = project.expressions.First(e => e.Value.flag == flag && e.Value.abbr != abbr);
project.MargeExpression(oldExp.Value.abbr, abbr);
return true;
}
return false;
}

public static UProject Create() {
Expand Down
27 changes: 27 additions & 0 deletions OpenUtau.Core/Ustx/UProject.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
using System.Collections.Generic;
using System.Linq;
using OpenUtau.Core.Util;
using SharpCompress;
using YamlDotNet.Serialization;

namespace OpenUtau.Core.Ustx {
Expand Down Expand Up @@ -84,6 +85,32 @@ public void RegisterExpression(UExpressionDescriptor descriptor) {
}
}

public void MargeExpression(string oldAbbr, string newAbbr) {
if (parts != null && parts.Count > 0) {
parts.Where(p => p is UVoicePart)
.OfType<UVoicePart>()
.ForEach(p => p.notes.ForEach(n => ConvertNoteExp(n, tracks[p.trackNo])));
} else if (voiceParts != null &&voiceParts.Count > 0) {
voiceParts.ForEach(p => p.notes.ForEach(n => ConvertNoteExp(n, tracks[p.trackNo])));
}
expressions.Remove(oldAbbr);

void ConvertNoteExp(UNote note, UTrack track) {
if (note.phonemeExpressions.Any(e => e.abbr == oldAbbr)) {
note.phonemeExpressions.ForEach(oldExp => {
if (!note.phonemeExpressions.Any(newExp => newExp.abbr == newAbbr && newExp.index == oldExp.index)) {
oldExp.abbr = newAbbr;
if (track.TryGetExpDescriptor(this, newAbbr, out var descriptor)) {
oldExp.descriptor = descriptor;
}
} else {
note.phonemeExpressions.Remove(oldExp);
}
});
}
}
}

public UNote CreateNote() {
UNote note = UNote.Create();
int start = NotePresets.Default.DefaultPortamento.PortamentoStart;
Expand Down
1 change: 1 addition & 0 deletions OpenUtau/Strings/Strings.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<system:String x:Key="errors.expression.abbrunique">Abbreviations must be unique</system:String>
<system:String x:Key="errors.expression.default">Default value must be between min and max</system:String>
<system:String x:Key="errors.expression.flagunique">Flags must be unique</system:String>
<system:String x:Key="errors.expression.marge">The following expressions have been merged due to duplicate flags</system:String>
<system:String x:Key="errors.expression.min">Min must be smaller than max</system:String>
<system:String x:Key="errors.expression.name">Name must be set</system:String>
<system:String x:Key="errors.failed.export">Failed to export</system:String>
Expand Down
1 change: 1 addition & 0 deletions OpenUtau/Strings/Strings.ja-JP.axaml
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,7 @@
<system:String x:Key="errors.expression.abbrunique">パラメータの略称が重複しています</system:String>
<system:String x:Key="errors.expression.default">デフォルト値は最小値以上、最大値以下にしてください</system:String>
<system:String x:Key="errors.expression.flagunique">フラグが重複しています</system:String>
<system:String x:Key="errors.expression.marge">フラグが重複しているため、以下の表情は統合されました</system:String>
<system:String x:Key="errors.expression.min">最小値は最大値より小さくしてください</system:String>
<system:String x:Key="errors.expression.name">表情名を入力してください</system:String>
<system:String x:Key="errors.failed.export">エクスポートに失敗しました</system:String>
Expand Down