Click here to Skip to main content
15,881,248 members
Articles / Programming Languages / C#
Article

WaveControl

Rate me:
Please Sign up or sign in to vote.
4.82/5 (22 votes)
22 Aug 20032 min read 164.5K   12K   80   18
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.

License

This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


Written By
Web Developer
United States United States
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.

Comments and Discussions

 
QuestionModifying the code to show words in audio on the waveform Pin
Lahsiv198119-Dec-16 7:10
Lahsiv198119-Dec-16 7:10 
QuestionCan it used with video ?? Pin
Member 456277620-Jan-15 16:13
Member 456277620-Jan-15 16:13 
GeneralMy vote of 5 Pin
alaro4-Jun-11 9:13
alaro4-Jun-11 9:13 
General24bit Wav file support Pin
weedweaver1-Dec-08 1:56
weedweaver1-Dec-08 1:56 
QuestionHow I can add this project to other? Pin
Yulay18-Nov-08 5:49
Yulay18-Nov-08 5:49 
QuestionChoose region Pin
captainhan28-Aug-07 23:03
captainhan28-Aug-07 23:03 
QuestionHow to copy a part of sound and plaster it to other place Pin
captainhan28-Aug-07 22:44
captainhan28-Aug-07 22:44 
QuestionRe: How to copy a part of sound and plaster it to other place Pin
Ibrahim Dwaikat18-Nov-07 6:12
Ibrahim Dwaikat18-Nov-07 6:12 
GeneralFile access Pin
amiashu30-Jul-07 6:04
amiashu30-Jul-07 6:04 
GeneralC# 2005 Pin
jvp2929-Jun-07 16:40
jvp2929-Jun-07 16:40 
Generaladding real time "bouncing ball" cursor Pin
jbarbermd5-Apr-06 15:38
jbarbermd5-Apr-06 15:38 
GeneralRe: adding real time "bouncing ball" cursor Pin
jbarbermd20-Apr-06 16:36
jbarbermd20-Apr-06 16:36 
GeneralWAV Control Pin
DNA Code this!6-Nov-04 9:52
DNA Code this!6-Nov-04 9:52 
GeneralLeft &amp; Right Pin
Kenneta24-Sep-04 1:57
Kenneta24-Sep-04 1:57 
GeneralRe: Left &amp; Right Pin
L Macia2-Nov-08 10:09
L Macia2-Nov-08 10:09 
Samples are interleaved. First, third, fifth,... are Right Channel samples and second, fourth, sixth, ... are Left channel samples.
GeneraluLaw format Pin
Anonymous17-May-04 17:12
Anonymous17-May-04 17:12 
QuestionHow to draw a waveform while recording? Pin
croch17-May-04 2:24
croch17-May-04 2:24 
AnswerRe: How to draw a waveform while recording? Pin
Ibrahim Dwaikat18-Nov-07 6:13
Ibrahim Dwaikat18-Nov-07 6:13 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.