「アイウエオ」と発音させる
少し長いのですが、まずはコードを見てもらおう。
""" 参考 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つのバンドパス・フィルタを使用し、それらの中心周波数の振幅を強調する、それぞれゲインを使って補いながら。「ワイウエヲ」と聞こえなくも無い。