static void Main(string[] args) { if (args.Length != 1) { Console.WriteLine("Usage AlphaTab.ScoreDump.exe Path"); return; } // we need to use english culture to have correct string variants of floating points (dot as decimal separator) Thread.CurrentThread.CurrentCulture = new CultureInfo("en-us"); Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-us"); // load score Score score = ScoreLoader.LoadScore(args[0]); // render score with svg engine Settings settings = Settings.Defaults; settings.Engine = "svg"; ScoreRenderer renderer = new ScoreRenderer(settings); // get iterate tracks for (int i = 0; i < 1; i++) { Track track = score.Tracks[i]; // render track Console.WriteLine("Rendering track {0} - {1}", i + 1, track.Name); var totalWidth = 0; var totalHeight = 0; XDocument merged = null; var currentY = 0f; renderer.PreRender += r => { // append the svg close tag which would be part of the RenderFinished event var svgString = r.RenderResult.ToString() + "</svg>"; merged = XDocument.Parse(svgString); }; renderer.PartialRenderFinished += r => { var subSvg = XDocument.Parse(r.RenderResult.ToString()); var subRoot = subSvg.Root; subRoot.SetAttributeValue("x", "0px"); subRoot.SetAttributeValue("y", ((int)currentY) + "px"); merged.Root.Add(subRoot); currentY += r.Height; }; renderer.RenderFinished += r => { totalWidth = (int)r.TotalWidth; totalHeight = (int)r.TotalHeight; }; renderer.Render(track); merged.Root.SetAttributeValue("width", totalWidth + "px"); merged.Root.SetAttributeValue("height", totalHeight + "px"); var svg = new StringWriter(); var xmlWriter = new EntitizingXmlWriter(svg); merged.Save(xmlWriter); FileInfo info = new FileInfo(args[0]); string path = Path.Combine(info.DirectoryName, Path.GetFileNameWithoutExtension(info.Name) + "-" + i + ".svg"); File.WriteAllText(path, svg.ToString()); } }