Browse Source

[1.33] continued

git-svn-id: https://espeak.svn.sourceforge.net/svnroot/espeak/trunk@159 d46cf337-b52f-0410-862d-fd96e6ae7743
master
jonsd 17 years ago
parent
commit
eab1faff96

+ 127
- 0
dictsource/ku_list View File

@@ -0,0 +1,127 @@

// This file is UTF8 encoded
// Spelling-to-phoneme words for Kurdish


_0 s'Ifr
_1 j'Ek
_2 d'U
_3 s'e
_4 dZ'ar
_5 p'endZ
_6 S'ES
_7 h'Eft
_8 h'EjSt
_9 n'Eh
_10 d'Eh
_11 jazd'E#
_12 danzd'E#
_13 sezd'E#
_14 tSaRd'E#
_15 panzd'E#
_16 Sanzd'E#
_17 hIvd'Eh
_18 hIZd'Eh
_19 nozd'Eh
_2X b'Ist
_3X s'i
_4X tS'Il
_5X pendZ'i
_6X S'est
_7X hEft'e
_8X heSt'e
_9X n'od
_0C s'Ed
_1C s'Ed
_0M1 hEz'ar
_1M1 hEz'ar
_0M2 mIl'jon
_1M2 mIl'jon

_0and _u
_dpt _xal
_?? tipa
_cap mezin // or "ya mezin" after the letter


// characters
// letter names
_a a
b be
c dZe
ç tSe
d de
_e E
_ê e
f fe
g ge
h he
_i I
_î i
j Ze
k ke
l le
m me
n ne
_o o
p pe
q qe
r Re
s se
ş Se
t te
_u U
_û u
v ve
w we
x xe
y je
z ze


_, behnok
_. xal
_: dZotxal
_; xalbehnok
_- bEndIk
_? pIRsniS'an
_! banES'an
% sEde
* steRk

// function words

û $u+ $pause
a $u+
ê $u+

// pronouns
ez $u+
te $u+
wê $u+
wî $u+
me $u+
we $u+
wan $u+

bes $pause
an $u $pause
anji $u $pause
ên $u
ya $u
yê $u
yan $u
yên $u
ji $u
bi $u
re $u
di $u
de $u
kir $u
got $u


// abbreviations
hwd hEr||wEki||dIn

// pronunciation exceptions

+ 115
- 0
dictsource/ku_rules View File

@@ -0,0 +1,115 @@

// Kurdish translation rules
// This file is UTF-8 encoded

.L01 î iy ê ew ey // front vowels

.group a
a a

@) a (_S1 %a
@) an (_S2 %an

.group b
b b

.group c
c dZ

.group ç
ç tS

.group d
d d

.group e
e E
e (_ E#
ew eU
ey eI

.group ê
ê e

@) ê (_S1 %e
@) ên (_S2 %en


.group f
f f

.group g
g g
g (L01 J

.group h
h h

.group i
i I

.group î
î i

.group j
j Z

.group k
k k
k (L01 c

.group l
l l

.group m
m m

.group n
n n

.group o
o o

.group p
p p

.group q
q q

.group r
r R

.group s
s s

.group ş
ş S

.group t
t t

.group u
u U

.group û
û u

.group v
v v

.group w
w w

.group x
x x

.group y
y j

.group z
z z

.group
ö I:
ü y
$ dUlar

+ 12
- 27
phsource/compile_report View File

@@ -1,4 +1,4 @@
49 phoneme tables
47 phoneme tables
new total
base 98 98
base2 24 117
@@ -39,7 +39,7 @@
grc 12 122
sv 25 120
no 28 124
is 32 123
is 33 124
vi 42 136
zhy 40 131
zh 65 148
@@ -47,8 +47,6 @@
tr 18 122
ku 17 121
id 14 119
ja 7 103
rw 12 122

Data file Used by
b/b [b] base
@@ -576,14 +574,17 @@ ufric/s_ [s] base
[s] es
[s#] pt
[z;] ro
[s2] is
ufric/s! [s] base
[s2] fi
[s] fr
[s2] hu
[s] es
[s#] pt
[s2] is
ufric/s_continue [s2] fi
[s2] hu
[s2] is
ufric/sh [S] base
[S] fr
[s#] pt_pt
@@ -696,7 +697,7 @@ ustop/p_ [p] base
[p2] fr
[ph] hi
[ph] zh
ustop/percus10 [(X1] base
ustop/percus10 [(X1)] base
ustop/pl [p] base
[p] base2
[p] fi
@@ -789,7 +790,7 @@ ustop/tsh_ [tS] base
ustop/t_short [t.] hi
[t] sk
[t] el
ustop/tsh_pzd [tS;] zh
ustop/tsh_pzd [tS;h] zh
ustop/tsh_pzd_unasp [tS;] zh
ustop/tsh_sr [tS] sr
ustop/ts_pzd [tS;] base
@@ -802,7 +803,7 @@ ustop/ts_pzd2 [c] hi
[c] hu
ustop/t_sr [d] sr
[t] sr
ustop/ts_rfx [ts.] zh
ustop/ts_rfx [ts.h] zh
ustop/ts_rfx_unasp [ts.] zh
ustop/ts_sr [tS;] sr
[dZ;] sr
@@ -1028,9 +1029,9 @@ vnasal/a#_n [&~] pt
vnasal/a#u_n [&U~] pt
[&U~] pt_pt
vnasal/ee_n [E~] en
[a] en_us
[E~] fr_ca
vnasal/ee_n2 [E~] hi
vnasal/ee_n2 [a] en_us
[E~] hi
[E~] pl
[&~] pt_pt
vnasal/e_n [e~] af
@@ -1190,15 +1191,12 @@ vowel/a [a] en_n
[a] it
[a] zh
[a] id
[a] ja
vowel/a# [a/] base2
[a2] en_sc
[a2] en_wi
[&] sr
[&] pt
[&/] pt
[a#] rw
[a/] rw
vowel/a_2 [a] base2
[a] en_wi
[A:] en_wi
@@ -1209,7 +1207,6 @@ vowel/a_2 [a] base2
[a] pt_pt
[a] ro
[a:] vi
[a] rw
vowel/a#_2 [&] hr
[a2] sv
[&] is
@@ -1294,8 +1291,6 @@ vowel/e [e] base2
[e] grc
[e] vi
[e] id
[e] rw
[e#] rw
vowel/e# [I] en_sc
[I2] en_sc
vowel/e_2 [eI] en_sc
@@ -1350,7 +1345,6 @@ vowel/e_mid [E] en_rp
[E] tr
[E] id
[E2] id
[e] ja
vowel/e_mid2 [E] af
[E] de
[E2] de
@@ -1388,9 +1382,6 @@ vowel/i [i] base2
[i] zhy
[i] zh
[i] sw
[i] ja
[i] rw
[i#] rw
vowel/i# [i] en_rp
[y:] cy
vowel/i_2 [i:] en_rp
@@ -1486,8 +1477,6 @@ vowel/o [o] base2
[o] grc
[o:] sv
[o] id
[o] rw
[o#] rw
vowel/o_2 [o:] cy
[o:] hi
[o:] hu
@@ -1525,7 +1514,6 @@ vowel/oo [O:] en_sc
[o] zhy
[O] tr
[O] id
[o] ja
vowel/oo_1 [O:] en_n
[O:] en_rp
[O@] en_rp
@@ -1620,8 +1608,6 @@ vowel/u_bck [u] base2
[u] is
[u] zhy
[u] zh
[u] rw
[u#] rw
vowel/u_bck2 [u:] la
vowel/u_fnt [u:] en_rp
vowel/uu [U] en
@@ -1642,7 +1628,6 @@ vowel/uu_bck [U] en_n
[U] pt
[U] no
[u] zhy
vowel/u_unr [u] ja
vowel/V [3] en_sc
vowel/V_2 [V] en
[a] af
@@ -1794,7 +1779,7 @@ vwl_ru/u [u] ru
vwl_ru/u# [u#] ru
vwl_ru/u#u [u"] ru
vwl_sv/r_sv3 [r] sv
vwl_zh/aang [aan] zhy
vwl_zh/aang [aang] zhy
vwl_zh/aau [Au] zh
vwl_zh/a_n [a] zh
vwl_zh/ang [ang] zhy
@@ -1805,7 +1790,7 @@ vwl_zh/ie [iE] zh
vwl_zh/ing [ing] zhy
vwl_zh/iou [iou] zh
vwl_zh/ng [ng] zhy
vwl_zh/oeng [oen] zhy
vwl_zh/oeng [oeng] zhy
vwl_zh/ong [ong] zhy
vwl_zh/uaa [uA] zh
vwl_zh/uai [uai] zh

+ 3
- 3
phsource/ph_english_us View File

@@ -29,9 +29,9 @@ phoneme a
vowel starttype (a) endtype (@)
length 210
formants vwl_en_us/a
before n vnasal/ee_n
before N vnasal/ee_n
before m vnasal/ee_n
before n vnasal/ee_n2
before N vnasal/ee_n2
before m vnasal/ee_n2
reduceto a2 0
endphoneme


+ 13
- 0
phsource/ph_icelandic View File

@@ -262,3 +262,16 @@ phoneme v // no fricative noise
endphoneme


phoneme s2 // 2nd part of geminated s
vls alv frc sibilant
vowelin f1=0 f2=1700 -300 300 f3=-100 80
vowelout f1=0 f2=1700 -300 250 f3=-100 80 rms=20
lengthmod 3
wave ufric/s_continue
before _ ufric/s_
before p ufric/s!
before t ufric/s!
before k ufric/s!
switchvoicing z
endphoneme


+ 3
- 3
phsource/ph_tamil View File

@@ -70,20 +70,20 @@ endphoneme

phoneme u
vowel starttype (u) endtype (u)
length 130
length 110
formants vowel/u
reduceto U 4
endphoneme

phoneme U
vowel starttype (u) endtype (u)
length 130
length 110
formants vowel/u#_3
endphoneme

phoneme u:
vowel starttype (u) endtype (u)
length 270
length 250
formants vowel/u
endphoneme


+ 0
- 6
phsource/phonemes View File

@@ -1274,9 +1274,3 @@ include ph_kurdish
phonemetable id base2
include ph_indonesian

phonemetable ja base
include ph_japanese

phonemetable rw base2
include ph_kinyarwanda


BIN
phsource/vwl_en_us/ii_2 View File


+ 1
- 1
platforms/windows/make_espeak.iss View File

@@ -2,7 +2,7 @@
[Setup]
AppName=eSpeak
AppVerName=eSpeak version 1.32
AppVerName=eSpeak version 1.33
AppCopyright=Licensed under GNU General Public License version 3. (See file License.txt for details).
WindowVisible=yes

+ 1
- 1
platforms/windows/make_espeakedit.iss View File

@@ -1,7 +1,7 @@
[Setup]
AppName=eSpeakEdit
AppVerName=eSpeakEdit version 1.32
AppVerName=eSpeakEdit version 1.33
DefaultDirName={pf}\eSpeak
DefaultGroupName=eSpeak
OutputBaseFilename=setup_espeakedit

+ 4
- 4
src/Makefile View File

@@ -1,4 +1,4 @@
# removed -fno-exceptions because it caused problems with stdio library on some platforms
# remove -fno-exceptions because it caused problems with stdio library on some platforms (ARM)

PREFIX=/
BINDIR=$(PREFIX)/usr/bin
@@ -6,7 +6,7 @@ INCDIR=$(PREFIX)/usr/include/espeak
LIBDIR=$(PREFIX)/usr/lib
DATADIR=$(PREFIX)/usr/share/espeak-data

RELEASE = 1.31
RELEASE = 1.33
BIN_NAME = speak
BIN2_NAME = espeak
LIB_NAME = libespeak.so
@@ -68,7 +68,7 @@ all: $(BIN_NAME) $(LIB_NAME) $(STATIC_LIB_NAME) $(BIN2_NAME)
mv $(LIB_NAME) $(LIB_NAME).$(LIBTAG)

.cpp.o:
$(CXX) $(CXXFLAGS) -D PATH_ESPEAK_DATA=\"$(DATADIR)\" -Wall -pedantic -I. -c $<
$(CXX) $(CXXFLAGS) -D PATH_ESPEAK_DATA=\"$(DATADIR)\" -Wall -pedantic -I. -c -fno-exceptions $<

$(BIN_NAME): $(OBJS1)
$(CXX) -o $@ $(OBJS1) $(LIBS1)
@@ -80,7 +80,7 @@ $(BIN2_NAME): $(OBJS3) $(LIB_NAME)

x_%.o: %.cpp
$(CXX) $(CXXFLAGS) -Wall -fpic -pedantic \
-I. -D LIBRARY -c $< -o x_$*.o
-I. -D LIBRARY -c -fno-exceptions $< -o x_$*.o

$(LIB_NAME): $(OBJS2)
$(CXX) -shared $(SONAME_OPT)$(LIB_NAME).$(LIB_VERSION) -o $@ $(OBJS2) $(LIBS2)

+ 15
- 5
src/compiledata.cpp View File

@@ -36,6 +36,11 @@
#include "voice.h"
#include "spect.h"

#ifdef PLATFORM_POSIX
#include <unistd.h>
#endif



#define tNUMBER 1
#define tSTRING 2
@@ -742,6 +747,7 @@ int Compile::LoadWavefile(FILE *f, const char *fname)
int resample_wav = 0;
char fname_temp[100];
int scale_factor=0;
int fd_temp;
char command[sizeof(path_source)+200];

fseek(f,24,SEEK_SET);
@@ -762,12 +768,16 @@ int Compile::LoadWavefile(FILE *f, const char *fname)
Error("Not mono: ",fname);
}
#else
sprintf(fname_temp,"%s.wav",tmpnam(NULL));
sprintf(command,"sox \"%s%s.wav\" -r %d -c 1 -w %s polyphase\n",path_source,fname,samplerate,fname_temp);
if(system(command) < 0)
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
{
Error("Failed to resample: ",command);
return(0);
close(fd_temp);
sprintf(command,"sox \"%s%s.wav\" -r %d -c 1 -w %s polyphase\n",path_source,fname,samplerate,fname_temp);
if(system(command) < 0)
{
Error("Failed to resample: ",command);
return(0);
}
}

f = fopen(fname_temp,"rb");

+ 2
- 2
src/compiledict.cpp View File

@@ -1516,8 +1516,8 @@ int CompileDictionary(const char *dsource, const char *dict_name, FILE *log, cha
}

value = N_HASH_DICT;
fwrite(&value,4,1,f_out);
fwrite(&offset_rules,4,1,f_out);
Write4Bytes(f_out,value);
Write4Bytes(f_out,offset_rules);

compile_dictlist_start();


+ 24
- 16
src/dictionary.cpp View File

@@ -87,20 +87,24 @@ void strncpy0(char *to,const char *from, int size)
to[size-1] = 0;
}


// use the following macros for translation from little endian to host's endianness

#ifdef ARCH_BIG
int reverse_word_bytes(int word)
{//=============================
// reverse the order of bytes from little-endian to big-endian
int ix;
int word2 = 0;
#define FIX_ENDIAN_USHORT(val) ((unsigned short) ( \
(unsigned short) ((unsigned short) (val) >> 8) | \
(unsigned short) ((unsigned short) (val) << 8)))

for(ix=24; ix>=0; ix -= 8)
{
word2 |= (word >> ix) & 0xff;
word2 = word2 << 8;
}
return(word2);
}
#define FIX_ENDIAN_UINT(val) ((unsigned int) ( \
(((unsigned int) (val) & (unsigned int) 0x000000ffU) << 24) | \
(((unsigned int) (val) & (unsigned int) 0x0000ff00U) << 8) | \
(((unsigned int) (val) & (unsigned int) 0x00ff0000U) >> 8) | \
(((unsigned int) (val) & (unsigned int) 0xff000000U) >> 24)))

#else

# define FIX_ENDIAN_USHORT(val) (val)
# define FIX_ENDIAN_UINT(val) (val)
#endif


@@ -157,7 +161,7 @@ int Translator::LoadDictionary(const char *name, int no_error)
size = GetFileLength(fname);

f = fopen(fname,"rb");
if((f == NULL) || (size == 0))
if((f == NULL) || (size <= 0))
{
if(no_error == 0)
{
@@ -175,13 +179,15 @@ int Translator::LoadDictionary(const char *name, int no_error)


pw = (int *)data_dictlist;
length = pw[1];
length = FIX_ENDIAN_UINT(pw[1]);
if(size <= (N_HASH_DICT + sizeof(int)*2))
{
fprintf(stderr,"Empty _dict file: '%s\n",fname);
return(2);
}
if((pw[0] != N_HASH_DICT) || (length <= 0) || (length > 0x8000000))

if((FIX_ENDIAN_UINT(pw[0]) != N_HASH_DICT) ||
(length <= 0) || (length > 0x8000000))
{
fprintf(stderr,"Bad data: '%s'\n",fname);
return(2);
@@ -258,7 +264,9 @@ void Translator::InitGroups(void)
pw = (unsigned int *)langopts.replace_chars;
while(*pw != 0)
{
*pw = reverse_word_bytes(*pw);
*pw = FIX_ENDIAN_UINT(*pw);
pw++;
*pw = FIX_ENDIAN_UINT(*pw);
pw++;
}
#endif

+ 2
- 2
src/numbers.cpp View File

@@ -126,7 +126,7 @@ static const short non_ascii_tab[] = {


// characters U+00e0 to U+017f
const short letter_accents_0e0[] = {
const unsigned short letter_accents_0e0[] = {
LETTER('a',M_GRAVE,0), // U+00e0
LETTER('a',M_ACUTE,0),
LETTER('a',M_CIRCUMFLEX,0),
@@ -291,7 +291,7 @@ LETTER('s',M_NAME,0), // long-s // U+17f


// characters U+0250 to U+029F
const short letter_accents_250[] = {
const unsigned short letter_accents_250[] = {
LETTER('a',M_TURNED,0), // U+250
LETTER(L_ALPHA,0,0),
LETTER(L_ALPHA,M_TURNED,0),

+ 14
- 4
src/readclause.cpp View File

@@ -34,6 +34,10 @@
#include "voice.h"
#include "translate.h"

#ifdef PLATFORM_POSIX
#include <unistd.h>
#endif

#include <locale.h>
#define N_XML_BUF 256

@@ -642,6 +646,7 @@ static int LoadSoundFile(const char *fname, int index)
if((f = fopen(fname,"rb")) != NULL)
{
int ix;
int fd_temp;
const char *resample;
int header[3];

@@ -660,11 +665,16 @@ static int LoadSoundFile(const char *fname, int index)
else
resample = "polyphase";

sprintf(fname_temp,"%s.wav",tmpnam(NULL));
sprintf(command,"sox \"%s\" -r %d -w -s -c1 %s %s\n", fname, samplerate, fname_temp, resample);
if(system(command) == 0)
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
{
fname = fname_temp;
close(fd_temp);
// sprintf(fname_temp,"%s.wav",tmpnam(NULL));
sprintf(command,"sox \"%s\" -r %d -w -s -c1 %s %s\n", fname, samplerate, fname_temp, resample);
if(system(command) == 0)
{
fname = fname_temp;
}
}
}
}

+ 1
- 1
src/synthdata.cpp View File

@@ -35,7 +35,7 @@
#include "translate.h"
#include "wave.h"

const char *version_string = "1.32 04.Mar.08";
const char *version_string = "1.33 06.Mar.08";
const int version_phdata = 0x013200;

int option_device_number = -1;

+ 1
- 1
src/synthesize.cpp View File

@@ -82,7 +82,7 @@ const char *WordToString(unsigned int word)
int ix;
static char buf[5];

for(ix=0; ix<3; ix++)
for(ix=0; ix<4; ix++)
buf[ix] = word >> (ix*8);
buf[4] = 0;
return(buf);

+ 1
- 1
src/tr_languages.cpp View File

@@ -656,7 +656,7 @@ SetLengthMods(tr,3); // all equal

case L('t','a'): // Tamil
{
static const short stress_lengths_ta[8] = {190, 190, 200, 200, 0, 0, 220, 220};
static const short stress_lengths_ta[8] = {200, 200, 210, 210, 0, 0, 230, 230};
static const unsigned char stress_amps_ta[8] = {18,18, 18,18, 20,20, 22,22 };

tr = new Translator();

+ 21
- 8
src/translate.cpp View File

@@ -893,26 +893,39 @@ if((wmark > 0) && (wmark < 8))
}

wordx[-1] = c_temp;
pfix = 1;
prefix_chars[0] = 0;
n_chars = prefix_type & 0x3f;

for(ix=0; ix < n_chars; ix++) // num. of bytes to remove
if((prefix_type & SUFX_B) == 0)
{
prefix_chars[pfix++] = *wordx++;
for(ix=(prefix_type & 0xf); ix>0; ix--) // num. of characters to remove
{
wordx++;
while((*wordx & 0xc0) == 0x80) wordx++; // for multibyte characters
}
}
else
{
pfix = 1;
prefix_chars[0] = 0;
n_chars = prefix_type & 0x3f;

if((prefix_type & SUFX_B) && (ix == (n_chars-1)))
for(ix=0; ix < n_chars; ix++) // num. of bytes to remove
{
prefix_chars[pfix-1] = 0; // discard the last character of the prefix, this is the separator character
prefix_chars[pfix++] = *wordx++;
if((prefix_type & SUFX_B) && (ix == (n_chars-1)))
{
prefix_chars[pfix-1] = 0; // discard the last character of the prefix, this is the separator character
}
}
prefix_chars[pfix] = 0;
}
prefix_chars[pfix] = 0;
c_temp = wordx[-1];
wordx[-1] = ' ';
confirm_prefix = 1;

if(prefix_type & SUFX_B)
{
// SUFX_B is used for Turkish, tr_rules contains "(Pb£
// retranslate the prefix part
char *wordpf;
char prefix_phonemes2[12];

+ 20
- 0
src/transldlg.cpp View File

@@ -31,6 +31,11 @@
#include "translate.h"
#include "prosodydisplay.h"

#ifdef PLATFORM_POSIX
#include <unistd.h>
#endif


#include "wx/font.h"
#include "wx/textctrl.h"
#include "wx/button.h"
@@ -372,6 +377,7 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
int clause_tone;
int clause_count;
FILE *f;
int fd_temp;
char fname_temp[100];
static int n_ph_list;
static PHONEME_LIST ph_list[N_PH_LIST+1];
@@ -383,11 +389,25 @@ void TranslDlg::OnCommand(wxCommandEvent& event)
case T_RULES:
case MENU_SPEAK_RULES:
option_phonemes = 2;

#ifdef PLATFORM_POSIX
strcpy(fname_temp,"/tmp/espeakXXXXXX");
if((fd_temp = mkstemp(fname_temp)) >= 0)
{
close(fd_temp);

if((f = fopen(fname_temp,"w+")) != NULL)
{
f_trans = f; // write translation rule trace to a temp file
}
}
#else
strcpy(fname_temp,tmpnam(NULL));
if((f = fopen(fname_temp,"w+")) != NULL)
{
f_trans = f; // write translation rule trace to a temp file
}
#endif
case T_TRANSLATE:
case MENU_SPEAK_TRANSLATE:
option_multibyte = espeakCHARS_AUTO;

+ 9
- 0
src/voices.cpp View File

@@ -1052,6 +1052,14 @@ static int ScoreVoice(espeak_VOICE *voice_spec, const char *spec_language, int s

p = voice->languages; // list of languages+dialects for which this voice is suitable

if(strcmp(spec_language,"mbrola")==0)
{
// only list mbrola voices
if(memcmp(voice->identifier,"mb/",3) == 0)
return(100);
return(0);
}

if(spec_n_parts == 0)
{
score = 100;
@@ -1198,6 +1206,7 @@ static int SetVoiceScores(espeak_VOICE *voice_select, espeak_VOICE **voices, int
for(ix=0; ix<n_voices_list; ix++)
{
vp = voices_list[ix];

if(((control & 1) == 0) && (memcmp(vp->identifier,"mb/",3) == 0))
continue;


+ 4
- 2
src/wavegen.cpp View File

@@ -816,8 +816,8 @@ static void WavegenSetEcho(void)
if(embedded_value[EMBED_T] > 0)
{
// announcing punctuation
amp = embedded_value[EMBED_T] * 10;
delay = 130;
amp = embedded_value[EMBED_T] * 8;
delay = 60;
}

if(delay == 0)
@@ -825,6 +825,8 @@ static void WavegenSetEcho(void)

echo_head = (delay * samplerate)/1000;
echo_length = echo_head; // ensure completion of echo at the end of speech. Use 1 delay period?
if(amp == 0)
echo_length = 0;
if(amp > 20)
echo_length = echo_head * 2; // perhaps allow 2 echo periods if the echo is loud.


Loading…
Cancel
Save