Introduction
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
Usage
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)
- Now
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.
Performance
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 );
Conclusion
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.
PJ currently works for Avid Technology, and lives in Cambridge, MA. When he isn't coding, you can find him collecting old dusty funk & soul records.