New FM synth added to the Mercury Playground @mercury, coded with a single AudioWorkletProcessor inside a ToneAudioNode from ToneJS

https://mercury-playground.cc/#Ly8gPT09IFRVVE9SSUFMIDI0MzogRk0gSW5zdHJ1bWVudHMgPT09Ci8vIEZNIGNhbiBiZSB1c2VkIHRvIHNpbXVsYXRlIG1hbnkgZGlmZmVyZW50IGluc3RydW1lbnQgc291bmRzLiBBIHZlcnkgZmFtb3VzIAovLyBGTSBzeW50aGVzaXplciB3YXMgdGhlIFlhbWFoYSBEWDcsIHdoaWNoIGNvbnRhaW5lZCBhIGJ1bmNoIG9mICJhbGdvcml0aG1zIiAKLy8gKGRpZmZlcmVudCBjb25maWd1cmF0aW9ucyBvZiBjYXJyaWVyL21vZHVsYXRvcikgYW5kIGRpZmZlcmVudCByYXRpb3MsIAovLyBpbmRleGVzIGFuZCBmbS1zaGFwZXMuIEJlbG93IGFyZSBzdWdnZXN0aW9ucyBmb3IgYSBiYXNzLCB4eWxvcGhvbmUgYW5kIHBsdWNrIAovLyBzb3VuZCBjb21iaW5lZCBpbnRvIGEgc2hvcnQgY29tcG9zaXRpb24uCgpzZXQgdGVtcG8gOTAKc2V0IHNjYWxlIG1pbm9yIGViCgpuZXcgc3ludGggZm0gbm90ZSgwIC0xKSBuYW1lKGJhc3MpIHNoYXBlKDEgMS80KQogICAgc2V0IGJhc3MgdGltZSgxLzQpIHBsYXkoMC43KSAKICAgIHNldCBiYXNzIGluZGV4KDUpIHJhdGlvKDIpIGZtU2hhcGUoNSA0MDApCiAgICAKbmV3IHN5bnRoIGZtIG5vdGUoc3ByZWFkKDcpIFsxIDJdKSBuYW1lKHh5bG8pIHNoYXBlKDEgMS8yKQogICAgc2V0IHh5bG8gdGltZSgxLzgpIHBsYXkoMC41KSByYXRpbyg3OC4zKSBmbVNoYXBlKDEgNDAwKSAKICAgIHNldCB4eWxvIGZ4KHJldmVyYiAwLjUgMTcpCiAgICAKbmV3IHN5bnRoIGZtIG5hbWUocGx1Y2spIG5vdGUoZHJ1bmsoOCAzKSAzKQogICAgc2V0IHBsdWNrIHRpbWUoMS80IDEvOCkgZngoZGVsYXkpCiAgICBzZXQgcGx1Y2sgcmF0aW8oMykgaW5kZXgoNCkgZm1TaGFwZSgwIDMwKSBzaGFwZSgxIDEvOCkKICAgIApzZXQgYWxsIHNjb3BlKCk%3D

It's a basic FM with a single modulator-(envelope)->carrier setup, and can be extended with extra voices and detuning to run 2-3 or more operators.

Syntax: `new synth fm index() ratio() fmShape()`

Some tutorials available on the website

#mercurylivecoding #fmsynthesis #webaudio #audioworkletprocessor #javascript #mercury #browserbased