WaveControl is based on the
WaveFile class that I wrote in another article. This user control uses that class for parsing of the wave file, and the control itself handles all the drawing/zooming of the waveform.
Features of control
- Zoom to region - Left click & drag to highlight a region, then right click to zoom
- Zoom In/Out - Mouse wheel
- Scroll waveform - Alt-Left click & drag
- Zoom out full - Double right click
Using the control in your own applications is very simple.
- Copy WaveControl.cs, WaveControl.resx, WaveFile.cs to your projects directory
- Add the 2 .cs files to the project. I normally do this by displaying the source file and rt-clicking, choosing 'Move <filename> to project'
- Save All & Build (VS.NET to get confused if you don't do this)
WaveControl should be available for addition to your forms from the 'My User Controls' toolbox.
I am in the process of learning VS.NET & C#, so this might not have been the easiest way to create a reusable control, but it does work. I look forward to other suggestions readers might have.
When I wrote the
WaveFile article and first tried to display a waveform, I was getting very poor performance when drawing larger wave files. It was pointed out that this was because I was using
PageScale to scale the drawing to something usable. However, this caused much more drawing than was actually necessary. So, in this version I find the max/min peaks for each X value that is being drawn, and draw a line between them, as shown here:
for ( int x = 0; x < m_SamplesPerPixel; x++ )
maxVal = Math.Max( maxVal, m_Wavefile.Data[ x + index ] );
minVal = Math.Min( minVal, m_Wavefile.Data[ x + index ] );
int scaledMinVal = (int) (( (minVal + 32768) * visBounds.Height ) / 65536 );
int scaledMaxVal = (int) (( (maxVal + 32768) * visBounds.Height ) / 65536 );
Things that need fixing/changing:
- Stereo waveforms still don't work right
- Only support 16bit waveforms
- Loading a wave and then loading another wave sometimes causes errors.