maybe I’d call them ‘Deutsch tones’… after Diana Deutsch who used these pitched/static versions in some psychoacoustic experiments.
Anyway you can do this with additive synthesis, maybe with Max or by writing an external?
For each pitch class (chroma) you have a sum of sine tones, one per octave. For height, you vary the amplitudes of the sine tones according to a Gaussian shape. (A raised cosine is used by Shepard, but the Gaussian is more flexible and works just as well.) The mean and spread (Gaussian standard deviation) are up to you. The perceived ‘height’ is essentially this mean. Obviously, you don’t want the variance to be too small, as then you’d get just a sine wave and not have the ambiguity, but neither do you want it large because then it’s a rich and buzzy spectrum, like a vacuum cleaner, and you can’t fit any other sounds in. Generally the most usable versions sound ‘glassy’. Also, you’re using a finite number of tones, so the amplitude of the lowest and highest frequency partials should be very close to zero, they should be totally masked and inaudible.
There’s also a tradeoff between absolute accuracy and timbral control. You may try instead of sine waves, triangle waves or some other wave. It can break up the ‘glassy’ tone somewhat and make it sound warmer, because using only octaves for partials has a very distinctive and sometimes annoying character, you might easily tire of it. The triangle or other versions has a different spectrum, with partials in non-octave relationships, but may sound more pleasing or just be good for variety. If you’re just after a rough perceptual effect in a piece, and not actually conducting a psychoacoustic experiment you can get away with a lot here. I remember some Prophet VS patches, not at all rigorously constructed, where the exact octave was confusing at least within a 2-3 octave range.