This is FFT.m in view mode; [Download] [Up]
/* FFT.m -- Implementation of FFT object
*
* This object manages the FFT display panel for edsnd.
* See FFT.h for more details
*
* jwp@silvertone.Princeton.edu, 1/90
* Version 1.3, 02/90
* -- Added support for Spectrum Analysis (courtesy Steve Boker)
* -- Fixed bug that allowed FFT of fragmented files
* Version 1.31, 03/90
* -- Fixed bug in setFFTSize that caused program to crash if
* the sound had changed since the last displayFFT:
*/
#import "FFT.h"
#import "FFTView.h"
#import "SpectrumView.h"
#import "EdsndApp.h"
#import "SoundDocument.h"
#import "ScrollingSound.h"
#import "UpPanel.h"
#import <appkit/Panel.h>
#import <appkit/Button.h>
#import <appkit/PopUpList.h>
#import <appkit/Form.h>
#import <appkit/Application.h>
#import <soundkit/Sound.h>
#import <soundkit/SoundView.h>
/* Convenient macros to select a specific row in a pop-up list,
* and to get the selected row in a pop-up list.
*/
#define PULSelectRow(button,row) \
[button setTitle:[[[[button target] itemList] cellAt:row :0] title]]
#define PULGetRow(button) \
[[[button target] itemList] selectedRow]
@implementation FFT
/* new -- Make a new instance of this object
* This loads the .nib file and initializes the pop-up list for FFT size
*/
+ new
{
id pul; /* Pointer to the pop-up lists */
self = [super new];
[NXApp loadNibSection:"FFT.nib" owner:self];
/* Set up the pop-up list that does FFT size selection for the
* FFT display panel
*/
pul = [PopUpList new];
[pul addItem:"256"];
[pul addItem:"512"];
[pul addItem:"1024"];
[pul addItem:"2048"];
NXAttachPopUpList(fftSizeButton, pul);
PULSelectRow(fftSizeButton,1); /* Select 512 points */
/* Set up the pop-up list that does Spectrum sliding window selection
* for the Spectrum display panel
*/
pul = [PopUpList new];
[pul addItem:"64"];
[pul addItem:"128"];
[pul addItem:"256"];
[pul addItem:"512"];
[pul addItem:"1024"];
[pul addItem:"2048"];
NXAttachPopUpList(spectrumSlideButton, pul);
PULSelectRow(spectrumSlideButton,3); /* Select 512 points */
slidepoints = 512;
/* Other initializations
*/
[spectrumView setMeanDisplay:[spectrumMeanButton state]];
[spectrumView setSpectrumDisplay:[spectrumSpectButton state]];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* displayFFT: -- Bring up the FFT panel and/or display the spectrum
*/
- displayFFT:sender
{
id scroller; /* Scroller within current window */
float start,size; /* start/size of selection */
if (![NXApp isOpenSound])
return self;
/* Find the current document's scroller and sound, and set up the FFT
*/
scroller = [[[NXApp mainWindow] delegate] scroller];
[fftView setSound:[[scroller view] sound]];
[scroller getSelStart:&start Size:&size];
[fftView setInskip:start];
[fftView display];
[fftPanel makeKeyAndOrderFront:self];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* displaySpectrum: -- Animate the Spectrum over the selection
*/
- displaySpectrum:sender
{
id scroller; /* Current doc's scroller */
id sound; /* The sound within that scroller */
float start,size; /* Selection start/size times */
/* If there's no current sound, don't do a thing
*/
if (![NXApp isOpenSound]) {
return self;
}
/* Get all the relevant info from the scroller and the sound
*/
scroller = [[[NXApp mainWindow] delegate] scroller];
sound = [[scroller view] sound];
[scroller getSelStart:&start Size:&size];
if (size == 0.0)
return self;
[spectrumPanel makeKeyAndOrderFront:self];
[spectrumView doSpectrum:sound
Start:start
Dur:size
Npoints:[fftView npoints]
Slidepoints: slidepoints ];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* setFFTSize: -- Set the size of the FFT window
*/
- setFFTSize:sender
{
int row;
id scroller = [[[NXApp mainWindow] delegate] scroller];
float start,size; /* Selection start/size times */
/* Get the row of the selected button and derive size from that.
* Row 0 = 256, Row 1 = 512, etc.
*/
row = PULGetRow(fftSizeButton);
[fftView setNpoints: 256 << row];
[fftView setSound:[[NXApp currentSound] sound]];
[scroller getSelStart:&start Size:&size];
[fftView setInskip:start];
[fftView display];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* SetFFTScaling: -- set FFT scaling type
* Sender is matrix of Radio buttons
*/
- setFFTScaling:sender
{
[fftView dBdisplay:[[sender selectedCell] tag]];
[spectrumView dBdisplay:[[sender selectedCell] tag]];
[fftView display];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* setSpectrumSlide: -- Set the size of the Spectrum sliding window
*/
- setSpectrumSlide:sender
{
int row;
/* Get the row of the selected button and derive size from that.
* Row 0 = 64, Row 1 = 128, etc.
*/
row = PULGetRow(spectrumSlideButton);
slidepoints = 64 << row;
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* SetSpectrumMean: -- set SpectrumView to display Mean line
* Sender is a switch button
*/
- setSpectrumMean:sender
{
[spectrumView setMeanDisplay:[sender state]];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* SetSpectrum: -- set SpectrumView to display Spectrum
* Sender is a switch button
*/
- setSpectrum:sender
{
[spectrumView setSpectrumDisplay:[sender state]];
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* cursorMoved: -- Respond to changes in FFTView cursor position
* This writes the cursor's freq/amp position into the forms
*/
- cursorMoved:sender
{
float time,freq,amp,mean; /* The cursor position data */
char s[16]; /* Space for sprintf */
if (sender == fftView) {
[fftView getCursorFreq:&freq Amp:&];
sprintf(s,"%8.3f",freq);
[fftFreqForm setStringValue:s at:0];
sprintf(s,"%8.3f",amp);
[fftAmpForm setStringValue:s at:0];
}
else if (sender == spectrumView) {
[spectrumView getCursorTime:&time Freq:&freq Mean:&mean];
sprintf(s,"%8.3f",time);
[spectrumTimeForm setStringValue:s at:0];
sprintf(s,"%8.3f",freq);
[spectrumFreqForm setStringValue:s at:0];
sprintf(s,"%8.3f",mean);
[spectrumMeanForm setStringValue:s at:0];
}
return self;
}
/* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
/* For Interface Builder ...
*/
- setFftPanel:anObject
{
fftPanel = anObject;
[fftPanel setUpdateAction:@selector(panelUpdate:) by:NXApp];
return self;
}
- setFftView:anObject
{
fftView = anObject;
[fftView setDelegate:self]; /* To get cursorMoved: messages */
return self;
}
- setFftAmpForm:anObject
{
fftAmpForm = anObject;
return self;
}
- setFftFreqForm:anObject
{
fftFreqForm = anObject;
return self;
}
- setFftSizeButton:anObject
{
fftSizeButton = anObject;
return self;
}
- setSpectrumPanel:anObject
{
spectrumPanel = anObject;
[spectrumPanel setUpdateAction:@selector(panelUpdate:) by:NXApp];
return self;
}
- setSpectrumView:anObject
{
spectrumView = anObject;
[spectrumView setDelegate:self]; /* To get cursorMoved: messages */
return self;
}
- setSpectrumMeanForm:anObject
{
spectrumMeanForm = anObject;
return self;
}
- setSpectrumFreqForm:anObject
{
spectrumFreqForm = anObject;
return self;
}
- setSpectrumTimeForm:anObject
{
spectrumTimeForm = anObject;
return self;
}
- setSpectrumSlideButton:anObject
{
spectrumSlideButton = anObject;
return self;
}
- setSpectrumMeanButton:anObject
{
spectrumMeanButton = anObject;
return self;
}
- setSpectrumSpectButton:anObject
{
spectrumSpectButton = anObject;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.