| 162 | |
| 163 | |
| 164 | void kickerInstrument::playNote( NotePlayHandle * _n, |
| 165 | sampleFrame * _working_buffer ) |
| 166 | { |
| 167 | const fpp_t frames = _n->framesLeftForCurrentPeriod(); |
| 168 | const f_cnt_t offset = _n->noteOffset(); |
| 169 | const float decfr = m_decayModel.value() * |
| 170 | Engine::mixer()->processingSampleRate() / 1000.0f; |
| 171 | const f_cnt_t tfp = _n->totalFramesPlayed(); |
| 172 | |
| 173 | if ( tfp == 0 ) |
| 174 | { |
| 175 | _n->m_pluginData = new SweepOsc( |
| 176 | DistFX( m_distModel.value(), |
| 177 | m_gainModel.value() ), |
| 178 | m_startNoteModel.value() ? _n->frequency() : m_startFreqModel.value(), |
| 179 | m_endNoteModel.value() ? _n->frequency() : m_endFreqModel.value(), |
| 180 | m_noiseModel.value() * m_noiseModel.value(), |
| 181 | m_clickModel.value() * 0.25f, |
| 182 | m_slopeModel.value(), |
| 183 | m_envModel.value(), |
| 184 | m_distModel.value(), |
| 185 | m_distEndModel.value(), |
| 186 | decfr ); |
| 187 | } |
| 188 | else if( tfp > decfr && !_n->isReleased() ) |
| 189 | { |
| 190 | _n->noteOff(); |
| 191 | } |
| 192 | |
| 193 | SweepOsc * so = static_cast<SweepOsc *>( _n->m_pluginData ); |
| 194 | so->update( _working_buffer + offset, frames, Engine::mixer()->processingSampleRate() ); |
| 195 | |
| 196 | if( _n->isReleased() ) |
| 197 | { |
| 198 | const float done = _n->releaseFramesDone(); |
| 199 | const float desired = desiredReleaseFrames(); |
| 200 | for( fpp_t f = 0; f < frames; ++f ) |
| 201 | { |
| 202 | const float fac = ( done+f < desired ) ? ( 1.0f - ( ( done+f ) / desired ) ) : 0; |
| 203 | _working_buffer[f+offset][0] *= fac; |
| 204 | _working_buffer[f+offset][1] *= fac; |
| 205 | } |
| 206 | } |
| 207 | |
| 208 | instrumentTrack()->processAudioBuffer( _working_buffer, frames + offset, _n ); |
| 209 | } |
| 210 | |
| 211 | |
| 212 |
nothing calls this directly
no test coverage detected