; this is an example of singing formant simulation of the male voice ; based on dodge pages 204-205 sr = 44100 kr = 4410 ksmps = 10 nchnls = 1 instr 1 ; amplitude is just a trapezoidal envelope ; not right for real simulation kamp linseg 0, p3*.1, p5*100, p3*.8, p5*100, p3*.1, 0 ; frequency from MIDI notes kfrq = cpsoct((p4/12) + 3) ; some stupid vibrato avib oscil .5, 3, 11 ; a pulse wave with harmonics up to 8000Hz apulse gbuzz kamp, kfrq+avib, (2000/kfrq) - 1, 1, 1, 11 ;alpb oscil kamp, 44100/(2097152), 11 ; turn it into more of a glottal waveform for formant filtering ; two low pass filters in series for a -12dB/octave drop alpb tone apulse, kfrq*2 ;alpb tone alpa, kfrq*2 ; ; the formant resonator bank ; 0 - a, 1 - e, 2 - iy, 3 - o, 4 - oo, 5 - u, 6 - er, 7 - uh ; i am guessing that the bandwidth should be 1/100 the frequency ; ; first formant - table 1 freq - table 6 amp ;kvowel line 0,p3,7.99999 krand0 randh 1, 2 krand1 randh 1, krand0+1 krand2 randi 2, krand1+1 kvowel = krand2+2 kf1frq tablei kvowel,1 kf1db tablei kvowel,6 kf1amp = ampdb(kf1db+96) areson1a reson alpb, kf1frq, kf1frq * p6, 1 areson1 reson areson1a, kf1frq, kf1frq * p6, 1 aform1 = areson1 * kf1amp ; ; second formant - table 2 freq - table 7 amp kf2frq tablei kvowel,2 kf2db tablei kvowel,7 kf2amp = ampdb(kf2db+96) areson2a reson alpb, kf2frq, kf2frq * p6, 1 areson2 reson areson2a, kf2frq, kf2frq * p6, 1 aform2 = areson2 * kf2amp ; ; third formant - table 3 freq - table 8 amp kf3frq tablei kvowel,3 kf3amp tablei kvowel,8 areson3a reson alpb, kf3frq, kf3frq * p6, 1 areson3 reson areson3a, kf3frq, kf3frq * p6, 1 aform3 = areson3 * ampdb(kf3amp+96) ; ; forth formant - table 4 freq - table 9 amp kf4frq tablei kvowel,4 kf4amp tablei kvowel,9 areson4a reson alpb, kf4frq, kf4frq * p6, 1 areson4 reson areson4a, kf4frq, kf4frq * p6, 1 aform4 = areson4 * ampdb(kf4amp+96) ; ; fifth formant - table 5 freq - table 10 amp kf5frq tablei kvowel,5 kf5amp tablei kvowel,10 areson5a reson alpb, kf5frq, kf5frq * p6, 1 areson5 reson areson5a, kf5frq, kf5frq * p6, 1 aform5 = areson5 * ampdb(kf5amp+96) ; ; mix them all together and spit it out ; amix = aform1 + aform2 + aform3 + aform4 + aform5 aout balance amix, alpb out aout endin