| #include "synthesize.h" | #include "synthesize.h" | ||||
| #include "translate.h" | #include "translate.h" | ||||
| static void SetSpeedFactors(voice_t *voice, int x, int *speed1, int *speed2, int *speed3); | |||||
| static void SetSpeedFactors(voice_t *voice, int x, int speeds[3]); | |||||
| static void SetSpeedMods(SPEED_FACTORS *speed, int voiceSpeedF1, int wpm, int x); | static void SetSpeedMods(SPEED_FACTORS *speed, int voiceSpeedF1, int wpm, int x); | ||||
| static void SetSpeedMultiplier(int *x, int *wpm); | static void SetSpeedMultiplier(int *x, int *wpm); | ||||
| 45 // 450 | 45 // 450 | ||||
| }; | }; | ||||
| static int speed1 = 130; | |||||
| static int speed2 = 121; | |||||
| static int speed3 = 118; | |||||
| static int len_speeds[3] = { 130, 121, 118 }; | |||||
| void SetSpeed(int control) | void SetSpeed(int control) | ||||
| { | { | ||||
| // The eSpeak output will be speeded up by at least x2 | // The eSpeak output will be speeded up by at least x2 | ||||
| x = 73; | x = 73; | ||||
| if (control & 1) { | if (control & 1) { | ||||
| speed1 = (x * voice->speedf1)/256; | |||||
| speed2 = (x * voice->speedf2)/256; | |||||
| speed3 = (x * voice->speedf3)/256; | |||||
| len_speeds[0] = (x * voice->speedf1)/256; | |||||
| len_speeds[1] = (x * voice->speedf2)/256; | |||||
| len_speeds[2] = (x * voice->speedf3)/256; | |||||
| } | } | ||||
| if (control & 2) { | if (control & 2) { | ||||
| double sonic; | double sonic; | ||||
| SetSpeedMultiplier(&x, &wpm); | SetSpeedMultiplier(&x, &wpm); | ||||
| if (control & 1) { | if (control & 1) { | ||||
| SetSpeedFactors(voice, x, &speed1, &speed2, &speed3); | |||||
| SetSpeedFactors(voice, x, len_speeds); | |||||
| } | } | ||||
| if (control & 2) { | if (control & 2) { | ||||
| *x = 6; | *x = 6; | ||||
| } | } | ||||
| static void SetSpeedFactors(voice_t *voice, int x, int *speed1, int *speed2, int *speed3) { | |||||
| static void SetSpeedFactors(voice_t *voice, int x, int speeds[3]) { | |||||
| // set speed factors for different syllable positions within a word | // set speed factors for different syllable positions within a word | ||||
| // these are used in CalcLengths() | // these are used in CalcLengths() | ||||
| *speed1 = (x * voice->speedf1)/256; | |||||
| *speed2 = (x * voice->speedf2)/256; | |||||
| *speed3 = (x * voice->speedf3)/256; | |||||
| speeds[0] = (x * voice->speedf1)/256; | |||||
| speeds[1] = (x * voice->speedf2)/256; | |||||
| speeds[2] = (x * voice->speedf3)/256; | |||||
| if (x <= 7) { | if (x <= 7) { | ||||
| *speed1 = x; | |||||
| *speed2 = *speed3 = x - 1; | |||||
| speeds[0] = x; | |||||
| speeds[1] = speeds[2] = x - 1; | |||||
| } | } | ||||
| } | } | ||||
| p->length = prev->length; | p->length = prev->length; | ||||
| if (p->type == phLIQUID) | if (p->type == phLIQUID) | ||||
| p->length = speed1; | |||||
| p->length = len_speeds[0]; | |||||
| if (next->type == phVSTOP) | if (next->type == phVSTOP) | ||||
| p->length = (p->length * 160)/100; | p->length = (p->length * 160)/100; | ||||
| } | } | ||||
| if (more_syllables == 0) | if (more_syllables == 0) | ||||
| length_mod *= speed1; | |||||
| length_mod *= len_speeds[0]; | |||||
| else if (more_syllables == 1) | else if (more_syllables == 1) | ||||
| length_mod *= speed2; | |||||
| length_mod *= len_speeds[1]; | |||||
| else | else | ||||
| length_mod *= speed3; | |||||
| length_mod *= len_speeds[2]; | |||||
| length_mod = length_mod / 128; | length_mod = length_mod / 128; | ||||
| length_mod = length_mod * (256 + (280 - len)/3)/256; | length_mod = length_mod * (256 + (280 - len)/3)/256; | ||||
| } | } | ||||
| if (length_mod > tr->langopts.max_lengthmod*speed1) { | |||||
| if (length_mod > tr->langopts.max_lengthmod*len_speeds[0]) { | |||||
| // limit the vowel length adjustment for some languages | // limit the vowel length adjustment for some languages | ||||
| length_mod = (tr->langopts.max_lengthmod*speed1); | |||||
| length_mod = (tr->langopts.max_lengthmod*len_speeds[0]); | |||||
| } | } | ||||
| length_mod = length_mod / 128; | length_mod = length_mod / 128; |