This is TablookUG.m in view mode; [Download] [Up]
/* This is a minimal implementation of TablookUG.m, a subclass of UnitGenerator. It was auto-generated by dspwrap from DSP source code. This file and TablookUG.h should be extended and rewritten to provide a higher level, device-independent interface to the SynthPatch programmer. See /usr/include/musickit/UnitGenerator.h and the UnitGenerator spec for more information regarding unit-generator method design. */ #import <math.h> #import "TablookUG.h" #define log2(x) (log((x))/log(2)) @implementation TablookUG:UnitGenerator { /* Instance variables go here */ } enum args { ainv, atablook, shftamt, aout, mtablook }; #import "tablookUGInclude.m" /*------- Default methods for poking unit generator memory arguments ---------- * * A default method has been written by dspwrap for every memory argument * defined in the unit-generator DSP source file. * Each method name is created from the symbolic name specified in * the second argument to the new_xarg or new_yarg macro in the DSP * source code. This is also the same name that is used in the * DSPWRAP ARGUMENT INFO comment field to declare the memory argument type. * * A UG memory argument may be either a datum or a DSP memory address. * At present, a DSPDatum is 24 bits, right justified in a 32-bit int. * An address argument is passed as a SynthData object. * The method names distinguish between input and output addresses * if the "(input)" and "(output)" type qualifiers are used in the * DSPWRAP ARGUMENT INFO comment field. * * We recommend that you re-implement the datum-setting methods to accept * abstract parameters as floating-point numbers between 0 and 1.0, and * physically meaningful parameters as floating-point numbers in natural * physical units such as Hertz, seconds, etc. Note that only those * arguments which the user needs to set should be exported; internally * managed "state variables" need not be exported. */ - setInputAinv:(id)aPatchPoint { fprintf(stderr,"Setting input to a patchpoint\n"); return [self setAddressArg:ainv to:aPatchPoint]; } - setAddressAtablook:(id)aPatchPoint { fprintf(stderr,"setting table to a patchpoint\n"); return [self setAddressArg:atablook to:aPatchPoint]; } - setShftamt:(DSPDatum)aFix24 { return [self setDatumArg:shftamt to:aFix24]; } - setOutputAout:(id)aPatchPoint { fprintf(stderr,"Setting output to a patchpoint\n"); return [self setAddressArg:aout to:aPatchPoint]; } - setMtablook:(DSPDatum)aFix24 { return [self setDatumArg:mtablook to:aFix24]; } - setTableSize:(int)tSize { fprintf(stderr,"setting table size to an int\n"); [self setMtablook: tSize-1]; // This sets the mask [self setShftamt: DSPDoubleToFix24(pow(2,-1-(23-log2(tSize))))]; // This sets the multiply-by constant return self; } /*----------------- Default unit-generator control methods -------------------- * * Only the "idleSelf" method below is actually required, and then * only when the unit generator has at least one output. */ /* * The "init" method is called once just after the unit generator * is instantiated. Instantiation implies loading of the DSP code. After * instantiation, a unit generator may be allocated and deallocated many * times by the Orchestra object in the process of building and freeing * SynthPatches. Initialization happens only the first time. A nil return * normally means there was not sufficient room on the DSP to load the * unit generator. */ - init { if (![super init]) return nil; /* Initialize instance variables here */ return self; } /* * The "idleSelf" method places the UnitGenerator in a "turned off" * state. This happens every time a unit generator is "deallocated". * At the very least, all outputs must be patched to the special * patchpoint "sink". In rare cases, inputs should be patched to "zero", * e.g., Out2sum. */ - idleSelf { [self setAddressArgToSink:aout]; return self; } /* * The "runSelf" method is invoked when the unit generator is sent the * "run" message. This is done each time before the unit generator is * used. The "runSelf" method should set any default initial state in * the unit generator. For envelopes, as an example, the envelope * is triggered (or retriggered) from the beginning by this method. * For oscillators, the phase may be reset to zero here. * * While "init" happens only once, "run" happens every time * the unit generator is reactivated after an "idle" message. * Note that a unit generator may remain loaded on the DSP * and belong to several different SynthPatches in succession. * Each usage is bracketed by "run" and "idle". */ - runSelf { return self; } @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.