-
Notifications
You must be signed in to change notification settings - Fork 42
/
Copy pathWaveFormRenderer.cs
74 lines (64 loc) · 2.99 KB
/
WaveFormRenderer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
using System;
using System.Drawing;
using NAudio.Wave;
namespace NAudio.WaveFormRenderer
{
public class WaveFormRenderer
{
public Image Render(WaveStream waveStream, WaveFormRendererSettings settings)
{
return Render(waveStream, new MaxPeakProvider(), settings);
}
public Image Render(WaveStream waveStream, IPeakProvider peakProvider, WaveFormRendererSettings settings)
{
int bytesPerSample = (waveStream.WaveFormat.BitsPerSample / 8);
var samples = waveStream.Length / (bytesPerSample);
var samplesPerPixel = (int)(samples / settings.Width);
var stepSize = settings.PixelsPerPeak + settings.SpacerPixels;
peakProvider.Init(waveStream.ToSampleProvider(), samplesPerPixel * stepSize);
return Render(peakProvider, settings);
}
private static Image Render(IPeakProvider peakProvider, WaveFormRendererSettings settings)
{
if (settings.DecibelScale)
peakProvider = new DecibelPeakProvider(peakProvider, 48);
var b = new Bitmap(settings.Width, settings.TopHeight + settings.BottomHeight);
if (settings.BackgroundColor == Color.Transparent)
{
b.MakeTransparent();
}
using (var g = Graphics.FromImage(b))
{
g.FillRectangle(settings.BackgroundBrush, 0,0,b.Width,b.Height);
var midPoint = settings.TopHeight;
int x = 0;
var currentPeak = peakProvider.GetNextPeak();
while (x < settings.Width)
{
var nextPeak = peakProvider.GetNextPeak();
for (int n = 0; n < settings.PixelsPerPeak; n++)
{
var lineHeight = settings.TopHeight * currentPeak.Max;
g.DrawLine(settings.TopPeakPen, x, midPoint, x, midPoint - lineHeight);
lineHeight = settings.BottomHeight * currentPeak.Min;
g.DrawLine(settings.BottomPeakPen, x, midPoint, x, midPoint - lineHeight);
x++;
}
for (int n = 0; n < settings.SpacerPixels; n++)
{
// spacer bars are always the lower of the
var max = Math.Min(currentPeak.Max, nextPeak.Max);
var min = Math.Max(currentPeak.Min, nextPeak.Min);
var lineHeight = settings.TopHeight * max;
g.DrawLine(settings.TopSpacerPen, x, midPoint, x, midPoint - lineHeight);
lineHeight = settings.BottomHeight * min;
g.DrawLine(settings.BottomSpacerPen, x, midPoint, x, midPoint - lineHeight);
x++;
}
currentPeak = nextPeak;
}
}
return b;
}
}
}