diff WaveView.h @ 0:a6a46af64546

first upload
author wenx <xue.wen@eecs.qmul.ac.uk>
date Wed, 10 Aug 2011 14:55:38 +0100
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/WaveView.h	Wed Aug 10 14:55:38 2011 +0100
@@ -0,0 +1,1717 @@
+/*
+    Harmonic Visualiser
+
+    An audio file viewer and editor.
+    Centre for Digital Music, Queen Mary, University of London.
+    This file copyright 2011 Wen Xue.
+
+    This program is free software; you can redistribute it and/or
+    modify it under the terms of the GNU General Public License as
+    published by the Free Software Foundation; either version 2 of the
+    License, or (at your option) any later version. 
+*/
+//---------------------------------------------------------------------------
+#ifndef WaveViewH
+#define WaveViewH
+//---------------------------------------------------------------------------
+/*
+    WaveView.cpp implements a VCL component for visualizing linear PCM
+    waveform audio contents and user interactions through this GUI.
+*/
+
+
+#include "AudioPac.h"
+#include "QuickSpec.h"
+#include "fft.h"
+
+#define C4 261.6255653005986346778499935233
+
+#define ITEMXZOOMIN_TAG   11
+#define ITEMXZOOMOUT_TAG  12
+#define ITEMXZOOMRESTORE_TAG  13
+#define ITEMYZOOMIN_TAG   14
+#define ITEMYZOOMRESTORE_TAG   15
+
+
+#define WV2_STRINGS_1   "%s\n\n%s: %d (%.3fsec)\n%s: %d (%.3fsec)\n%s: %d (%.3fsec)\n\n%s: %.1fhz\n%s: %.1fhz\n%s: %.1fhz\n\n%s: %d (%.3fsec)\n\n%s: %d\n%s: %dbit\n"
+#define WV2_STRINGS_Amplitude_rms  "Amplitude(rms)"
+#define WV2_STRINGS_Average  "Average"
+#define WV2_STRINGS_Bits_per_sample   "Bits per sample"
+#define WV2_STRINGS_Extract  "Extract"
+#define WV2_STRINGS_Frequency  "Frequency"
+#define WV2_STRINGS_From  "From"
+#define WV2_STRINGS_Maximum  "Maximum"
+#define WV2_STRINGS_Minimum  "Minimum"
+#define WV2_STRINGS_Play  "Play"
+#define WV2_STRINGS_Properties  "Properties..."
+#define WV2_STRINGS_Properties_current_audio   "Properties: current audio"
+#define WV2_STRINGS_Properties_selection   "Properties: selection"
+#define WV2_STRINGS_Samples   "Samples"
+#define WV2_STRINGS_Samples_per_second   "Samples per second"
+#define WV2_STRINGS_Size   "Size"
+#define WV2_STRINGS_Stop_playback  "Stop playback"
+#define WV2_STRINGS_Time  "Time"
+#define WV2_STRINGS_To  "To"
+#define WV2_STRINGS_Total_time   "Total time"
+#define WV2_STRINGS_X_zoom  "X zoom"
+#define WV2_STRINGS_X_zoom_all  "X zoom all"
+#define WV2_STRINGS_X_zoom_in  "X zoom in"
+#define WV2_STRINGS_X_zoom_out  "X zoom out"
+#define WV2_STRINGS_Y_zoom  "Y zoom"
+#define WV2_STRINGS_Y_zoom_all  "Y zoom all"
+#define WV2_STRINGS_Y_zoom_in  "Y zoom in"
+#define WV2_STRINGS_Y_zoom_out  "Y zoom out"
+
+#define WV2_VSELECT 1
+#define WV2_HSELECT 2
+#define WV2_AMP 4
+#define WV2_LEFT 1
+#define WV2_TOP 2
+#define WV2_RIGHT 4
+#define WV2_BOTTOM 8
+
+#define WV2_MAX_CHANNEL 16
+#define WV2_MIN_LOG_FREQ 0.0001
+#define WV2_LOG_FREQ(f) (((f)>=WV2_MIN_LOG_FREQ)?(f):WV2_MIN_LOG_FREQ)
+
+#define wopIdle -1
+#define wopDrag 0
+#define wopSelect 1
+#define wopReselect 2
+//---------------------------------------------------------------------------
+typedef void __fastcall (__closure *TWaveViewCustomPaintEvent)(TObject* Sender, bool &Done);
+typedef void __fastcall (__closure *TWaveViewCustomPropertyEvent)(TObject* Sender, bool ShowPropSel);
+typedef int __fastcall (__closure *TWaveViewCustomInfoEvent)(TObject* Sender);
+struct TWaveViewObject;
+typedef void __fastcall (__closure *TWaveViewDrawObjectEvent)(TObject* Sender, TWaveViewObject& Obj);
+typedef void __fastcall (__closure *TWaveViewMousePointerEvent)(TObject* Sender, int PaneIndex, int t, double f);
+typedef void __fastcall (__closure* TWaveViewMouseLocalDataEvent)(TObject* Sender, void* Data0, void* DataP, void* DataN, int Count, int bytespersample, int t, double f, int Down);
+typedef void __fastcall (__closure* TWaveViewGetIntervalEvent)(TObject* Sender, int& st, int& en, bool option);
+typedef void __fastcall (__closure* TWaveViewGetOpModeEvent)(TObject* Sender, TShiftState Shift, int& OpMode);
+
+struct TWaveViewRulerSetting
+{
+  TColor FrontColor;
+  TColor BackColor;
+  TColor UnitTickColor;
+  TColor TickColor;
+  TColor GridColor;
+  int UnitTickSize;
+  int TickSize;
+  TFont* UnitFont;
+  bool pre_drawing;
+};
+
+struct TWaveViewSelection
+{
+  int StartPos;
+  int EndPos;
+  double StartDigiFreq;
+  double EndDigiFreq;
+  bool __fastcall operator!=(const TWaveViewSelection& WS)
+  {
+    return StartPos!=WS.StartPos || EndPos!=WS.EndPos || StartDigiFreq!=WS.StartDigiFreq || EndDigiFreq!=WS.EndDigiFreq;
+  }
+};
+
+typedef enum
+{
+  selOuter=0,
+  selLeft=1,
+  selTopLeft=3,
+  selTop=2,
+  selTopRight=6,
+  selRight=4,
+  selBottomRight=12,
+  selBottom=8,
+  selBottomLeft=9,
+  selInner=15,
+  selNone=0
+} TWaveViewSelHitTest;
+
+typedef enum
+{
+  wvfNone,
+  wvfPass,
+  wvfStop
+} TWaveViewPlaybackFilter;
+
+typedef enum
+{
+  wvpStereo,
+  wvpSwap,
+  wvpLeft,
+  wvpRight
+} TWaveViewStereoMode;
+
+typedef enum
+{
+  wvtPitchScale,
+  wvtPlayNote
+} enumWaveViewTools;
+
+typedef Set <enumWaveViewTools, wvtPitchScale, wvtPlayNote> TWaveViewTools;
+
+/*
+  TWaveViewObject implement a class to describe visual objects (tags) drawn onto the
+  visual display of a WaveView. They can respond to keyboard and mouse events.
+
+  Rect
+  Position of object inside the WaveView. This is automatically updated each time
+  the contents of the WaveView is drawn. Keyboard and mouse events are enabled when
+  the mouse pointer falls inside the area spectifies by Rect.
+
+  Id
+  Identifier.
+
+  Tag[4], ShortTag[8]
+  Integer descriptors. By default ShortTag[0] describes the type of the tag.
+
+  Buffer
+  Assiciated binary data.
+
+  Options
+  Binary options. So far only one option wvoNoMouseFocus is available. Object
+  with this option set do not capture mouse movements or respond to events.
+
+  DrawObjects
+  Pointer to method responsible to draw the object and set Rect accordingly.
+
+  OnClick, OnDblClick, OnMouseDown, OnMouseMove, OnMouseUp, OnMouseWheel
+  Mouse event entries: pointers to methods responding to various mouse events.
+
+  OnKeyDown
+  Keyboard event entry: pointers to method responding to key-down event.
+*/
+#define wvoNoMouseFocus 1
+struct TWaveViewObject
+{
+  TRect Rect;
+  int Id;
+  union
+  {
+    int Tag[4];
+    __int16 ShortTag[8];
+  };
+  void* Buffer;
+  int Options;
+  TWaveViewDrawObjectEvent DrawObject;
+  TNotifyEvent OnClick;
+  TNotifyEvent OnDblClick;
+  TMouseEvent OnMouseDown;
+  TMouseMoveEvent OnMouseMove;
+  TMouseEvent OnMouseUp;
+  TMouseWheelEvent OnMouseWheel;
+  TKeyEvent OnKeyDown; 
+};
+
+AnsiString SemitoneToPitch(double f);
+
+/*
+  TWaveViewObjects maintains a list of TWaveViewObject pointers assicated with the
+  WaveView.
+*/
+class TWaveViewObjects
+{
+public:
+  int Capacity;
+  int Count;
+  TWaveViewObject* Items;
+  TWaveViewObjects(){Capacity=0; Count=0; Items=0;}
+  ~TWaveViewObjects(){free(Items);}
+  void Add(TWaveViewObject AnItem)
+  {
+    if (Count==Capacity)
+    {
+      Items=(TWaveViewObject*)realloc(Items, sizeof(TWaveViewObject)*(Capacity+50));
+      Capacity+=50;
+    }
+    Items[Count]=AnItem;
+    Count++;
+  }
+  void Delete(int index)
+  {
+    memmove(&Items[index], &Items[index+1], sizeof(TWaveViewObject)*(Count-index-1));
+    Count--;
+  }
+};
+
+/*
+  TWaveViewPanes mains a list of drawing panes the WaveView uses to draw waveforms,
+  spectrograms, or other contents. The drawing panes are orginized into a matrix
+  of Y rows and X columns and occupies most of the WaveView. The pane with indices
+  (x,y) in this matrix is given the pane index y*X+x.
+
+
+  public variables/properties
+
+    readwrite FX
+    Number of columns.
+
+    readonly Channel[i]
+    Channel index of the i-th pane.
+
+    readonly Count
+    Number of panes.
+
+    readonly HasFreqAxis[i]
+    True is the i-th pane has frequency axis (e.g. spectrogram pane), false if not.
+
+    readwrite Margin
+    Margin between adjacent panes, in pixels.
+
+    readwrite MarginOut
+    Margins between panes and boundary of client area, i.e. ClientRect, in pixels.
+
+    readonly Type[i]
+    Pane type (waveform, spectrogram, etc.) of the i-th pane.
+
+    readwrite Rect[i]
+    The rectangualr area of the i-th pane.
+
+    readwrite Content[i]
+    The content of the i-th pane, equals Type[i]*WV2_MAX_CHANNEL+Channel[i].
+
+    readwrite YScale[i]
+    The scale for y-axis of the i-th pane. 0 for linear scale, 1 for log scale.
+
+    readwrite Rulers[i]
+    The set of axes of the i-th pane. Set WV2_HSELECT for time axis, WV2_VSELECT for
+    frequency axis, WV2_AMP for magnitude axis.
+
+
+  public methods
+
+    WaveViewPanes, ~WaveViewPanes
+    Default constructor and destructor.
+
+    int CreatePanes(TRect ARect, int X, int Y, bool erase=true)
+    Set the number of columns to X, number of rows to Y, and client area to ARect.
+    Clear the current pane contents if erase is set. Returns X*Y is successful, 0
+    if not.
+
+    bool FreqAxis(int type)
+    Returns true if the queried pane type has frequency axis, false if not.
+
+    int ResizePanes(TRect ARect)
+    Resize to client area to ARect. Returns 0.
+*/
+class TWaveViewPanes
+{
+  int FY;
+  int FCapacity;
+  int FCount;
+  int FMargin;
+  TRect FMarginOut;
+  TRect ClientRect;
+protected:
+  void __fastcall SetMargin(int AMargin);
+  void __fastcall SetMarginOut(TRect AMarginOut);
+public:
+  int FX;
+  __property int Channel[int index]={read=GetChannel};
+  __property int Count={read=FCount};
+  __property bool HasFreqAxis[int index]={read=GetHasFreqAxis};
+  __property int Margin={read=FMargin, write=SetMargin};
+  __property TRect MarginOut={read=FMarginOut, write=FMarginOut};
+  __property int Type[int index]={read=GetType};
+  TRect* Rect;
+  int* Content;
+  int* YScale; //0:linear, 1:log
+  int* Rulers;
+  TWaveViewPanes()
+  {
+    FCapacity=50;
+    FCount=0;
+    Rect=new TRect[FCapacity];
+    Content=new int[FCapacity];
+    YScale=new int[FCapacity];
+    Rulers=new int[FCapacity];
+    memset(Content, 0xFF, sizeof(int)*FCapacity);
+    FMargin=4;
+    FMarginOut=TRect(5, 5, 5, 5);
+  }
+  ~TWaveViewPanes()
+  {
+    delete[] Rect;
+    delete[] Content;
+    delete[] YScale;
+    delete[] Rulers;
+  }
+  int CreatePanes(TRect ARect, int X, int Y, bool erase=true)
+  {
+    if (X*Y>FCapacity) return 0;
+    FCount=X*Y;
+    if (erase)
+      memset(Content, 0xFF, sizeof(int)*FCapacity),
+      memset(YScale, 0, sizeof(int)*FCapacity),
+      memset(Rulers, 0, sizeof(int)*FCapacity);
+    else
+      memset(&Content[FCount], 0xFF, sizeof(int)*(FCapacity-FCount)),
+      memset(&YScale[FCount], 0, sizeof(int)*(FCapacity-FCount)),
+      memset(&Rulers[FCount], 0, sizeof(int)*(FCapacity-FCount));
+
+    double XX=(ARect.Width()-FMarginOut.left-FMarginOut.right+FMargin)*1.0/X,
+           YY=(ARect.Height()-FMarginOut.top-FMarginOut.bottom+FMargin)*1.0/Y;
+    for (int y=0; y<Y; y++)
+    {
+      for (int x=0; x<X; x++)
+      {
+        int ind=y*X+x;
+        Rect[ind].left=ARect.left+MarginOut.left+XX*x;
+        Rect[ind].right=ARect.left+MarginOut.left+XX*(x+1)-FMargin;
+        Rect[ind].top=ARect.top+MarginOut.top+YY*y;
+        Rect[ind].bottom=ARect.top+MarginOut.top+YY*(y+1)-FMargin;
+      }
+    }
+    ClientRect=ARect;
+    FX=X, FY=Y;
+    return FCount;
+  }
+  static bool __fastcall FreqAxis(int type)
+  {
+    if (type==0) return false;
+    else return true;
+  }
+private:
+  int __fastcall GetChannel(int index)
+  {
+    return Content[index]%WV2_MAX_CHANNEL;
+  }
+  bool __fastcall GetHasFreqAxis(int index)
+  {
+    int AType=Content[index]/WV2_MAX_CHANNEL;
+    return FreqAxis(AType);
+  }
+  int __fastcall GetType(int index)
+  {
+    return Content[index]/WV2_MAX_CHANNEL;
+  }
+public:
+  int ResizePanes(TRect ARect)
+  {
+    if (FX==0 || FY==0) return 0;
+    double XX=(ARect.Width()-FMarginOut.left-FMarginOut.right+FMargin)*1.0/FX,
+           YY=(ARect.Height()-FMarginOut.top-FMarginOut.bottom+FMargin)*1.0/FY;
+    for (int y=0; y<FY; y++)
+    {
+      for (int x=0; x<FX; x++)
+      {
+        int ind=y*FX+x;
+        Rect[ind].left=ARect.left+MarginOut.left+XX*x;
+        Rect[ind].right=ARect.left+MarginOut.left+XX*(x+1)-FMargin;
+        Rect[ind].top=ARect.top+MarginOut.top+YY*y;
+        Rect[ind].bottom=ARect.top+MarginOut.top+YY*(y+1)-FMargin;
+      }
+    }
+    ClientRect=ARect;
+    return 0;
+  }
+};
+
+/*
+  TWaveViewSelections maintains a list of time-frequency selections (or a binary
+  T-F mask).
+
+
+  public variables and properties
+
+    readwrite Capacity
+    Number of selections the currently allocated buffer can hold.
+
+    readwrite FCount
+    readonly Count
+    Number of selections.
+
+    readwrite Focus
+    Index to the currently active ("focused") selection.
+
+    readonly StartPos
+    Start of the duration of the focused selection, in samples.
+
+    readonly EndPos
+    End of the duration of the focused selection, in samples.
+
+    readonly Length
+    Duration of the focused selection, in samples.
+
+    readonly StartDigiFreq
+    Lower frequency bound of the focused selection, 1=sampling frequency.
+
+    readonly EndDigiFreq
+    Upper frequency bound of the focused selection, 1=sampling frequency.
+
+    readwrite Items
+    The list of selections.
+
+
+  methods
+
+    TWaveViewSelections, ~TWaveViewSelections
+    Default constructor and destructor.
+
+    void Add(TWaveViewSelection& ASelection)
+    Adds new selection to list.
+
+    void Clear()
+    Clears list.
+
+    Delete(int Index)
+    Delete the index-th selection. Returns 1 if successful, 0 if not.
+
+    operator[i]
+    Return the i-th selection.
+
+*/
+class TWaveViewSelections
+{
+public:
+  int Capacity;
+  int FCount;
+  int Focus;
+  __property int Count={read=FCount};
+  __property int StartPos={read=GetStartPos};
+  __property int EndPos={read=GetEndPos};
+  __property int Length={read=GetLength};
+  __property double StartDigiFreq={read=GetStartDigiFreq};
+  __property double EndDigiFreq={read=GetEndDigiFreq};
+  TWaveViewSelection* Items;
+  TWaveViewSelections()
+  {
+    Capacity=100;
+    FCount=0;
+    Focus=0;
+    Items=new TWaveViewSelection[Capacity];
+  }
+  ~TWaveViewSelections()
+  {
+    delete[] Items;
+  }
+  void Add(TWaveViewSelection& ASelection)
+  {
+    if (FCount==Capacity)
+    {
+      int OldCapacity=Capacity;
+      Capacity+=50;
+      TWaveViewSelection* NewItems=new TWaveViewSelection[Capacity];
+      memcpy(NewItems, Items, sizeof(TWaveViewSelection)*OldCapacity);
+      delete[] Items;
+      Items=NewItems;
+    }
+    Items[FCount]=ASelection;
+    Focus=FCount;
+    FCount++;
+  }
+  void Clear()
+  {
+    FCount=0;
+    Focus=0;
+  }
+  Delete(int Index)
+  {
+    if (Index<0 || Index>=FCount)
+      return 0;
+    memmove(&Items[Index], &Items[Index+1], sizeof(TWaveViewSelection)*(FCount-1-Index));
+    FCount--;
+    if (Focus==Index) Focus=FCount-1;
+    else if (Focus>Index)
+      Focus--;
+    return 1;
+  }
+  int __fastcall GetStartPos()
+  {
+    if (FCount>0)
+      return Items[Focus].StartPos;
+    else return -1;
+  }
+  int __fastcall GetEndPos()
+  {
+    if (FCount>0)
+      return Items[Focus].EndPos;
+    else return -1;
+  }
+  int __fastcall GetLength()
+  {
+    if (FCount>0)
+      return Items[Focus].EndPos-Items[Focus].StartPos;
+    else return -1;
+  }
+  double __fastcall GetStartDigiFreq()
+  {
+    if (FCount>0)
+      return Items[Focus].StartDigiFreq;
+    else return -1;
+  }
+  double __fastcall GetEndDigiFreq()
+  {
+    if (FCount>0)
+      return Items[Focus].EndDigiFreq;
+    else return -1;
+  }
+  TWaveViewSelection operator[](int index)
+  {
+    if (index>=0 && index<FCount) return Items[index];
+    else
+    {
+      TWaveViewSelection wvs={0, 0, 0, 0};
+      return wvs;
+    }
+  }
+};
+
+/*
+    Component TWaveView
+
+      WaveView is a CustomControl used to display waveform audio and handling user
+      interactions with the display. Use a TWaveView object at design time or create
+      the object with new keyword.
+
+
+    Published Properties:
+
+        readwrite   Align (inherited)
+        readwrite   Anchors (inherited)
+        readwrite   AutoExtractMode
+        readwrite   AutoSpecAmp
+        readwrite   AxisColor
+        readwrite   BackColor
+        readwrite   ClickFocus
+        readwrite   DefaultPopupMenu
+        readwrite   DoubleBuffered (inherited)
+        readwrite   LocalDataTimeGrid
+        readwrite   MultiSelect
+        readwrite   PitchScalePart
+        readwrite   PlaybackFilter
+        readwrite   PopupMenu (inherited)
+        readwrite   ProgressCursor
+        readwrite   SamplesPerSec
+	      readwrite   ScrollBar
+        readwrite   SelectedAreaColorX
+        readwrite   SelectedFrameColorX
+        readwrite   SelectingFrameColorX
+        readwrite   SelectionBorderWidth
+        readwrite   Tools
+        readwrite   Visible (inherited)
+        readwrite   WaveAudio
+        readwrite   WaveBackColor
+        readwrite   WaveColor
+
+
+        AutoExtractMode
+        ExtractMode controls what type of zoom (time, frequency, time and frequency)
+        when a zoom-to-selection operation is invoked. If AutoExtractMode is set,
+        ExtractMode is automatically linked to SelectMode, i.e. if SelectMode is
+        time-select, then automatically set ExtractMode to time-zoom.
+
+        AutoSpecAmp
+        Set to automatically adjust spectrogram brightness so that the brightest
+        points in display stays at constant brightness.
+
+        AxisColor, BackColor, WaveBackColor and WaveColor
+        Use these properties to change the colors of the WaveView.
+
+        ClickFocus
+        Set to pass mouse and keyboard focus to the WaveView whenever it is clicked.
+
+        DefaultPopupMenu and PopupMenu
+        WaveView provides some basic operations with a default PopupMenu. User can
+        inspect or play the wave through these operations. Anyway, user may not want
+        the popupmenu in his design. A DefaultPopupMenu property is used for this
+        instance.  If DefaultPopupMenu is set to true, the menu is used. If it is
+        set to false, the default menu is not used, and user can assign another
+        popupmenu to the WaveView through the PopupMenu property.  The operations
+        associated with the default popupmenu are also available through a group
+        of methods that are declared public in TWaveView class.  See Public Methods
+        for details.
+
+        LocalDataTimeGrid
+        WaveView invokes MouseLocalData event as the mouse pointer is moved inside
+        the display panes, supplying the time at mouse pointer as an argument. If
+        LocalDataTimeGrid is set, the time argument provided is aligned to the
+        nearest spectrogram frame centre.
+
+        MultiSelect
+        Set to entre multiple selection mode in which the user can made multiple
+        time-frequency selections.
+
+        PitchScalePart
+        WaveView draws a set of harmonic frequency markers aligned to the position
+        of the mouse pointer if Tools contains wvtPitchScale. PitchScalePart specifies
+        the partial index associated with the frequency at mouse pointer.
+
+        PlaybackFilter
+        Specifies the type of filter (pass, stop, none) to use for playback.
+
+        ProgressCursor
+        Set to show a playback cursor during playback.
+
+        SamplesPerSec
+        Sampling rate used by the WaveView.
+
+        ScrollBar
+        WaveView doesn't implement a scrollbar. To provide a WaveView object
+        with a scrollbar, simply use a normal ScrollBar and assign it to the
+        WaveView object through the ScrollBar property. The WaveView will use
+        the scrollbar automatically.
+
+        SelectedAreaColorX, SelectedFrameColorX, SelectingFrameColorX
+        Use these properties to change the xor colour masks for drawing the
+        time-frequency selections.
+
+        Tools
+        Additional tools the WaveView comes with, including wvtPitchScale for drawing
+        a set of harmonic frequency marks aligned to the position of teh mouse pointer,
+        and wvtPlayNote for playing a note pitched at the mouse pointer when the
+        mouse is clicked with Shift key held down.
+
+        WaveAudio
+        Use this property to associate a WaveAudio object to WaveView. If 0 is
+        written to WaveAudio property, the WaveView displays nothing.
+
+
+    Public Properties
+
+        readonly    A[][]
+        readwrite   AccessFCaption
+        readonly    BytesPerSample
+        readonly    CalculateFrameCount
+        readonly    Canvas (inherited)
+        readwrite   Caption (inherited)
+        readwrite   Channels
+        readonly    CurrentAmplitude
+        readonly    CurrentChannel
+        readonly    CurrentDigiFreq
+        readonly    CurrentPane
+        readonly    CurrentRange
+        readonly    CurrentSample16
+        readonly    CurrentSampleInPixel
+        readonly    CurrentTime
+        readonly    CurrentX
+        readonly    CurrentY
+        readwrite   CursorColorBright
+        readwrite   CursorColorDim
+        readwrite   Data[]
+        readonly    Data8[]
+        readonly    Data16[]
+        readonly    Data24[]
+        readwrite   DefaultPropertyItems
+        readwrite   EndDigiFreq
+        readwrite   EndPos
+        readwrite   ExtractMode
+        readwrite   ForceHamming
+        readwrite   InfoColor0
+        readwrite   InfoColor1
+        readwrite   InfoColor2
+        readonly    LastX
+        readonly    LastY
+        readwrite   Length
+        readonly    OpMode
+        readonly    Ph[][]
+        readonly    Playing
+        readwrite   PlayNoteInSemitone
+        readwrite   RulerAlignX
+        readwrite   RulerAlignY
+        readwrite   RulerUnitAmp
+        readwrite   RulerUnitFreq
+        readwrite   RulerUnitTime
+        readwrite   SectionEndPos
+        readwrite   SectionStartPos
+        readwrite   Selections
+        readwrite   SelectMode
+        readwrite   ShowCursotText
+        readwrite   ShowInfo
+        readwrite   ShowPaneInfo
+        readonly    Spec[][]
+        readwrite   SpecAmp
+        readwrite   SpecOffst
+        readwrite   SpecRes
+        readonly    Spectrogram[]
+        readwrite   SpecWindowParamD[]
+        readwrite   SpecWindowType
+        readwrite   StartDigiFreq
+        readonly    StartPane
+        readwrite   StartPos
+        readonly    StartSel
+        readonly    StartSelX
+        readonly    StartSelY
+        readwrite   StereoMode
+        readwrite   YZoomRate
+
+
+        A[ch][fr]
+        Amplitude spectrum of channel ch and frame fr.
+
+        AccessFCaption
+        Provides direct access to FCaption without invoking SetCaption(...).
+
+        BytesPerSample
+        Bytes used for each waveform sample (8, 16 or 24).
+
+        Channels
+        Number of channels.
+
+        CurrentAmplitude
+        Reading on amplitude axis at the mouse pointer in waveform display.
+
+        CurrentChannel
+        Channel index of data displayed in CurrentPane.
+
+        CurrentDigiFreq
+        Reading on frequency axis at the mouse pointer in spectrogram display.
+
+        CurrentPane
+        Index of the display pane that currently containins the mouse pointer.
+
+        CurrentRange
+        Time-frequency scope of the current display.
+
+        CurrentSample16
+        Sample value of CurrentChannel at CurrentTime.
+
+        CurrentSampleInPixel
+        The display Y-coordinate corresponding to CurrentSample16.
+
+        CurrentTime
+        Reading on time axis at the mouse pointer.
+
+        CurrentX
+        X-coordinate of mouse pointer.
+
+        CurrentY
+        Y-coordinate of mouse pointer.
+
+        CursorColorBright
+        Colour used to draw ruler cursor in on dim background.
+
+        CursorColorDim
+        Colour used to draw ruler cursor in on bright background.
+
+        Data[ch], Data8[ch], Data16[ch], Data24[ch]
+        Data buffer of channel ch in void*, __int8*, __int16* and __pint24.
+
+        DefaultPropertyItems
+        Set to show default list of properties when Properties menu item from the
+        default popup menu is invoked.
+
+        EndDigiFreq and StartDigiFreq
+        Upper and lower bounds of the currently displayed frequency range (1=sampling
+        frequency). Write these properties to change the display range and trigger
+        an OnPageChange event.
+
+        EndPos and StartPos
+        End and starting positions of currently displayed duration, in samples.
+        Write these properties to change the  display range and trigger an OnPageChange
+        event.
+
+        ExtractMode
+        Specifies the type of zooming (time, frequency, time and frequency) to
+        perform when zoom-to-selection operation is invoked.
+
+        ForceHamming
+        Set to force Hamming windowing for audio playback via playback filter.
+
+        InfoColor0, InfoColor1, InfoColor2
+        Colours used to draw the internal (info) tags if ShowInfo is set.
+
+        LastX, LastY
+        The X and Y coordinates recorded at the last mouse down, move and up event.
+        They are identical to X and Y upon calling MouseMove() and MoveUp(), and
+        after calling MouseDown().
+
+        Length
+        Length of the audio content the WaveView currently holds, in samples.
+
+        OpMode
+        The current operation mode (idle, dragging, selecting, reselecting, or other
+        user-defined modes).
+
+        Ph[ch][fr]
+        Phase spectrum of channel ch and frame fr.
+
+        Playing
+        Set if playback is in progress, cleared if not.
+
+        PlayNoteInSemitone
+        Set to adjust note playback using wvtPlayNote tool to pitch at the nearst
+        well-tempered semitone (A4=440Hz) from CurrentDigiFreq.
+
+        RulerAlignX, RulerAlignY
+        Alignments of X and Y axes.
+
+        RulerUnitAmp
+        Display unit for amplitude axis. 0=relative(-1 to +1), 1=absolute.
+
+        RulerUnitFreq
+        Display unit for frequency axis. 0=hz, 1=bin (when using linear frequency
+        scale) or semitones (when using log frequency scale).
+
+        RulerUnitTime
+        Display unit for time axis. 0=samples, 1=seconds.
+
+        SectionEndPos, SectionStartPos
+        End and starting points of the playback duration.
+
+        Selections
+        Current time-frequency selections.
+
+        SelectMode
+        Specifies mode (time, frequency or time-and-frequency) for normal selections.
+
+        ShowCursotText
+        Set to display cursor text.
+
+        ShowInfo
+        Set to display basic info tags (number of channels, sampling rate, bytes
+        per sample, duration, display range).
+
+        ShowPaneInfo
+        Set to display pane info.
+
+        Spec[ch][fr]
+        Complex spectrum of channel ch at frame fr.
+
+        SpecAmp
+        Spectral display amplification, for adjusting the spectrogram brightness.
+
+        SpecOffst
+        Time offst between ajcent frame centres.
+
+        SpecRes
+        Window size for spectrogram computation.
+
+        Spectrogram[ch]
+        Spectrogram of channal ch.
+
+        SpecWindowParamD[], SpecWindowType
+        Window type and optional parameter list of window function.
+
+        StartPane
+        Index to display pane in which a mouse key was last pressed down in the WaveView.
+
+        StartSel
+        Reading of time axis the last time a mouse key was pressed down in the WaveView.
+
+        StartSelX, StartSelY
+        X and Y coordinates that last time a mouse key was pressed down in the WaveView.
+
+        StereoMode
+        Stereo playback mode (normal, swap-channel, left channel or right channel).
+
+        YZoomRate
+        Amplitude display amplification.
+
+
+    Public variables
+
+        PBPR
+        Playbuffer pointer. Position from which to load the next playback buffer.
+
+        DisableMouseWheelZoom
+        Set to disable time and frequency zooming by mouse wheeling.
+
+        maxv_specamp
+        Product of the maximal spectal amplitude in current display range and SpecAmp.
+        This is kept constant if AutoSpecAmp is set.
+
+        FSpectrogram[WV2_MAX_CHANNEL]
+        Spectrograms of the channels.
+
+        FPanes
+        List of display panes.
+
+        FObjects
+        List of WaveView objects.
+
+        InfoRectCount, InfoRect[]
+        Number of info tags, their display areas
+
+        InfoRectAtPointer
+        Index to the info tag at mouse pointer.
+
+        ObjectAtPointer
+        Pointer to WaveView object at mouse pointer.
+
+        StartObject
+        If a mouse key is pressed down with the mouse pointer at a WaveView object
+        whose OnMouseDown event is set, then StartObject is set to that object
+        and cleared after the next MouseUp event.
+
+        DefaultRulerSetting[4]
+        Default settings for drawing the axes.
+
+        DefaultPaneInfoFont
+        Default font for displaying pane info.
+
+        DefaultInfoFont
+        Default font for displaying info tags.
+
+        InfoLeft, InfoTop
+        Top-left coordinates to draw info tags.
+
+        AutoScroll
+        Set to enable automatic scrolling when playback proceeds beyond current
+        display range, clear to disable it.
+
+        ForceOLA
+        When filling the playback buffers, WaveView chooses whether or not using
+        overlap-add of adjacent frames according to the playback filter. If ForceOLA
+        is set then overlap-add is unconditionally enforced the next time a block
+        buffer is filled.
+
+        LoopPlay
+        Set to enable looped playback, clear to disable it.
+
+        LoopMode
+        Specifies the loop range in looped playback. 0=no looping, 1=looping the
+        current display range, 2=looping the current active selection.
+
+        Basic0[WV2_MAX_CHANNEL], Basic1[WV2_MAX_CHANNEL]
+        Internal bitmaps for storing the raw waveform and spectrogram images.
+
+
+    Public Methods
+
+        TWaveView, ~TWaveView()
+        Default constructor and destructor.
+
+        CheckWaveOutDevCaps
+        Checks if WaveOut device is ready and enable/disable playback menu accordingly.
+
+        ClearSelections
+        Empty current list of time-frequency selections.
+
+        ClearSpectrogram, ClearSpectrograms
+        Free buffered spectrogram data.
+
+        CreatePanes(X, Y)
+        Creates X columns times Y rows of display panes.
+
+        DefaultShowProperty
+        Display a message box to show basic properties of the audio content.
+
+        DoExtract, UndoExtract
+        Zoom-to-selction operation, undo the last zoom-to-selectino operation.
+
+        DrawBitmap(Sender)
+        Draws a bitmap (TBitmap*)Sender in the WaveView.
+
+        DrawCaption
+        Draws a caption on the top-right of the WaveView.
+
+        DrawCursor(PaneIndex, X, Y)
+        Draws the mouse cursors in display pane PaneIndex given pointer coordinates.
+
+        DrawInfo
+        Draws info tags and update their active areas.
+
+        DrawPane
+        Draws a display pane.
+
+        DrawPaneInfo
+        Draws the pane info.
+
+        DrawPanes
+        Draws display panes.
+
+        DrawPitchScale
+        Draws a set of harmonic frequency marks aligned to the current mouse pointer.
+
+        DrawPlaybackCursor
+        Draws the playback cursor which marks the current playback position.
+
+        DrawSelection, DrawSelections
+        Draw the current time-frequency selections.
+
+        DrawSemitones
+        Draws a set of frequency grids marking whole well-tempered semitones.
+
+        DrawSpectrogramX
+        Draws the spectrogram.
+
+        DrawWaveForm
+        Draws the waveform.
+
+        ExtDataChange
+        Invoked to notify a change to the data buffer committed by the caller so
+        that WaveView can update its display.
+
+        FocusSelection
+        Puts the focus to a specific selection in multiple selection mode.
+
+        FreeData
+        Frees internal waveform audio buffer(s).
+
+        FreeInternalBitmaps
+        Frees Basic0[] and Basic1[] which stores raw waveform and spectrogram images.
+
+        FreeSpectrograms
+        Frees internal spectrogram buffers (unlike ClearSpectrogram, which frees
+        buffer data held in the buffers).
+
+        FromAmplitudeToPixel, FromPixelToAmplitude, FromDigiFreqToPixel,
+        FromPixelToDigiFreq, FromPixelToSample, FromSampleToPixel
+        Conversion routines between screen coordinates and time-amplitude locations
+        on the displayed waveform of time-frequency locations of the spectrogram.
+
+        GetFMask
+        Obtain the frequency mask at certain time (snapshot of CurrentSelections).
+
+        GetObjectAtPointer
+        Obtain the object at given coordinates and set ObjectToPointer variable.
+
+        GetOpMode
+        Obtain OpMode given specific keyboard and mouse status and set OpMode property.
+
+        InvalidateBasic, InvalidateBasics
+        Discard stored raw waveform and/or spectrogram images.
+
+        ItemExtractClick, ItemPlayClick, ItemPropertyClick,
+        ItemXZoomClick, ItemYZoomClick
+        Calling these methods do the same as clicking on the dufault popupmenu items
+        excpet for the Sender argument. The Sender argument has its importance in
+        ItemXZoomClick and ItemYZoomClick methods. If user wishes to use his own
+        popupmenu, it is recommended to assign these methods to the menu. Before
+        assigning ItemXZoomClick and ItemYZoomClick, be sure to fill the Tag property
+        of the Sender. Valid Tag values are: ITEMXZOOMIN_TAG(11), ITEMXZOOMOUT_TAG(12),
+        ITEMXZOOMRESTORE_TAG(13), ITEMYZOOMIN_TAG(14), and ITEMYZOOMRESTORE_TAG(15).
+
+        PausePlayback, StartPlayback
+        Stops and starts audio playback.
+
+        Post
+        Sends local waveform data to the associated WaveAudio object.
+
+        RemoveSelection
+        Removes a time-frequency selection.
+
+        Retrieve
+        Read waveform data from the associated WaveAudio object into local buffer.
+
+        SelectionAtPos
+        Returns index to the time-frequency selection at specified time and frequency.
+
+        SetArea
+        Sets the four variables specifying the display range in one command.
+
+        SetContent
+        Specifies what to display in each display pane.
+
+        SetCursorTF
+        Sends mouse pointer to the position corresponding to given time and frequency.
+
+        SetRulers
+        Specifies what axes to display in each display pane.
+
+        SetRulerUnit
+        Specifies the unit used for displaying each axes.
+
+        SetSelection
+        Make a new time-frequency selection.
+
+        SetStartAndEndDigiFreq, SetStartAndEndPos
+        Sets the frequency/time range of display.
+
+        SetYScale
+        Sets the display amplification of waveform amplitude.
+
+        StartDrag
+        Simulates the start of a mouse dragging operation at specified coordinates.
+
+        TFFilter
+        Applies time-frequency filtering using a binary mask specified by CurrentSelections.
+
+        UpdateScrollBar
+        Updates the associated scrollbar.
+
+        Zoom, ZoomF, ZoomY
+        Time/magnitude/frequeny zooming operations.
+
+
+    Events
+
+        CustomCursorText
+        Triggered before drawing cursor texts for the user to fill in customized texts.
+
+        CustomItemExtractClick
+        Customized handler of the Extract menu item of the default popup menu.
+
+        CustomInfo
+        Triggered before drawing into tags for the user to fill in customized texts.
+
+        CustompaneInfo
+        Triggered before drawing pane into for the user to fill in customized texts.
+
+        CustomProperty
+        Customized handler of the Properties menu item of the default popup menu.
+
+        CustomXZoomClick, CustomYZoomClick
+        Customized handlers of the XZoom and YZoom menu items of the default popum menu.
+
+        OnCustomPaint
+        Customized painting routine of the WaveView.
+
+        OnGetPlaybackStartAndEndPos
+        Triggered before starting playback to allow user decide what duration to play.
+
+        OnGetOpMode
+        Triggered when querying operation mode to allow non-default mode settings and
+        user-defined modes.
+
+        OnInfoDblClick
+        Triggered when a info tag is double-clicked.
+
+        OnResize (inherited)
+        OnKeyDown (inherited)
+        OnKeyPress (inherited)
+        OnKeyUp (inherited)
+        OnDblClick (inherited)
+        OnMouseDown (inherited)
+        OnMousemove (inherited)
+        OnMouseUp (inherited)
+        OnMouseWheel (inherited)
+
+        OnMouseLocalData
+        Triggered when moving mouse pointer inside display pane, supplying the caller
+        with the time at mouse pointer and data buffers near the time.
+
+        OnMousePointer
+        Triggered when pressing left mouse key and when moving mouse pointer with
+        left mouse key down.
+
+        BeforePlayback
+        Triggered before playback starts.
+
+        OnPageChange
+        Triggered when the display duration is changed.
+
+        OnPaint
+        Triggered after painting the WaveView.
+
+        OnPlaybackDone
+        Triggered when playback finishes.
+
+        OnPlaybackStart
+        Triggered when playback starts.
+
+        OnSelectedChange
+        Triggered when the selection focus switches.
+
+        OnScaleChange
+        Triggered when YZoomRate changes.
+
+    Current version Wen Xue 2011/7
+    First version Wen Xue 2003/3
+*/
+class PACKAGE TWaveView : public TCustomControl
+{
+friend void FeedFFTBuffers(int Id, cdouble* &w, cdouble* &x, double* &win, int* &hbi, void* Parent);
+friend void TFFilter(TWaveView*, int, TWaveViewSelections*, bool, bool);
+private:
+  TWaveAudio* FWaveAudio;
+  TDataAudio* FSection;
+  TWaveViewSelections* FSelections;
+
+  TPopupMenu* FMenu;
+  TScrollBar* FScrollBar;
+
+  TNotifyEvent FBeforePlayback;
+  TNotifyEvent FCustomItemExtractClick;
+  TNotifyEvent FCustomXZoomClick;
+  TNotifyEvent FCustomYZoomClick;
+  TNotifyEvent FOnInfoDblClick;
+  TNotifyEvent FOnPageChange;
+  TNotifyEvent FOnPaint;
+  TNotifyEvent FOnPlaybackDone;
+  TNotifyEvent FOnPlaybackStart;
+  TNotifyEvent FOnScaleChange;
+  TNotifyEvent FOnSelectedChange;
+
+  TWaveViewGetIntervalEvent FOnGetPlaybackStartAndEndPos;
+  TWaveViewGetOpModeEvent FOnGetOpMode;
+  TWaveViewMouseLocalDataEvent FOnMouseLocalData;
+  TWaveViewMousePointerEvent FOnMousePointer;
+
+  TWaveViewCustomInfoEvent FCustomCursorText;
+  TWaveViewCustomPaintEvent FOnCustomPaint;
+  TWaveViewCustomInfoEvent FCustomPaneInfo;
+  TWaveViewCustomInfoEvent FCustomInfo;
+  TWaveViewCustomPropertyEvent FCustomProperty;
+  TWaveViewSelHitTest FSelHitTest;
+
+  TColor FAxisColor;
+  TColor FBackColor;
+  TColor FCursorColorDim;
+  TColor FCursorColorBright;
+  TColor FInfoColor0;
+  TColor FInfoColor1;
+  TColor FInfoColor2;
+  TColor FWaveBackColor;
+  TColor FWaveColor; TColor FWaveColor2;
+  TColor FSelectedAreaColorX;
+  TColor FSelectedFrameColorX;
+  TColor FSelectingFrameColorX;
+
+  AnsiString FCaption;
+
+  TAlign FRulerAlignX;
+  TAlign FRulerAlignY;
+
+#define WV2_FONT_NUMBER 6
+  TFont* FFonts[WV2_FONT_NUMBER];
+
+  bool FAutoCaption;
+  bool FAutoExtractMode;
+  bool FAutoSpecAmp;
+  bool FClickFocus;
+  bool FDefaultPopupMenu;
+  bool FDefaultPropertyItems;
+  bool FForceHamming;
+  bool FLocalDataOn;
+  bool FMultiSelect;
+  bool FPlayNoteInSemitone;
+  bool FProgressCursor;
+
+  bool FShowCursor;
+  bool FShowCursorText;
+  bool FShowInfo;
+  bool FShowPaneInfo;
+  bool FLocalDataTimeGrid;
+
+  double FCurrentDigiFreq1;
+  double FCurrentDigiFreq2;
+  double FCurrentTime1;
+  double FCurrentTime2;
+  double FSpecAmp;
+  double FEndDigiFreq;
+  double FStartDigiFreq;
+  double FVStartSel;
+  double FVStartSelR;
+  double FYZoomRate;
+  double prevk;
+  TWaveViewSelHitTest FStartSelHitTest;
+
+  double* PlayBuffer0;
+  double* PlayBuffer1;
+  int PBPA;
+  int PBPW;
+
+  int FBlockSize;
+  int FBytesPerSample;
+  int FCalculateFrameCount;
+  int FChannels;
+  int FCurrentPane;
+  int FEndPos;
+  int FExtractMode;
+  int FLength;
+  int FOpMode;
+  int FPitchScalePart;
+  int FRulerUnitAmp;
+  int FRulerUnitFreq;
+  int FRulerUnitTime;
+  int FSamplesPerSec;
+  int FSectionBlocks;
+  int FSectionProgress;
+  int FSectionStartPos;
+  int FSectionEndPos;
+  int FSelectionBorderWidth;
+  int FSelectMode;
+  int FSpecOffst;
+  int FSpecRes;
+  int FStartPane;
+  int FStartPos;
+  int FStartSel;
+  int FStartSelR;
+  int FStartSelX;
+  int FStartSelY;
+  TWaveViewSelection FStartSelSel;
+  TWaveViewStereoMode FStereoMode;
+
+  int FLastFocus;
+  int FX;
+  int FY;
+  TShiftState FLastShiftState;
+  int FLastX;
+  int FLastY;
+
+
+  int FX1;
+  int FX2;
+
+  //FFT Buffers
+  cdouble* fw;
+  cdouble* fx;
+  //playback windows
+  double* fw1;
+  double* fw2;
+  double* ifw1;
+  double* fw2_fw1;
+  //analysis window function
+  double* fwin;
+  double* famp;
+  double* loopframe0;
+  double* loopframe1;
+  int* fhbi;
+
+  void* FData[WV2_MAX_CHANNEL];
+
+  WindowType FSpecWindowType;
+  double FSpecWindowParamD[5];
+  int FSpecWindowParamI[5];
+
+  TWaveViewPlaybackFilter FPlaybackFilter;
+  TWaveViewTools FTools;
+
+public:
+  int PBPR;
+  bool DisableMouseWheelZoom;
+  double maxv_specamp;
+
+  TQuickSpectrogram* FSpectrogram[WV2_MAX_CHANNEL];
+  TWaveViewPanes FPanes;
+  TWaveViewObjects FObjects;
+  #define WV2_INFORECTCOUNT 10
+  int InfoRectCount;
+  int InfoRectAtPointer;
+  TRect InfoRect[WV2_INFORECTCOUNT];
+  TWaveViewObject* ObjectAtPointer;
+  TWaveViewObject* StartObject;
+
+  TMenuItem* ItemExtract;
+  TMenuItem* ItemPlay;
+  TMenuItem* ItemProperty;
+  TMenuItem* ItemSeparator1;
+  TMenuItem* ItemSeparator2;
+  TMenuItem* ItemXZoomRestore;
+  TMenuItem* ItemYZoomRestore;
+
+  TWaveViewSelection UndoExtractSelection;
+
+  TWaveViewRulerSetting DefaultRulerSetting[4];
+  TFont* DefaultPaneInfoFont;
+  TFont* DefaultInfoFont;
+
+  int TimeStamp1;
+  int TimeStamp2;
+  int InfoLeft;
+  int InfoTop;
+  bool AutoScroll;
+  bool ForceOLA;
+  bool LoopPlay;
+  int LoopMode;
+
+  Graphics::TBitmap* Basic0[WV2_MAX_CHANNEL];
+  struct sBasic0Settings {int X; int Y; int Start; int End; double YZR;
+    bool __fastcall operator!=(const sBasic0Settings& BS){return X!=BS.X || Y!=BS.Y || Start!=BS.Start || End!=BS.End || YZR!=BS.YZR;}
+    } Basic0Settings[WV2_MAX_CHANNEL];
+  Graphics::TBitmap* Basic1[WV2_MAX_CHANNEL];
+  struct sBasic1Settings {int X; int Y; TWaveViewSelection Sel; double amp; int yscale; int specstyle;
+    bool __fastcall operator!=(const sBasic1Settings& BS){return X!=BS.X || Y!=BS.Y || Sel!=BS.Sel || amp!=BS.amp || yscale!=BS.yscale || specstyle!=BS.specstyle;}
+    } Basic1Settings[WV2_MAX_CHANNEL];
+
+private:
+  int CalculateSpectrogramX(int channel, double* xx, int dX, bool interpolate);
+  TCursor __fastcall ControlCursorAtPos(int X, int Y);
+  int __fastcall FillBlock(void* Block);
+  void __fastcall FMenuPopup(TObject*);
+  QSPEC_FORMAT __fastcall SampleSpectrogramX(int channel, Graphics::TBitmap* ABmp, double* xx, double* yy, int dX, int dY, double amp, bool interpolate);
+  QSPEC_FORMAT __fastcall SamplePeakSpectrogramX(int yscale, int channel, double AStartDigiFreq, double AnEndDigiFreq, Graphics::TBitmap* ABmp, double* xx, int dX, int dY, double amp);
+  QSPEC_FORMAT __fastcall SampleSinuSpectrogramX(int yscale, int channel, double AStartDigiFreq, double AnEndDigiFreq, Graphics::TBitmap* ABmp, double* xx, int dX, int dY, double amp);
+  TWaveViewSelHitTest __fastcall SelHitTest(int X, int Y);
+  void __fastcall SetAutomaticSpecAmp(int channel, double* xx, double AStartDigiFreq, double AnEndDigiFreq, int dX, int dY);
+
+protected:
+  DYNAMIC void __fastcall Click(void);
+  DYNAMIC void __fastcall DblClick(void);
+  virtual QSPEC_FORMAT* __fastcall GetA(int Channel, int fr);
+  virtual double __fastcall GetCurrentAmplitude();
+  virtual int __fastcall GetCurrentChannel();
+  virtual double __fastcall GetCurrentDigiFreq();
+  virtual __int16 __fastcall GetCurrentSample16();
+  virtual int __fastcall GetCurrentSampleInPixel();
+  virtual int __fastcall GetCurrentTimeEx();
+  virtual TWaveViewSelection __fastcall GetCurrentRange();
+  virtual void* __fastcall GetData(int Channel);
+  virtual __int16* __fastcall GetData16(int Channel);
+  virtual __pint24 __fastcall GetData24(int Channel);
+  virtual char* __fastcall GetData8(int Channel);
+  virtual QSPEC_FORMAT* __fastcall GetPh(int Channel, int fr);
+	virtual cmplx<QSPEC_FORMAT>* __fastcall GetSpec(int Channel, int fr);
+	virtual TQuickSpectrogram* __fastcall GetSpectrogram(int Channel);
+	virtual double __fastcall GetSpecWindowParamD(int Index);
+	DYNAMIC void __fastcall KeyDown(Word &Key, TShiftState Shift);
+  DYNAMIC void __fastcall KeyUp(Word &Key, TShiftState Shift);
+  DYNAMIC void __fastcall MouseCursor(TShiftState Shift, int X, int Y);
+  DYNAMIC void __fastcall MouseDown(TMouseButton Button, TShiftState Shift, int X, int Y);
+  DYNAMIC void __fastcall MouseLocalData(int X, int Y, int Down);
+  DYNAMIC void __fastcall MouseMove(TShiftState Shift, int X, int Y);
+  DYNAMIC void __fastcall MousePointer(TShiftState Shift, int X, int Y);
+  DYNAMIC void __fastcall MouseUp(TMouseButton Button, TShiftState Shift, int X, int Y);
+  DYNAMIC void __fastcall MouseWheelHandler(TMessage& Msg);
+  virtual void __fastcall Paint();
+  DYNAMIC void __fastcall Resize();
+
+  virtual void __fastcall PageChange(bool updatescrollbar=true);
+
+  virtual void __fastcall ScrollBarChange(TObject* Sender);
+
+  virtual void __fastcall SetAutoExtractMode(bool AnAutoExtractMode);
+  virtual void __fastcall SetAutoSpecAmp(bool AnAutoSpecAmp);
+  virtual void __fastcall SetAxisColor(TColor AnAxisColor);
+  virtual void __fastcall SetBackColor(TColor ABackColor);
+  virtual void __fastcall SetCaption(AnsiString ACaption);
+  virtual void __fastcall SetClickFocus(bool AClickFocus);
+  virtual void __fastcall SetData(int index, void* AData);
+  virtual void __fastcall SetDefaultPopupMenu(bool ADefaultPopupMenu);
+  virtual void __fastcall SetEndPos(int AnEndPos);
+  virtual void __fastcall SetExtractMode(int AnExtractMode);
+  virtual void __fastcall SetForceHamming(bool AForceHamming);
+  virtual void __fastcall SetMultiSelect(bool AMultiSelect);
+  virtual void __fastcall SetPitchScalePart(int APart);
+  virtual void __fastcall SetPlaybackFilter(TWaveViewPlaybackFilter APlaybackFilter);
+  virtual void __fastcall SetSamplesPerSec(int ASamplesPerSec);
+  virtual void __fastcall SetScrollBar(TScrollBar* AScrollBar);
+  virtual void __fastcall SetSelectedAreaColorX(TColor ASelectedAreaColorX);
+  virtual void __fastcall SetSelectedFrameColorX(TColor ASelectedFrameColorX);
+  virtual void __fastcall SetSelectingFrameColorX(TColor ASelectingFrameColorX);
+  virtual void __fastcall SetSelectMode(int ASelectMode);
+  virtual void __fastcall SetSpecOffst(int ASpecOffst);
+  virtual void __fastcall SetSpecRes(int ASpecRes);
+  virtual void __fastcall SetSpecWindowParamD(int Index, double AParamD);
+  virtual void __fastcall SetSpecWindowType(WindowType ASpecWindowType);
+  virtual void __fastcall SetSpecAmp(double AnAmp);
+  virtual void __fastcall SetStartPos(int AStartPos);
+  virtual void __fastcall SetTools(TWaveViewTools ATools);
+  virtual void __fastcall SetWaveAudio(TWaveAudio* AWaveAudio);
+  virtual void __fastcall SetWaveBackColor(TColor AWaveBackColor);
+  virtual void __fastcall SetWaveColor(TColor AWaveColor);
+  virtual void __fastcall SetYZoomRate(double AYZoomRate);
+
+  virtual void __fastcall WaveViewAudioChange(TObject* Sender);
+  virtual void __fastcall WaveViewHitTest(int X, int Y);
+  virtual void __fastcall WaveViewSectionPlaybackDone(TObject* Sender);
+  virtual void __fastcall WaveViewSectionPlaybackProg(TObject* Sender, double Progress);
+
+public:
+  __property Canvas;
+
+  __property TWaveViewSelection CurrentRange={read=GetCurrentRange};
+  __property TWaveViewSelections* Selections={read=FSelections, write=FSelections};
+
+  __property AnsiString AccessFCaption={read=FCaption, write=FCaption};
+  __property AnsiString Caption={read=FCaption, write=SetCaption};
+
+  __property int CalculateFrameCount={read=FCalculateFrameCount};
+
+  __property bool DefaultPropertyItems={read=FDefaultPropertyItems, write=FDefaultPropertyItems};
+  __property bool ForceHamming={read=FForceHamming, write=SetForceHamming};
+  __property bool Playing={read=GetPlaying};
+  __property bool PlayNoteInSemitone={read=FPlayNoteInSemitone, write=FPlayNoteInSemitone};
+  __property bool ShowInfo={read=FShowInfo, write=FShowInfo};
+  __property bool ShowPaneInfo={read=FShowPaneInfo, write=FShowPaneInfo};
+
+  __property void* Data[int Channel]={read=GetData, write=SetData};
+  __property __int16* Data16[int Channel]={read=GetData16};
+  __property __pint24 Data24[int Channel]={read=GetData24};
+  __property char* Data8[int Channel]={read=GetData8};
+
+  __property double CurrentAmplitude={read=GetCurrentAmplitude};
+  __property int CurrentChannel={read=GetCurrentChannel};
+  __property double CurrentDigiFreq={read=GetCurrentDigiFreq};
+  __property int CurrentPane={read=FCurrentPane};
+  __property __int16 CurrentSample16={read=GetCurrentSample16};
+  __property int CurrentSampleInPixel={read=GetCurrentSampleInPixel};
+  __property int CurrentTime={read=GetCurrentTimeEx};
+  __property int CurrentX={read=FX};
+  __property int CurrentY={read=FY};
+  __property double EndDigiFreq={read=FEndDigiFreq, write=FEndDigiFreq};
+  __property double SpecAmp={read=FSpecAmp, write=SetSpecAmp};
+  __property double StartDigiFreq={read=FStartDigiFreq, write=FStartDigiFreq};
+  __property double YZoomRate={read=FYZoomRate,write=SetYZoomRate};
+
+  __property QSPEC_FORMAT* A[int Channel][int fr]={read=GetA};
+  __property int BytesPerSample={read=FBytesPerSample};
+  __property int Channels={read=FChannels, write=FChannels};
+  __property int EndPos={read=FEndPos, write=SetEndPos};
+  __property int ExtractMode={read=FExtractMode, write=SetExtractMode};
+  __property int LastX={read=FLastX};
+  __property int LastY={read=FLastY};
+  __property int Length={read=FLength, write=FLength};
+  __property int OpMode={read=FOpMode};
+  __property QSPEC_FORMAT* Ph[int Channel][int fr]={read=GetPh};
+  __property TAlign RulerAlignX={read=FRulerAlignX, write=FRulerAlignX};
+  __property TAlign RulerAlignY={read=FRulerAlignY, write=FRulerAlignY};
+  __property int RulerUnitAmp={read=FRulerUnitAmp, write=FRulerUnitAmp};
+  __property int RulerUnitFreq={read=FRulerUnitFreq, write=FRulerUnitFreq};
+  __property int RulerUnitTime={read=FRulerUnitTime, write=FRulerUnitTime};
+  __property int SectionEndPos={read=FSectionEndPos, write=FSectionEndPos};
+  __property int SectionStartPos={read=FSectionStartPos, write=FSectionStartPos};
+  __property int SelectMode={read=FSelectMode, write=SetSelectMode};
+  __property bool ShowCursorText={read=FShowCursorText, write=FShowCursorText};
+	__property cmplx<QSPEC_FORMAT>* Spec[int Channel][int fr]={read=GetSpec};
+	__property TQuickSpectrogram* Spectrogram[int Channel]={read=GetSpectrogram};
+	__property int SpecOffst={read=FSpecOffst, write=SetSpecOffst};
+	__property int SpecRes={read=FSpecRes, write=SetSpecRes};
+  __property double SpecWindowParamD[int Index]={read=GetSpecWindowParamD, write=SetSpecWindowParamD};
+  __property int StartPane={read=FStartPane};
+  __property int StartPos={read=FStartPos, write=SetStartPos};
+  __property int StartSel={read=FStartSel};
+  __property int StartSelX={read=FStartSelX};
+  __property int StartSelY={read=FStartSelY};
+  __property TWaveViewStereoMode StereoMode={read=FStereoMode, write=FStereoMode};
+
+  __property TColor CursorColorBright={read=FCursorColorBright, write=FCursorColorBright};
+  __property TColor CursorColorDim={read=FCursorColorDim, write=FCursorColorDim};
+  __property TColor InfoColor0={read=FInfoColor0, write=FInfoColor0};
+  __property TColor InfoColor1={read=FInfoColor1, write=FInfoColor1};
+  __property TColor InfoColor2={read=FInfoColor2, write=FInfoColor2};
+
+  __property WindowType SpecWindowType={read=FSpecWindowType, write=SetSpecWindowType};
+
+
+public:
+  __fastcall TWaveView(TComponent* Owner, bool usex=false, bool usep=false);
+  __fastcall ~TWaveView();
+
+  void ClearSpectrogram(int index);
+  void ClearSpectrograms();
+  void __fastcall DefaultShowProperty(bool selection);
+  virtual void __fastcall DoExtract(TObject* Sender);
+  virtual void __fastcall UndoExtract(TObject* Sender);
+
+  virtual void __fastcall ItemExtractClick(TObject* Sender);
+  virtual void __fastcall ItemPlayClick(TObject* Sender);
+  virtual void __fastcall ItemPropertyClick(TObject* Sender);
+  virtual void __fastcall ItemXZoomClick(TObject* Sender);
+  virtual void __fastcall ItemYZoomClick(TObject* Sender);
+
+  void __fastcall CheckWaveOutDevCaps(TObject* Sender);
+  void __fastcall ClearExtra(int AnExtra);
+  void __fastcall ClearSelections(TObject* Sender);
+  int __fastcall CreatePanes(int X, int Y);
+  void __fastcall DrawBitmap(TObject*);
+  void __fastcall DrawCaption(AnsiString ACaption);
+  void __fastcall DrawCursor(int PaneIndex, int X, int Y);
+  void __fastcall DrawInfo();
+  void __fastcall DrawPane(int Channel, int Type, int YScale, int Rulers, TCanvas* Canv, TRect& Rect);
+  void __fastcall DrawPaneInfo(int Channel, int Type, int YScale, TCanvas* Canv, TRect& Rect);
+  void __fastcall DrawPanes(int Type=-1);
+  void __fastcall DrawPitchScale(int Type, TCanvas* Canv, TRect& Rect, int yscale);
+  void __fastcall DrawPlaybackCursor(int Position, TCanvas* Canv, TRect& Rect, int PaneType);
+  void __fastcall DrawSelection(int Type, TCanvas* Canv, TRect& Rect, int yscale, int Index, TColor FrameColorX);
+  void __fastcall DrawSelections(int Type, TCanvas* Canv, TRect& Rect, int yscale);
+  void __fastcall DrawSemitones(int start, int end, TCanvas* Canv, TRect& Rect, int yscale);
+  void __fastcall DrawSpectrogramX(int channel, TWaveViewSelection Sel, int yscale, TCanvas* ACanvas, TRect ARect, double amp=1, bool forceresample=false, bool basic=false, int SpecStyle=1);
+  void __fastcall DrawWaveForm(int channel, TCanvas* ACanvas, TRect, int, int, double amp=1, bool basic=false);
+  void __fastcall ExtDataChange(TObject* Sender);
+  void __fastcall ExtDataChange(TObject* Sender, int Channel, int From, int To);
+  TRect __fastcall ExtraBounds(int AnExtra);
+  TRect __fastcall ExtraInvBounds(int AnExtra);
+  void __fastcall FocusSelection(int Index);
+  void __fastcall FreeData(int Count);
+  void __fastcall FreeInternalBitmaps(int Count);
+  void __fastcall FreeSpectrograms();
+  double __fastcall FromAmplitudeToPixel(int PaneIndex, double Amplitude);
+  double __fastcall FromPixelToAmplitude(int PaneIndex, double Y);
+  double __fastcall FromDigiFreqToPixel(int PaneIndex, double DigiFreq);
+  double __fastcall FromDigiFreqToPixel(double DigiFreq, double AStartDigiFreq, double AnEndDigiFreq, int Y1, int Y2, int YScale);
+  double __fastcall FromPixelToDigiFreq(int PaneIndex, double Y);
+  void __fastcall FromPixelToDigiFreq(int Scale, double* DigiFreq, int Count, double AStartDigiFreq, double AnEndDigiFreq);
+  double __fastcall FromPixelToSample(int PaneIndex, double X);
+  void __fastcall FromPixelToSample(double* Sample, int Count, int AStartPos, int AnEndPos);
+  double __fastcall FromPixelToSample(double X, int AStartPos, int AnEndPos, int X1, int X2);
+  double __fastcall FromSampleToPixel(int PaneIndex, double Pos);
+  double __fastcall FromSampleToPixel(double Pos, int X1, int X2);
+
+  double __fastcall GetFMask(double* mask, int t, TWaveViewPlaybackFilter Filter);
+  virtual void __fastcall GetObjectAtPointer(int X, int Y);
+  virtual void __fastcall GetOpMode(Word Key, TMouseButton Button, TShiftState Shift);
+  bool __fastcall GetPlaying();
+  bool __fastcall GetSpectroCalc(int startpos=-1, int endpos=-1, int Offst=-1, int Res=-1);
+  void __fastcall InvalidateBasic(int channel, int basic);
+  void __fastcall InvalidateBasics(int channel);
+  void __fastcall PausePlayback(TObject* Sender);
+  void __fastcall Post(int Mode=0);
+  void __fastcall RemoveSelection(int Index);
+  void __fastcall RePinExtra(int AnExtra);
+  void __fastcall Retrieve(int Mode=0, int from=0, int length=0);
+  int __fastcall SelectionAtPos(int Pos, double DigiFreq);
+  void __fastcall SetArea(int AStartPos, int AnEndPos, double AStartDigiFreq, double AnEndDigiFreq);
+  void __fastcall SetContent(int index, int channel, int type);
+  void __fastcall SetContent(int X, int Y, int channel, int type);
+  void __fastcall SetCursorTF(int PaneIndex, int t, double digif);
+  void __fastcall SetRulers(int PaneIndex, int Rulers);
+  void __fastcall SetRulerUnit(int ARulerUnitTime, int ARulerUnitFreq, int ARulerUnitAmp);
+  void __fastcall SetSelection(int Start, int End, double VStart, double VEnd);
+  void __fastcall SetStartAndEndDigiFreq(double AStartDigiFreq, double AnEndDigiFreq);
+  void __fastcall SetStartAndEndPos(int AStartPos, int AnEndPos);
+  void __fastcall SetYScale(int index, int yscale);
+  void StartDrag(int X, int Y);
+  void __fastcall StartPlayback(TObject* Sender);
+  void __fastcall TFFilter(int channel, bool pass, bool wholelength=false);
+  virtual void __fastcall UpdateScrollBar(TObject* Sender);
+  void __fastcall Zoom(int X, double Rate);
+  void __fastcall ZoomF(double Y, double Rate, int yscale);
+  void __fastcall ZoomY(double Rate);
+  
+__published:
+  __property Align;
+  __property Anchors;
+  __property bool AutoCaption={read=FAutoCaption, write=FAutoCaption};
+  __property bool AutoExtractMode={read=FAutoExtractMode, write=SetAutoExtractMode};
+  __property bool AutoSpecAmp={read=FAutoSpecAmp, write=SetAutoSpecAmp};
+  __property TColor AxisColor={read=FAxisColor,write=SetAxisColor};
+  __property TColor BackColor={read=FBackColor,write=SetBackColor};
+  __property bool ClickFocus={read=FClickFocus, write=SetClickFocus};
+  __property bool DefaultPopupMenu={read=FDefaultPopupMenu, write=SetDefaultPopupMenu, default=true};
+  __property DoubleBuffered;
+  __property bool MultiSelect={read=FMultiSelect, write=SetMultiSelect};
+  __property OnResize;
+  __property int PitchScalePart={read=FPitchScalePart, write=SetPitchScalePart};
+  __property TWaveViewPlaybackFilter PlaybackFilter={read=FPlaybackFilter, write=SetPlaybackFilter};
+  __property PopupMenu;
+  __property bool ProgressCursor={read=FProgressCursor, write=FProgressCursor, default=true};
+  __property int SamplesPerSec={read=FSamplesPerSec, write=SetSamplesPerSec};
+	__property TScrollBar* ScrollBar={read=FScrollBar,write=SetScrollBar};
+  __property TColor SelectedAreaColorX={read=FSelectedAreaColorX, write=SetSelectedAreaColorX};
+  __property TColor SelectedFrameColorX={read=FSelectedFrameColorX, write=SetSelectedFrameColorX};
+  __property TColor SelectingFrameColorX={read=FSelectingFrameColorX, write=SetSelectingFrameColorX};
+  __property int SelectionBorderWidth={read=FSelectionBorderWidth, write=FSelectionBorderWidth};
+  __property bool LocalDataTimeGrid={read=FLocalDataTimeGrid, write=FLocalDataTimeGrid, default=true};
+  __property TWaveViewTools Tools={read=FTools, write=SetTools};
+  __property Visible;
+  __property TWaveAudio* WaveAudio={read=FWaveAudio, write=SetWaveAudio};
+  __property TColor WaveBackColor={read=FWaveBackColor, write=SetWaveBackColor};
+  __property TColor WaveColor={read=FWaveColor,write=SetWaveColor};
+
+  __property TWaveViewCustomInfoEvent CustomCursorText={read=FCustomCursorText, write=FCustomCursorText};
+  __property TNotifyEvent CustomItemExtractClick={read=FCustomItemExtractClick, write=FCustomItemExtractClick};
+  __property TWaveViewCustomInfoEvent CustomInfo={read=FCustomInfo, write=FCustomInfo};
+  __property TWaveViewCustomInfoEvent CustomPaneInfo={read=FCustomPaneInfo, write=FCustomPaneInfo};
+  __property TWaveViewCustomPropertyEvent CustomProperty={read=FCustomProperty, write=FCustomProperty};
+  __property TNotifyEvent CustomXZoomClick={read=FCustomXZoomClick, write=FCustomXZoomClick};
+  __property TNotifyEvent CustomYZoomClick={read=FCustomYZoomClick, write=FCustomYZoomClick};
+  __property TWaveViewCustomPaintEvent OnCustomPaint={read=FOnCustomPaint, write=FOnCustomPaint};
+  __property TWaveViewGetIntervalEvent OnGetPlaybackStartAndEndPos={read=FOnGetPlaybackStartAndEndPos, write=FOnGetPlaybackStartAndEndPos};
+  __property TWaveViewGetOpModeEvent OnGetOpMode={read=FOnGetOpMode, write=FOnGetOpMode};
+  __property TNotifyEvent OnInfoDblClick={read=FOnInfoDblClick, write=FOnInfoDblClick};
+  __property OnKeyDown;
+  __property OnKeyPress;
+  __property OnKeyUp;
+  __property OnDblClick;
+  __property OnMouseDown;
+  __property OnMouseMove;
+  __property OnMouseWheel
+  ;
+  __property TWaveViewMouseLocalDataEvent OnMouseLocalData={read=FOnMouseLocalData, write=FOnMouseLocalData};
+  __property TWaveViewMousePointerEvent OnMousePointer={read=FOnMousePointer, write=FOnMousePointer};
+  __property OnMouseUp;
+  __property TNotifyEvent BeforePlayback={read=FBeforePlayback, write=FBeforePlayback};
+  __property TNotifyEvent OnPageChange={read=FOnPageChange,write=FOnPageChange};
+  __property TNotifyEvent OnPaint={read=FOnPaint, write=FOnPaint};
+  __property TNotifyEvent OnPlaybackDone={read=FOnPlaybackDone,write=FOnPlaybackDone};
+  __property TNotifyEvent OnPlaybackStart={read=FOnPlaybackStart, write=FOnPlaybackStart};
+  __property TNotifyEvent OnSelectedChange={read=FOnSelectedChange,write=FOnSelectedChange};
+  __property TNotifyEvent OnScaleChange={read=FOnScaleChange,write=FOnScaleChange};
+};
+//---------------------------------------------------------------------------
+#endif