Scroll To Top

Welcome to Yofiel: Named for the archangel of beauty, Yofiel provides knowledge and tools for you to be beautiful yourself.

SynthCore Audio DSP Library v2.1 (Max7+)
SynthCore Audio DSP Library v2.1 (Max7+)

SynthCore Audio DSP Library v2.1 (Max7+)


With over 1500 downloads in the first six months, this is the most popular item on this site. The library bundle includes: the Synthcore2 library, with over a hundred functions written in Cycling74 gen~ codebox for audio; two complete synths built with the library that implement the audio path entirely in gen~; a demo patch illustrating usage of the main library functions; data files; and a suite of demo patches with graphical designs of the same gen~ and MAX patches.

Yofiel's gen~ libraries have been integrated into:

  • Ableton Live, in its spectral wave display for its new synth in Ableton Live 10.
  • Cycling'74, which now uses Yofiel's EPTR model for its anti-aliased pulse and saw oscillators.
  • Max for Cats, in a custom waveset oscillator.
  • Encode Audio, which uses a number of Synthcore's oscillator and filter functions.
  • Compositor Software, which uses the 5-D SVF filter in its spectral decoders.

Free Demos

All the compiled SynthCore versions are now available as a single free checkout item atSynthCore2 (Windows 10 and Macos X).

The Library

>6 months in the making and the first of its kind, Synthcore library v2.0 is designed for performance, ease of use, and flexibility. Multiple demos illustrate how to include and implement the functions.

MATHSqcos(), qsin(), db2a().
PANS & SMOOTHERSpan1(), pan2(), smoother(), smoother2(), smoother3(), rampgate(), ramptrig(), line().
SATURATORSparabol1(), parabol2(), paraboln(), hyperbol().
1‑POLE FILTERSstatic(), staticlo(), statichi(), shelflo(), shelfhi().
BIQUADSbiquad(), biquad0(), biquadlow(), biquadlo2(), biguadlo3(), biquadband(), biquadband2(), biquadband3(), biquadhi(), biquadhi2(), biquadhi3(), biquadnotch(), biquadval(), biquadamp(), biquadplot(), biquadplot2().
RAMP OSCSramp(), ramptrg(), rampgate(), rampphase(), rampsoft(), rampsofter(), rampramp(), rampramper().
OSCSsine(), pulse1(), pulse2(), eptr(), eptrpulse(), eptrpulse3x(), sawdown(), sawup(), tri(), tri2(), sawtri(), karplus(), karplusd(), karplusenv(), karplusm(), waveset(), noiselpf(), noisebpf(), noisehpf(), oisenotch(), pinknoise(), noiseosc(), osc().
SVFsupsample(), downsample() svf(), svfCoeffs3x(), gainComp(), svfMixer(), filt3x(), filt().
LFOslfo(), lfopoly().
ENVsadsr(), adsrloop(), padsrloop(), adbdsrloop(), padbdsrloop().
EFFECTSglide(), ping1(), ping2(), chorus1(), chorus2(), diffdelay(), earlyreflections(), tank(), reverb().
DECLARATIONSBuffers and constants.

The benefit of codebox implementations is that the functions can be disabled when not in use via conditional clauses like this:

Hide LIne Numbers
  1. Param oscillator_select, pitch(60);
  2.    if (oscillator_select == 1){
  3.       sawdown(pitch);
  4.    } else {
  5.      sawup(pitch);
  6.    }

All the library functions have descriptions of values passed in and out, with descriptions of ranges.

Additional Demo Patches

Additional patches included in this download illustrate the main functions with graphical objects instead of code, and include patches for transforming Synthcore into a fully polyphonic instrument. Thre patches are fully documented on this site. for more information, please see:

The EPTR-antialiased square and saw oscillator implementations are now part of Max7's core objects. The library includes codebox implementations, and the quality is illustrated here.

EPTR-antialiased square wave. The gen~ codebox implementation is included.
EPTR-antialiased square wave. The gen~ codebox implementation is included.

Synthcore 2 Patch and Source Code

Synthcore 2 is one of the most powerful analog emulation synthesizers ever made, based on features from the OSCAR and Waldorf Q (both of which, as you may know, were discontinued because they were too expensive to build in hardware). The monophonic version is now available for free download in Windows 32/64, Mac OS X, and open-source Cycling'74 Max 7 code.

SynthCore 2.0 Main Panel
SynthCore 2.0 Main Panel

Main Features and Architecture

  • 3 oscillators, with feedback, FM, four kinds of sync, phase control, ring modulation, and dual output mixing; 61 morphing waveforms, including: pulse, saw, and triangle oscillators with newest EPTR anti-aliasing technology; Karplus physical modeling; multiple filtered noise options; 48 cross-sampled waveset oscillators; and sub oscillator.
  • 2 comb filters, both with pitch tracking.
  • 2 5-d serial/parallel, 2/4-pole, 3x-oversampled SVF filters, with continuous control of: filter type; number of filter poles; drive + saturation: cutoff; resonance; serial/parallel output; and output pan.
  • 3 envelopes. Predelay and 7-stage breakpoint included. Multi, single, loop, and clock triggers.
  • 3 LFOs, all with morphing waveforms, gate sync, and freq. control.
  • Modulation matrix with 15 nodes, each scalable from any of 60 sources to 135 destinations. Sample and hold, gated, and MIDI sources available. Many compound sources and destinations for rapid patching. Fixed- and variable-source modulations may shape and scale each other within the matrix.
  • Multi-mode glide and glissando, with unique glissando pattern generator.
  • Stereo effects chain with 2 tempo delays, 8-band chorus, realistic reverb, and advanced limiting.
  • Toggle-mode monophonic keyboard. Notes may optionally be stored in programs.
  • Flexible multi-channel architecture functions like a modular synth without needing rewiring. Monitor outputs at all mix points. LFOs, envelopes, and other modulation sources may modulate effects parameters.
Synthcore 2 Architecture
Synthcore 2 Architecture
Synthcore Architecture(click for lightbox, click anywhere to close lightbox)
  • MIDI I/O for all controls across two MIDI channels. Wheel, extended-range bend, and pedal controllers. Pgm#s and notes sent/received. 'All notes off' and standard MIDI cc#s implemented on main MIDI channel.
  • Fully instrumented panel with >200 controls and dynamic state display of oscillators, filters, envelopes, LFOs, and effects (in full versions). Lite version without dynamic state display for those with lower-powered computers.
  • Hover tips and help tabs. >3,000 words of context-sensitive interactive documentation.
  • 64-bit floating point audio processing at sample rate throughout, including envelopes and LFOs. All mix functions, pans, and switches are declicked and debounced.
  • Large, open, portable compiled function library available separately (seeSynthcore Library). Patches documented copiously, code documented expediently.


Unused functions in a preset are bypassed in code, to reduce CPU load, and all can be turned on and off without introducing clicks on the output. Typical load of the full version at 48kHz, on a Win64 4-GHz i7 and 2.5-GHz Mac Mini, is ~5.5% and ~25%, respectively. Those seeking more quality will find performance at 96kHz to be very decent.

Synthcore Lite

Some MacOS users report performance issues with the full version, and as it is also intended as a demonstration of the Synthcore source-code library, So I am also providingSynthcore Lite for MacOS. This version has the same audio quality, with 64-bit audio processing throughout, and complete declicking of all audio gain paths (a professional feature which is ~15% of the total audio processing load). However even so, on my old Mac Mini, by removing the dynamic graphics entirely, the app's CPU usage drops to

Synthcore 2.1

Released on the first-year anniversary of Synthcore 2.0, the 2.1 upgrade includes theBEAP 5D Filter available for free on this site, shelving filters, parametric EQ filters, and more biquad filters. There are several FIR/IIR versions that are not biquad based. The Synthcore 2.1 library versions are redesigned so that coefficients can be stored statically within the filter calls, and are only recalculated if the filter controls change. As a side benefit of static coefficient calculation at Parameter value changes, the benefit of passing in constants is minimal, so the signatures are greatly simplified. However, if for example there are two channels with the same filter settings, this means the coefficients would be calculated twice necessarily, once for each channel. Multichannel versions are therefore included for more performance optimization.

Synthcore 2.1 also includes a gen~ implementation of Reverb66, originally in the instrument 'steampipe', designed for Reaktor by Martijn Zwartjesmatz in 2001. Native Instruments was very proud of this design, and duplicated it, only replacing the filters with parametric EQ, in its 'Reverb Master Pro II' product. NI's 'pro' version duplicates an error in the original freeware design which caused the frequency modulation not to work as it should. This version fixes the problem, although it doesn't do much to improve the reverb, there are very few reverbs like this around, and it does have its uses.

There are a dozen additional functions used internally.

Hide LIne Numbers
  1. //*************** SYNTHCORE 2.1 FOR GEN 7.3.4 ********************* //
  2. // UTILITY FUNCTION SIGNATURES *********************************** //
  3. out = qsin(in);    // quick transcendental calcs
  4. out = qcos(in);
  5. out = qtan(in);
  6. gain= db2a(db);    // quick level conversion
  7. db  = a2dB(gain);    
  8. out = smoothermsecs(in);// predelay smoother, 0~0.24
  9. out = smoother1(val){     // smoothing over ~46 clock cycles
  10. out = smoother2(val);     // smoothing over ~400 clock cycles
  11. out = smoother3(val);    // slowest smoothing for long delay line times
  12. out = pan3db(x);        // pan with -3dB center
  13. out = powerfade(in1L, i2L, in1R, in2R, x); // ganged fader with exp crossfade
  14. out = stereomix(in1L, in2L, in1R, in2R, x);// stereo ganged mix
  15. out = ramp(inc);        // quickest ramp generator, 0 to 1 over inc cycles
  16. out = ramptrig(msecs, trg);// triggered 1-shot ramp, time in msecs
  17. // OSCILLATOR FUNCTION SIGNATURES******************************** //
  18. out = parasine(inc);    // a sine osc approximation. with much lower cpu
  19. out = triwave(ramp, width);    // variable tri/saw with simple AA
  20. out = karplus(impulse, P, dampen);     // Karplus oscillator
  21. out = karplusd(impulse, P, diffuse);     // diffused Karplus
  22. out = karplusm(impulse, fc, mod);     // mod Karplus
  23. out = noiseosc(type, p, fc, q);        //lp/bp/hp/notch white/pink noise
  24. out = waveset(sel, width, ramp, wavesets); // waveset oscillator, crosswave interp.
  25. out = eptr3x(ramp, inc, width, eptr); // 3x-oversampled AA Pulse, table-based calcs
  26. out = eptrx(ramp, inc, width, eptr);    //antialiasing slope for pulse osc
  27. out = lfo(sel, Fc, wid, snc_en, trg);     // basic LFO
  28. out = lfopoly(sel, Fc, sprd, sprdlvl, sprdtype, wid, sncen, trg); // LFO, voice spread
  29. // ENVELOPES FUNCTION SIGNATURES ********************************** //
  30. out = adsr(gate,predelay,att,dec,sus,susn,rel); basic ADSR
  31. out = adsrloop(trg,gate,predelay,att,dec,sus,susn,rel,mode);// ADSR with loop mode
  32. out = padsrloop(trg,gate,pre1, pre2,att,dec,sus,rel,mode); // PADSR, loop & predelay
  33. out = adbdsrloop(trg,gate,predelay,att,dec1,brk,dec2,sus,rel,mode); // ADBDSR, loop
  34. out = padbdsrloop)trg,gate,pre1,pre2,att,dec1,brk,dec2,sus,rel,mode); // PADBDSR. predelay & loop
  35. // FILTER FUNCTIONS  ----------------------------------------------------
  36. out = lo1pole1 (in, P);                // 6db lowpass filter 
  37. out = hi1pole1(in, P);                    // 6db highpass filter 
  38. out1, out2 = lo1pole2 (in1, in2, P);        // stereo 6db lowpass filter 
  39. out1, out2 = hi1pole2(in1, in2, P);        // stereo 6db highpass filter 
  40. out =  loshelf(in, P, dB);                // 12dB/oct lo shelf, +/-12dB range
  41. out =  hishelf(in, P, dB);                // 12dB/oct hi shelf, +/-12dB range
  42. out =  loshelf2(in, P, dB);                // 24dB/oct lo shelf, +/-12dB range
  43. out =  hishelf2(in, P, dB);            // 24dB/oct hi shelf, +/-12dB range
  44. out1, out2 =  hishelfStereo(in1, in2, P, dB); // stereo hishelf
  45. out1, out2 =  loshelfStereo(in1, in2, P dB); //stereo lowshelf
  46. out = biquad0    (in, a0, a1, a2, b1, b2);     // biquad direct form 1
  47. out = biquad     (in, a0, a1, a2, b1, b2);    // biquad optimized form 2
  48. out = biquadresonant(in, P, Q);            //resonant
  49. out = biquadgainresonant(in, P, Q, gain);    //gain resonant
  50. out = biquadlo   (in, Fc, Q);              // biquad lowpass, simple
  51. out = biquadlp1  (in, Fc, Q);             // tuned  lowpass 
  52. out = biquadlo2  (in, P,  Q);            // biquad lowpass, MIDI pitch Fc,
  53. out = biquadlo3  (in, P,  Q);            // biquad lowpass, qain-limiting
  54. out = biquadband (in, Fc, Q);            // biquad bandpass, simple
  55. out = biquadbp1  (in, Fc, Q);             // tuned  bandpass 
  56. out = biquadband2(in, P,  Q);            // biquad bandpass, MIDI pitch Fc,
  57. out = biquadband3(in, P, Q);            // biquad bandpass, gain limiting
  58. out = biquadband4(in, P,  Q);            // biquad bandpass, unity gain
  59. out = biquadbandgain(in, Fc, Q, gain);    // biquad bandpass gain
  60. out = biquadhi   (in, Fc, Q);            // biquad highpass, simple
  61. out = biquadhp1  (in, Fc, Q);             // tuned  highpass 
  62. out = biquadhi2  (in, P,  Q);            // biquad highpass, MIDI pitch Fc,
  63. out = biquadhi3  (in, P,  Q);            // biquad highpass, gain limiting
  64. out = biquadhigain(P, Q, gain);            // biquad gain hipass
  65. out = biquadnotch(in, Fc, Q);            // biquad notch, somple 
  66. out = biquadgainbandstop(in, P, Q, gain);    //gain gandstop
  67. out = biquadbandstop(in, P, Q);            // biquad bandstop
  68. out = biquadpeaknotch(in, Fc, Q, gain);    // biquad peak/notch 
  69. out = biquadallpass(in, P, Q);            // biquad allpass
  70. out = biquadgainallpass(in, P, Q, gain);    // gain allpass
  71. val = biquadamp  (w,  a0, a1, a2, b1, b2);    // biquad gain @ specfic fc
  72. out = filt5d(in, P, Q, type, poles, drive);    // 3x-oversampled 5d filter
  73. out1, out2, out3 =  upsample(in);        // 3x upsampling with sinc coefficients
  74. out = downsample(out1, out2, out3);        // 3x downsampling with sinc coefficients
  75. out = comb(input, delay, feedback, lvl); // feedforward comb filter
  76. // EFFECTS FUNCTION SIGNATURES ************************************* //
  77. out1, out2 = ping0(L, R, delayL, delayR, cross, feedback); // simple stereo delay
  78. out1, out2 = ping1(L, R, delayL, delayR, cross, feedback, 
  79.         locut, hicut); // stereo delay, 1pole filter
  80. out1, out2 = ping3(L, R, delayL, delayR, cross, feedback,
  81.           loP, loG, midP, midG, midQ, hiP, hiG); //  stereo delay with 3band EQ
  82. out1, out2 = chorus(in1, in2, del, deep, sprd, mix); // dual quad-band chorus
  83. out = diffdelay(in, delay, diff);            //  basic diffusion delay
  84. out = diffdelSmall(in, depth, time);     // small diffusion delay
  85. out = diffdelBig(in, depth, time);      // large diffusion delay
  86. out = earlydelF(in, Dffs, size, ha1, hb0, hb1, la1, lb0, lb1); // biquad diff delay
  87. out = tankLeft(in, damp, decay);          // left late reflections
  88. out = tankRight(in, damp, decay);      // right late reflections
  89. out1, out2 = reverb(in1, in2, pre, cut, damp, decay, lvl);//acoustic reverb
  90. out1, out2 = rev66(in1, in2, pre, cut, latemix, size, time, inc, 
  91.           spin, rndm, hishelf, loshelf); // production-quality reverb
  92. out1, out2 = limit(in1, in2, lvl, window, attlo, atthi, rello, relhi); // stereo limiter
  93. // ***************************************************************** //

This illustration shows how easy it is to change filters in your design. Because it is implemented in codebox with a SELECTOR, only the selected filter consumes CPU.

filter library demo
filter library demo

Thank you for your interest in Yofiel. We hope you enjoy Synthcore 2.