This is EnvDelegate.m in view mode; [Download] [Up]
/************************************************** * SynthBuilder * Copyright 1993 Nick Porcaro All Rights Reserved **************************************************/ /* EnvDelegate.m * Nick Porcaro, independent work Summer 1993 */ #import <stdlib.h> #import <math.h> #import <stddef.h> #import <string.h> #import <appkit/Application.h> #import <appkit/Window.h> #import <appkit/Panel.h> #import <musickit/Envelope.h> #import "EnvDelegate.h" #import "EnvController.h" #import "FakeUG.h" #import "PatchParam.h" #import "FakeSynthPatch.h" #define EOS '\0' extern char *getAppName(); @implementation EnvDelegate - init { envString = NULL; [NXApp loadNibSection:"EnvelopeEd.nib" owner:self withNames:YES]; thePatchParam = nil; theFakeUG = nil; return self; } - closeInspector { [envWindow performClose:self]; return self; } - free { if (envController) { [envController removeEnvelope:self]; [envController free]; } return [super free]; } - setFakeUG:aFakeUG ArgNum: (int) argnum { theFakeUG = aFakeUG; theArgNum = argnum; return self; } - setPatchParameter:aPP { thePatchParam = aPP; return self; } - (BOOL) hasFakeUG { if (theFakeUG) return YES; else return NO; } - displayWindow:(char *) title { [self envelope]; // Make sure we have it [envWindow setTitle:title]; [envWindow makeKeyAndOrderFront:self]; return self; } - closeWindow { [envWindow close]; return self; } - (char *) envelopeToText { int i, count; double *x, *y; unsigned int env_size; int stick; BOOL do_stick = NO; /* Do something to the envelope so the File's Owner * object can do something cool with it */ [self envelope]; /* Get the damn thing */ if (! envelope) { NXRunAlertPanel(getAppName(), "Unexpected NULL envelope", NULL, NULL, NULL); return NULL; } if (envString) { NXZoneFree([self zone], envString); envString = NULL; } count = [envelope pointCount]; if (count <= 0) { return NULL; } x = [envelope xArray]; y = [envelope yArray]; stick = [envelope stickPoint]; if (stick != MAXINT) { do_stick = YES; } if (! (x && y) ) { return NULL; } /* The max a coordinate of an envelope can be is %03.5 = 9 characters * add a comma and paren for each coordinate (make it 4 to be safe) * Then we have 9+5 = 14 characters for each coordinate * or 28 characters for each point */ env_size = count * 28 + 256; /* add 256 for extra fudge */ envString = (char *) NXZoneCalloc([self zone], env_size, sizeof(char)); if (! envString) { NXRunAlertPanel(getAppName(), "Grave danger -- malloc error", NULL, NULL, NULL); return NULL; } strcpy(envString, ""); for (i=0; i<count; i++) { sprintf(envString, "%s(%4.4f, %f)", envString, x[i], y[i]); if (do_stick && (stick == i)) { strcat(envString, "|"); } } return envString; } - textToEnvelope: (char *) aString { int i, j; int pointCount = 0; int stickPoint = -1; double *xArray, *yArray, *smoothingArray; id newEnv; if (! aString) { return nil; } for (i=0; aString[i] != '\0'; i++) { if (aString[i]=='|') { stickPoint = pointCount-1; } if (aString[i]=='(') pointCount++; } if (pointCount <= 0) { return nil; } xArray = (double *) NXZoneCalloc([self zone], pointCount, sizeof(double)); yArray = (double *) NXZoneCalloc([self zone], pointCount, sizeof(double)); smoothingArray = (double *) NXZoneCalloc([self zone], pointCount, sizeof(double)); j=0; for (i=0; i<pointCount; i++) { xArray[i] = yArray[i] = 0.0; smoothingArray[i] = 1.0; while (aString[j]!='(') { j++; } sscanf(aString+j, "(%lf,%lf,%lf)", &xArray[i], &yArray[i], &smoothingArray[i]); j++; } newEnv = [[[Envelope alloc] init] setPointCount: pointCount xArray: xArray orSamplingPeriod: 1.0 yArray: yArray smoothingArray: smoothingArray orDefaultSmoothing: 1.0 ]; if (stickPoint != -1) { [newEnv setStickPoint:stickPoint]; } return newEnv; } - envelope { envelope = [envController envelope]; return envelope; } - sendEnvelope /* Whenever the envelope is redrawn, * this method is called by EnvelopeView:drawSelf */ { if (theFakeUG) { /* Get the latest envelope and * send it to the fake UG */ [[theFakeUG getSP] enableNoteOff:NO]; [theFakeUG setArg:theArgNum WithEnvelope:[self envelope]]; } else if (thePatchParam) { [thePatchParam setMapEnvelope:[self envelope]]; } else { ; /* Do nothing */ } return self; } - envController { return envController; } - envelopeRemoved { envelope = nil; if (theFakeUG) { [theFakeUG clearArgEnvelope:theArgNum]; /* If there is an envelope there, send it */ if ([self envelope]) { [self sendEnvelope]; } } else if (thePatchParam) { [thePatchParam clearMapEnvelope]; } return self; } - envelopeAdded { [self sendEnvelope]; return self; } - willAddEnvelope { if (theFakeUG) { [theFakeUG willAddEnvelope:theArgNum]; } return self; } - willRemoveEnvelope { if (theFakeUG) { [theFakeUG willRemoveEnvelope:theArgNum]; } return self; } - willSplitView { if (theFakeUG) { [[theFakeUG getSP] enableNoteOff:NO]; } return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.