string replace(string text, Commas separator) { Zeroes zeroes = new Zeroes(); string sep = ""; if (separator == Commas.Comma) { sep = "#,"; } if (settings.PaddingZeroes) { zeroes.bpm = new string('0', settings.BPMintPad) + "." + new string('0', settings.BPMDecPtPad); zeroes.nc = new string('0', settings.NoteCountPad); zeroes.plph = new string('0', settings.PolyphonyPad); zeroes.nps = new string('0', settings.NPSPad); zeroes.tick = new string('0', settings.TicksPad); zeroes.bars = new string('0', settings.BarCountPad); zeroes.frms = new string('0', settings.FrCountPad); } text = text.Replace("{bpm}", tempo.ToString(zeroes.bpm)); text = text.Replace("{nc}", noteCount.ToString(sep + zeroes.nc)); text = text.Replace("{nr}", (CurrentMidi.noteCount - noteCount).ToString(sep + zeroes.nc)); text = text.Replace("{tn}", CurrentMidi.noteCount.ToString(sep + zeroes.nc)); text = text.Replace("{nps}", nps.ToString(sep + zeroes.nps)); text = text.Replace("{mnps}", Mnps.ToString(sep + zeroes.nps)); text = text.Replace("{plph}", polyphony.ToString(sep + zeroes.plph)); text = text.Replace("{mplph}", Mplph.ToString(sep + zeroes.plph)); text = text.Replace("{currsec}", ((double)(seconds / 100) / 10).ToString(sep + "0.0")); text = text.Replace("{currtime}", time.ToString("mm\\:ss")); text = text.Replace("{cmiltime}", time.ToString("mm\\:ss\\.fff")); text = text.Replace("{cfrtime}", time.ToString("mm\\:ss") + ";" + (frames % renderSettings.fps).ToString(fzp)); text = text.Replace("{totalsec}", ((double)(totalsec / 100) / 10).ToString(sep + "0.0")); text = text.Replace("{totaltime}", totaltime.ToString("mm\\:ss")); text = text.Replace("{tmiltime}", totaltime.ToString("mm\\:ss\\.fff")); text = text.Replace("{tfrtime}", totaltime.ToString("mm\\:ss") + ";" + (totalframes % renderSettings.fps).ToString(fzp)); text = text.Replace("{remsec}", ((double)((totalsec - seconds) / 100) / 10).ToString(sep + "0.0")); text = text.Replace("{remtime}", (totaltime - time).ToString("mm\\:ss")); text = text.Replace("{rmiltime}", (totaltime - time).ToString("mm\\:ss\\.fff")); text = text.Replace("{rfrtime}", (totaltime - time).ToString("mm\\:ss") + ";" + ((totalframes - frames + renderSettings.fps) % renderSettings.fps).ToString(fzp)); text = text.Replace("{currticks}", (limMidiTime).ToString(sep + zeroes.tick)); text = text.Replace("{totalticks}", (CurrentMidi.tickLength).ToString(sep + zeroes.tick)); text = text.Replace("{remticks}", (CurrentMidi.tickLength - limMidiTime).ToString(sep + zeroes.tick)); text = text.Replace("{currbars}", bar.ToString(sep + zeroes.bars)); text = text.Replace("{totalbars}", maxbar.ToString(sep + zeroes.bars)); text = text.Replace("{rembars}", (maxbar - bar).ToString(sep + zeroes.bars)); text = text.Replace("{ppq}", CurrentMidi.division.ToString()); text = text.Replace("{tsn}", CurrentMidi.timeSig.numerator.ToString()); text = text.Replace("{tsd}", CurrentMidi.timeSig.denominator.ToString()); text = text.Replace("{avgnps}", ((double)CurrentMidi.noteCount / (double)CurrentMidi.secondsLength).ToString(sep + "0.00")); text = text.Replace("{currframes}", frames.ToString(sep + zeroes.frms)); text = text.Replace("{totalframes}", totalframes.ToString(sep + zeroes.frms)); text = text.Replace("{remframes}", (totalframes - frames).ToString(sep + zeroes.frms)); text = text.Replace("{notep}", (((decimal)noteCount * 1000000 / (decimal)CurrentMidi.noteCount) / 10000).ToString("00.0000")); text = text.Replace("{tickp}", (((decimal)limMidiTime * 1000000 / (decimal)CurrentMidi.tickLength) / 10000).ToString("00.0000")); text = text.Replace("{timep}", (((decimal)seconds * 1000000 / (decimal)totalsec) / 10000).ToString("00.0000")); return(text); }
public void RenderFrame(FastList <Note> notes, double midiTime, int finalCompositeBuff) { GL.BindFramebuffer(FramebufferTarget.Framebuffer, finalCompositeBuff); GL.Viewport(0, 0, renderSettings.width, renderSettings.height); GL.Clear(ClearBufferMask.ColorBufferBit); GL.Clear(ClearBufferMask.DepthBufferBit); GL.Enable(EnableCap.Blend); GL.EnableClientState(ArrayCap.VertexArray); GL.EnableClientState(ArrayCap.ColorArray); GL.EnableClientState(ArrayCap.TextureCoordArray); GL.Enable(EnableCap.Texture2D); GL.EnableVertexAttribArray(0); GL.EnableVertexAttribArray(1); GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha); if (settings.fontName != font || settings.fontSize != fontSize || settings.fontStyle != fontStyle) { font = settings.fontName; fontSize = settings.fontSize; fontStyle = settings.fontStyle; textEngine.SetFont(font, fontStyle, fontSize); } if (!renderSettings.Paused) { polyphony = 0; currentNotes = 0; long nc = 0; lock (notes) foreach (Note n in notes) { nc++; if (n.start < midiTime) { if (n.end > midiTime || !n.hasEnded) { polyphony++; } else if (n.meta != null) { n.delete = true; } if (n.meta == null) { currentNotes++; noteCount++; n.meta = true; } } if (n.start > midiTime) { break; } } LastNoteCount = nc; notesHit.AddLast(currentNotes); while (notesHit.Count > renderSettings.fps) { notesHit.RemoveFirst(); } nps = notesHit.Sum(); if (Mnps < nps) { Mnps = nps; } if (Mplph < polyphony) { Mplph = polyphony; } frames++; } double tempo = Tempo; int seconds = (int)Math.Floor((double)frames * 1000 / renderSettings.fps); int totalsec = (int)Math.Floor(CurrentMidi.secondsLength * 1000); int totalframes = (int)Math.Ceiling(CurrentMidi.secondsLength * renderSettings.fps); if (seconds > totalsec) { seconds = totalsec; } TimeSpan time = new TimeSpan(0, 0, 0, 0, seconds); TimeSpan totaltime = new TimeSpan(0, 0, 0, 0, totalsec); if (frames > totalframes) { frames = totalframes; } double barDivide = (double)CurrentMidi.division * CurrentMidi.timeSig.numerator / CurrentMidi.timeSig.denominator * 4; long limMidiTime = (long)midiTime; if (limMidiTime > CurrentMidi.tickLength) { limMidiTime = CurrentMidi.tickLength; } long bar = (long)Math.Floor(limMidiTime / barDivide) + 1; long maxbar = (long)Math.Floor(CurrentMidi.tickLength / barDivide); if (bar > maxbar) { bar = maxbar; } string fzp = new string('0', renderSettings.fps.ToString().Length); Func <string, Commas, string> replace = (text, separator) => { Zeroes zeroes = new Zeroes(); string sep = ""; if (separator == Commas.Comma) { sep = "#,"; } if (settings.PaddingZeroes) { zeroes.bpm = new string('0', settings.BPMintPad) + "." + new string('0', settings.BPMDecPtPad); zeroes.nc = new string('0', settings.NoteCountPad); zeroes.plph = new string('0', settings.PolyphonyPad); zeroes.nps = new string('0', settings.NPSPad); zeroes.tick = new string('0', settings.TicksPad); zeroes.bars = new string('0', settings.BarCountPad); zeroes.frms = new string('0', settings.FrCountPad); } text = text.Replace("{bpm}", tempo.ToString(zeroes.bpm)); text = text.Replace("{nc}", noteCount.ToString(sep + zeroes.nc)); text = text.Replace("{nr}", (CurrentMidi.noteCount - noteCount).ToString(sep + zeroes.nc)); text = text.Replace("{tn}", CurrentMidi.noteCount.ToString(sep + zeroes.nc)); text = text.Replace("{nps}", nps.ToString(sep + zeroes.nps)); text = text.Replace("{mnps}", Mnps.ToString(sep + zeroes.nps)); text = text.Replace("{plph}", polyphony.ToString(sep + zeroes.plph)); text = text.Replace("{mplph}", Mplph.ToString(sep + zeroes.plph)); text = text.Replace("{currsec}", ((double)(seconds / 100) / 10).ToString(sep + "0.0")); text = text.Replace("{currtime}", time.ToString("mm\\:ss")); text = text.Replace("{cmiltime}", time.ToString("mm\\:ss\\.fff")); text = text.Replace("{cfrtime}", time.ToString("mm\\:ss") + ";" + (frames % renderSettings.fps).ToString(fzp)); text = text.Replace("{totalsec}", ((double)(totalsec / 100) / 10).ToString(sep + "0.0")); text = text.Replace("{totaltime}", totaltime.ToString("mm\\:ss")); text = text.Replace("{tmiltime}", totaltime.ToString("mm\\:ss\\.fff")); text = text.Replace("{tfrtime}", totaltime.ToString("mm\\:ss") + ";" + (totalframes % renderSettings.fps).ToString(fzp)); text = text.Replace("{remsec}", ((double)((totalsec - seconds) / 100) / 10).ToString(sep + "0.0")); text = text.Replace("{remtime}", (totaltime - time).ToString("mm\\:ss")); text = text.Replace("{rmiltime}", (totaltime - time).ToString("mm\\:ss\\.fff")); text = text.Replace("{rfrtime}", (totaltime - time).ToString("mm\\:ss") + ";" + ((totalframes - frames + renderSettings.fps) % renderSettings.fps).ToString(fzp)); text = text.Replace("{currticks}", (limMidiTime).ToString(sep + zeroes.tick)); text = text.Replace("{totalticks}", (CurrentMidi.tickLength).ToString(sep + zeroes.tick)); text = text.Replace("{remticks}", (CurrentMidi.tickLength - limMidiTime).ToString(sep + zeroes.tick)); text = text.Replace("{currbars}", bar.ToString(sep + zeroes.bars)); text = text.Replace("{totalbars}", maxbar.ToString(sep + zeroes.bars)); text = text.Replace("{rembars}", (maxbar - bar).ToString(sep + zeroes.bars)); text = text.Replace("{ppq}", CurrentMidi.division.ToString()); text = text.Replace("{tsn}", CurrentMidi.timeSig.numerator.ToString()); text = text.Replace("{tsd}", CurrentMidi.timeSig.denominator.ToString()); text = text.Replace("{avgnps}", ((double)CurrentMidi.noteCount / (double)CurrentMidi.secondsLength).ToString(sep + "0.00")); text = text.Replace("{currframes}", frames.ToString(sep + zeroes.frms)); text = text.Replace("{totalframes}", totalframes.ToString(sep + zeroes.frms)); text = text.Replace("{remframes}", (totalframes - frames).ToString(sep + zeroes.frms)); text = text.Replace("{notep}", (((decimal)noteCount * 1000000 / (decimal)CurrentMidi.noteCount) / 10000).ToString("00.0000")); text = text.Replace("{tickp}", (((decimal)limMidiTime * 1000000 / (decimal)CurrentMidi.tickLength) / 10000).ToString("00.0000")); text = text.Replace("{timep}", (((decimal)seconds * 1000000 / (decimal)totalsec) / 10000).ToString("00.0000")); return(text); }; string renderText = settings.text; renderText = replace(renderText, settings.thousandSeparator); if (settings.textAlignment == Alignments.TopLeft) { var size = textEngine.GetBoundBox(renderText); Matrix4 transform = Matrix4.Identity; transform = Matrix4.Mult(transform, Matrix4.CreateScale(1.0f / renderSettings.width, -1.0f / renderSettings.height, 1.0f)); transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(-1, 1, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateRotationZ(0)); textEngine.Render(renderText, transform, Color4.White); } else if (settings.textAlignment == Alignments.TopRight) { float offset = 0; string[] lines = renderText.Split('\n'); foreach (var line in lines) { var size = textEngine.GetBoundBox(line); Matrix4 transform = Matrix4.Identity; transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(-size.Width, offset, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateScale(1.0f / renderSettings.width, -1.0f / renderSettings.height, 1.0f)); transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(1, 1, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateRotationZ(0)); offset += size.Height; textEngine.Render(line, transform, Color4.White); } } else if (settings.textAlignment == Alignments.BottomLeft) { float offset = 0; string[] lines = renderText.Split('\n'); foreach (var line in lines.Reverse()) { var size = textEngine.GetBoundBox(line); Matrix4 transform = Matrix4.Identity; transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(0, offset - size.Height, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateScale(1.0f / renderSettings.width, -1.0f / renderSettings.height, 1.0f)); transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(-1, -1, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateRotationZ(0)); offset -= size.Height; textEngine.Render(line, transform, Color4.White); } } else if (settings.textAlignment == Alignments.BottomRight) { float offset = 0; string[] lines = renderText.Split('\n'); foreach (var line in lines.Reverse()) { var size = textEngine.GetBoundBox(line); Matrix4 transform = Matrix4.Identity; transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(-size.Width, offset - size.Height, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateScale(1.0f / renderSettings.width, -1.0f / renderSettings.height, 1.0f)); transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(1, -1, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateRotationZ(0)); offset -= size.Height; textEngine.Render(line, transform, Color4.White); } } else if (settings.textAlignment == Alignments.TopSpread) { float offset = 0; string[] lines = renderText.Split('\n'); float dist = 1.0f / (lines.Length + 1); int p = 1; foreach (var line in lines.Reverse()) { var size = textEngine.GetBoundBox(line); Matrix4 transform = Matrix4.Identity; transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(-size.Width / 2, 0, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateScale(1.0f / renderSettings.width, -1.0f / renderSettings.height, 1.0f)); transform = Matrix4.Mult(transform, Matrix4.CreateTranslation((dist * p++) * 2 - 1, 1, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateRotationZ(0)); offset -= size.Height; textEngine.Render(line, transform, Color4.White); } } else if (settings.textAlignment == Alignments.BottomSpread) { float offset = 0; string[] lines = renderText.Split('\n'); float dist = 1.0f / (lines.Length + 1); int p = 1; foreach (var line in lines.Reverse()) { var size = textEngine.GetBoundBox(line); Matrix4 transform = Matrix4.Identity; transform = Matrix4.Mult(transform, Matrix4.CreateTranslation(-size.Width / 2, -size.Height, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateScale(1.0f / renderSettings.width, -1.0f / renderSettings.height, 1.0f)); transform = Matrix4.Mult(transform, Matrix4.CreateTranslation((dist * p++) * 2 - 1, -1, 0)); transform = Matrix4.Mult(transform, Matrix4.CreateRotationZ(0)); offset -= size.Height; textEngine.Render(line, transform, Color4.White); } } if (outputCsv != null) { outputCsv.WriteLine(replace(settings.csvFormat, Commas.Nothing)); } GL.Disable(EnableCap.Blend); GL.Disable(EnableCap.Texture2D); GL.DisableClientState(ArrayCap.VertexArray); GL.DisableClientState(ArrayCap.ColorArray); GL.DisableClientState(ArrayCap.TextureCoordArray); GL.DisableVertexAttribArray(0); GL.DisableVertexAttribArray(1); }