ShowWaveForm'�A C# Implementation of CWaveForm
Environment: VS.NET
Introduction
ShowWaveForm is based from a C++ class, called CWaveFile, written by Alexander Beletsky. This is a port to C#, with some added features. A small .wav file is included in the demo project .zip file for testing.
WaveFile.cs
WaveFile.cs is the main class. It reads and parses the WAV file headers. When passed a PaintEventArgs (typically from an OnPaint() event), it will draw the waveform. The class also allows for zooming in/out on the waveform.
Usage
Using the class is very simple. Here is the sample project file open menu handler:
private void fileOpen_Click(object sender, System.EventArgs e)
{
OpenFileDialog fileDlg = new OpenFileDialog();
if ( fileDlg.ShowDialog() == DialogResult.OK )
{
wave = new WaveFile( fileDlg.FileName );
sbpMainPanel.Text = "Reading .WAV file...";
wave.Read( );
sbpMainPanel.Text = "Finished Reading .WAV file...";
m_DrawWave = true;
Refresh( );
}
}
And here is the Paint handler of the demo project:
private void Form1_Paint( object sender,
System.Windows.Forms.PaintEventArgs e)
{
Pen pen = new Pen( ForeColor );
if ( m_DrawWave )
{
sbpMainPanel.Text = "Drawing .WAV file...";
wave.Draw( e, pen );
sbpMainPanel.Text = "Finished drawing .WAV file...";
}
}
The last interesting thing in the demo project is the MouseWheel handler, which controls zooming of the waveform:
protected override void OnMouseWheel( MouseEventArgs mea )
{
if ( mea.Delta * SystemInformation.MouseWheelScrollLines /
120 > 0 )
wave.ZoomIn( );
else
wave.ZoomOut( );
Refresh( );
}
Questions/Discussion
This is my first attempt at programming in C#/.NET. So, please comment on everything in this code! Specifically, I have questions about the following:
- Drawing the waveform is very slow for large files, perhaps because of using PageScale?
- How to catch some of the errors that can occur in zooming in/out too far
- Drawing of stereo waveforms
Downloads
Download demo project - 11 KbDownload source - 2 Kb

Comments
Works on Linux too :)
Posted by t3rmin4t0r on 06/09/2004 08:52amIt works - though I think the color handling was ugly (read that as I hate white bgs :) http://demo.dotgnu.org/~t3rmin4t0r/waveform.png No changes except color .. if you look at the terminal , you'll see the compile command too. Anyway nice portable code :)
ReplyBecause it's your first attempt, it's very good.
Posted by Wosiu on 04/13/2004 01:26pmOtherwise it would be Average. Thank you very much this is exactly what I was looking for. I'm currently analyzing your code to write something more advanced as my university project ;) thx
Reply