Update of /cvsroot/audacity/audacity-src/src In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv9053/src
Modified Files: Spectrum.cpp Spectrum.h TrackArtist.cpp TrackPanel.cpp WaveClip.cpp Log Message: Allows zooming in on Spectrum view. Not very fast however. And not perfect. Index: Spectrum.cpp =================================================================== RCS file: /cvsroot/audacity/audacity-src/src/Spectrum.cpp,v retrieving revision 1.12 retrieving revision 1.13 diff -u -d -r1.12 -r1.13 --- Spectrum.cpp 30 Nov 2006 01:03:01 -0000 1.12 +++ Spectrum.cpp 2 Jan 2007 01:05:13 -0000 1.13 @@ -34,7 +34,7 @@ bool ComputeSpectrum(float * data, int width, int height, - int maxFreq, int windowSize, + int maxFreq, int minFreq, int windowSize, double rate, float *grayscaleOut, bool autocorrelation, int windowFunc) { @@ -92,7 +92,10 @@ windows++; } + int minSamples = int (minFreq * windowSize / rate + 0.5); // units here are fft bins int maxSamples = int (maxFreq * windowSize / rate + 0.5); + if (minSamples < 0.) + minSamples = 0.; if (maxSamples > half) maxSamples = half; @@ -139,7 +142,7 @@ } else { // Convert to decibels // But do it safely; -Inf is nobody's friend - for (i = 0; i < maxSamples; i++){ + for (i = minSamples; i < maxSamples; i++){ float temp=(processed[i] / windowSize / windows); if (temp > 0.0) processed[i] = 10*log10(temp); @@ -149,10 +152,10 @@ } // Finally, put it into bins in grayscaleOut[], normalized to a 0.0-1.0 scale - + float binPerPx = float(maxSamples - minSamples) / float(height); for (i = 0; i < height; i++) { - float bin0 = float (i) * maxSamples / height; - float bin1 = float (i + 1) * maxSamples / height; + float bin0 = float (i) * binPerPx + minSamples; + float bin1 = float (i + 1) * binPerPx + minSamples; float value; @@ -184,7 +187,6 @@ grayscaleOut[i] = value; } - delete[]in; delete[]out; delete[]out2; Index: Spectrum.h =================================================================== RCS file: /cvsroot/audacity/audacity-src/src/Spectrum.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -d -r1.5 -r1.6 --- Spectrum.h 30 Nov 2006 01:03:01 -0000 1.5 +++ Spectrum.h 2 Jan 2007 01:05:13 -0000 1.6 @@ -22,7 +22,7 @@ */ bool ComputeSpectrum(float * data, int width, int height, - int maxFrequency, int windowSize, + int maxFrequency, int minFrequency, int windowSize, double rate, float *out, bool autocorrelation, int windowFunc=3); #endif Index: WaveClip.cpp =================================================================== RCS file: /cvsroot/audacity/audacity-src/src/WaveClip.cpp,v retrieving revision 1.24 retrieving revision 1.25 diff -u -d -r1.24 -r1.25 --- WaveClip.cpp 30 Nov 2006 01:03:01 -0000 1.24 +++ WaveClip.cpp 2 Jan 2007 01:05:13 -0000 1.25 @@ -76,6 +76,7 @@ { windowTypeOld = -1; maxFreqPrefOld = -1; + minFreqPrefOld = -1; windowSizeOld = -1; dirty = -1; start = -1.0; @@ -95,6 +96,7 @@ int windowTypeOld; int maxFreqPrefOld; + int minFreqPrefOld; int windowSizeOld; int dirty; int height; @@ -384,7 +386,8 @@ int windowType; bool autoMaxFrequency; - int maxFreqPref = gPrefs->Read(wxT("/Spectrum/MaxFreq"), 8000); + int minFreqPref = gPrefs->Read(wxT("/Spectrum/MinFreq"), 0L); + int maxFreqPref = gPrefs->Read(wxT("/Spectrum/MaxFreq"), 8000L); int windowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256); gPrefs->Read(wxT("/Spectrum/AutoMaxFrequency"), &autoMaxFrequency, false); gPrefs->Read(wxT("/Spectrum/WindowType"), &windowType, 3); @@ -396,6 +399,7 @@ if (mSpecCache && mSpecCache->windowTypeOld == windowType && mSpecCache->maxFreqPrefOld == maxFreqPref && + mSpecCache->minFreqPrefOld == minFreqPref && mSpecCache->windowSizeOld == windowSize && mSpecCache->dirty == mDirty && mSpecCache->start == t0 && @@ -432,6 +436,7 @@ if (oldCache->dirty == mDirty && oldCache->windowTypeOld == windowType && oldCache->maxFreqPrefOld == maxFreqPref && + oldCache->minFreqPrefOld == minFreqPref && oldCache->windowSizeOld == windowSize && oldCache->pps == pixelsPerSecond && oldCache->height == height && @@ -462,6 +467,7 @@ float *buffer = new float[windowSize]; mSpecCache->windowTypeOld = windowType; mSpecCache->maxFreqPrefOld = maxFreqPref; + mSpecCache->minFreqPrefOld = minFreqPref; mSpecCache->windowSizeOld = windowSize; for (x = 0; x < mSpecCache->len; x++) @@ -498,7 +504,7 @@ mSequence->Get((samplePtr)adj, floatSample, start, len); ComputeSpectrum(buffer, windowSize, height, - maxFreqPref, windowSize, + maxFreqPref, minFreqPref, windowSize, mRate, &mSpecCache->freq[height * x], autocorrelation, windowType); } Index: TrackArtist.cpp =================================================================== RCS file: /cvsroot/audacity/audacity-src/src/TrackArtist.cpp,v retrieving revision 1.87 retrieving revision 1.88 diff -u -d -r1.87 -r1.88 --- TrackArtist.cpp 30 Nov 2006 01:03:01 -0000 1.87 +++ TrackArtist.cpp 2 Jan 2007 01:05:13 -0000 1.88 @@ -316,13 +316,13 @@ bool autoMaxFrequency; int windowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256); int maxFreq = gPrefs->Read(wxT("/Spectrum/MaxFreq"), rate/2.); + int minFreq = gPrefs->Read(wxT("/Spectrum/MinFreq"), 0.); gPrefs->Read(wxT("/Spectrum/AutoMaxFrequency"), &autoMaxFrequency, false); if (autoMaxFrequency) { // automatically set frequency to half of sampling rate maxFreq=int(rate/2); } - int minFreq = 0.; /* draw the ruler Index: TrackPanel.cpp =================================================================== RCS file: /cvsroot/audacity/audacity-src/src/TrackPanel.cpp,v retrieving revision 1.333 retrieving revision 1.334 diff -u -d -r1.333 -r1.334 --- TrackPanel.cpp 29 Nov 2006 00:03:02 -0000 1.333 +++ TrackPanel.cpp 2 Jan 2007 01:05:13 -0000 1.334 @@ -1220,13 +1220,13 @@ } /// When in the label, we can either vertical zoom or re-order tracks. -/// Dont't change cursor/tip to zoom if display is not waveform (either linear of dB) +/// Dont't change cursor/tip to zoom if display is not waveform (either linear of dB) or Spectrum void TrackPanel::SetCursorAndTipWhenInLabel( Track * t, wxMouseEvent &event, const wxChar ** ppTip ) { if (event.m_x >= GetVRulerOffset() && t->GetKind() == Track::Wave && - ((WaveTrack *) t)->GetDisplay() <= WaveTrack::WaveformDBDisplay) { + ((WaveTrack *) t)->GetDisplay() <= WaveTrack::SpectrumDisplay) { *ppTip = _("Click to vertically zoom in, Shift-click to zoom out, Drag to create a particular zoom region."); SetCursor(event.ShiftDown()? *mZoomOutCursor : *mZoomInCursor); } @@ -2356,13 +2356,10 @@ if (!mCapturedTrack) return; - // don't do anything if track is not wave or if it is not - // WaveformDisplay or WaveformDBDisplay + // don't do anything if track is not wave or Spectrum if (mCapturedTrack->GetKind() != Track::Wave - || ((WaveTrack *) mCapturedTrack)->GetDisplay() > WaveTrack::WaveformDBDisplay) { - + || ((WaveTrack *) mCapturedTrack)->GetDisplay() > WaveTrack::SpectrumDisplay) return; - } mMouseCapture = IsVZooming; mZoomStart = event.m_y; @@ -2390,13 +2387,9 @@ mMouseCapture = IsUncaptured; - // don't do anything if track is not wave or if it is not - // WaveformDisplay or WaveformDBDisplay - if (mCapturedTrack->GetKind() != Track::Wave - || ((WaveTrack *) mCapturedTrack)->GetDisplay() > WaveTrack::WaveformDBDisplay) { - + // don't do anything if track is not wave + if (mCapturedTrack->GetKind() != Track::Wave) return; - } WaveTrack *track = (WaveTrack *)mCapturedTrack; WaveTrack *partner = (WaveTrack *)mTracks->GetLink(track); @@ -2410,8 +2403,21 @@ mZoomStart = temp; } - float min, max, c, l; - track->GetDisplayBounds(&min, &max); + float min, max, c, l, binSize; + bool spectrum; + int windowSize; + double rate = ((WaveTrack *)track)->GetRate(); + ((WaveTrack *) track)->GetDisplay() == WaveTrack::SpectrumDisplay ? spectrum = true : spectrum = false; + if(spectrum) { + min = gPrefs->Read(wxT("/Spectrum/MinFreq"), 0L); + if(min < 0) + min = 0; + max = gPrefs->Read(wxT("/Spectrum/MaxFreq"), 8000L); + windowSize = gPrefs->Read(wxT("/Spectrum/FFTSize"), 256); + binSize = rate / windowSize; + } + else + track->GetDisplayBounds(&min, &max); if (IsDragZooming()) { // Drag Zoom @@ -2425,10 +2431,18 @@ min = (tmax * (1.0-p2) + tmin * p2); // Enforce maximum vertical zoom - if (max - min < 0.2) { - c = (min+max/2); - min = c-0.1; - max = c+0.1; + if(spectrum) { + if(min < 0.) + min = 0.; + if(max < min + 10. * binSize) //minimum 10 freq bins + max = min + 10. * binSize; + } + else { + if (max - min < 0.2) { + c = (min+max/2); + min = c-0.1; + max = c+0.1; + } } } else if (event.ShiftDown() || event.ButtonUp(3)) { @@ -2436,41 +2450,73 @@ // Zoom out to -1.0...1.0 first, then, and only // then, if they click again, allow one more // zoom out. - if (min <= -1.0 && max >= 1.0) { - min = -2.0; - max = 2.0; - } - else { + if(spectrum) { c = 0.5*(min+max); l = (c - min); - min = wxMax( -1.0, c - 2*l); - max = wxMin( 1.0, c + 2*l); + if(c - 2*l <= 0) { + min = 0.0; + max = wxMin( rate/2., 2. * max); + } + else { + min = wxMax( 0.0, c - 2*l); + max = wxMin( rate/2., c + 2*l); + } + } + else { + if (min <= -1.0 && max >= 1.0) { + min = -2.0; + max = 2.0; + } + else { + c = 0.5*(min+max); + l = (c - min); + min = wxMax( -1.0, c - 2*l); + max = wxMin( 1.0, c + 2*l); + } } } else { // Zoom IN float p1; - - // Zoom in centered on cursor - if (min < -1.0 || max > 1.0) { - min = -1.0; - max = 1.0; - } - else { + if(spectrum) { c = 0.5*(min+max); // Enforce maximum vertical zoom - l = wxMax( 0.1, (c - min)); + l = wxMax( 10. * binSize, (c - min)); //is this a sensible min? MJS p1 = (mZoomStart - ypos) / (float)height; c = (max * (1.0-p1) + min * p1); - min = c - 0.5*l; - max = c + 0.5*l; + min = wxMax( 0.0, c - 0.5*l); + max = wxMin( rate/2., min + l); + } + else { + + // Zoom in centered on cursor + if (min < -1.0 || max > 1.0) { + min = -1.0; + max = 1.0; + } + else { + c = 0.5*(min+max); + // Enforce maximum vertical zoom + l = wxMax( 0.1, (c - min)); + + p1 = (mZoomStart - ypos) / (float)height; + c = (max * (1.0-p1) + min * p1); + min = c - 0.5*l; + max = c + 0.5*l; + } } } - track->SetDisplayBounds(min, max); - if (partner) - partner->SetDisplayBounds(min, max); + if(spectrum) { + gPrefs->Write(wxT("/Spectrum/MaxFreq"), (long)max); + gPrefs->Write(wxT("/Spectrum/MinFreq"), (long)min); + } + else { + track->SetDisplayBounds(min, max); + if (partner) + partner->SetDisplayBounds(min, max); + } mZoomEnd = mZoomStart = 0; Refresh(false); ------------------------------------------------------------------------- Take Surveys. Earn Cash. Influence the Future of IT Join SourceForge.net's Techsay panel and you'll get the chance to share your opinions on IT & business topics through brief surveys - and earn cash http://www.techsay.com/default.php?page=join.php&p=sourceforge&CID=DEVDEV _______________________________________________ Audacity-cvs mailing list Audacity-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/audacity-cvs