Mercurial > hg > hv
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