1 /* reasonable simple synth
3 * Copyright (C) 2013 Robin Gareus <robin@gareus.org>
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2, or (at your option)
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software Foundation,
17 * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
21 #define _GNU_SOURCE // needed for M_PI
35 #ifndef BUFFER_SIZE_SAMPLES
36 #define BUFFER_SIZE_SAMPLES 64
40 #define MIN(A, B) ( (A) < (B) ? (A) : (B) )
43 /* internal MIDI event abstraction */
52 struct rmidi_event_t {
53 enum RMIDI_EV_TYPE type;
54 uint8_t channel; /**< the MIDI channel number 0-15 */
68 uint32_t tme[3]; // attack, decay, release times [settings:ms || internal:samples]
69 float vol[2]; // attack, sustain volume [0..1]
70 uint32_t off[3]; // internal use (added attack,decay,release times)
73 typedef struct _RSSynthChannel {
75 uint32_t adsr_cnt[128];
77 float phase[128]; // various use, zero'ed on note-on
78 int8_t miditable[128]; // internal, note-on/off velocity
79 int8_t midimsgs [128]; // internal, note-off + on in same cycle, sustained-off
80 int8_t sustain; // sustain pedal pressed
82 void (*synthesize) (struct _RSSynthChannel* sc,
83 const uint8_t note, const float vol, const float pc,
84 const size_t n_samples, float* left, float* right);
87 typedef void (*SynthFunction) (RSSynthChannel* sc,
88 const uint8_t note, const float vol, const float pc,
89 const size_t n_samples, float* left, float* right);
93 float buf [2][BUFFER_SIZE_SAMPLES];
94 RSSynthChannel sc[16];
104 /* initialize ADSR values
106 * @param rate sample-rate
107 * @param a attack time in seconds
108 * @param d decay time in seconds
109 * @param r release time in seconds
110 * @param avol attack gain [0..1]
111 * @param svol sustain volume level [0..1]
113 static void init_adsr(ADSRcfg *adsr, const double rate,
114 const uint32_t a, const uint32_t d, const uint32_t r,
115 const float avol, const float svol) {
119 adsr->tme[0] = a * rate / 1000.0;
120 adsr->tme[1] = d * rate / 1000.0;
121 adsr->tme[2] = r * rate / 1000.0;
123 assert(adsr->tme[0] > 32);
124 assert(adsr->tme[1] > 32);
125 assert(adsr->tme[2] > 32);
126 assert(adsr->vol[0] >=0 && adsr->vol[1] <= 1.0);
127 assert(adsr->vol[1] >=0 && adsr->vol[1] <= 1.0);
129 adsr->off[0] = adsr->tme[0];
130 adsr->off[1] = adsr->tme[1] + adsr->off[0];
131 adsr->off[2] = adsr->tme[2] + adsr->off[1];
134 /* calculate per-sample, per-key envelope */
135 static inline float adsr_env(RSSynthChannel *sc, const uint8_t note) {
137 if (sc->adsr_cnt[note] < sc->adsr.off[0]) {
139 const uint32_t p = ++sc->adsr_cnt[note];
140 if (p == sc->adsr.tme[0]) {
141 sc->adsr_amp[note] = sc->adsr.vol[0];
142 return sc->adsr.vol[0];
144 const float d = sc->adsr.vol[0] - sc->adsr_amp[note];
145 return sc->adsr_amp[note] + (p / (float) sc->adsr.tme[0]) * d;
148 else if (sc->adsr_cnt[note] < sc->adsr.off[1]) {
150 const uint32_t p = ++sc->adsr_cnt[note] - sc->adsr.off[0];
151 if (p == sc->adsr.tme[1]) {
152 sc->adsr_amp[note] = sc->adsr.vol[1];
153 return sc->adsr.vol[1];
155 const float d = sc->adsr.vol[1] - sc->adsr_amp[note];
156 return sc->adsr_amp[note] + (p / (float) sc->adsr.tme[1]) * d;
159 else if (sc->adsr_cnt[note] == sc->adsr.off[1]) {
161 return sc->adsr.vol[1];
163 else if (sc->adsr_cnt[note] < sc->adsr.off[2]) {
165 const uint32_t p = ++sc->adsr_cnt[note] - sc->adsr.off[1];
166 if (p == sc->adsr.tme[2]) {
167 sc->adsr_amp[note] = 0;
170 const float d = 0 - sc->adsr_amp[note];
171 return sc->adsr_amp[note] + (p / (float) sc->adsr.tme[2]) * d;
175 sc->adsr_cnt[note] = 0;
181 /*****************************************************************************/
182 /* piano like sound w/slight stereo phase */
183 static void synthesize_sineP (RSSynthChannel* sc,
184 const uint8_t note, const float vol, const float fq,
185 const size_t n_samples, float* left, float* right) {
188 float phase = sc->phase[note];
190 for (i=0; i < n_samples; ++i) {
191 float env = adsr_env(sc, note);
192 if (sc->adsr_cnt[note] == 0) break;
193 const float amp = vol * env;
195 left[i] += amp * sinf(2.0 * M_PI * phase);
196 left[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
197 left[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
198 left[i] += .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
199 //left[i] -= .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
200 //left[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
201 left[i] += .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
203 right[i] += amp * sinf(2.0 * M_PI * phase);
204 right[i] += .300 * amp * sinf(2.0 * M_PI * phase * 2.0);
205 right[i] += .150 * amp * sinf(2.0 * M_PI * phase * 3.0);
206 right[i] -= .080 * amp * sinf(2.0 * M_PI * phase * 4.0);
207 //right[i] += .007 * amp * sinf(2.0 * M_PI * phase * 5.0);
208 //right[i] += .010 * amp * sinf(2.0 * M_PI * phase * 6.0);
209 right[i] -= .020 * amp * sinf(2.0 * M_PI * phase * 7.0);
213 if (phase > 1.0) phase -= 2.0;
215 sc->phase[note] = phase;
218 static const ADSRcfg piano_adsr = {{ 5, 800, 100}, { 1.0, 0.0}, {0,0,0}};
220 /*****************************************************************************/
223 /* process note - move through ADSR states, count active keys,.. */
224 static void process_key (void *synth,
225 const uint8_t chn, const uint8_t note,
226 const size_t n_samples, float *left, float *right)
228 RSSynthesizer* rs = (RSSynthesizer*)synth;
229 RSSynthChannel* sc = &rs->sc[chn];
230 const int8_t vel = sc->miditable[note];
231 const int8_t msg = sc->midimsgs[note];
232 const float vol = /* master_volume */ 0.1f * abs(vel) / 127.f;
233 const float phase = sc->phase[note];
234 const int8_t sus = sc->sustain;
235 sc->midimsgs[note] &= ~3;
237 if (phase == -10 && vel > 0) {
239 sc->midimsgs[note] &= ~4;
240 assert(sc->adsr_cnt[note] == 0);
241 sc->adsr_amp[note] = 0;
242 sc->adsr_cnt[note] = 0;
245 //printf("[On] Now %d keys active on chn %d\n", sc->keycomp, chn);
247 else if (phase >= -1.0 && phase <= 1.0 && vel > 0) {
248 // sustain note or re-start note while adsr in progress:
249 if (sc->adsr_cnt[note] > sc->adsr.off[1] || msg == 3 || msg == 5 || msg == 7) {
250 sc->midimsgs[note] &= ~4;
252 sc->adsr_amp[note] = adsr_env(sc, note);
253 sc->adsr_cnt[note] = 0;
256 else if (phase >= -1.0 && phase <= 1.0 && vel < 0) {
257 sc->midimsgs[note] |= 4;
259 if (sc->adsr_cnt[note] <= sc->adsr.off[1] && !sus) {
260 if (sc->adsr_cnt[note] != sc->adsr.off[1]) {
262 sc->adsr_amp[note] = adsr_env(sc, note);
264 sc->adsr_cnt[note] = sc->adsr.off[1] + 1;
266 else if (sus && sc->adsr_cnt[note] == sc->adsr.off[1]) {
267 sc->adsr_cnt[note] = sc->adsr.off[1] + 1;
271 //printf("FORCE NOTE OFF: %d %d\n", vel, sus);
272 /* note-on + off in same cycle */
273 sc->miditable[note] = 0;
274 sc->adsr_cnt[note] = 0;
275 sc->phase[note] = -10;
278 //printf("NOTE: %d (%d %d %d)\n", sc->adsr_cnt[note], sc->adsr.off[0], sc->adsr.off[1], sc->adsr.off[2]);
280 // synthesize actual sound
281 sc->synthesize(sc, note, vol, rs->freqs[note], n_samples, left, right);
283 if (sc->adsr_cnt[note] == 0) {
284 //printf("Note %d,%d released\n", chn, note);
285 sc->midimsgs[note] = 0;
286 sc->miditable[note] = 0;
287 sc->adsr_amp[note] = 0;
288 sc->phase[note] = -10;
290 //printf("[off] Now %d keys active on chn %d\n", sc->keycomp, chn);
294 /* synthesize a BUFFER_SIZE_SAMPLES's of audio-data */
295 static void synth_fragment (void *synth, const size_t n_samples, float *left, float *right) {
296 RSSynthesizer* rs = (RSSynthesizer*)synth;
297 memset (left, 0, n_samples * sizeof(float));
298 memset (right, 0, n_samples * sizeof(float));
303 for (c=0; c < 16; ++c) {
304 for (k=0; k < 128; ++k) {
305 if (rs->sc[c].miditable[k] == 0) continue;
306 process_key(synth, c, k, n_samples, left, right);
308 keycomp += rs->sc[c].keycomp;
311 #if 1 // key-compression
312 float kctgt = 8.0 / (float)(keycomp + 7.0);
313 if (kctgt < .5) kctgt = .5;
314 if (kctgt > 1.0) kctgt = 1.0;
315 const float _w = rs->kcfilt;
316 for (i=0; i < n_samples; ++i) {
317 rs->kcgain += _w * (kctgt - rs->kcgain);
318 left[i] *= rs->kcgain;
319 right[i] *= rs->kcgain;
325 static void synth_reset_channel(RSSynthChannel* sc) {
327 for (k=0; k < 128; ++k) {
331 sc->miditable[k] = 0;
337 static void synth_reset(void *synth) {
338 RSSynthesizer* rs = (RSSynthesizer*)synth;
340 for (c=0; c < 16; ++c) {
341 synth_reset_channel(&(rs->sc[c]));
346 static void synth_load(RSSynthChannel *sc, const double rate,
347 SynthFunction synthesize,
348 ADSRcfg const * const adsr) {
349 synth_reset_channel(sc);
350 init_adsr(&sc->adsr, rate,
351 adsr->tme[0], adsr->tme[1], adsr->tme[2],
352 adsr->vol[0], adsr->vol[1]);
353 sc->synthesize = synthesize;
358 * internal abstraction of MIDI data handling
360 static void synth_process_midi_event(void *synth, struct rmidi_event_t *ev) {
361 RSSynthesizer* rs = (RSSynthesizer*)synth;
364 rs->sc[ev->channel].midimsgs[ev->d.tone.note] |= 1;
365 if (rs->sc[ev->channel].miditable[ev->d.tone.note] <= 0)
366 rs->sc[ev->channel].miditable[ev->d.tone.note] = ev->d.tone.velocity;
369 rs->sc[ev->channel].midimsgs[ev->d.tone.note] |= 2;
370 if (rs->sc[ev->channel].miditable[ev->d.tone.note] > 0)
371 rs->sc[ev->channel].miditable[ev->d.tone.note] *= -1.0;
376 if (ev->d.control.param == 0x00 || ev->d.control.param == 0x20) {
377 /* 0x00 and 0x20 are used for BANK select */
378 } else if (ev->d.control.param == 64) {
380 rs->sc[ev->channel].sustain = ev->d.control.value < 64 ? 0: 1;
381 } else if (ev->d.control.param == 121) {
382 /* reset all controllers */
383 } else if (ev->d.control.param == 120 || ev->d.control.param == 123) {
384 /* Midi panic: 120: all sound off, 123: all notes off*/
385 synth_reset_channel(&(rs->sc[ev->channel]));
386 } else if (ev->d.control.param >= 120) {
387 /* params 122-127 are reserved - skip them. */
395 /******************************************************************************
396 * PUBLIC API (used by lv2.c)
400 * align LV2 and internal synth buffers
401 * call synth_fragment as often as needed for the given LV2 buffer size
403 * @param synth synth-handle
404 * @param written samples written so far (offset in \ref out)
405 * @param nframes total samples to synthesize and write to the \out buffer
406 * @param out pointer to stereo output buffers
407 * @return end of buffer (written + nframes)
409 static uint32_t synth_sound (void *synth, uint32_t written, const uint32_t nframes, float **out) {
410 RSSynthesizer* rs = (RSSynthesizer*)synth;
412 while (written < nframes) {
413 uint32_t nremain = nframes - written;
415 if (rs->boffset >= BUFFER_SIZE_SAMPLES) {
416 const uint32_t tosynth = MIN(BUFFER_SIZE_SAMPLES, nremain);
417 rs->boffset = BUFFER_SIZE_SAMPLES - tosynth;
418 synth_fragment(rs, tosynth, &(rs->buf[0][rs->boffset]), &(rs->buf[1][rs->boffset]));
421 uint32_t nread = MIN(nremain, (BUFFER_SIZE_SAMPLES - rs->boffset));
423 memcpy(&out[0][written], &rs->buf[0][rs->boffset], nread*sizeof(float));
424 memcpy(&out[1][written], &rs->buf[1][rs->boffset], nread*sizeof(float));
427 rs->boffset += nread;
433 * parse raw midi-data.
435 * @param synth synth-handle
436 * @param data 8bit midi message
437 * @param size number of bytes in the midi-message
439 static void synth_parse_midi(void *synth, const uint8_t *data, const size_t size) {
440 if (size < 2 || size > 3) return;
441 // All messages need to be 3 bytes; except program-changes: 2bytes.
442 if (size == 2 && (data[0] & 0xf0) != 0xC0) return;
444 struct rmidi_event_t ev;
446 ev.channel = data[0]&0x0f;
447 switch (data[0] & 0xf0) {
450 ev.d.tone.note=data[1]&0x7f;
451 ev.d.tone.velocity=data[2]&0x7f;
455 ev.d.tone.note=data[1]&0x7f;
456 ev.d.tone.velocity=data[2]&0x7f;
457 if (ev.d.tone.velocity == 0) {
462 ev.type=CONTROL_CHANGE;
463 ev.d.control.param=data[1]&0x7f;
464 ev.d.control.value=data[2]&0x7f;
467 ev.type=PROGRAM_CHANGE;
468 ev.d.control.value=data[1]&0x7f;
473 synth_process_midi_event(synth, &ev);
476 static const uint8_t jingle[] = { 71 ,71 ,71 ,71 ,71 ,71 ,71 ,74 ,67 ,69 ,71 ,72 ,72 ,72 ,72 ,72 ,71 ,71 ,71 ,71 ,71 ,69 ,69 ,71 ,69 ,74 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,74 ,67 ,69 ,71 ,72 ,72 ,72 ,72 ,72 ,71 ,71 ,71 ,71 ,74 ,74 ,72 ,69 ,67 ,62 ,62 ,71 ,69 ,67 ,62 ,62 ,62 ,62 ,71 ,69 ,67 ,64 ,64 ,64 ,72 ,71 ,69 ,66 ,74 ,76 ,74 ,72 ,69 ,71 ,62 ,62 ,71 ,69 ,67 ,62 ,62 ,62 ,62 ,71 ,69 ,67 ,64 ,64 ,64 ,72 ,71 ,69 ,74 ,74 ,74 ,74 ,76 ,74 ,72 ,69 ,67 ,74 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,74 ,67 ,69 ,71 ,72 ,72 ,72 ,72 ,72 ,71 ,71 ,71 ,71 ,71 ,69 ,69 ,71 ,69 ,74 ,71 ,71 ,71 ,71 ,71 ,71 ,71 ,74 ,67 ,69 ,71 ,72 ,72 ,72 ,72 ,72 ,71 ,71 ,71 ,71 ,74 ,74 ,72 ,69 ,67 };
478 static void synth_parse_xmas(void *synth, const uint8_t *data, const size_t size) {
479 RSSynthesizer* rs = (RSSynthesizer*)synth;
480 if (size < 2 || size > 3) return;
481 // All messages need to be 3 bytes; except program-changes: 2bytes.
482 if (size == 2 && (data[0] & 0xf0) != 0xC0) return;
484 struct rmidi_event_t ev;
486 ev.channel = data[0]&0x0f;
487 switch (data[0] & 0xf0) {
490 ev.d.tone.note=jingle[rs->xmas_off++];
491 ev.d.tone.velocity=data[2]&0x7f;
492 if (rs->xmas_off >= sizeof(jingle)) rs->xmas_off = 0;
496 ev.d.tone.note=jingle[rs->xmas_on++];
497 ev.d.tone.velocity=data[2]&0x7f;
498 if (rs->xmas_on >= sizeof(jingle)) rs->xmas_on = 0;
501 ev.type=CONTROL_CHANGE;
502 ev.d.control.param=data[1]&0x7f;
503 ev.d.control.value=data[2]&0x7f;
506 ev.type=PROGRAM_CHANGE;
507 ev.d.control.value=data[1]&0x7f;
512 synth_process_midi_event(synth, &ev);
515 * initialize the synth
516 * This should be called after synth_alloc()
517 * as soon as the sample-rate is known
519 * @param synth synth-handle
520 * @param rate sample-rate
522 static void synth_init(void *synth, double rate) {
523 RSSynthesizer* rs = (RSSynthesizer*)synth;
525 rs->boffset = BUFFER_SIZE_SAMPLES;
526 const float tuning = 440;
528 for (k=0; k < 128; k++) {
529 rs->freqs[k] = (tuning / 32.0f) * powf(2, (k - 9.0) / 12.0) / rate;
530 assert(rs->freqs[k] < M_PI/2); // otherwise spatialization may phase out..
532 rs->kcfilt = 12.0 / rate;
535 for (c=0; c < 16; c++) {
536 synth_load(&rs->sc[c], rate, &synthesize_sineP, &piano_adsr);
543 * Allocate data-structure, create a handle for all other synth_* functions.
545 * This data should be freeded with \ref synth_free when the synth is no
548 * The synth can only be used after calling \rev synth_init as well.
550 * @return synth-handle
552 static void * synth_alloc(void) {
553 return calloc(1, sizeof(RSSynthesizer));
557 * release synth data structure
558 * @param synth synth-handle
560 static void synth_free(void *synth) {
563 /* vi:set ts=8 sts=2 sw=2 et: */