This is HenonController.m in view mode; [Download] [Up]
/* Generated by Interface Builder */
#import "HenonController.h"
#import <appkit/appkit.h>
#import <musickit/musickit.h>
@implementation HenonController
- init
{
[super init];
[NXApp loadNibSection:"HenonControl.nib" owner:self withNames:NO];
[thePanel makeKeyAndOrderFront:self];
return self;
}
- closeUp
{
[thePanel close];
return self;
}
- setUp
{
X = [sInitValueFields doubleValueAt:0];
Y = [sInitValueFields doubleValueAt:1];
speed = [sSpeedField floatValue];
duration = [sDurationField floatValue];
A = [sAField doubleValue];
B = [sBField doubleValue];
[self setSoundMode:DSP];
axisMode = [sAxisButtons selectedTag];
return self;
}
- setSoundMode:(int)mode
{
switch (soundMode = mode) {
case DSP:
[[sFreqBox setTitle:"Frequency (Hz)"] display];
[sFreqRangeSlider setMinValue:0.0];
[sFreqRangeSlider setMaxValue:4000.0];
[sFreqRangeSlider setFloatValue:500.0];
[sFreqRangeField setFloatValue:500.0];
[sFreqCenterSlider setMinValue:0.0];
[sFreqCenterSlider setMaxValue:4000.0];
[sFreqCenterSlider setFloatValue:500.0];
[sFreqCenterField setFloatValue:500.0];
freqRange = [sFreqRangeField floatValue];
freqCenter = [sFreqCenterField floatValue];
[[sAmpBox setTitle:"Amplitude (dB)"] display];
[sAmpRangeSlider setMinValue:0.0];
[sAmpRangeSlider setMaxValue:60.0];
[sAmpRangeSlider setFloatValue:30.0];
[sAmpRangeField setFloatValue:30.0];
[sAmpCenterSlider setMinValue:-60.0];
[sAmpCenterSlider setMaxValue:0.0];
[sAmpCenterSlider setFloatValue:-20.0];
[sAmpCenterField setFloatValue:-20.0];
ampRange = [sAmpRangeField floatValue];
ampCenter = [sAmpCenterField floatValue];
break;
case MIDI:
[[sFreqBox setTitle:"Key"] display];
[sFreqRangeSlider setMinValue:0.0];
[sFreqRangeSlider setMaxValue:127.0];
[sFreqRangeSlider setFloatValue:64.0];
[sFreqRangeField setFloatValue:64.0];
[sFreqCenterSlider setMinValue:0.0];
[sFreqCenterSlider setMaxValue:127.0];
[sFreqCenterSlider setFloatValue:64.0];
[sFreqCenterField setFloatValue:64.0];
freqRange = [sFreqRangeField floatValue];
freqCenter = [sFreqCenterField floatValue];
[[sAmpBox setTitle:"Velocity"] display];
[sAmpRangeSlider setMinValue:0.0];
[sAmpRangeSlider setMaxValue:127.0];
[sAmpRangeSlider setFloatValue:64.0];
[sAmpRangeField setFloatValue:64.0];
[sAmpCenterSlider setMinValue:0.0];
[sAmpCenterSlider setMaxValue:127.0];
[sAmpCenterSlider setFloatValue:64.0];
[sAmpCenterField setFloatValue:64.0];
ampRange = [sAmpRangeField floatValue];
ampCenter = [sAmpCenterField floatValue];
break;
default:
break;
}
return self;
}
- changeInitValue:sender
{
X = [sender doubleValueAt:0];
Y = [sender doubleValueAt:1];
return self;
}
- changeDurationField:sender
{
duration = [sender floatValue];
[sDurationSlider setFloatValue:duration];
return self;
}
- changeSpeedField:sender
{
speed = [sender floatValue];
if (speed < 0.01) {
speed = 0.01;
[sender setFloatValue:speed];
}
[sSpeedSlider setFloatValue:speed];
return self;
}
- changeFreqCenterField:sender
{
freqCenter = [sender floatValue];
[sFreqCenterSlider setFloatValue:freqCenter];
return self;
}
- changeASlider:sender
{
A = [sender doubleValue];
[sAField setDoubleValue:A];
return self;
}
- changeBSlider:sender
{
B = [sender doubleValue];
[sBField setDoubleValue:B];
return self;
}
- changeFreqRangeField:sender
{
freqRange = [sender floatValue];
[sFreqRangeSlider setFloatValue:freqRange];
return self;
}
- changeAmpCenterField:sender
{
ampCenter = [sender floatValue];
[sAmpCenterSlider setFloatValue:ampCenter];
return self;
}
- changeAField:sender
{
A = [sender doubleValue];
[sASlider setDoubleValue:A];
return self;
}
- changeBField:sender
{
B = [sender doubleValue];
[sBSlider setDoubleValue:B];
return self;
}
- changeAmpRangeField:sender
{
ampRange = [sender floatValue];
[sAmpRangeSlider setFloatValue:ampRange];
return self;
}
- changeAmpRangeSlider:sender
{
ampRange = [sender floatValue];
[sAmpRangeField setFloatValue:ampRange];
return self;
}
- changeFreqRangeSlider:sender
{
freqRange = [sender floatValue];
[sFreqRangeField setFloatValue:freqRange];
return self;
}
- changeAmpCenterSlider:sender
{
ampCenter = [sender floatValue];
[sAmpCenterField setIntValue:ampCenter];
return self;
}
- changeSpeedSlider:sender
{
speed = [sender floatValue];
[sSpeedField setFloatValue:speed];
return self;
}
- changeDurationSlider:sender
{
duration = [sender floatValue];
[sDurationField setFloatValue:duration];
return self;
}
- changeFreqCenterSlider:sender
{
freqCenter = [sender floatValue];
[sFreqCenterField setFloatValue:freqCenter];
return self;
}
- changeAxis:sender
{
axisMode = [sender selectedTag];
return self;
}
- iterateFreq:(float *)freq Amp:(float *)amp Dur:(float *)dur Next:(float *)next
X:(float *)xpos Y:(float *)ypos
{
double newX;
if ((fabs(X) > 3.0) || (fabs(Y) > 1.0)) {
NXRunAlertPanel("KaBoom!", "Orbit escapes to infinity: resetting.", "OK", 0, 0);
A = 1.4;
B = 0.3;
X = 0.0;
Y = 0.0;
[sAField setDoubleValue:A];
[sASlider setDoubleValue:A];
[sBField setDoubleValue:B];
[sBSlider setDoubleValue:B];
[sInitValueFields setDoubleValue:X at:0];
[sInitValueFields setDoubleValue:Y at:0];
}
*xpos = (X + 1.5) / 3.0;
*ypos = (Y + 0.5);
switch (axisMode) {
case XY:
*freq = ((X / 3.0) * freqRange) + freqCenter;
*amp = (Y * ampRange) + ampCenter;
break;
case YX:
*freq = (Y * freqRange) + freqCenter;
*amp = ((X / 3.0) * ampRange) + ampCenter;
break;
}
*dur = duration;
*next = speed;
newX = Y + 1.0 - (A * X * X);
Y = B * X;
X = newX;
return self;
}
@end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.