Skip to content

Commit

Permalink
Revert "Merge pull request stakira#190 from nagotown/en-delta-cvvc-ph…
Browse files Browse the repository at this point in the history
…onemizer"

This reverts commit 4dba066, reversing
changes made to c93d8ec.
  • Loading branch information
stakira committed Dec 3, 2021
1 parent c9bd09f commit fe25222
Show file tree
Hide file tree
Showing 50 changed files with 1,230 additions and 681 deletions.
3 changes: 0 additions & 3 deletions Misc/after_build.ps1

This file was deleted.

1 change: 0 additions & 1 deletion Misc/appcast.xml

This file was deleted.

166 changes: 136 additions & 30 deletions OpenUtau.Core/Classic/Ust.cs
Original file line number Diff line number Diff line change
Expand Up @@ -126,8 +126,8 @@ private static void ParsePart(UProject project, UVoicePart part, List<IniBlock>
private static void SnapPitchPoints(UVoicePart part) {
UNote lastNote = null;
foreach (var note in part.notes) {
if (lastNote != null && note.position == lastNote.End) {
note.pitch.snapFirst = true;
if (lastNote == null || note.position > lastNote.End) {
note.pitch.snapFirst = false;
}
lastNote = note;
}
Expand Down Expand Up @@ -201,24 +201,15 @@ private static void ParseNote(UNote note, int lastNotePos, int lastNoteEnd, List
break;
case "Velocity":
error |= !isFloat;
note.phonemeExpressions.Add(new UExpression("vel") {
index = 0,
value = floatValue,
});
SetExpression(note, "vel", 0, floatValue);
break;
case "Intensity":
error |= !isFloat;
note.phonemeExpressions.Add(new UExpression("vol") {
index = 0,
value = floatValue,
});
SetExpression(note, "vol", 0, floatValue);
break;
case "Moduration":
error |= !isFloat;
note.phonemeExpressions.Add(new UExpression("mod") {
index = 0,
value = floatValue,
});
SetExpression(note, "mod", 0, floatValue);
break;
case "VoiceOverlap":
error |= !isFloat;
Expand Down Expand Up @@ -276,6 +267,19 @@ private static void ParseNote(UNote note, int lastNotePos, int lastNoteEnd, List
ParsePitchBend(note, pbs, pbw, pby, pbm);
}

private static void SetExpression(UNote note, string abbr, int index, float value) {
var exp = note.phonemeExpressions
.FirstOrDefault(exp => exp.abbr == abbr && exp.index == index);
if (exp == null) {
exp = new UExpression(abbr) {
index = index,
value = value,
};
note.phonemeExpressions.Add(exp);
}
exp.value = value;
}

private static void ParseLyric(UNote note, string ust) {
if (ust.StartsWith("?")) {
ust = ust.Substring(1);
Expand Down Expand Up @@ -341,7 +345,6 @@ private static void ParsePitchBend(UNote note, string pbs, string pbw, string pb
float pbsX = parts.Length >= 1 && ParseFloat(parts[0], out pbsX) ? pbsX : 0;
float pbsY = parts.Length >= 2 && ParseFloat(parts[1], out pbsY) ? pbsY : 0;
points.Add(new PitchPoint(pbsX, pbsY));
note.pitch.snapFirst = false;
// PBW, PBY
var x = points.First().X;
if (!string.IsNullOrWhiteSpace(pbw)) {
Expand Down Expand Up @@ -387,17 +390,20 @@ static bool ParseFloat(string s, out float value) {
}

public static void SavePart(UProject project, UVoicePart part, string filePath) {
WritePart(project, part, part.notes, filePath);
WritePart(project, part, filePath);
}

public static List<UNote> WritePart(UProject project, UVoicePart part, IEnumerable<UNote> notes, string filePath) {
public static List<UNote> WritePart(UProject project, UVoicePart part, string filePath) {
var sequence = new List<UNote>();
var track = project.tracks[part.trackNo];
using (var writer = new StreamWriter(filePath, false, ShiftJIS)) {
WriteHeader(project, part, writer);
var position = 0;
foreach (var note in notes) {
if (note.position != position) {
foreach (var note in part.notes) {
if (note.position < position) {
continue;
}
if (note.position > position) {
writer.WriteLine($"[#{sequence.Count:D4}]");
var spacer = UNote.Create();
spacer.position = position;
Expand All @@ -417,6 +423,67 @@ public static List<UNote> WritePart(UProject project, UVoicePart part, IEnumerab
return sequence;
}

public static List<UNote> WritePlugin(UProject project, UVoicePart part, UNote first, UNote last, string filePath) {
var prev = first.Prev;
if (prev == null) {
if (first.position > 0) {
prev = UNote.Create();
prev.duration = first.position;
prev.lyric = "R";
prev.tone = 60;
}
} else if (first.position > prev.End) {
prev = UNote.Create();
prev.duration = first.position - prev.End;
prev.lyric = "R";
prev.tone = 60;
}
var next = last.Next;
if (next != null && next.position > last.End) {
next = UNote.Create();
next.duration = next.position - last.End;
next.lyric = "R";
next.tone = 60;
}
var sequence = new List<UNote>();
var track = project.tracks[part.trackNo];
using (var writer = new StreamWriter(filePath, false, ShiftJIS)) {
WriteHeader(project, part, writer);
var position = 0;
if (prev != null) {
writer.WriteLine($"[#PREV]");
WriteNoteBody(project, track, prev, writer);
position = prev.End;
}
var note = first;
while (note != last.Next) {
if (note.position < position) {
continue;
}
if (note.position > position) {
writer.WriteLine($"[#{sequence.Count:D4}]");
var spacer = UNote.Create();
spacer.position = position;
spacer.duration = note.position - position;
spacer.lyric = "R";
spacer.tone = 60;
sequence.Add(spacer);
WriteNoteBody(project, track, spacer, writer);
}
writer.WriteLine($"[#{sequence.Count:D4}]");
WriteNoteBody(project, track, note, writer, forPlugin: true);
position = note.End;
sequence.Add(note);
note = note.Next;
}
if (next != null) {
writer.WriteLine($"[#NEXT]");
WriteNoteBody(project, track, next, writer);
}
}
return sequence;
}

static void WriteHeader(UProject project, UVoicePart part, StreamWriter writer) {
writer.WriteLine("[#SETTING]");
writer.WriteLine($"Tempo={project.bpm}");
Expand All @@ -436,19 +503,24 @@ static void WriteFooter(StreamWriter writer) {
writer.WriteLine("[#TRACKEND]");
}

static void WriteNoteBody(UProject project, UTrack track, UNote note, StreamWriter writer) {
static void WriteNoteBody(UProject project, UTrack track, UNote note, StreamWriter writer, bool forPlugin = false) {
writer.WriteLine($"Length={note.duration}");
writer.WriteLine($"Lyric={note.lyric}");
writer.WriteLine($"NoteNum={note.tone}");
writer.WriteLine("PreUtterance=");
//writer.WriteLine("VoiceOverlap=");
if (note.phonemes.Count > 0) {
var vel = note.phonemes[0].GetExpression(project, track, "vel").Item1;
var phoneme = note.phonemes[0];
var vel = phoneme.GetExpression(project, track, "vel").Item1;
writer.WriteLine($"Velocity={(int)vel}");
var vol = note.phonemes[0].GetExpression(project, track, "vol").Item1;
var vol = phoneme.GetExpression(project, track, "vol").Item1;
writer.WriteLine($"Intensity={(int)vol}");
var mod = note.phonemes[0].GetExpression(project, track, "mod").Item1;
var mod = phoneme.GetExpression(project, track, "mod").Item1;
writer.WriteLine($"Moduration={(int)mod}");
if (forPlugin && !string.IsNullOrEmpty(phoneme.oto.DisplayFile)) {
writer.WriteLine($"@filename={phoneme.oto.DisplayFile}");
writer.WriteLine($"@alias={phoneme.oto.Alias}");
}
}
WriteEnvelope(note, writer);
WritePitch(note, writer);
Expand Down Expand Up @@ -504,9 +576,14 @@ static void WriteVibrato(UNote note, StreamWriter writer) {
}
}

public static void ParseDiffs(UProject project, UVoicePart part, List<UNote> sequence, string diffFile) {
public static (List<UNote>, List<UNote>) ParsePlugin(
UProject project, UVoicePart part, UNote first, UNote last,
List<UNote> sequence, string diffFile) {
var toRemove = new List<UNote>();
var toAdd = new List<UNote>();
using (var reader = new StreamReader(diffFile, ShiftJIS)) {
var blocks = Ini.ReadBlocks(reader, diffFile, @"\[#\w+\]");
int index = 0;
foreach (var block in blocks) {
var header = block.header;
switch (header) {
Expand All @@ -515,25 +592,54 @@ public static void ParseDiffs(UProject project, UVoicePart part, List<UNote> seq
case "[#TRACKEND]":
case "[#PREV]":
case "[#NEXT]":
break;
case "[#INSERT]":
if (index <= sequence.Count) {
var newNote = project.CreateNote();
ParseNote(newNote, 0, 0, block.lines, out var _);
newNote.AfterLoad(project, project.tracks[part.trackNo], part);
sequence.Insert(index, newNote);
toAdd.Add(newNote);
index++;
}
break;
case "[#DELETE]":
if (index < sequence.Count) {
toRemove.Add(sequence[index]);
sequence.RemoveAt(index);
}
break;
default:
if (int.TryParse(header.Substring(2, header.Length - 3), out var noteIndex)) {
if (noteIndex < sequence.Count) {
ParseNote(sequence[noteIndex], 0, 0, block.lines, out var _);
}
if (index < sequence.Count) {
toRemove.Add(sequence[index]);
var newNote = sequence[index].Clone();
ParseNote(newNote, 0, 0, block.lines, out var _);
newNote.AfterLoad(project, project.tracks[part.trackNo], part);
sequence[index] = newNote;
toAdd.Add(newNote);
index++;
}
break;
}
}
}
var position = 0;
int position = first.position;
foreach (var note in sequence) {
note.position = position;
position += note.duration;
}
SnapPitchPoints(part);
var rests = part.notes
.Where(n => n.lyric.ToLowerInvariant() == "r")
.Select(n => n.position)
.ToHashSet();
toAdd = toAdd
.Where(n => n.duration > 0)
.Where(n => n.lyric.ToLowerInvariant() != "r" || rests.Contains(n.position))
.ToList();
toRemove = toRemove
.Where(n => part.notes.Contains(n))
.ToList();
return (toRemove, toAdd);
}
}
}
7 changes: 1 addition & 6 deletions OpenUtau.Core/Classic/VoicebankLoader.cs
Original file line number Diff line number Diff line change
Expand Up @@ -77,10 +77,6 @@ public static void LoadOtoSets(Voicebank voicebank, string dirPath) {
}
var dirs = Directory.GetDirectories(dirPath);
foreach (var dir in dirs) {
var charTxt = Path.Combine(dir, kCharTxt);
if (File.Exists(charTxt)) {
continue;
}
LoadOtoSets(voicebank, dir);
}
}
Expand Down Expand Up @@ -317,8 +313,7 @@ public static Oto ParseOto(string line) {
var ext = Path.GetExtension(wav);
if (!string.IsNullOrEmpty(ext)) {
result.Alias = wav.Replace(ext, "");
}
else {
} else {
result.Alias = wav;
}
}
Expand Down
11 changes: 6 additions & 5 deletions OpenUtau.Core/DocManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,17 @@ public void SearchAllLegacyPlugins() {
}

public void SearchAllPlugins() {
const string kBuiltin = "OpenUtau.Plugin.Builtin.dll";
var stopWatch = Stopwatch.StartNew();
var phonemizerFactories = new List<PhonemizerFactory>();
phonemizerFactories.Add(PhonemizerFactory.Get(typeof(DefaultPhonemizer)));
Directory.CreateDirectory(PathManager.Inst.PluginsPath);
var files = Directory.EnumerateFiles(PathManager.Inst.PluginsPath, "*.dll", SearchOption.AllDirectories).ToList();
if (!OS.IsWindows()) {
var path = Path.GetDirectoryName(GetType().Assembly.Location);
files.InsertRange(0, Directory.EnumerateFiles(
path, "*Plugin.Builtin.dll", SearchOption.TopDirectoryOnly));
string oldBuiltin = Path.Combine(PathManager.Inst.PluginsPath, kBuiltin);
if (File.Exists(oldBuiltin)) {
File.Delete(oldBuiltin);
}
var files = Directory.EnumerateFiles(PathManager.Inst.PluginsPath, "*.dll", SearchOption.AllDirectories).ToList();
files.Insert(0, Path.Combine(Path.GetDirectoryName(GetType().Assembly.Location), kBuiltin));
foreach (var file in files) {
Assembly assembly;
try {
Expand Down
8 changes: 0 additions & 8 deletions OpenUtau.Core/OpenUtau.Core.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,8 @@
<PropertyGroup>
<TargetFramework>netstandard2.1</TargetFramework>
<SatelliteResourceLanguages>none</SatelliteResourceLanguages>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>

<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<AllowUnsafeBlocks>true</AllowUnsafeBlocks>
</PropertyGroup>

<ItemGroup>
<PackageReference Include="BunLabs.NAudio.Flac" Version="2.0.1" />
<PackageReference Include="K4os.Hash.xxHash" Version="1.0.6" />
Expand Down
12 changes: 5 additions & 7 deletions OpenUtau.Core/ResamplerDriver/Factorys/ExeDriver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ public ExeDriver(string filePath, string basePath) {
}

public byte[] DoResampler(EngineInput Args, ILogger logger) {
const bool debugResampler = false;
bool resamplerLogging = Preferences.Default.ResamplerLogging;
byte[] data = new byte[0];
if (!_isLegalPlugin) {
return data;
Expand All @@ -36,21 +36,19 @@ public byte[] DoResampler(EngineInput Args, ILogger logger) {
using (var proc = new Process()) {
proc.StartInfo = new ProcessStartInfo(FilePath, ArgParam) {
UseShellExecute = false,
RedirectStandardOutput = debugResampler,
RedirectStandardError = debugResampler,
RedirectStandardOutput = resamplerLogging,
RedirectStandardError = resamplerLogging,
CreateNoWindow = true,
};
#pragma warning disable CS0162 // Unreachable code detected
if (debugResampler) {
if (resamplerLogging) {
proc.OutputDataReceived += (o, e) => logger.Information($" >>> [thread-{threadId}] {e.Data}");
proc.ErrorDataReceived += (o, e) => logger.Error($" >>> [thread-{threadId}] {e.Data}");
}
proc.Start();
if (debugResampler) {
if (resamplerLogging) {
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
}
#pragma warning restore CS0162 // Unreachable code detected
if (!proc.WaitForExit(60000)) {
logger.Warning($"[thread-{threadId}] Timeout, killing...");
try {
Expand Down
8 changes: 4 additions & 4 deletions OpenUtau.Core/Ustx/UPart.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,6 @@
using Newtonsoft.Json;
using YamlDotNet.Serialization;
using Serilog;
using NAudio.Wave;
using NAudio.Wave.SampleProviders;

namespace OpenUtau.Core.Ustx {
[JsonObject(MemberSerialization.OptIn)]
Expand Down Expand Up @@ -38,8 +36,6 @@ public class UVoicePart : UPart {
[JsonProperty]
[YamlMember(Order = 100)]
public SortedSet<UNote> notes = new SortedSet<UNote>();
[YamlMember(Order = 101)]
public SortedSet<UTag> tags = new SortedSet<UTag>();

public override string DisplayName => name;

Expand Down Expand Up @@ -108,6 +104,10 @@ public override void Validate(UProject project, UTrack track) {

public override UPart Clone() {
return new UVoicePart() {
name = name,
comment = comment,
trackNo = trackNo,
position = position,
notes = new SortedSet<UNote>(notes.Select(note => note.Clone())),
};
}
Expand Down
Loading

0 comments on commit fe25222

Please sign in to comment.