65.9K
CodeProject is changing. Read more.
Home

WaveControl

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (20 votes)

Aug 23, 2003

2 min read

viewsIcon

166547

downloadIcon

12026

A user control for displaying .WAV files using C#

Sample Image - wavecontrol.jpg

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.

  1. Copy WaveControl.cs, WaveControl.resx, WaveFile.cs to your projects directory
  2. 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'
  3. Save All & Build (VS.NET to get confused if you don't do this)
  4. 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.