「アイウエオ」と発音させる

少し長いのですが、まずはコードを見てもらおう。

"""
参考
 http://www.sfu.ca/sca/Manuals/Csound/Hamel/Week9.html
"""
from sndobj import *
import time
  #ブザーのようなサウンドを生成
tab = HarmTable(8192, 22, 4)
interp = Interp(0, 0, 0.1)
osc = Oscil(tab, 150, 0, None, interp)

env_cutoff01 = Interp(100, 100, 0.1)
env_cutoff02 = Interp(100, 100, 0.1)
env_cutoff03 = Interp(100, 100, 0.1)
env_bw01 = Interp(40, 40, 0.1)
env_bw02 = Interp(40, 40, 0.1)
env_bw03 = Interp(40, 40, 0.1)
  #バンドパス・フィルタのカットオフ周波数をフォルマント周波数に
filter01 = ButtBP(100, 40, osc, env_cutoff01, env_bw01)
filter02 = ButtBP(100, 40, osc, env_cutoff02, env_bw02)
filter03 = ButtBP(100, 40, osc, env_cutoff03, env_bw03)
gain01 = Gain(0.0, filter01)
gain02 = Gain(0.0, filter02)
gain03 = Gain(0.0, filter03)
mix = Mixer()
mix.AddObj(gain01)
mix.AddObj(gain02)
mix.AddObj(gain03)
out = SndRTIO(mix)

thread = SndThread()
thread.AddObj(interp)
thread.AddObj(osc)
thread.AddObj(env_cutoff01)
thread.AddObj(env_cutoff02)
thread.AddObj(env_cutoff03)
thread.AddObj(env_bw01)
thread.AddObj(env_bw02)
thread.AddObj(env_bw03)
thread.AddObj(filter01)
thread.AddObj(filter02)
thread.AddObj(filter03)
thread.AddObj(gain01)
thread.AddObj(gain02)
thread.AddObj(gain03)
thread.AddObj(mix)
thread.AddObj(out, SNDIO_OUT)

  #フォルマント周波数、帯域幅、ゲインを配列に
formant = [
[800, 1150, 2900, 80, 90, 120, 0, -6, -32], 
[270, 2140, 2950, 60, 90, 100, 0, -12, -26], 
[325, 700, 2700, 50, 60, 170, 0, -16, -35], 
[350, 2000, 2800, 60, 100, 120, 0, -20, -15], 
[450, 800, 2830, 70, 80, 100, 0, -11, -22]
]

thread.ProcOn()
for i in range(5):
    interp.SetCurve(0, 5000)
    env_cutoff01.SetCurve(100, formant[i][0])
    env_cutoff02.SetCurve(100, formant[i][1])
    env_cutoff03.SetCurve(100, formant[i][2])
    env_bw01.SetCurve(100, formant[i][3])
    env_bw02.SetCurve(100, formant[i][4])
    env_bw03.SetCurve(100, formant[i][5])
    gain01.SetGain(formant[i][6])
    gain02.SetGain(formant[i][7])
    gain03.SetGain(formant[i][8])
    interp.Restart()
    env_cutoff01.Restart()
    env_cutoff02.Restart()
    env_cutoff03.Restart()
    env_bw01.Restart()
    env_bw02.Restart()
    env_bw03.Restart()

    time.sleep(0.5)

    interp.SetCurve(8000, 0)
    interp.Restart()

    time.sleep(0.3)
time.sleep(1)
thread.ProcOff()

フォルマント合成と呼ばれるものの1つ。声質などいろいろありながらも認識可能な理由として挙げられる。こちらのマニュアルは5つのフォルマント周波数を列挙しているが、今回は第1,2,3を。具体的には生成した波形を3つのバンドパス・フィルタを使用し、それらの中心周波数の振幅を強調する、それぞれゲインを使って補いながら。「ワイウエヲ」と聞こえなくも無い。