Experiences with Vowel class?

Hi everyone,
I’m curious if any of you has ever used the Vowel class in Supercollider, and if so what have you used it for. Personally, I’m thinking about trying to blend between vowels using an accelerometer, but I feel like at this stage it’s better to see what other people have made out of that class to get a general vibe for it.
In the Vowel helpfile, a lot of amazing examples are conducted using Ndef - this led me to find out about a whole new universe that I don’t have time right now to explore (but absolutely will the next month), so I’m mostly curious to see Vowel used in any other context (SynthDefs for starters).

Spill the tea :smiley: love u all

I believe Vowel is designed to be used in conjunction with Formants, so you don’t have to look up a formant filter chart for different vowels/voice types/etc. I find it to be a bit inflexible and not particularly useful in its approach for what I might use it for in a Ugen graph function, but others may disagree.

Thanks for the comment, do you have any preferred alternative to it?

If an Ndef is making audio from a function, then it’s using a SynthDef based on that function. So you shouldn’t think of Ndefs and SynthDefs as completely radically different. The “glue” connecting the synthesis to the rest of the system is different between the two, but the core is largely the same.

hjh

1 Like

I think the confusion might be coming from the examples in the documentation, which tend to use Ndef.

(
Ndef(\vowel).fadeTime = 5;
Ndef(\vowel, {
    var freqs, dBs, widths, out;
    var baseFreq = LFNoise0.kr([5, 10] * 0.1).round(0.1).exprange(50, 200) * [2, 1.01];
    #freqs, dBs, widths =  (Vowel(\i, \soprano).blend(Vowel(\o, \bass), LFNoise1.kr(0.1265))).blend(Vowel(\e, \bass), LFNoise1.kr(10)).asArray;
    
    //freqs = freqs * SinOsc.ar([0.1, 0.2, 0.3, 0.4].scramble, Rand(), 0.1, 1);
    freqs = freqs * LFNoise1.ar([0.1, 0.2, 0.3, 0.4].scramble, 0.1, 1);
    
    out = [freqs, widths, dBs.dbamp].flop.collect{ |args| 
        Formant.ar(baseFreq, *args); 
    }.flop;

    out = out.collect{|vocal|
        Splay.ar(vocal)
    }.sum.postln;

    out
        * LFPulse.ar([9, 9.01], 0, 0.4).range(0, 1).lag(0.01, 0.5) 
        * LFPulse.ar(0.1, [0, 0.35], [0.9, 0.8]).lag(0.01)

 * 0.1

}).play
)

As a SynthDef (probably a more useful way to do this, but it works):

(
SynthDef(\vowel, {
    var freqs, dBs, widths, out;
    var baseFreq = LFNoise0.kr([5, 10] * 0.1).round(0.1).exprange(50, 200) * [2, 1.01];
    #freqs, dBs, widths =  (Vowel(\i, \soprano).blend(Vowel(\o, \bass), LFNoise1.kr(0.1265))).blend(Vowel(\e, \bass), LFNoise1.kr(10)).asArray;
    
    //freqs = freqs * SinOsc.ar([0.1, 0.2, 0.3, 0.4].scramble, Rand(), 0.1, 1);
    freqs = freqs * LFNoise1.ar([0.1, 0.2, 0.3, 0.4].scramble, 0.1, 1);
    
    out = [freqs, widths, dBs.dbamp].flop.collect{ |args| 
        Formant.ar(baseFreq, *args); 
    }.flop;

    out = out.collect{|vocal|
        Splay.ar(vocal)
    }.sum;

	Out.ar(out, out * LFPulse.ar([9, 9.01], 0, 0.4).range(0, 1).lag(0.01, 0.5) * LFPulse.ar(0.1, [0, 0.35], [0.9, 0.8]).lag(0.01) * 0.1);

}).add;
)

Synth(\vowel);

And you shouldn’t shy away from using the class either. It’s great if you’re after a convenient way to recreate more natural vowel sounds without spending time doing a bunch of research. My complaint is that it can start to get heavy rather quickly as I might try to build more flexible synths from it, but it’s definitely still useful. I’d just rather spend the CPU elsewhere most of the time.

1 Like

gotcha, thanks for the feedback. this helped me clarify pros and cons of Vowel. I ended up putting this attempt a bit on the side, but not forever. I agree that if I’d want to approach vowel sound again I’d start from here, but we’ll see :wink: