/** * @param aInstrument pointer to the SynthInstrument containing the rendering properties for the BaseSynthEvent * @param aFrequency frequency in Hz for the note to be rendered * @param aPosition offset in the sequencer where this event starts playing / becomes audible * @param aLength length of the event (in sequencer steps) * @param aIsSequenced whether this event is sequenced and only audible in a specific sequence range */ void BaseSynthEvent::init( SynthInstrument *aInstrument, float aFrequency, int aPosition, int aLength, bool aIsSequenced ) { _destroyableBuffer = true; // synth event buffer is always unique and managed by this instance ! _instrument = aInstrument; _adsr = aInstrument->adsr != 0 ? aInstrument->adsr->clone() : new ADSR(); // when instrument has no fixed length and the decay is short // we deactivate the decay envelope completely (for now) if ( !aIsSequenced && _adsr->getDecay() < .75 ) _adsr->setDecay( 0 ); _buffer = 0; _locked = false; position = aPosition; length = aLength; isSequenced = aIsSequenced; _queuedForDeletion = false; _deleteMe = false; _update = false; _cancel = false; // whether we should cancel caching _hasMinLength = isSequenced; // a sequenced event has no early cancel _caching = false; _cachingCompleted = false; // whether we're done caching _autoCache = false; // we'll cache sequentially instead _rendering = false; _volume = aInstrument->volume; _sampleLength = 0; _cacheWriteIndex = 0; setFrequency( aFrequency ); calculateBuffers(); addToSequencer(); }
/** * @param aInstrument pointer to the SynthInstrument containing the rendering properties for the BaseSynthEvent * @param aFrequency frequency in Hz for the note to be rendered * @param aPosition offset in the sequencer where this event starts playing / becomes audible * @param aLength length of the event (in sequencer steps) * @param isSequenced whether this event is sequenced and only audible in a specific sequence range */ void BaseSynthEvent::init( SynthInstrument* aInstrument, float aFrequency, int aPosition, float aLength, bool isSequenced ) { instanceId = ++INSTANCE_COUNT; _destroyableBuffer = true; // synth event buffer is always unique and managed by this instance ! _instrument = aInstrument; _synthInstrument = aInstrument; // convenience reference (typecast to SynthInstrument) position = aPosition; length = aLength; cachedProps.ADSRenvelope = 0.0; cachedProps.arpeggioPosition = 0; cachedProps.arpeggioStep = 0; int maxOscillatorAmount = 8; // let's assume a max amount of oscillators of 8 here cachedProps.oscillatorPhases.reserve( maxOscillatorAmount ); for ( int i = 0; i < maxOscillatorAmount; ++i ) cachedProps.oscillatorPhases.push_back( 0.0 ); this->isSequenced = isSequenced; _queuedForDeletion = false; _deleteMe = false; _hasMinLength = isSequenced; // a sequenced event has no early cancel _sampleLength = 0; lastWriteIndex = 0; setFrequency( aFrequency ); calculateBuffers(); addToSequencer(); }
void BaseAudioEvent::setInstrument( BaseInstrument* aInstrument ) { // swap instrument if new one is different to existing reference // additionally, if event was added to the sequencer, add it to the new // instruments sequenced events list if ( aInstrument != 0 && _instrument != aInstrument ) { bool wasAddedToSequencer = _addedToSequencer; if ( wasAddedToSequencer ) removeFromSequencer(); _instrument = aInstrument; if ( wasAddedToSequencer ) addToSequencer(); } }
/** * @param aPosition position in the sequencer where this event starts playing * @param aLength length (in sequencer steps) of this event * @param aInstrument the SynthInstrument whose properties will be used for synthesizing this event * can be NULL to keep the current SynthInstrument, if not null the current * SynthInstrument is replaced */ void BaseSynthEvent::invalidateProperties( int aPosition, float aLength, SynthInstrument *aInstrument ) { // swap instrument if new one is different to existing reference if ( aInstrument != 0 && _instrument != aInstrument ) { removeFromSequencer(); _instrument = aInstrument; addToSequencer(); } position = aPosition; length = aLength; // is this event caching ? if ( AudioEngineProps::EVENT_CACHING && !_cachingCompleted ) _cancel = true; if ( _rendering ) _update = true; // we're rendering, request update from within render loop else updateProperties(); // instant update as we're not rendering }