{
   "ancestor_list" : [],
   "description" : "cleaned-up code for \"Figure 6\" of the paper \"A SUPERCOLLIDER CLASS FOR VOWEL SYNTHESIS\r\nAND ITS USE FOR SONIFICATION\" (doi: https://pub.uni-bielefeld.de/record/2277122 )",
   "name" : "Vowel synthesis even/odd Harmonics with DynKlang",
   "author" : "LFSaw",
   "is_private" : null,
   "id" : "1-5i5",
   "code" : "(\r\n{ // even odd harmonics\r\n\tvar baseFreq = 100;\r\n\tvar numFreqs = 69;\r\n\tvar vowel = Vowel(\\a, \\bass);\r\n\tvar startFilterOrder = 4.0;\r\n\tvar stopFilterOrders = [0.8, 0.65, 0.5, 0.35, 0.1];\r\n\tvar freqs, evenFreqs, oddFreqs, amps, evenAmps, oddAmps, orders;\r\n\tvar dur = 12;\r\n\tvar evenAmpMod = SinOsc.kr(freq: 1).exprange(0.04, 1).sqrt;\r\n\tvar oddAmpMod = SinOsc.kr(freq: 1, phase: pi).exprange(0.04, 1).sqrt;\r\n\tvar ampEnv = Env.linen(attackTime: 0.01, sustainTime: dur, releaseTime: 0.2).kr(doneAction: 2);\r\n\t\r\n\t\r\n\tevenFreqs = ((1, 3 .. numFreqs) * baseFreq);\r\n\toddFreqs = ((2, 4 .. numFreqs) * baseFreq);\r\n\t\r\n\t\r\n\t// there are 5 formants in each vowel, ergo 5 filter orders may be provided\r\n\torders = stopFilterOrders.collect{|stop, i|  \r\n\t\tXLine.kr(startFilterOrder, stop, dur * ( 4 + (2 * i)/dur))\r\n\t};\r\n\t\r\n\tevenAmps = vowel.ampAt(evenFreqs, orders ) * evenAmpMod;\r\n\toddAmps = vowel.ampAt(oddFreqs, orders ) * oddAmpMod;\r\n\t\r\n\t\r\n\tfreqs = evenFreqs ++ oddFreqs;\r\n\tamps = evenAmps ++ oddAmps;\r\n\t\r\n\tamps = amps.normalizeSum; // tame amplitudes\r\n\t\r\n\tDynKlang.ar(`[freqs, amps , nil] ) * 0.1 * ampEnv;\r\n}.play\r\n)",
   "labels" : [
      "code example"
   ]
}
