| 742 | } |
| 743 | |
| 744 | void GranularSynth::handleNoteOff(juce::MidiKeyboardState*, int, int midiNoteNumber, float) { |
| 745 | const Utils::PitchClass pitchClass = Utils::getPitchClass(midiNoteNumber); |
| 746 | |
| 747 | for (GrainNote* gNote : mActiveNotes) { |
| 748 | if (gNote->pitch == midiNoteNumber && gNote->removeTs == -1) { |
| 749 | // Set timestamp to delete note based on release time and set note off for all generators |
| 750 | float release = mParameters.getFloatParam(mParameters.global.ampEnvRelease, true);; |
| 751 | for (size_t i = 0; i < NUM_GENERATORS; ++i) { |
| 752 | gNote->genAmpEnvs[i].noteOff(mTotalSamps); |
| 753 | } |
| 754 | gNote->removeTs = mTotalSamps + static_cast<int>(release * mSampleRate); |
| 755 | break; |
| 756 | } |
| 757 | } |
| 758 | // Update mod envelopes |
| 759 | for (auto& env : mParameters.global.modEnvs) { |
| 760 | env.handleNoteOff(mTotalSamps); |
| 761 | } |
| 762 | } |
| 763 | |
| 764 | void GranularSynth::makePitchSpec() { |
| 765 | mPitchSpecBuffer.clear(); |
nothing calls this directly
no test coverage detected