This is SoundEditor.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
extern void energy();
#import "SoundEditor.h"
#import <appkit/View.h>
#import <appkit/appkit.h>
#import <soundkit/soundkit.h>
#import <strings.h>
@implementation SoundEditor
static newLocation(NXPoint *p)
{
// compute the location of the new window
// shifted to the botom-right
static count = 0;
p->x += (20.0 * count);
p->y -= (25.0 * count);
count = (count > 10)? 0 : count+1;
}
+new
{
// create the new window
// and initialize the different parameters
self = [super new];
[NXApp loadNibSection:"SoundEditor.nib" owner:self];
// browser purpose
strcpy(SignalFileName,"SoundEditor.snd");
strcpy(SignalDirName,".");
strcpy(EnergyFileName,"E.SoundEditor.snd");
strcpy(EnergyDirName,"./");
// view attributes
[SoundSignal setAutodisplay:YES];
[SoundSignal setAutoscale: YES];
[SoundZoom setAutodisplay:YES];
[SoundZoom setAutoscale: YES];
[SoundEnergy setAutodisplay:YES];
[SoundEnergy setAutoscale: YES];
[SoundEnergy setEnabled: NO ];
[SoundEnergy setDisplayMode:SK_DISPLAY_WAVE];
// view defaults contents
sndSignal = [Sound new];
[SoundSignal setSound:sndSignal];
sndZoom = [Sound new];
[SoundZoom setSound:sndZoom];
sndEnergy = [Sound new];
[SoundEnergy setSound:sndEnergy];
return self;
}
- setSoundZoom:anObject
{
SoundZoom = anObject;
return self;
}
- setSoundEnergy:anObject
{
SoundEnergy = anObject;
return self;
}
- setSoundWindow:anObject
{
NXRect theFrame;
SoundWindow = anObject;
[SoundWindow getFrame:&theFrame];
newLocation(&theFrame.origin);
[SoundWindow moveTo:theFrame.origin.x :theFrame.origin.y];
return self;
}
- setSoundSignal:anObject
{
SoundSignal = anObject;
return self;
}
- PlayAllZoom:sender
{
// play the whole zoom sound
id ZoomSound;
ZoomSound = [Sound new];
ZoomSound = [SoundZoom sound];
[ZoomSound play];
return self;
}
- Play:sender
{
// play the current selection of the signal sound
[SoundSignal play:sender];
return self;
}
- ZoomOut:sender
{
// zoom out from zoom sound to signal sound
[SoundZoom selectAll:sender];
[SoundZoom copy:sender];
[SoundSignal paste:sender];
[self ComputeEnergy];
return self;
}
- PlayZoom:sender
{
// play the current selection of the zoom sound
[SoundZoom play:sender];
return self;
}
- Record:sender
{
// record from the microphone to the selected part of the signal sound
static int state=0;
state = (++state)%2;
if (state) {
[SoundSignal record:sender];
}
else {
[SoundSignal stop:sender];
[self ComputeEnergy];
}
return self;
}
- PlayAll:sender
{
// play the whole signal sound
id SignalSound;
SignalSound = [Sound new];
SignalSound = [SoundSignal sound];
[self ComputeEnergy];
[SignalSound play];
return self;
}
- Load:sender
{
id theBrowser;
id aSound;
int result;
char *slashPtr;
// open a browser and load the selected file
theBrowser = [OpenPanel new];
[theBrowser setRequiredFileType: "snd"];
[theBrowser setDirectory: SignalDirName];
result = [theBrowser runModal];
if (result) {
aSound = [Sound new];
strcpy(SignalFileName,[theBrowser filename]);
strcpy(SignalDirName,SignalFileName);
slashPtr = rindex (SignalDirName, '/');
if (slashPtr) {
*slashPtr = '\0';
}
[aSound readSoundfile:SignalFileName];
[SoundSignal setSound:aSound];
strcpy(EnergyFileName,"E.");
strcat(EnergyFileName,strrchr(SignalFileName,'/')+1);
[SoundWindow setTitle:strrchr(SignalFileName,'/')+1];
[self ComputeEnergy];
}
return self;
}
- ZoomIn:sender
{
// zoom in from the signal sound to the zoom sound
int firstSample, sampleCount;
id aSound;
aSound = [Sound new];
[SoundSignal getSelection:&firstSample size:&sampleCount];
[aSound copySound:[SoundSignal sound]];
if (firstSample) {
[aSound deleteSamplesAt:0 count:firstSample-1];
}
if (sampleCount) {
[aSound deleteSamplesAt:sampleCount count:[aSound sampleCount]];
}
[SoundZoom setSound:aSound];
return self;
}
- Show:sender
{
[SoundWindow makeKeyAndOrderFront:self];
return self;
}
- Save:sender
{
id theBrowser;
id aSound;
int result;
// open a browser and save the selected file
theBrowser = [SavePanel new];
[theBrowser setRequiredFileType: "snd"];
result = [theBrowser runModalForDirectory: SignalDirName
file: SignalFileName];
if (result) {
aSound = [Sound new];
aSound = [SoundSignal sound];
sndSignal = [SoundSignal sound];
strcpy(SignalFileName,[theBrowser filename]);
[aSound writeSoundfile:SignalFileName];
[SoundWindow setTitle:strrchr(SignalFileName,'/')+1];
}
return self;
}
- ComputeEnergy
{
// compute the energy of the signal sound
// and store it in the energy view
char newEnergy[100];
char SystemCommand[200];
id aSound;
aSound = [Sound new];
if ([[SoundSignal sound] sampleCount]) {
[[SoundSignal sound] writeSoundfile: EnergyFileName];
energy (EnergyFileName);
strcpy(newEnergy, EnergyFileName);
strcat(newEnergy, ".energy");
[aSound readSoundfile:newEnergy];
[SoundEnergy setSound: aSound];
// cleanup purpose
strcpy(SystemCommand, "rm ");
strcat(SystemCommand, EnergyFileName);
system ( SystemCommand );
strcpy(SystemCommand, "rm ");
strcat(SystemCommand, newEnergy);
system ( SystemCommand );
}
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.