//--------------------------------------------------- void Snare_trigger(const uint8_t vel, const uint8_t note) { lfo_retrigger(3); //update velocity modulation modNode_updateValue(&velocityModulators[3],vel/127.f); float offset = 1; if(snareVoice.transGen.waveform==1) //offset mode { offset -= snareVoice.transGen.volume; } if(snareVoice.osc.waveform == SINE) snareVoice.osc.phase = (0x3ff<<20)*offset;//voiceArray[voiceNr].osc.startPhase ; else if(snareVoice.osc.waveform > SINE && snareVoice.osc.waveform <= REC) snareVoice.osc.phase = (0xff<<20)*offset; else snareVoice.osc.phase = 0; DecayEg_trigger(&snareVoice.oscPitchEg); slopeEg2_trigger(&snareVoice.oscVolEg); snareVoice.velo = vel/127.f; osc_setBaseNote(&snareVoice.osc,note); //TODO noise muss mit transponiert werden transient_trigger(&snareVoice.transGen); SnapEg_trigger(&snareVoice.snapEg); }
//--------------------------------------------------- void HiHat_trigger( uint8_t vel, uint8_t isOpen, const uint8_t note) { lfo_retrigger(5); //update velocity modulation modNode_updateValue(&velocityModulators[5],vel/127.f); float offset = 1; if(hatVoice.transGen.waveform==1) //offset mode { offset -= hatVoice.transGen.volume; } if(hatVoice.osc.waveform == SINE) hatVoice.osc.phase = (0x3ff<<20)*offset;//voiceArray[voiceNr].osc.startPhase ; else if(hatVoice.osc.waveform > SINE && hatVoice.osc.waveform <= REC) hatVoice.osc.phase = (0xff<<20)*offset; else hatVoice.osc.phase = 0; osc_setBaseNote(&hatVoice.osc,note); osc_setBaseNote(&hatVoice.modOsc,note); osc_setBaseNote(&hatVoice.modOsc2,note); hatVoice.isOpen = isOpen; hatVoice.oscVolEg.decay = isOpen?hatVoice.decayOpen:hatVoice.decayClosed; slopeEg2_trigger(&hatVoice.oscVolEg); hatVoice.velo = vel/127.f; transient_trigger(&hatVoice.transGen); SnapEg_trigger(&hatVoice.snapEg); }
//--------------------------------------------------- void Cymbal_trigger( const uint8_t vel, const uint8_t note) { lfo_retrigger(4); //update velocity modulation modNode_updateValue(&velocityModulators[4],vel/127.f); float offset = 1; if(cymbalVoice.transGen.waveform==1) //offset mode { offset -= cymbalVoice.transGen.volume; } if(cymbalVoice.osc.waveform == SINE) cymbalVoice.osc.phase = (0x3ff<<20)*offset;//voiceArray[voiceNr].osc.startPhase ; else if(cymbalVoice.osc.waveform > SINE && cymbalVoice.osc.waveform <= REC) cymbalVoice.osc.phase = (0xff<<20)*offset; else cymbalVoice.osc.phase = 0; cymbalVoice.modOsc.phase = 0; cymbalVoice.modOsc2.phase = 0; osc_setBaseNote(&cymbalVoice.osc,note); osc_setBaseNote(&cymbalVoice.modOsc,note); osc_setBaseNote(&cymbalVoice.modOsc2,note); slopeEg2_trigger(&cymbalVoice.oscVolEg); cymbalVoice.velo = vel/127.f; transient_trigger(&cymbalVoice.transGen); SnapEg_trigger(&cymbalVoice.snapEg); }
//--------------------------------------------------- void Drum_trigger(const uint8_t voiceNr, const uint8_t vol, const uint8_t note) { lfo_retrigger(voiceNr); //update velocity modulation modNode_updateValue(&velocityModulators[voiceNr],vol/127.f); //only reset phase if envelope is closed #ifdef USE_AMP_FILTER if((voiceArray[voiceNr].volEgValueBlock[15]<=0.01f) || (voiceArray[voiceNr].transGen.waveform==1)) #else // if((voiceArray[voiceNr].ampFilterInput<=0.01f) || (voiceArray[voiceNr].transGen.waveform==1)) #endif { float offset = 1; if(voiceArray[voiceNr].transGen.waveform==1) //offset mode { offset -= voiceArray[voiceNr].transGen.volume; #ifdef USE_AMP_FILTER setOnePoleCoef(&voiceArray[voiceNr].ampFilter,1.0f); //turn off amp filter for super snappy attack } else { setOnePoleCoef(&voiceArray[voiceNr].ampFilter,ampSmoothValue); #endif } if(voiceArray[voiceNr].osc.waveform == SINE) voiceArray[voiceNr].osc.phase = 1024 + ( (0x3ff<<20) - 1024)*offset;//voiceArray[voiceNr].osc.startPhase ; else if(voiceArray[voiceNr].osc.waveform > SINE && voiceArray[voiceNr].osc.waveform <= REC) voiceArray[voiceNr].osc.phase = (0xff<<20)*offset; else voiceArray[voiceNr].osc.phase = 0; } osc_setBaseNote(&voiceArray[voiceNr].osc,note); osc_setBaseNote(&voiceArray[voiceNr].modOsc,note); DecayEg_trigger(&voiceArray[voiceNr].oscPitchEg); slopeEg2_trigger(&voiceArray[voiceNr].oscVolEg); voiceArray[voiceNr].velo = vol/127.f; transient_trigger(&voiceArray[voiceNr].transGen); SnapEg_trigger(&voiceArray[voiceNr].snapEg); }