Beispiel #1
0
        public static void LoadProject(string file)
        {
            ProjectFormats format  = DetectProjectFormat(file);
            UProject       project = null;

            if (format == ProjectFormats.Ustx)
            {
                project = USTx.Load(file);
            }
            else if (format == ProjectFormats.Vsq3 || format == ProjectFormats.Vsq4)
            {
                project = VSQx.Load(file);
            }
            else if (format == ProjectFormats.Ust)
            {
                project = Ust.Load(file);
            }
            else
            {
                System.Windows.MessageBox.Show("Unknown file format");
            }
            if (project != null)
            {
                DocManager.Inst.ExecuteCmd(new LoadProjectNotification(project));
            }
        }
    public UnrealEngineInstance(UnrealItemDescription unrealItem)
    {
        BuildType = UnrealEngineBuildType.Source;

        unrealItem = UnrealItemDescription.RequireUnrealItem(unrealItem.RootPath, UnrealItemType.Project, UnrealItemType.Engine);

        if (unrealItem.Type == UnrealItemType.Project)
        {
            var availableBuilds = FindAvailableBuilds();
            var Configuration   = unrealItem.SanitizeConfiguration(unrealItem.ReadConfiguration <ProjectConfiguration>());
            if (!(Configuration?.UE4RootPath).IsNullOrWhiteSpace())
            {
                RootPath = Configuration.UE4RootPath;
                Uuid     = "<Engine Not Registered>";

                foreach (var(uuid, path) in availableBuilds)
                {
                    if (Path.GetFullPath(path.Item1) == RootPath)
                    {
                        Uuid      = uuid;
                        BuildType = path.Item2;
                        break;
                    }
                }
            }
            else
            {
                UProject project = UProject.Load(unrealItem.FullPath);

                if (!availableBuilds.TryGetValue(project.EngineAssociation, out var item))
                {
                    throw new UEIdNotFound(project.EngineAssociation);
                }

                Uuid      = project.EngineAssociation;
                RootPath  = Path.GetFullPath(item.Item1);
                BuildType = item.Item2;
            }
        }
        else if (unrealItem.Type == UnrealItemType.Engine)
        {
            RootPath = Path.GetFullPath(unrealItem.RootPath);

            var availableBuilds = FindAvailableBuilds();
            foreach (var pair in availableBuilds)
            {
                if (RootPath.StartsWith(Path.GetFullPath(pair.Value.Item1)))
                {
                    RootPath  = pair.Value.Item1;
                    BuildType = pair.Value.Item2;
                    Uuid      = pair.Key;

                    break;
                }
            }
        }

        Version = JsonConvert.DeserializeObject <Version>(
            File.ReadAllText(Path.Combine(BuildPath, "Build.version")));
    }
Beispiel #3
0
        private RenderItem BuildRenderItem(UPhoneme phoneme, UVoicePart part, UProject project)
        {
            USinger singer  = project.Tracks[part.TrackNo].Singer;
            string  rawfile = Lib.EncodingUtil.ConvertEncoding(singer.FileEncoding, singer.PathEncoding, phoneme.Oto.File);

            rawfile = Path.Combine(singer.Path, rawfile);

            double strechRatio      = Math.Pow(2, 1.0 - (double)(int)phoneme.Parent.Expressions["velocity"].Data / 100);
            double length           = phoneme.Oto.Preutter * strechRatio + phoneme.Envelope.Points[4].X;
            double requiredLength   = Math.Ceiling(length / 50 + 1) * 50;
            double lengthAdjustment = phoneme.TailIntrude == 0 ? phoneme.Preutter : phoneme.Preutter - phoneme.TailIntrude + phoneme.TailOverlap;

            RenderItem item = new RenderItem()
            {
                // For resampler
                RawFile        = rawfile,
                NoteNum        = phoneme.Parent.NoteNum,
                Velocity       = (int)phoneme.Parent.Expressions["velocity"].Data,
                Volume         = (int)phoneme.Parent.Expressions["volume"].Data,
                StrFlags       = phoneme.Parent.GetResamplerFlags(),
                PitchData      = BuildPitchData(phoneme, part, project),
                RequiredLength = (int)requiredLength,
                Oto            = phoneme.Oto,
                Tempo          = project.BPM,

                // For connector
                SkipOver = phoneme.Oto.Preutter * strechRatio - phoneme.Preutter,
                PosMs    = project.TickToMillisecond(part.PosTick + phoneme.Parent.PosTick + phoneme.PosTick) - phoneme.Preutter,
                DurMs    = project.TickToMillisecond(phoneme.DurTick) + lengthAdjustment,
                Envelope = phoneme.Envelope.Points
            };

            return(item);
        }
Beispiel #4
0
        public static List <UNote> WriteNotes(UProject project, UVoicePart part, IEnumerable <UNote> notes, string filePath)
        {
            List <UNote> sequence = new List <UNote>();

            using (var writer = new StreamWriter(filePath, false, ShiftJIS)) {
                WriteHeader(project, part, writer);
                int position = 0;
                foreach (var note in notes)
                {
                    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, spacer, writer);
                    }
                    writer.WriteLine($"[#{sequence.Count:D4}]");
                    WriteNoteBody(project, note, writer);
                    position = note.End;
                    sequence.Add(note);
                }
                WriteFooter(writer);
            }
            return(sequence);
        }
Beispiel #5
0
 public void Play(UProject project)
 {
     if (renderTask != null)
     {
         if (renderTask.IsCompleted)
         {
             renderTask = null;
         }
         else
         {
             return;
         }
     }
     if (outDevice != null)
     {
         if (outDevice.PlaybackState == PlaybackState.Playing)
         {
             return;
         }
         if (outDevice.PlaybackState == PlaybackState.Paused)
         {
             outDevice.Play();
             return;
         }
         outDevice.Dispose();
     }
     Render(project);
 }
Beispiel #6
0
        private void Render(UProject project)
        {
            FileInfo         ResamplerFile = new FileInfo(PathManager.Inst.GetPreviewEnginePath());
            IResamplerDriver driver        = ResamplerDriver.ResamplerDriver.Load(ResamplerFile.FullName);

            if (driver == null)
            {
                return;
            }
            Task.Run(() => {
                var task = Task.Run(async() => {
                    RenderEngine engine = new RenderEngine(project, driver, cache);
                    renderTask          = engine.RenderAsync();
                    trackSources        = await renderTask;
                    StartPlayback();
                    renderTask = null;
                });
                try {
                    task.Wait();
                } catch (AggregateException ae) {
                    foreach (var e in ae.Flatten().InnerExceptions)
                    {
                        Log.Error(e, "Failed to render.");
                    }
                }
            });
        }
Beispiel #7
0
 public TrackChangePhonemizerCommand(UProject project, UTrack track, Phonemizer newPhonemizer)
 {
     this.project       = project;
     this.track         = track;
     this.newPhonemizer = newPhonemizer;
     this.oldPhonemizer = track.Phonemizer;
 }
Beispiel #8
0
        static public List <UVoicePart> Load(string file, UProject project)
        {
            List <UVoicePart> resultParts = new List <UVoicePart>();
            MidiFile          midi        = new MidiFile(file);

            for (int i = 0; i < midi.Tracks; i++)
            {
                Dictionary <int, UVoicePart> parts = new Dictionary <int, UVoicePart>();
                foreach (var e in midi.Events.GetTrackEvents(i))
                {
                    if (e is NoteOnEvent)
                    {
                        var _e = e as NoteOnEvent;
                        if (!parts.ContainsKey(_e.Channel))
                        {
                            parts.Add(_e.Channel, new UVoicePart());
                        }
                        var note = project.CreateNote(
                            _e.NoteNumber,
                            (int)_e.AbsoluteTime * project.Resolution / midi.DeltaTicksPerQuarterNote,
                            _e.NoteLength * project.Resolution / midi.DeltaTicksPerQuarterNote);
                        parts[e.Channel].Notes.Add(note);
                    }
                }
                foreach (var pair in parts)
                {
                    pair.Value.DurTick = pair.Value.GetMinDurTick(project);
                    resultParts.Add(pair.Value);
                }
            }
            return(resultParts);
        }
Beispiel #9
0
 public TrackChangeSingerCommand(UProject project, UTrack track, USinger newSinger)
 {
     this.project   = project;
     this.track     = track;
     this.newSinger = newSinger;
     this.oldSinger = track.Singer;
 }
Beispiel #10
0
        public static UProject Load(StreamReader reader, string file)
        {
            var project = new UProject()
            {
                resolution = 480, FilePath = file, Saved = false
            };

            Ustx.AddDefaultExpressions(project);

            project.tracks.Add(new UTrack {
                TrackNo = 0,
            });
            var part = new UVoicePart()
            {
                trackNo  = 0,
                position = 0,
                name     = Path.GetFileNameWithoutExtension(file),
            };

            project.parts.Add(part);

            var blocks = ReadBlocks(reader, file);

            ParsePart(project, part, blocks);
            part.Duration = part.notes.Select(note => note.End).Max() + project.resolution;

            return(project);
        }
Beispiel #11
0
 public ConfigureExpressionsCommand(
     UProject project,
     UExpressionDescriptor[] descriptors) : base(project)
 {
     oldDescriptors = project.expressions.Values.ToArray();
     newDescriptors = descriptors;
 }
Beispiel #12
0
 public MovePartCommand(UProject project, UPart part, int position, int trackNo) : base(project, part)
 {
     newPos     = position;
     newTrackNo = trackNo;
     oldPos     = part.position;
     oldTrackNo = part.trackNo;
 }
Beispiel #13
0
        public void RenderToFiles(UProject project)
        {
            FileInfo         ResamplerFile = new FileInfo(PathManager.Inst.GetExportEnginePath());
            IResamplerDriver driver        = ResamplerDriver.ResamplerDriver.Load(ResamplerFile.FullName);

            if (driver == null)
            {
                return;
            }
            StopPreRender();
            Task.Run(() => {
                var task = Task.Run(() => {
                    RenderEngine engine = new RenderEngine(project, driver, cache);
                    var trackMixes      = engine.RenderTracks();
                    for (int i = 0; i < trackMixes.Count; ++i)
                    {
                        var file = PathManager.Inst.GetExportPath(project.FilePath, i + 1);
                        DocManager.Inst.ExecuteCmd(new ProgressBarNotification(0, $"Exporting to {file}."));
                        WaveFileWriter.CreateWaveFile16(file, new ExportAdapter(trackMixes[i]));
                        DocManager.Inst.ExecuteCmd(new ProgressBarNotification(0, $"Exported to {file}."));
                    }
                });
                try {
                    task.Wait();
                } catch (AggregateException ae) {
                    foreach (var e in ae.Flatten().InnerExceptions)
                    {
                        Log.Error(e, "Failed to render.");
                    }
                }
            });
        }
Beispiel #14
0
 public TimeSignatureCommand(UProject project, int beatPerBar, int beatUnit) : base(project)
 {
     oldBeatPerBar = project.beatPerBar;
     oldBeatUnit   = project.beatUnit;
     newBeatPerBar = beatPerBar;
     newBeatUnit   = beatUnit;
 }
Beispiel #15
0
        private void Render(UProject project, int tick)
        {
            IResamplerDriver driver = GetPreviewDriver();

            if (driver == null)
            {
                return;
            }
            StopPreRender();
            var scheduler = TaskScheduler.FromCurrentSynchronizationContext();

            Task.Run(() => {
                RenderEngine engine = new RenderEngine(project, driver, cache, tick);
                var result          = engine.RenderProject(tick);
                faders     = result.Item2;
                var source = result.Item3;
                source     = Interlocked.Exchange(ref playbakCancellationTokenSource, source);
                if (source != null)
                {
                    source.Cancel();
                    Log.Information("Cancelling previous render");
                }
                StartPlayback(project.TickToMillisecond(tick), result.Item1);
            }).ContinueWith((task) => {
                if (task.IsFaulted)
                {
                    Log.Information($"{task.Exception}");
                    DocManager.Inst.ExecuteCmd(new UserMessageNotification(task.Exception.ToString()));
                    throw task.Exception;
                }
            }, CancellationToken.None, TaskContinuationOptions.OnlyOnFaulted, scheduler);
        }
Beispiel #16
0
        public RenderItem(UPhoneme phoneme, UVoicePart part, UProject project)
        {
            var singer = project.Tracks[part.TrackNo].Singer;

            SourceFile = phoneme.Oto.File;
            SourceFile = Path.Combine(PathManager.Inst.InstalledSingersPath, SourceFile);

            var strechRatio      = Math.Pow(2, 1.0 - (double)(int)phoneme.Parent.Expressions["velocity"].Data / 100);
            var length           = phoneme.Oto.Preutter * strechRatio + phoneme.Envelope.Points[4].X;
            var requiredLength   = Math.Ceiling(length / 50 + 1) * 50;
            var lengthAdjustment = phoneme.TailIntrude == 0 ? phoneme.Preutter : phoneme.Preutter - phoneme.TailIntrude + phoneme.TailOverlap;

            NoteNum        = phoneme.Parent.NoteNum;
            Velocity       = (int)phoneme.Parent.Expressions["velocity"].Data;
            Volume         = (int)phoneme.Parent.Expressions["volume"].Data;
            StrFlags       = phoneme.Parent.GetResamplerFlags();
            PitchData      = BuildPitchData(phoneme, part, project);
            RequiredLength = (int)requiredLength;
            Oto            = phoneme.Oto;
            Tempo          = project.BPM;

            SkipOver = phoneme.Oto.Preutter * strechRatio - phoneme.Preutter;
            PosMs    = project.TickToMillisecond(part.PosTick + phoneme.Parent.PosTick + phoneme.PosTick) - phoneme.Preutter;
            DurMs    = project.TickToMillisecond(phoneme.DurTick) + lengthAdjustment;
            Envelope = phoneme.Envelope.Points;

            phonemeName = phoneme.Phoneme;
        }
Beispiel #17
0
        async Task <SequencingSampleProvider> RenderPartAsync(UVoicePart part, UProject project, string cacheDir)
        {
            var singer = project.Tracks[part.TrackNo].Singer;

            if (singer == null || !singer.Loaded)
            {
                return(null);
            }
            var tasks    = new List <Task <RenderItem> >();
            var progress = new Progress(part.Notes.Sum(note => note.Phonemes.Count));

            progress.Clear();
            foreach (var note in part.Notes)
            {
                foreach (var phoneme in note.Phonemes)
                {
                    if (string.IsNullOrEmpty(phoneme.Oto.File))
                    {
                        Log.Warning($"Cannot find phoneme in note {note.Lyric}");
                        continue;
                    }
                    var item = new RenderItem(phoneme, part, project);
                    item.progress = progress;
                    tasks.Add(Task <RenderItem> .Factory.StartNew(ResamplePhonemeAsync, item, cancellationTokenSource.Token));
                }
            }
            await Task.WhenAll(tasks.ToArray());

            progress.Clear();
            return(new SequencingSampleProvider(tasks.Select(task => new RenderItemSampleProvider(task.Result))));
        }
Beispiel #18
0
        public static void Save(string file, UProject project)
        {
            JavaScriptSerializer jss = new JavaScriptSerializer();

            jss.RegisterConverters(
                new List <JavaScriptConverter>()
            {
                new UProjectConvertor(),
                new MiscConvertor(),
                new UPartConvertor(),
                new UNoteConvertor(),
                new UPhonemeConverter()
            });
            StringBuilder str = new StringBuilder();

            try
            {
                jss.Serialize(project, str);
                var f_out = new StreamWriter(file);
                f_out.Write(str.ToString());
                f_out.Close();
                project.Saved    = true;
                project.FilePath = file;
            }
            catch (Exception e)
            {
                System.Diagnostics.Debug.WriteLine(e.ToString());
            }
        }
Beispiel #19
0
 public static void AddBuiltInExpressions(UProject project)
 {
     project.RegisterExpression(new UExpressionDescriptor("velocity", "vel", 0, 200, 100));
     project.RegisterExpression(new UExpressionDescriptor("volume", "vol", 0, 200, 100));
     project.RegisterExpression(new UExpressionDescriptor("attack", "atk", 0, 200, 100));
     project.RegisterExpression(new UExpressionDescriptor("decay", "dec", 0, 100, 0));
 }
Beispiel #20
0
        public static UProject Load(string filePath)
        {
            string   text    = File.ReadAllText(filePath, Encoding.UTF8);
            UProject project = text.StartsWith("{")
                ? JsonConvert.DeserializeObject <UProject>(text, new VersionConverter(), new UPartConverter())
                : Yaml.DefaultDeserializer.Deserialize <UProject>(text);

            AddDefaultExpressions(project);
            project.FilePath = filePath;
            project.Saved    = true;
            project.AfterLoad();
            project.Validate();
            if (project.ustxVersion < kUstxVersion)
            {
                Log.Information($"Upgrading project from {project.ustxVersion} to {kUstxVersion}");
            }
            if (project.ustxVersion == new Version(0, 1))
            {
                project.parts
                .Where(part => part is UVoicePart)
                .Select(part => part as UVoicePart)
                .SelectMany(part => part.notes)
                .ToList()
                .ForEach(note => {
                    foreach (var kv in note.expressions)
                    {
                        if (kv.Value != null)
                        {
                            foreach (var phoneme in note.phonemes)
                            {
                                phoneme.SetExpression(project, kv.Key, (float)kv.Value.Value);
                            }
                        }
                    }
                    note.expressions = null;
                });
            }
            if (project.ustxVersion < new Version(0, 4))
            {
                if (project.expressions.TryGetValue("acc", out var exp) && exp.name == "accent")
                {
                    project.expressions.Remove("acc");
                    exp.abbr = "atk";
                    exp.name = "attack";
                    project.expressions["atk"] = exp;
                    project.parts
                    .Where(part => part is UVoicePart)
                    .Select(part => part as UVoicePart)
                    .SelectMany(part => part.notes)
                    .SelectMany(note => note.phonemeExpressions)
                    .Where(exp => exp.abbr == "acc")
                    .ToList()
                    .ForEach(exp => exp.abbr = "atk");
                    project.Validate();
                }
            }
            project.ustxVersion = kUstxVersion;
            return(project);
        }
Beispiel #21
0
 public SetPhonemeExpressionCommand(UProject project, UPhoneme phoneme, string abbr, float value)
 {
     this.project = project;
     this.phoneme = phoneme;
     Key          = abbr;
     newValue     = value;
     oldValue     = phoneme.GetExpression(project, abbr).Item1;
 }
        private ISampleProvider BuildWavePartAudio(UWavePart part, UProject project)
        {
            AudioFileReader stream;

            try { stream = new AudioFileReader(part.FilePath); }
            catch { return(null); }
            return(new WaveToSampleProvider(stream));
        }
Beispiel #23
0
 IEnumerable <RenderItem> PrepareTrack(UTrack track, UProject project, int startTick)
 {
     return(project.parts
            .Where(part => part.trackNo == track.TrackNo)
            .Where(part => part is UVoicePart)
            .Select(part => part as UVoicePart)
            .SelectMany(part => PreparePart(part, track, project, startTick)));
 }
Beispiel #24
0
 public MovePartCommand(UProject project, UPart part, int newPos, int newTrackNo)
 {
     this.project    = project;
     this.part       = part;
     this.newPos     = newPos;
     this.newTrackNo = newTrackNo;
     this.oldPos     = part.PosTick;
     this.oldTrackNo = part.TrackNo;
 }
Beispiel #25
0
 public static void Save(string filePath, UProject project)
 {
     project.ustxVersion = kUstxVersion;
     project.FilePath    = filePath;
     project.BeforeSave();
     File.WriteAllText(filePath, Yaml.DefaultSerializer.Serialize(project), Encoding.UTF8);
     project.Saved = true;
     project.AfterSave();
 }
Beispiel #26
0
 IEnumerable <RenderItem> PreparePart(UVoicePart part, UTrack track, UProject project, int startTick)
 {
     return(part.notes
            .Where(note => !note.OverlapError)
            .SelectMany(note => note.phonemes)
            .Where(phoneme => !phoneme.Error)
            .Where(phoneme => part.position + phoneme.Parent.position + phoneme.End > startTick)
            .Select(phoneme => new RenderItem(phoneme, part, track, project, driver.GetInfo().Name)));
 }
Beispiel #27
0
 public static void AddDefaultExpressions(UProject project)
 {
     AddBuiltInExpressions(project);
     project.RegisterExpression(new UExpressionDescriptor("gender", "gen", -100, 100, 0, "g"));
     project.RegisterExpression(new UExpressionDescriptor("breath", "bre", 0, 100, 0, "B"));
     project.RegisterExpression(new UExpressionDescriptor("lowpass", "lpf", 0, 100, 0, "H"));
     project.RegisterExpression(new UExpressionDescriptor("modulation", "mod", 0, 100, 0));
     project.RegisterExpression(new UExpressionDescriptor("resampler engine", "eng", false, new string[] { "", "resampler.exe" }));
 }
Beispiel #28
0
 public void Play(UProject project, int tick)
 {
     if (AudioOutput.PlaybackState == PlaybackState.Paused)
     {
         AudioOutput.Play();
         return;
     }
     AudioOutput.Stop();
     Render(project, tick);
 }
Beispiel #29
0
 private void LoadPart(UPart part, UProject project)
 {
     if (!(part is UVoicePart))
     {
         return;
     }
     UnloadPart();
     Part = part as UVoicePart;
     OnPartModified();
 }
Beispiel #30
0
 public RenderEngine(UProject project, IResamplerDriver driver, RenderCache cache, int startTick = 0)
 {
     this.project   = project;
     this.driver    = driver;
     this.cache     = cache;
     this.startTick = startTick;
     resamplers     = ResamplerDriver.ResamplerDriver
                      .Search(PathManager.Inst.GetEngineSearchPath())
                      .ToDictionary(resampler => resampler.GetInfo().Name, resampler => resampler);
 }