This is FM.h in view mode; [Download] [Up]
#import <musickit/SynthPatch.h> #import <musickit/WaveTable.h> #import <musickit/Envelope.h> /* ------------------------------------------------------------------------ * * FM is a frequency modulation SynthPatch with arbitrary waveforms for * * carrier and modulator and an interpolating oscillator for the carrier. * * It supports a wide variety of parameters, including many MIDI parameters.* * It supports a wide variety of parameters, including many MIDI parameters.* * * * This example is almost identical to the Fm1vi supplied with the 2.0 * * Music Kit SynthPatch Library. The only difference is that Fm1vi supports * * multiple "flavors" for optimization. For example, Fm1vi allows you to * * specify a patch implementing only periodic or only random vibrato. * * * * See the FM literature for details of FM synthesis. * * (Note that the implementation here is "frequency modulation" rather than * * "phase modulation" and that the deviation scaling does not follow the * * frequency envelope -- it is exactly as defined in the literature only * * when the frequency envelope is at 1 and the vibrato is neither above nor * * below the pitch.) * * ------------------------------------------------------------------------ */ @interface FM:SynthPatch { /* Instance variables for the parameters to which the SynthPatch responds. */ WaveTable *waveform; /* Carrier waveform */ WaveTable *m1Waveform; /* Modulator waveform */ double cRatio; /* Carrier frequency scaler. */ double m1Ratio; /* Modulater frequency scaler. */ Envelope *ampEnv; /* Amplitude envelope. */ double amp0; /* Amplitude when ampEnv is at 0 */ double amp1; /* Amplitude when ampEnv is at 1 */ double ampAtt; /* ampEnv attack time or MK_NODVAL for 'not set'. */ double ampRel; /* ampEnv release time or MK_NODVAL for 'not set'. */ Envelope *freqEnv; /* Frequency envelope. */ double freq0; /* Frequency when freqEnv is at 0. */ double freq1; /* Frequency when freqEnv is at 1. */ double freqAtt; /* freqEnv attack time or MK_NODVAL for 'not set'. */ double freqRel; /* freqEnv release time or MK_NODVAL for 'not set'. */ Envelope *m1IndEnv;/* FM index envelope */ double m1Ind0; /* FM index when m1IndEnv is at 0 */ double m1Ind1; /* FM index when m1IndEnv is at 1 */ double m1IndAtt; /* m1IndEnv attack time or MK_NODVAL for 'not set'. */ double m1IndRel; /* m1IndEnv release time or MK_NODVAL for 'not set'. */ double bright; /* Brightness. A multiplier on index. */ double bearing; /* Left/right panning. -45 to 45. */ double portamento;/* Transition time upon rearticulation, in seconds. */ WaveTable *vibWaveform; /* Waveform used for vibrato. */ double svibAmp0; /* Vibrato, on a scale of 0 to 1, when modWheel is 0. */ double svibAmp1; /* Vibrato, on a scale of 0 to 1, when modWheel is 127.*/ double svibFreq0; /* Vibrato freq in Hz. when modWheel is 0. */ double svibFreq1; /* Vibrato freq in Hz. when modWheel is 1. */ double rvibAmp; /* Random vibrato. On a scale of 0 to 1. */ double phase; /* Initial phase in radians */ double m1Phase; /* Initial modulator phase in radians */ double velocitySensitivity; /* Sensitivity to velocity. Scale of 0 to 1 */ double afterTouchSensitivity;/* Sensitivity to afterTouch. 0 to 1. */ double pitchbendSensitivity; /* Sensitivity to pitchBend in semitones. */ int velocity; /* MIDI velocity. Boosts or attenuates amplitude. */ int pitchbend; /* MIDI pitchBend. Raises or lowers pitch. */ int modWheel; /* MIDI modWheel. Controls vibrato frequency and amp */ int afterTouch; /* MIDI afterTouch. Anything less than full after touch functions as an attenuation. */ int volume; /* MIDI volume pedal. Anything less than full pedal functions as an attenuation. */ int wavelen; /* WaveTable size. Rarely needed. */ } /* Default parameter values, if corresponding parameter is omitted: waveform - sine wave m1Waveform - sine wave cRatio - 1.0 m1Ratio - 1.0 ampEnv - none amp0 - 0 amp1 - 0.1 ampAtt - not set (use times specified in envelope directly) ampRel - not set (use times specified in envelope directly) freqEnv - none freq0 - 0.0 Hz. freq1 - 440.0 Hz. freqAtt - not set (use times specified in envelope directly) freqRel - not set (use times specified in envelope directly) m1IndEnv - none m1Ind0 - 0.0 m1Ind1 - 2.0 m1IndAtt - not set (use times specified in envelope directly) m1IndRel - not set (use times specified in envelope directly) bright - 1.0 bearing - 0.0 portamento - not set (use times specified in envelope directly) vibWaveform - sine wave svibAmp0 - 0.0 svibAmp1 - 0.0 svibFreq0 - 0.0 Hz. svibFreq1 - 0.0 Hz. rvibAmp - 0.0 phase - 0.0 radians m1Phase - 0.0 radians velocitySensitivity - 0.5 of maximum afterTouchSensitivity - 0.5 of maximum pitchbendSensitivity - 3.0 semitones velocity - no boost or attenuation (64) pitchbend - no bend (MIDI_ZEROBEND -- see <midi/midi_types.h>) afterTouch - no attenuation (127) volume - no attenuation (127) modWheel - vibrato amplitude of svibAmp1 and frequency of svibFreq1 (127) wavelen - automatically-selected value */ /* The methods are all explained in the class description for SynthPatch */ +patchTemplateFor:currentNote; -init; -controllerValues:controllers; -noteOnSelf:aNote; -preemptFor:aNote; -noteUpdateSelf:aNote; -(double)noteOffSelf:aNote; -noteEndSelf; /* Private methods included here only for forward referencing. */ -_setDefaults; -_updateParameters:aNote; @end
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.