How to use the Waveform Analyzer
After recording a sound (see the
How to perform a recording session section for recording details) the embedded Waveform Analyzer, implemented through the
WaveformAnalyzer class, allows performing a detailed analysis of the sound itself with the purpose of generating a graphical representation of the sound's waveform.
The first step is to perform the sound's analysis through a call to the
WaveformAnalyzer.AnalyzeFullSound method: the analysis can be more or less accurate depending upon the resolution set into the
nResolution property of the
WAVEFORM_ANALYZER_SETTINGS class: higher resolutions will allow a better quality because more peaks will be detected: as a side effect, higher resolutions will require more memory and will generate larger bitmaps. When the results of an analysis are no more needed, the involved memory can be released through a call to the
WaveformAnalyzer.FreeMemory method. The analysis can be aborted at any time through a call to the
WaveformAnalyzer.AnalyzeAbort method.
After calling this method, the control will allow the container application to stay up-to-date about the analysis advancement through the following events:
WaveAnalysisPerc: fired several times during the analysis in order to inform the container application about the percentage of advancement.
At this point it's possible creating a graphical representation of analyzed sounds in one of the following modes:
In order to start the visual editing of the sound's waveform, we need to create the Waveform Analyzer user interface through a call to the
WaveformAnalyzer.Create method. By default the Waveform Analyzer user interface will appear as in the picture below where the top waveform represents the left channel of a stereo sound while the bottom waveform represents the right channel of a stereo sound (sounds in mono are rendered using one single waveform):
As most Windows controls with an user interface, the Waveform Analyzer can be:
scrolled through the WaveformAnalyzer.Scroll method: scrolling can be also performed panning the horizontal scrollbars with the mouse.
The Waveform Analyzer allows selecting/deselecting portions of the displayed waveform in two different ways:
through mouse acting directly on the waveform area: simply press the left button, drag the mouse position keeping the left button pressed and then release the left button: the selected area will appear with its colors inverted and with two tracker handles that will allow further manual resizing of the selected range; this selection can be also moved performing a mouse panning. After these manual operations the control can obtain the selected area through the WaveformAnalyzer.GetSelection method.
The Waveform Analyzer allows zooming the displayed waveform in two different ways:
through mouse acting directly on the tracker handles of one of the available horizontal scrollbars as seen on the picture below:
Whenever a change occurs on the user interface, the container application is notified through one of the following events:
The Waveform Analyzer automatically manages two vertical lines, one for displaying the current position during a playback session and another one for displaying a selection point: the look of these two lines can be modified trough the
colorWavePositionLine and the
colorWavePlaybackLine members of the
WAVEFORM_ANALYZER_SETTINGS class.
In order to ease management of custom vertical lines through mouse interaction, you can catch the
WaveAnalyzerMouseAction event which reports the exact position where the mouse was pressed on the waveform: accurate positioning is guaranteed also when the waveform is zoomed. Mouse interaction can be enabled/disabled through the
WaveformAnalyzer.MouseSelectionEnable method. During a playback session the mouse interaction is automatically disabled and an eventual call to this method will be ignored.
Mode 2: Creation of bitmaps in BMP format
After catching the
WaveAnalysisStop event, it will be possible requesting to the control the creation of the waveform's bitmap through a call to the
WaveformAnalyzer.CreateFileBitmapView and
WaveformAnalyzer.CreateMemoryBitmapView methods. It's important to note that the
WaveAnalysisStop event will report the exact number of peaks detected inside the loaded sound and the exact duration in milliseconds of each peak. When generating the bitmap for the full sound's waveform, the reported number of peaks will be exactly equal to the width in pixels of the bitmap. In case you should create a view of a given sound's range, you could obtain the number of pixels needed to display the waveform's view through a call to the
WaveformAnalyzer.GetBitmapViewWidth method.
The generated waveform's bitmap will be rendered using colors set into the
colorWaveLine and
colorWaveBackground properties of the
WAVEFORM_ANALYZER_SETTINGS class.
Below you can see five bitmaps generated using the same sound (whose duration is around 2.4 seconds length) but with five different resolutions (just for your information the song used for generating these bitmaps is available on this
link); all these bitmaps have been created using the same height of 100 pixels:
|
Resolution set into the nResolution property
|
Generated bitmap
|
|
|
|
|
WAVEANALYZER_RES_MAXIMUM
|
|
|
WAVEANALYZER_RES_VERY_HIGH
|
|
|
WAVEANALYZER_RES_HIGH
|
|
|
WAVEANALYZER_RES_MIDDLE
|
|
|
WAVEANALYZER_RES_LOW
|
|
As mentioned before, you can also generate a "view" of a defined portion of the loaded sound: on the bitmap below you can see the original song in its full length (with WAVEFORM_RES_MAXIMUM resolution)
and below you can see the view of the same song for the range between 500 and 1500 milliseconds
On the samples above we have used a very small song limited to 2.4 seconds: in case you should be in need of displaying the full waveform of a longer song on a space much smaller than the total number of required pixels, the
WaveformAnalyzer.CreateFileBitmapView and
WaveformAnalyzer.CreateMemoryBitmapView methods will shrink the waveform in order to fit exactly inside the available space; in the example below you can see a 3 minutes song fitting inside a 455 pixels wide bitmap: the original full length bitmap, using the WAVEFORM_RES_MAXIMUM resolution, would require a width of 243,683 pixels.
VERY IMPORTANT: When using high resolutions and big sound files, keep count that the Windows operating system has limits on the size of bitmaps creation; this means that it would be better avoiding the creation of very large bitmaps: in this case it would be a better approach splitting the total song's bitmap into several smaller bitmaps, for example creating bitmaps whose width in pixels doesn't exceed the current screen width.