float env = adsr_env(sc, note);
if (sc->adsr_cnt[note] == 0) break;
const float amp = vol * env;
-
- left[i] += amp * sinf(2.0 * M_PI * phase);
- left[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
- left[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
- left[i] += .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
- //left[i] -= .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
- //left[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
- left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
- phase += fq;
- right[i] += amp * sinf(2.0 * M_PI * phase);
- right[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
- right[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
- right[i] -= .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
- //right[i] += .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
- //right[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
- right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
+ if (amp > 1e-10) {
+ left[i] += amp * sinf(2.0 * M_PI * phase);
+ left[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
+ left[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
+ left[i] += .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
+ //left[i] -= .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
+ //left[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
+ left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
+ phase += fq;
+ right[i] += amp * sinf(2.0 * M_PI * phase);
+ right[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
+ right[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
+ right[i] -= .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
+ //right[i] += .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
+ //right[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
+ right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
+ } else {
+ phase += fq;
+ }
if (phase > 1.0) phase -= 2.0;
}
sc->phase[note] = phase;
RSSynthChannel* sc = &rs->sc[chn];
const int8_t vel = sc->miditable[note];
const int8_t msg = sc->midimsgs[note];
- const float vol = /* master_volume */ 0.25 * fabsf(vel) / 127.0;
+ const float vol = /* master_volume */ 0.1 * fabsf(vel) / 127.0;
const float phase = sc->phase[note];
sc->midimsgs[note] = 0;
uint32_t nremain = nframes - written;
if (rs->boffset >= BUFFER_SIZE_SAMPLES) {
- rs->boffset = 0;
- synth_fragment(rs, BUFFER_SIZE_SAMPLES, rs->buf[0], rs->buf[1]);
+ const uint32_t tosynth = MIN(BUFFER_SIZE_SAMPLES, nremain);
+ rs->boffset = BUFFER_SIZE_SAMPLES - tosynth;
+ synth_fragment(rs, tosynth, &(rs->buf[0][rs->boffset]), &(rs->buf[1][rs->boffset]));
}
uint32_t nread = MIN(nremain, (BUFFER_SIZE_SAMPLES - rs->boffset));