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

Reply via email to