| 108 | |
| 109 | |
| 110 | void MonstroSynth::renderOutput( fpp_t _frames, sampleFrame * _buf ) |
| 111 | { |
| 112 | float modtmp; // temp variable for freq modulation |
| 113 | // macros for modulating with env/lfos |
| 114 | #define modulatefreq( car, mod ) \ |
| 115 | modtmp = 0.0f; \ |
| 116 | if( mod##_e1 != 0.0f ) modtmp += env[0][f] * mod##_e1; \ |
| 117 | if( mod##_e2 != 0.0f ) modtmp += env[1][f] * mod##_e2; \ |
| 118 | if( mod##_l1 != 0.0f ) modtmp += lfo[0][f] * mod##_l1; \ |
| 119 | if( mod##_l2 != 0.0f ) modtmp += lfo[1][f] * mod##_l2; \ |
| 120 | car = qBound( MIN_FREQ, car * powf( 2.0f, modtmp ), MAX_FREQ ); |
| 121 | |
| 122 | #define modulateabs( car, mod ) \ |
| 123 | if( mod##_e1 != 0.0f ) car += env[0][f] * mod##_e1; \ |
| 124 | if( mod##_e2 != 0.0f ) car += env[1][f] * mod##_e2; \ |
| 125 | if( mod##_l1 != 0.0f ) car += lfo[0][f] * mod##_l1; \ |
| 126 | if( mod##_l2 != 0.0f ) car += lfo[1][f] * mod##_l2; |
| 127 | |
| 128 | #define modulatephs( car, mod ) \ |
| 129 | if( mod##_e1 != 0.0f ) car += env[0][f] * mod##_e1; \ |
| 130 | if( mod##_e2 != 0.0f ) car += env[1][f] * mod##_e2; \ |
| 131 | if( mod##_l1 != 0.0f ) car += lfo[0][f] * mod##_l1; \ |
| 132 | if( mod##_l2 != 0.0f ) car += lfo[1][f] * mod##_l2; |
| 133 | |
| 134 | #define modulatevol( car, mod ) \ |
| 135 | if( mod##_e1 > 0.0f ) car *= ( 1.0f - mod##_e1 + mod##_e1 * env[0][f] ); \ |
| 136 | if( mod##_e1 < 0.0f ) car *= ( 1.0f + mod##_e1 * env[0][f] ); \ |
| 137 | if( mod##_e2 > 0.0f ) car *= ( 1.0f - mod##_e2 + mod##_e2 * env[1][f] ); \ |
| 138 | if( mod##_e2 < 0.0f ) car *= ( 1.0f + mod##_e2 * env[1][f] ); \ |
| 139 | if( mod##_l1 != 0.0f ) car *= ( 1.0f + mod##_l1 * lfo[0][f] ); \ |
| 140 | if( mod##_l2 != 0.0f ) car *= ( 1.0f + mod##_l2 * lfo[1][f] ); \ |
| 141 | car = qBound( -MODCLIP, car, MODCLIP ); |
| 142 | |
| 143 | |
| 144 | |
| 145 | //////////////////// |
| 146 | // // |
| 147 | // MODULATORS // |
| 148 | // // |
| 149 | //////////////////// |
| 150 | |
| 151 | // LFO phase offsets |
| 152 | const float lfo1_po = m_parent->m_lfo1Phs.value() / 360.0f; |
| 153 | const float lfo2_po = m_parent->m_lfo2Phs.value() / 360.0f; |
| 154 | |
| 155 | // remove cruft from phase counters to prevent overflow, add phase offset |
| 156 | m_lfo_phase[0] = absFraction( m_lfo_phase[0] + lfo1_po ); |
| 157 | m_lfo_phase[1] = absFraction( m_lfo_phase[1] + lfo2_po ); |
| 158 | |
| 159 | // LFO rates and increment |
| 160 | m_lfo_rate[0] = ( m_parent->m_lfo1Rate.value() * 0.001f * m_parent->m_samplerate ); |
| 161 | m_lfo_rate[1] = ( m_parent->m_lfo2Rate.value() * 0.001f * m_parent->m_samplerate ); |
| 162 | m_lfo_inc[0] = 1.0f / m_lfo_rate[0]; |
| 163 | m_lfo_inc[1] = 1.0f / m_lfo_rate[1]; |
| 164 | |
| 165 | m_env_sus[0] = m_parent-> m_env1Sus.value(); |
| 166 | m_env_sus[1] = m_parent-> m_env2Sus.value(); |
| 167 |
no test coverage detected