1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#ifndef KLATT_H
#define KLATT_H
#include "resonator.h"
#define CASCADE_PARALLEL 1
#define ALL_PARALLEL 2
#define NPAR 40
class klatt_frame
{
public:
int mF0FundamentalFreq; // Voicing fund freq in Hz
int mVoicingAmpdb; // Amp of voicing in dB, 0 to 70
int mFormant1Freq; // First formant freq in Hz, 200 to 1300
int mFormant1Bandwidth; // First formant bw in Hz, 40 to 1000
int mFormant2Freq; // Second formant freq in Hz, 550 to 3000
int mFormant2Bandwidth; // Second formant bw in Hz, 40 to 1000
int mFormant3Freq; // Third formant freq in Hz, 1200 to 4999
int mFormant3Bandwidth; // Third formant bw in Hz, 40 to 1000
int mFormant4Freq; // Fourth formant freq in Hz, 1200 to 4999
int mFormant4Bandwidth; // Fourth formant bw in Hz, 40 to 1000
int mFormant5Freq; // Fifth formant freq in Hz, 1200 to 4999
int mFormant5Bandwidth; // Fifth formant bw in Hz, 40 to 1000
int mFormant6Freq; // Sixth formant freq in Hz, 1200 to 4999
int mFormant6Bandwidth; // Sixth formant bw in Hz, 40 to 2000
int mNasalZeroFreq; // Nasal zero freq in Hz, 248 to 528
int mNasalZeroBandwidth; // Nasal zero bw in Hz, 40 to 1000
int mNasalPoleFreq; // Nasal pole freq in Hz, 248 to 528
int mNasalPoleBandwidth; // Nasal pole bw in Hz, 40 to 1000
int mAspirationAmpdb; // Amp of aspiration in dB, 0 to 70
int mNoSamplesInOpenPeriod; // # of samples in open period, 10 to 65
int mVoicingBreathiness; // Breathiness in voicing, 0 to 80
int mVoicingSpectralTiltdb; // Voicing spectral tilt in dB, 0 to 24
int mFricationAmpdb; // Amp of frication in dB, 0 to 80
int mSkewnessOfAlternatePeriods; // Skewness of alternate periods, 0 to 40 in sample#/2
int mFormant1Ampdb; // Amp of par 1st formant in dB, 0 to 80
int mFormant1ParallelBandwidth; // Par. 1st formant bw in Hz, 40 to 1000
int mFormant2Ampdb; // Amp of F2 frication in dB, 0 to 80
int mFormant2ParallelBandwidth; // Par. 2nd formant bw in Hz, 40 to 1000
int mFormant3Ampdb; // Amp of F3 frication in dB, 0 to 80
int mFormant3ParallelBandwidth; // Par. 3rd formant bw in Hz, 40 to 1000
int mFormant4Ampdb; // Amp of F4 frication in dB, 0 to 80
int mFormant4ParallelBandwidth; // Par. 4th formant bw in Hz, 40 to 1000
int mFormant5Ampdb; // Amp of F5 frication in dB, 0 to 80
int mFormant5ParallelBandwidth; // Par. 5th formant bw in Hz, 40 to 1000
int mFormant6Ampdb; // Amp of F6 (same as r6pa), 0 to 80
int mFormant6ParallelBandwidth; // Par. 6th formant bw in Hz, 40 to 2000
int mParallelNasalPoleAmpdb; // Amp of par nasal pole in dB, 0 to 80
int mBypassFricationAmpdb; // Amp of bypass fric. in dB, 0 to 80
int mPalallelVoicingAmpdb; // Amp of voicing, par in dB, 0 to 70
int mOverallGaindb; // Overall gain, 60 dB is unity, 0 to 60
klatt_frame();
};
class darray;
class Element;
class Slope
{
public:
float mValue; /* boundary value */
int mTime; /* transition time */
Slope()
{
mValue = 0;
mTime = 0;
}
};
enum KLATT_WAVEFORM
{
KW_SAW,
KW_TRIANGLE,
KW_SIN,
KW_SQUARE,
KW_PULSE,
KW_NOISE,
KW_WARBLE
};
class klatt
{
// resonators
resonator mParallelFormant1, mParallelFormant2, mParallelFormant3,
mParallelFormant4, mParallelFormant5, mParallelFormant6,
mParallelResoNasalPole, mNasalPole, mNasalZero,
mCritDampedGlotLowPassFilter, mDownSampLowPassFilter, mOutputLowPassFilter;
public:
int mBaseF0;
float mBaseSpeed;
float mBaseDeclination;
int mBaseWaveform;
int mF0Flutter;
int mSampleRate;
int mNspFr;
int mF0FundamentalFreq; // Voicing fund freq in Hz
int mVoicingAmpdb; // Amp of voicing in dB, 0 to 70
int mSkewnessOfAlternatePeriods; // Skewness of alternate periods,0 to 40
int mTimeCount; // used for f0 flutter
int mNPer; // Current loc in voicing period 40000 samp/s
int mT0; // Fundamental period in output samples times 4
int mNOpen; // Number of samples in open phase of period
int mNMod; // Position in period to begin noise amp. modul
// Various amplitude variables used in main loop
float mAmpVoice; // mVoicingAmpdb converted to linear gain
float mAmpBypas; // mBypassFricationAmpdb converted to linear gain
float mAmpAspir; // AP converted to linear gain
float mAmpFrica; // mFricationAmpdb converted to linear gain
float mAmpBreth; // ATURB converted to linear gain
// State variables of sound sources
int mSkew; // Alternating jitter, in half-period units
float mVLast; // Previous output of voice
float mNLast; // Previous output of random number generator
float mGlotLast; // Previous value of glotout
float mDecay; // mVoicingSpectralTiltdb converted to exponential time const
float mOneMd; // in voicing one-pole ELM_FEATURE_LOW-pass filter
unsigned int mSeed; // random seed
float natural_source(int aNper);
void frame_init();
void flutter();
void pitch_synch_par_reset(int ns);
void parwave(short int *jwave);
void init(int aBaseFrequency = 1330, float aBaseSpeed = 10.0f, float aBaseDeclination = 0.5f, int aBaseWaveform = KW_SAW);
static int phone_to_elm(char *aPhoneme, int aCount, darray *aElement);
int mElementCount;
unsigned char *mElement;
int mElementIndex;
klatt_frame mFrame;
Element * mLastElement;
int mTStress;
int mNTStress;
Slope mStressS;
Slope mStressE;
float mTop;
void initsynth(int aElementCount,unsigned char *aElement);
int synth(int aSampleCount, short *aSamplePointer);
klatt();
};
#endif