This is DetMagView.m in view mode; [Download] [Up]
/* Generated by Interface Builder */ #import "DetMagView.h" #import "DetController.h" #import "SmsObject.h" #import <dpsclient/wraps.h> // for PSxxx stuff #import "PWfft.h" #define WIDTH bounds.size.width #define HEIGHT bounds.size.height @implementation DetMagView - initFrame:(const NXRect *)frameRect { self = [super initFrame: frameRect]; userPath = newUserPath(); fOffset = 0; return self; } - getTheSmsObject { if (!winDelegate) winDelegate = [window delegate]; if ([winDelegate respondsTo:@selector(getTheSmsObject)]) return [winDelegate getTheSmsObject]; else return NULL; } //------------------------------------------------------------------- // - drawTrajectory draw one trajectory of the SmsObject - drawTrajectory:(int)iTraj:(int)posit { id theSmsObject = [self getTheSmsObject]; int FirstFrame = [winDelegate getFirstFrameMag], LastFrame = [winDelegate getLastFrameMag], ScaleAmp = [winDelegate getDeterministicScale], NFrames = LastFrame - FirstFrame, i, iFrame = FirstFrame, incFrame = NFrames / 100; float LowestPartial = [winDelegate getLowestPartialMag], HighestPartial = [winDelegate getHighestPartialMag], NPartials = HighestPartial - LowestPartial, SizeDisplay = 80 - (40 * NPartials / 50), fMag = 0, a, x, y, P1 = 30 + (posit - LowestPartial) * gSection, P2 = 80 - 60 * (posit - LowestPartial) / NPartials, HEIGHT100 = (HEIGHT - 100) / NFrames, BottomDb = [winDelegate getBottomDb], TopDb = [winDelegate getTopDb], rangeDb = TopDb - BottomDb, MagBottomDb = TO_MAG(BottomDb), MagrangeDb = TO_MAG(TopDb) - MagBottomDb; if (theSmsObject != NULL) { beginUserPath(userPath, NO); if (incFrame < 1) incFrame = 1; for (iFrame = FirstFrame; iFrame <= LastFrame; iFrame = iFrame + incFrame) { i = iFrame - FirstFrame; x = P1 + i * fSection; y = HEIGHT100 * i + P2; UPmoveto(userPath, x, y); UPlineto(userPath, x, y); } iFrame = FirstFrame; fMag = [theSmsObject getDeterministicMag:iFrame iTraj:iTraj]; i = (float)(iFrame - FirstFrame); if (fMag < BottomDb) fMag = BottomDb; if (fMag > TopDb) fMag = TopDb; if (ScaleAmp) a = SizeDisplay * (TO_MAG(fMag)-MagBottomDb)/MagrangeDb; else a = SizeDisplay * (fMag-BottomDb)/rangeDb; UPmoveto(userPath, (P1 + i * fSection), (HEIGHT100 * i + a + P2)); for (iFrame = FirstFrame+1; iFrame <= LastFrame; iFrame++) { i = (float)(iFrame - FirstFrame); fMag = [theSmsObject getDeterministicMag:iFrame iTraj:iTraj]; if (fMag < BottomDb) fMag = BottomDb; if (fMag > TopDb) fMag = TopDb; if (ScaleAmp) a = SizeDisplay * (TO_MAG(fMag)-MagBottomDb)/MagrangeDb; else a = SizeDisplay * (fMag-BottomDb)/(TopDb - BottomDb); UPlineto(userPath, (P1 + i * fSection), (HEIGHT100 * i + a + P2)); } endUserPath(userPath, dps_ustroke); sendUserPath(userPath); } return self; } //------------------------------------------------------------------- // - drawSelf:: - Draw the magnitude trajectories in the view - drawSelf:(NXRect *)rects :(int)rectCount { id theSmsObject = [self getTheSmsObject]; int FirstFrame = [winDelegate getFirstFrameMag], LastFrame = [winDelegate getLastFrameMag], NFrames = LastFrame - FirstFrame; float LowestPartial = [winDelegate getLowestPartialMag], HighestPartial = [winDelegate getHighestPartialMag], NPartials = HighestPartial - LowestPartial; int iNTraj = [theSmsObject getNTrajectories]; int iNFrame = [theSmsObject getNRecords]; int iTraj = LowestPartial; int i, j, counter=0, iFormat, position[iNTraj]; float Sum, Frq, min, lastmin = 0, Freq[iNTraj]; float lowW = 30, lowH = 20, highH = 80; fSection = (.35 * WIDTH) / NFrames; gSection = (.6 * WIDTH) / NPartials; NXEraseRect(&bounds); PSsetlinewidth(0.0); PWinit(); if (theSmsObject != NULL) { beginUserPath(userPath, NO); UPmoveto(userPath, lowW, highH); UPlineto(userPath, lowW+(.6 * WIDTH), lowH); endUserPath(userPath, dps_ustroke); sendUserPath(userPath); [self lockFocus]; PWdrawX1ruler((int)(LowestPartial+1),(int)(HighestPartial+1),(int)2,2*gSection,-(120.0/NPartials)); [self unlockFocus]; iFormat = [theSmsObject getFormat]; if (iFormat == FORMAT_HARMONIC || iFormat == FORMAT_HARMONIC_WITH_PHASE) while(iTraj <= HighestPartial) { [self drawTrajectory:iTraj:iTraj]; iTraj++; } else { for (i = 0; i < iNTraj; i++) { Sum = 0; counter = 0; for (j = 0; j < iNFrame; j++) { Frq = [theSmsObject getDeterministicFreq:j iTraj:i]; Sum = Sum + Frq; if (Frq > 0) counter++; } Freq[i] = (float) (Sum / counter); } for (i = 0; i < iNTraj; i++) { min = 22050.0; for (j = 0; j < iNTraj; j++) if (Freq[j] < min && Freq[j] > lastmin) { min = Freq[j]; counter = j; } lastmin = min; position[i] = counter; } while(iTraj <= HighestPartial) { [self drawTrajectory:position[iTraj]:iTraj]; iTraj++; } } } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.