public void Synth(string filename) { var landmarks = Finder.EnumerateAllLandmarks().ToArray(); var stripeCount = 1 + landmarks.Max(l => l.StripeIndex); var wave = new float[stripeCount * Analysis.CHUNK_SIZE]; foreach (var l in landmarks) { var startSample = Analysis.CHUNK_SIZE * (l.StripeIndex - 1); var endSample = startSample + 2 * Analysis.CHUNK_SIZE; for (var t = startSample; t < endSample; t++) { wave[t] += MathF.Sin(2 * MathF.PI * Analysis.BinToFreq(l.InterpolatedBin) * t / Analysis.SAMPLE_RATE) * MathF.Exp(l.InterpolatedLogMagnitude / UInt16.MaxValue) * Envelope[t - startSample]; } } var maxSample = wave.Max(s => Math.Abs(s)); var bytes = new List <byte>(2 * wave.Length); foreach (var s in wave) { bytes.AddRange(BitConverter.GetBytes(Convert.ToInt16(Int16.MaxValue * s / maxSample))); } File.WriteAllBytes(filename, bytes.ToArray()); }
public void Paint(string filename) { var w = Analysis.StripeCount; var h = Analysis.BIN_COUNT; var gamma = 0.25f; var maxMagnitudeSquared = Analysis.FindMaxMagnitudeSquared(); using (var bitmap = new Bitmap(w, h)) { for (var x = 0; x < w; x++) { for (var y = 0; y < h; y++) { var magnitudeSquared = Analysis.GetMagnitudeSquared(x, y); var shade = Convert.ToByte(255 * MathF.Pow(magnitudeSquared / maxMagnitudeSquared, gamma / 2)); bitmap.SetPixel(x, h - y - 1, Color.FromArgb(shade, shade, shade)); } } using (var g = Graphics.FromImage(bitmap)) { g.SmoothingMode = SmoothingMode.AntiAlias; foreach (var l in Finder.EnumerateAllLandmarks()) { var radius = 8 * l.InterpolatedLogMagnitude / UInt16.MaxValue; var cx = l.StripeIndex; var cy = h - l.InterpolatedBin - 1; g.FillEllipse(Brushes.Yellow, cx - radius, cy - radius, 2 * radius, 2 * radius); } } bitmap.Save(filename); } }