This is one of my passions!
I put a lot of time into the DX-9, DX-7, and then DX-7S, in the day, and still have the latter two synths. I’ve had a patch published as a patch of the month in the Yamaha magazine for DX, and sold music cues written with my original voices.
Yes, FM programming it is non-intuitive, AT FIRST. But it gets better if you understand the physics of it, and know a thing or two about musical acoustics. Not many do this, but it combines well with formant filtering (as opposed to low-pass), for creating very naturalistic and ear-friendly sounds.
I have been dabbling with procedural FM synthesis, and among other things, made this controller which is producing 6-operator FM bells, live.
http://hexara.com/SpiderBellDashboard.htm
(The graphics use up more cpu than the sound!)
I am rewriting, making a basic mechanism for polyphonic play that does not require managing separate threads for every note, and creating hooks to allow MIDI triggering.
The goal is to have a selection of nice FM patches (from my library of work done on the DX-7) playable via a Java Sequencer in a game. The patches would match what I can score with on my DAW via a VST. It would then be possible to compose on the DAW, then export the MIDI file to Java and have the Java-FM synth play the file during the game.
The single biggest hitch: I’m having troubles when I chain 3 operators. The “SpiderBell” is three sets of carrier-modulator pairs. When I try to implement modulator-modulator-carrier, all sorts of problems start to occur. Very likely due to accumulating calculation errors? I am looking forward to creating a “simple case” example of the problem and presenting it on this forum, eventually. Would love to have a collaborator, though, to work on this.