This is Simplicity.m in view mode; [Download] [Up]
#import <musickit/unitgenerators/unitgenerators.h> #import "Simplicity.h" /* We call our simple SynthPatch 'Simplicity'. */ @implementation Simplicity /* A static integer is created for each synthElement. */ static int osc, /* sine wave UnitGenerator */ stereoOut, /* sound output UnitGenerator */ outPatchpoint; /* SynthData */ + patchTemplateFor:aNote /* The argument is ignored in this implementation. */ { /* Step 1: Create an instance of the PatchTemplate class. This method is automatically invoked each time the SynthPatch receives a Note. However, the PatchTemplate should only be created the first time this method is invoked. If the object has already been created, it's immediately returned. */ static PatchTemplate *theTemplate = nil; if (theTemplate) return theTemplate; theTemplate = [[PatchTemplate alloc] init]; /* Step 2: Add synthElement specifications to the PatchTemplate. The first two are UnitGenerators; the last is a SynthData that's used as a patchpoint. */ osc = [theTemplate addUnitGenerator:[OscgUGxy class]]; stereoOut = [theTemplate addUnitGenerator:[Out2sumUGx class]]; outPatchpoint = [theTemplate addPatchpoint:MK_xPatch]; /* Step 3: Specify the connections between synthElements. */ [theTemplate to:osc sel:@selector(setOutput:) arg:outPatchpoint]; /* Always return the PatchTemplate. */ return theTemplate; } #define valid(_x) (!MKIsNoDVal(_x)) - applyParameters:aNote /* This is a private method to the Simplicity class. It is used internally only. */ { /* Retrieve and store the parameters. */ double myFreq = [aNote freq]; double myAmp = [aNote parAsDouble:MK_amp]; double myBearing = [aNote parAsDouble:MK_bearing]; /* Apply frequency if present. */ if (valid(myFreq)) [[self synthElementAt:osc] setFreq:myFreq]; /* Apply amplitude if present. */ if (valid(myAmp)) [[self synthElementAt:osc] setAmp:myAmp]; /* Apply bearing if present. */ if (valid(myBearing)) [[self synthElementAt:stereoOut] setBearing:myBearing]; } - noteOnSelf:aNote { /* Step 1: Read the parameters in the Note and apply them to the patch. */ [self applyParameters:aNote]; /* Step 2: Turn on the patch by connecting the Out2sumUGx object to the patchpoint and sending the run message to all the synthElements. */ [[self synthElementAt:stereoOut] setInput:[self synthElementAt:outPatchpoint]]; [synthElements makeObjectsPerform:@selector(run)]; return self; } - noteUpdateSelf:aNote { /* This method can be omitted, if you don't need your patch to respond to noteUpdates. */ [self applyParameters:aNote]; return self; } - noteEndSelf { /* Deactivate the SynthPatch by idling the output. */ [[self synthElementAt:stereoOut] idle]; return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.