Thanks for the article link! Nice to see some confirmation and clarification. I am also interested in ideas for a good power curve for panning. For now, I'm just using two linears, in reverse directions, one for each channel, with the plan to work on a better version if/when I get into true 3D or another situation that demands power balancing throughout the panning range.
I went through a process of trial an error for the carrier and modulator power curves, testing by ear. The "VolumeMap" object I created can have its LUT (similar in implementation to what I posted on the 'fastest sin' thread) populated by any number of methods. This made it pretty easy to swap the various maps in and out for comparison purposes. The ones that I implemented and compared follow:
- reverse cos : 1 - cos(x) where x [0..PI/2]
All of the rest, x goes from 0 to 1:
- 2^x - 1
- (10^x - 1) / 9
- (20^x -1) / 19
and a few miscellaneous experiments that didn't work out at all.
I compared the results, by ear, with numbers plugged into the Yamaha DX7 or Native Instruments FM7. I don't consider my choices "final" answers.
I recall x^4 (the article's "overall best") was pretty good, but I guess I am working with a larger dynamic range, hence using the higher exponent values. I remember being indecisive between x^5 and x^6 early on. Lately, I just start with the two I mentioned and try others only if I am have an audible goal in mind. For example some patches, x^7 seems to work better than x^6. The times x^7 works best are patches where the envelope levels are transitioned via "EXP" curves rather than linearly in the "parent" synth.
Thanks to this discussion, I just found another option to try: mapping derived from a Bessel function. Check out the following link, "Appendix B: Bessel Functions" from Dave Benson's book on music related mathematics.http://homepages.abdn.ac.uk/mth192/pages/html/music.pdf#appendix.B
At the very end of this appendix section is a table, with the caption:
The following table shows how index of modulation (z) varies as a func-
tion of operator output level (an integer in the range 0–99) on the Yamaha
six operator synthesizers DX7, DX7IID, DX7IIFD, DX7S, DX5, DX1, TX7,
TX816, TX216, TX802 and TF1
I don't know much at all about Bessel functions, or even if this table arises from Bessel functions other than that it is in the "Bessel" appendix. In this table, I take it that 1.0 is one complete modulation cycle. To be more concrete: I have a sin LUT of 1024. An offset of 360 degrees would be once through the sine table, so a modulation index or amplitude of 1024 in my OpPML should correspond to the DX7S modulation index value of between 69 and 70. This rings true for the patches I've recreated. I'm going to have to confirm. I'm also going to have to experiment with using this table (with linear interpolation) for the modulation values that arise by applying the envelope to the modulation index.
Envelopes should be pretty much the same as they are for subtractive synthesis or wave-table synthesis. Yes? No? I'm assuming you are using outputs that range from 0 to 1 and are multiplied in (but with a power curver). I assumed you have already implemented that sort of thing. I recall a JGO post with you and "AngryOctopus" (ShannonSmith), exchanging links to software synthesizers you had each made.
I think I have a pretty nifty envelope working (updates every frame), but am curious how you do it, and possible improvements.