public async Task TestLy()
        {
            var writerFactory = new SheetWriterFactory();
            var writerExt     = writerFactory.GetAllSupportedExtension();

            var readerFactory = new SheetReaderFactory();
            var readerExt     = readerFactory.GetAllSupportedExtension();

            var reader = readerFactory.GetReader("../../../DPA_Musicsheets/Files/Twee-emmertjes-water-halen.ly");

            //reader.SetFilePath("../../../DPA_Musicsheets/Files/Alle-eendjes-zwemmen-in-het-water.ly");

            reader.SetFilePath("../../../DPA_Musicsheets/Files/Twee-emmertjes-water-halen.ly");


            var resultA = await reader.ReadFromFileAsync();

            var resultB = await reader.ReadFromFileAsync();

            var writerA    = writerFactory.GetWriter("hallo.ly");
            var strResultA = await writerA.WriteToString(resultA);

            var strResultB = await writerA.WriteToString(resultB);

            var nothing = string.Empty;
        }
        private int _beatsPerBar;    // Aantal beatnotes per maat.

        async public Task OpenFile(string fileName)
        {
            var sheetReaderFactory = new SheetReaderFactory();
            var sheetWriterFactory = new SheetWriterFactory();
            var sheetReader        = sheetReaderFactory.GetReader(fileName);
            var converter          = new SheetToWPFConverter();
            var writer             = sheetWriterFactory.GetWriter(".ly");

            var sheet = await sheetReader.ReadFromFileAsync();

            WPFStaffs.Clear();
            WPFStaffs.AddRange(converter.ConvertSheet(sheet));
            WPFStaffsChanged?.Invoke(this, new WPFStaffsEventArgs()
            {
                Symbols = WPFStaffs
            });

            LilypondTextChanged?.Invoke(this, new LilypondEventArgs {
                LilypondText = await writer.WriteToString(sheet)
            });

            MidiSequence = GetSequenceFromWPFStaffs();
            MidiSequenceChanged?.Invoke(this, new MidiSequenceEventArgs()
            {
                MidiSequence = MidiSequence
            });
        }
        public void SetMusicSheet(Sheet sheet)
        {
            _musicSheet = sheet;

            var factory = new SheetWriterFactory();
            var writer  = factory.GetWriter(".ly");

            try
            {
                _text = writer.WriteToString(_musicSheet).Result;
            }
            catch (Exception)
            {
            }
        }
        public async Task WriteToFile(Sheet sheet)
        {
            var factory = new SheetWriterFactory();

            string directory        = Directory.GetCurrentDirectory();
            string date             = DateTime.Now.ToString();
            string tempFileName     = $"{directory}\temp -{date}.ly";
            string lilypondLocation = @"C:\Program Files (x86)\LilyPond\usr\bin\lilypond.exe";

            if (!File.Exists(lilypondLocation))
            {
                throw new Exception("Lilypond.exe not found, conversion not possible");
            }

            var writer = factory.GetWriter(tempFileName);

            if (writer != null)
            {
                await writer.WriteToFile(sheet);


                string sourceFolder   = Path.GetDirectoryName(tempFileName);
                string sourceFileName = Path.GetFileNameWithoutExtension(tempFileName);
                string targetFolder   = Path.GetDirectoryName(filePath);
                string targetFileName = Path.GetFileNameWithoutExtension(filePath);

                var process = new Process
                {
                    StartInfo =
                    {
                        WorkingDirectory = directory,
                        WindowStyle      = ProcessWindowStyle.Hidden,
                        Arguments        = string.Format("--pdf \"{0}\\{1}.ly\"", sourceFolder, sourceFileName),
                        FileName         = lilypondLocation
                    }
                };

                process.Start();
                while (!process.HasExited)
                { /* Wait for exit */
                }
                if (sourceFolder != targetFolder || sourceFileName != targetFileName)
                {
                    File.Move(sourceFolder + "\\" + sourceFileName + ".pdf", targetFolder + "\\" + targetFileName + ".pdf");
                    File.Delete(tempFileName);
                }
            }
        }
        public void Invoke <T>(CareTaker <T> careTaker)
        {
            if (careTaker is EditorCareTaker ect)
            {
                var fact = new SheetWriterFactory();
                fact.AddAssembly(Assembly.GetAssembly(typeof(SaveToPdfCommand)));

                var extensions = fact.GetAllSupportedExtension().Where(x => x.ext.Contains("pdf")).Select(x =>
                {
                    var e = $"*{x.ext}";

                    if (x.ext.StartsWith("(", StringComparison.InvariantCultureIgnoreCase))
                    {
                        e = x.ext.Replace("(", "").Replace(")", "").Replace("|", ";").Replace(".", "*.");
                    }

                    return($"{x.name}|{e}");
                });

                var fileService = ServiceLocator.Current.GetInstance <IFileService>();

                var path = fileService.RequestWritePath(string.Join("|", extensions.ToArray()));

                if (!string.IsNullOrWhiteSpace(path))
                {
                    var writer = fact.GetWriter(path);

                    try
                    {
                        writer.WriteToFile(ect.Current.MusicSheet);
                    }
                    catch (Exception ex)
                    {
                        Messenger.Default.Send(new ErrorMessage()
                        {
                            Exception = ex
                        });
                    }
                }
            }
        }
        public LilypondViewModel(FileHandler fileHandler, IFileService fileService, IMessageService messageService)
        {
            _fileHandler  = fileHandler;
            writerFactory = new SheetWriterFactory();

            _fileHandler.LilypondTextChanged += (src, e) =>
            {
                _textChangedByLoad = true;
                LilypondText       = e.LilypondText;
                _textChangedByLoad = false;

                CreateCareTaker();
            };

            _text = "Your lilypond text will appear here.";

            CreateCareTaker();

            this.fileService    = fileService;
            this.messageService = messageService;
        }