From b38a692fc56ec3fac1a0b3afe779003858fa4915 Mon Sep 17 00:00:00 2001 From: lwvmobile Date: Sat, 29 Jul 2023 21:16:02 -0400 Subject: [PATCH] Rewrite Call Alert; Switch to Generated Tone; --- download-and-install-nodeps.sh | 6 -- download-and-install.sh | 6 -- examples/Install_Notes.md | 23 ---- include/dsd.h | 1 + install.sh | 6 -- src/dsd_audio2.c | 22 ++++ src/dsd_ncurses.c | 190 +++++++++++++++------------------ tone24.wav | Bin 9058 -> 0 bytes tone48.wav | Bin 12044 -> 0 bytes tone8.wav | Bin 4044 -> 0 bytes 10 files changed, 112 insertions(+), 142 deletions(-) delete mode 100644 tone24.wav delete mode 100644 tone48.wav delete mode 100644 tone8.wav diff --git a/download-and-install-nodeps.sh b/download-and-install-nodeps.sh index 47d52b2..4d89405 100644 --- a/download-and-install-nodeps.sh +++ b/download-and-install-nodeps.sh @@ -9,12 +9,6 @@ read -p "Press enter to continue" git clone https://github.com/lwvmobile/dsd-fme cd dsd-fme -sudo cp tone8.wav /usr/share/ -sudo cp tone24.wav /usr/share/ -sudo cp tone48.wav /usr/share/ -sudo chmod 777 /usr/share/tone8.wav -sudo chmod 777 /usr/share/tone24.wav -sudo chmod 777 /usr/share/tone48.wav mkdir build cd build cmake .. diff --git a/download-and-install.sh b/download-and-install.sh index f6c9927..70d9e4c 100644 --- a/download-and-install.sh +++ b/download-and-install.sh @@ -45,12 +45,6 @@ cd .. git clone https://github.com/lwvmobile/dsd-fme cd dsd-fme -sudo cp tone8.wav /usr/share/ -sudo cp tone24.wav /usr/share/ -sudo cp tone48.wav /usr/share/ -sudo chmod 777 /usr/share/tone8.wav -sudo chmod 777 /usr/share/tone24.wav -sudo chmod 777 /usr/share/tone48.wav mkdir build cd build cmake .. diff --git a/examples/Install_Notes.md b/examples/Install_Notes.md index f8ece69..9333f19 100644 --- a/examples/Install_Notes.md +++ b/examples/Install_Notes.md @@ -97,12 +97,6 @@ Finish by running these steps to clone and build DSD-FME. ``` git clone https://github.com/lwvmobile/dsd-fme cd dsd-fme -sudo cp tone8.wav /usr/share/ -sudo cp tone24.wav /usr/share/ -sudo cp tone48.wav /usr/share/ -sudo chmod 777 /usr/share/tone8.wav -sudo chmod 777 /usr/share/tone24.wav -sudo chmod 777 /usr/share/tone48.wav mkdir build cd build cmake .. @@ -129,12 +123,6 @@ Then you can build and install using ``` git clone https://github.com/lwvmobile/dsd-fme cd dsd-fme -cp tone8.wav /usr/share/ -cp tone24.wav /usr/share/ -cp tone48.wav /usr/share/ -chmod 777 /usr/share/tone8.wav -chmod 777 /usr/share/tone24.wav -chmod 777 /usr/share/tone48.wav mkdir build cd build # -DAERO=ON is optional, but recommended if you want the older OSS support as well @@ -163,15 +151,4 @@ cmake .. make -j `nproc` sudo make install sudo ldconfig -``` - -If the call alert wav files aren't playing, then make sure to run the following in the dsd-fme folder to copy the wav files to the /usr/share/ folder and give them adequate permission to be accessed. - -``` -sudo cp tone8.wav /usr/share/ -sudo cp tone24.wav /usr/share/ -sudo cp tone48.wav /usr/share/ -sudo chmod 777 /usr/share/tone8.wav -sudo chmod 777 /usr/share/tone24.wav -sudo chmod 777 /usr/share/tone48.wav ``` \ No newline at end of file diff --git a/include/dsd.h b/include/dsd.h index decdfa0..e39798a 100644 --- a/include/dsd.h +++ b/include/dsd.h @@ -961,6 +961,7 @@ int getSymbol (dsd_opts * opts, dsd_state * state, int have_sync); void upsample (dsd_state * state, float invalue); void processDSTAR (dsd_opts * opts, dsd_state * state); +void soft_tonef (float samp[160], int n, int ID, int AD); //new p25lcw void p25_lcw (dsd_opts * opts, dsd_state * state, uint8_t LCW_bits[], uint8_t irrecoverable_errors); diff --git a/install.sh b/install.sh index 058cd27..3a167ba 100644 --- a/install.sh +++ b/install.sh @@ -1,9 +1,3 @@ -sudo cp tone8.wav /usr/share/ -sudo cp tone24.wav /usr/share/ -sudo cp tone48.wav /usr/share/ -sudo chmod 777 /usr/share/tone8.wav -sudo chmod 777 /usr/share/tone24.wav -sudo chmod 777 /usr/share/tone48.wav mkdir build cd build cmake .. diff --git a/src/dsd_audio2.c b/src/dsd_audio2.c index cdf3f3a..22eaa02 100644 --- a/src/dsd_audio2.c +++ b/src/dsd_audio2.c @@ -10,6 +10,7 @@ *-----------------------------------------------------------------------------*/ #include "dsd.h" +#include //TODO: Test All voice decoders with all combos (short mono, short stereo, float mono, float stereo) //TODO: Need Method To Dynamically Close and Open any OSS instances when changing decoding classes from Ncurses Menu (particularly rate and/or channel configs) @@ -867,4 +868,25 @@ void playSynthesizedVoiceSS4 (dsd_opts * opts, dsd_state * state) state->audio_out_idx2R = 0; } +} + +//largely borrowed from Boatbod OP25 (simplified single tone ID version) +void soft_tonef (float samp[160], int n, int ID, int AD) +{ + int i; + float step1, step2, amplitude, freq1, freq2; + + // Synthesize tones + freq1 = 31.25 * ID; freq2 = freq1; + step1 = 2 * M_PI * freq1 / 8000.0f; + step2 = 2 * M_PI * freq2 / 8000.0f; + amplitude = AD * 75.0f; + + for (i = 0; i < 160; i++) + { + samp[i] = (float) ( amplitude * (sin((n) * step1)/2 + sin((n) * step2)/2) ); + samp[i] /= 8000.0f; + n++; + } + } \ No newline at end of file diff --git a/src/dsd_ncurses.c b/src/dsd_ncurses.c index 667c081..bed66a8 100644 --- a/src/dsd_ncurses.c +++ b/src/dsd_ncurses.c @@ -135,120 +135,108 @@ char * DMRBusrtTypes[32] = { }; -#ifdef TONES //NOTE: This option is purely for the precompiled version that gets distributed, not other user Cygwin builds -void beeper (dsd_opts * opts, dsd_state * state, int type) -{ - FILE *beep; - char wav_name[1024] = {0}; - if (opts->pulse_digi_rate_out == 8000) strncpy(wav_name, "tone8.wav", 1023); - if (opts->pulse_digi_rate_out == 48000) strncpy(wav_name, "tone48.wav", 1023); - if (opts->pulse_digi_rate_out == 24000) strncpy(wav_name, "tone24.wav", 1023); - if (opts->audio_out_type == 5) strncpy(wav_name, "tone48.wav", 1023); - - wav_name[1023] = '\0'; - struct stat stat_buf; - if (stat(wav_name, &stat_buf) == 0) - { - beep = fopen (wav_name, "ro"); - uint8_t buf[1024]; - memset (buf, 0, sizeof(buf)); - short blip = 0; - int loop = 1; - while (loop == 1) - { - fread(buf, sizeof(buf), 1, beep); - if ( feof (beep) ) - { - loop = 0; - } - if (loop == 1) - { - //only beep on R if dmr_stereo is active and slot 2, else beep on L - if (type == 0 && opts->dmr_stereo == 1 && opts->audio_out == 1) - { - if (opts->audio_out_type == 0) pa_simple_write(opts->pulse_digi_dev_out, buf, sizeof(buf), NULL); - if (opts->audio_out_type == 5) write (opts->audio_out_fd, buf, sizeof(buf)); - //fprintf (stderr, "BEEP 0 24\n"); - } - if (type == 1 && opts->dmr_stereo == 1 && opts->audio_out == 1) - { - if (opts->audio_out_type == 0) pa_simple_write(opts->pulse_digi_dev_outR, buf, sizeof(buf), NULL); - if (opts->audio_out_type == 5) write (opts->audio_out_fd, buf, sizeof(buf)); - //fprintf (stderr, "BEEP 1 24\n"); - } - if (opts->dmr_stereo == 0 && opts->audio_out == 1) - { - if (opts->audio_out_type == 0) pa_simple_write(opts->pulse_digi_dev_out, buf, sizeof(buf), NULL); - if (opts->audio_out_type == 5) write (opts->audio_out_fd, buf, sizeof(buf)); - //fprintf (stderr, "BEEP 0 8\n"); - } - - - } - - } - - fclose (beep); - } - -} - -#else -void beeper (dsd_opts * opts, dsd_state * state, int type) +//Sorry Remus :( +void beeper (dsd_opts * opts, dsd_state * state, int lr) { UNUSED(state); + int i, j, n; + //use lr as left or right channel designation in stereo config + float samp_f[160]; //mono float sample + float samp_fs[320]; //stereo float sample + short samp_s[160]; //mono short sample + short samp_ss[320]; //stereo short sample + short samp_su[960]; //mono short upsample + short outbuf[6]; //temp storage for upsample - FILE *beep; - char wav_name[1024] = {0}; + n = 0; //rolling sine wave 'degree' - if (opts->pulse_digi_rate_out == 8000) strncpy(wav_name, "/usr/share/tone8.wav", 1023); - if (opts->pulse_digi_rate_out == 48000) strncpy(wav_name, "/usr/share/tone48.wav", 1023); - if (opts->pulse_digi_rate_out == 24000) strncpy(wav_name, "/usr/share/tone24.wav", 1023); - if (opts->audio_out_type == 5) strncpy(wav_name, "/usr/share/tone24.wav", 1023); - wav_name[1023] = '\0'; - struct stat stat_buf; - if (stat(wav_name, &stat_buf) == 0) + //each j increment is 20 ms at 160 samples / 8 kHz + for (j = 0; j < 3; j++) { - beep = fopen (wav_name, "ro"); - uint8_t buf[1024]; - memset (buf, 0, sizeof(buf)); - int loop = 1; - while (loop == 1) + //'zero' out stereo mix samples + memset (samp_fs, 0.1f, sizeof(samp_fs)); + memset (samp_ss, 0, sizeof(samp_ss)); + + //generate a tone (ID=45, AD=103, rolling n value) + soft_tonef(samp_f, n, 45, 103); + + //convert float to short if required + if (opts->floating_point == 0) { - fread(buf, sizeof(buf), 1, beep); - if ( feof (beep) ) + mbe_floattoshort(samp_f, samp_s); + for (i = 0; i < 160; i++) { - loop = 0; + samp_s[i] *= 4000; //apply gain + samp_ss[(i*2)+lr] = samp_s[i]; } - if (loop == 1) - { - //only beep on R if dmr_stereo is active and slot 2, else beep on L - if (type == 0 && opts->dmr_stereo == 1 && opts->audio_out == 1) - { - pa_simple_write(opts->pulse_digi_dev_out, buf, sizeof(buf), NULL); - //fprintf (stderr, "BEEP 0 24\n"); - } - if (type == 1 && opts->dmr_stereo == 1 && opts->audio_out == 1) - { - pa_simple_write(opts->pulse_digi_dev_outR, buf, sizeof(buf), NULL); - //fprintf (stderr, "BEEP 1 24\n"); - } - if (opts->dmr_stereo == 0 && opts->audio_out == 1) - { - pa_simple_write(opts->pulse_digi_dev_out, buf, sizeof(buf), NULL); - //fprintf (stderr, "BEEP 0 8\n"); - } - - - } - } - fclose (beep); + //load returned tone sample into appropriate channel -- left = +0; right = +1; + for (i = 0; i < 160; i++) + samp_fs[(i*2)+lr] = samp_f[i]; + + //play sample 3 times (20ms x 3 = 60ms) + if (opts->audio_out_type == 0) //Pulse Audio + { + if (opts->pulse_digi_out_channels == 2 && opts->floating_point == 1) + pa_simple_write(opts->pulse_digi_dev_out, samp_fs, 320*4, NULL); + + if (opts->pulse_digi_out_channels == 1 && opts->floating_point == 1) + pa_simple_write(opts->pulse_digi_dev_out, samp_f, 160*4, NULL); + + if (opts->pulse_digi_out_channels == 2 && opts->floating_point == 0) + pa_simple_write(opts->pulse_digi_dev_out, samp_ss, 320*2, NULL); + + if (opts->pulse_digi_out_channels == 1 && opts->floating_point == 0) + pa_simple_write(opts->pulse_digi_dev_out, samp_s, 160*2, NULL); + + } + + else if (opts->audio_out_type == 1) //STDOUT + { + if (opts->pulse_digi_out_channels == 2 && opts->floating_point == 1) + write(opts->audio_out_fd, samp_fs, 320*4); + + if (opts->pulse_digi_out_channels == 1 && opts->floating_point == 1) + write(opts->audio_out_fd, samp_f, 160*4); + + if (opts->pulse_digi_out_channels == 2 && opts->floating_point == 0) + write(opts->audio_out_fd, samp_ss, 320*2); + + if (opts->pulse_digi_out_channels == 1 && opts->floating_point == 0) + write(opts->audio_out_fd, samp_s, 160*2); + } + + else if (opts->audio_out_type == 2) //OSS Variable Output (no float) + { + + if (opts->pulse_digi_out_channels == 2 && opts->floating_point == 0) + write(opts->audio_out_fd, samp_ss, 320*2); + + if (opts->pulse_digi_out_channels == 1 && opts->floating_point == 0) + write(opts->audio_out_fd, samp_s, 160*2); + } + + else if (opts->audio_out_type == 5) //OSS 48k/1 configuration with upsample + { + short prev = 0; + for (i = 0; i < 160; i++) + { + upsampleS (samp_s[i], prev, outbuf); + samp_su[(i*6)+0] = outbuf[0]; + samp_su[(i*6)+1] = outbuf[1]; + samp_su[(i*6)+2] = outbuf[2]; + samp_su[(i*6)+3] = outbuf[3]; + samp_su[(i*6)+4] = outbuf[4]; + samp_su[(i*6)+5] = outbuf[5]; + } + + write (opts->audio_out_fd, samp_su, 960*2); + } + } } -#endif char * getDateN(void) { char datename[80]; //bug in 32-bit Ubuntu when using date in filename, date is garbage text diff --git a/tone24.wav b/tone24.wav deleted file mode 100644 index bac507830c09b08e17bde93ac93c857409aba9ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9058 zcmYkCcT|(-|Na3*HiSI_hy+3)kmPA=>%i68*6un%t5rb|5Rj#!Oa~4SL^cAVtqVo% zvQw)fj;`lP2nmEe!j`?4ey`m6`<&nDzdeTozH(i!_jPC8M<0B!g`=kCwQAG*{vlBg zEHyPXb^N!wR88%qx4N2!8cS{0&ZwPlHfwdyu5H0a=M%g%zRV*^ z_=D&;RY1+93`FMz``pW2?{U|2HqD>5*>7>(I9GpzmV-va%$f1+L;k(rcIqn?jaqdD z)j2XtsgvXe^C!KBE~UemGVzTHE7?%h>RQvrC9T&xc0KnQOdl(o)=~GKcSi49R=hdS z=7@caqZRjE*GaykKqed#9iig>_PI%RD{xXVb^V zds^9oo?O2tu>}thRaU^pMKlMI+lW~w(N%LiS)${6V8;z6&oq@gnLn-4` zGY%TQT4(f&jbkiy*=y%7CWGEfE9qY5pd?-DBKK50 zuDjVZs7&tK*|&GNaH3_FKPOB(&)~d?zhyVu#bJ^Y>f+yzOl+xic8*S5tqAFc0DJd$fy$|ORuF%w6} z(fZ6=;!25O7EV-Kf| z)Hj2r^Q^<>ZZ>iD362)r)vjZFXF(-cI!q-}L!wHsG{RryYQv3lOt9zL95cVbI<2>P zp1%51u;e!w^!z$lGHLv{cDRZqyIJvGTCl zS>u&6b{alf*UyxW2rTuv>GN(mO*s5z z>t%J;^nzim&eFMkFRo2SjrjG)bXT_}fTbSAUAazWt;9pjVq)odn#BmkGKqfWJ$Wx! zN@%WXOYHXP44AxNfmgve|O$n|5~=1Up~h9pL{7mY#?rs8f_R z#TK0aOH$XT+*O{EF2y02R)Qs-Kn#|SP)T5k0ZU{2 z)vo5;LypJnU64!XS*ge+ef9F`6NIJ99ZOpc8o#LRM=ss2cp?sCE`y~<^i{@DVl6F@ zWh0jwkxMz90lk4kXT~Kn^ELdnvh>dxM_U-M*CUt8xV6ZolVFKWouNXhC!!O=GLJ~) zlE3pGgr(ESrQ^D5G}YDaOvQ})4um6@Hn)7zkcC`2Uio3gKJhXpg+4&H(a)JENru!_ zzD)5DxiqRg)#ck4IDBEEaaJ^EkM=o(LX$m~z3ll8Q=AZ&0Jk>xdcjt(luNCnvXM($ zJ-XbCc|SM}J3K`$Wg(ZM!P3Z!E0g<1zV1)#u4+5ne5}4*abK=g*??Tq1xtyv8N&xl zdX?q!HpOA&Qd3)e_m=+sBiAQKU%WN z3) zVd+fe`l{TT4;#K}dC(r#<2w*L`ZIFrQ_UpZLZejV(hab*+xZr6KmUQp5#-W-d|J&Y z8{|@?y9BxPKIhB%2JA44E5>J$OST%)nVfOoA-~@IPGe;waw)sI03GKjxyF>EZA#E_ zPmxRJvcam)YxU4^*N{uw22;k$rw!G;kV{3Z6XpwSj@ieOjvM2<2&7;skvc*Ri=;vq z!7y^k9xNr=JKLN9OQ(=a#_Er!50C9a$KC1>v>Jn@;VJ{!jf%g;;mo%n_!(V-T(XuH zfhEnl`bJY_E^=uPa*3I-0ZY01=ZzyR^pQ);Irq5=*D&`}0yB{{{=O=fjtZZ6MDTC$ z0-S$aa0MNgYWA(sVdT>E%Ri_8^f1Q>3zdWH0RsI+9#5Z8|J$SDue^@r9^5}BoR83T(UyP#oD`}8|Im+ zKbk&1wsSBT9rsSFQR641<4P-@A(yV;rfoq9So#wkr($VsRqE@GJ3~j&9drj14PSCc$33dM-ZZH^*|noD1isXYjtkW;M91y6 z>|t}kQlN{UTf4iG_)-RZDNVFgxWQw9XC5bo z4@JS$S;`(P9TSAO*SkI>Ea{@-&Kqax?}RUjXR^or;NE$i=E~Yejk>(*T$!WPN>U16 z3Zt*kq0BR|WQ<(;1n#}CwFE5f8azpI$$MU!UIFVESW19;s|tH0DP&Gu}3cD%kq&+ zwT&!ge&=pt5uNxyTj?98Nt1OAkEufu%jjrE7Le zt<%gd8lBR8Uvm~LCBT=_*Y#ImOO=5m9 zlV~6BXu^HpbppP`2>V4Rz|x55Um+hXec)=!O$19qn^^O2amQ_)$5JnwJ~HNyTq^B& z1G%KS<5;q5=(teiQYdn%gs@a7%ONb8f+c_CQu??Q?!61{T}W8kh>m**mLl9wkd8Y; z?WgYJj=PUsy37m09e3SsrFDwg1^Chjnse2D1WVfnB6}XUdm)!{YrLw`DwpDpTR}Rm zgYIEsC8u%6tx!CzD`^@6O9AM(;)%N1H|K7rqr&fB=-ZV+FJ>8?Y^#npF#C0(%OBDTOC7f=&6R+wTF_>6SiEx5NII z+R=`?%5{YAL^gpWvI)qDFRga9088=6rC09l4PPq59p?{UDj_VbgL|`(OaH=`zCjwQ zShB??a6y(;Jr}uTq0B?a`3+^_j$>==);f!hi$X4`SSrUR5KcA$HaaeXDiHj z$fe(jFQu8CH#!0LR)c%T!IvVDOI|IXz0RfgDh?o*P9q`O;7j`@SyF*~k>Wn?IF)T_V=OL@qpgF2q*xNF3h z5^%>IC7Zxqxqf90+}nVOfqR?4y%iGO$_MbJ1ma8aU?~C}H-wIh)+sj3G2LMGkL`fN zPfiBBLFCfgVCgF=k6J{n2TNUGX(#SDXNN(!cQ)}Q(VV*33ln>W{rXOHjiBSo>z2Tm z(xeHJ4){_C$)$th#mJ>ixZ^$mOXcvT9RmrYcc#?UJ_Jj}aBolR>+q#O=Mv)HCx|bl zQkGyTh4@k#I&LFainJ&;&W3y2Ye;a%1%Rb|Yyu69>UH_JChRZ3(j#sS*_SNIz7!6YP9v8h;of_ke?l%TwazvxAa|Ua+Am;f z2l1tCEo&OGYc{}_R)eK?m~`B6t#lW&Pm+sGU>Q12wF#*1xIM(ZRV?Komx6G|If12M z7k}Jwt=I%Sk^5g!8OWtg*aQs0lFFC7t+x4P!GHk>jo4~6(u3Pata;XNJ zz^i?U1(xb1I%Ho;KrU6b9qHZ)maa?=ViSnb$-^e#Mcn(glL^@b-hwY}MM8K|n~8h- zU=x@EOFisBa>s>ei->!N4*MXNhLtzK(hB6#S?o*CnKtB7D(#6oZdJwU%C*>+K0?Rc z1xx<$r8`rTFTVgwg+`~$-o+;H+k)-Rx3LM7dmM%@9fU<#Q)Z%*f+*xtIXZ6rd_C+- z=aEZ3S{&q38r<8zx2V&A+;Qisvt_nYdu)~WL2wD&`w?;Pv8s=24IAHSy#ZhHA3Q$x zh-?C9!BRZ-rK9$T9Syl3ViRx^{3{%UFCE2J$-tLXn}8|zh+~XBtO^~MjE>X6R(WJB zU@#CYz0qpg_<8MMmA>p2x#KP%4WH6C7;A|Q+`FjyMQsCosjzcbZvcEr4)@-vm7`yT zO+XJUy@!rdkWIh_cU&qJLj5I5BAdVsblk5CF5`|n3->;TT+&qgX(|?5Wkk=@_KoPc zJak+t?zl*FTsr>3?Qrk?*q7Yo%aKc^@TJtQZGFMR=O#L5-QeB@21O=;mK|W}1z7TN zQ@Xbcyus30YBQB7T1Z%8@$Mj({;}O?m1|mrtsX`Z?I zpVLX$1VW$R><}WC*4GYI8KL8ziT5!VkxLJ-d$T3B((}kAHEaUb=(ru&D)Yu=GZxsr zbM-G7hgoQ06Hu{KiA^9yV2XVy9Ub=&EIr0nS;F%}$CcPEw@ydL9fy0*B^{^orSf)f zxOYa)X1Mn%Y?Z29iln<}C3f$#=(wfW1b%25R-W$q3hrGr(J|{ZCsI4tpcuRNbFehS z2|~v;lRIuDR;{h%j$4n8W073?%XSkw?wnx^SQ>ayf~|6Ae|)#J?F3lrR@{-ZuvH4h zI!pq6ls07C&~b*?1lqAxo@kb}#lgMzVfXGvF2!N1%tXgkV5|Jj$%r?Ej(by>A^IA> zt0(rQHbI;FPPe_-1UL?z>>zBF1qMOzB_(n19et@?ePHQ9-FpgWYyt<#?j43rU?tpJ z#nKk|()$ftun9!=Y(_5qIyFyiHCQS(It!LA+Wmn$?t8L(A4kWj_9a!voy5LW3HM$G zU(#bA085$J1RTg#sq&?B*eX@Nl#4sg4jp$3zVwQvzpz!B$p+xwMsV+I9l@{No29-9 zcU&e>u;hz7E(0BBPj>H%#t{~V>~+`#9&;;PBjHQd zA~PgJB=s09-Svne`_hl-xK&^&kNDDDt&%@yul9NDOTJ*q1-TUHvJ<}4f?QgJrDrobPL)f8ZhE|* z&~YkX%7QP&>MY0ZT{0Ot;)_i{4);EaTza*8i^O_hDW3RJ72I3pOR@DyWE0qot?~vs zZt2{8I+qR4ViR~`JK^v>d`Y!?FM%&@!cSdJ-cZ`$OS{o=3y@2J*q2o9{RVO=2X835 z`p$F>Dz9PpUZD`klfhCq(}_DS1@3(an?NdjDGyuaX54X+J=@3~r`iOL=zfcRX_@t9 zyL({iIxn367`u0wC=AJOk2~%-?zn2#C&;CBU@6+-0=7yYEjx`m+;RRxU-uScU#e-G zQ%sxM$OP>KouoSJ81!VCe{aX$3lt zPwu#*SljzV6|Zy2jJ(Hju~in~4Q1mzGqNvjM=q6ih+0|LD#xmH;7k9Cqu}0t^uP3V zxVMG07@L54U3H@+I?kupcPM+jdd7;dbP4XQg-zf+&I89ZxH`xSQ!O~*#9+xG0TeuGUk|FO`r|0Ai`N@LltAlY6Q}`8cX7uZhA&lPtK5N2;0D}#5w^+;=(tz= z(jDZIilw)ZOIwjk%fM0_-sAl69`^zr*N6AG0+VxOt5jmERP9S?aPLxd+;Rn<)qQ(ecilty(_E)a}G9vV~*zB<*uWA4|LoBc|#e5FS!av`S0NkCDHLP zcJCu_?^Lj4^!jZ#@cDOeZ#`@RTS2G(M(x{JI)uIfNX}N zu?=r1=Zz2HZTE}$t8vH4T|<#eZ1Nr#PTo)+;*Pt;+f8=w<=B^0o507KFJAtHO<*T- z>F(>@djrX(19;obL>hmL!dOR76A7@I&dw#vQOy^GLseQZat6iD2=1-thW zyo_z7QbkLI>ph14cgJn8%0b5+(pia3;0np5*zTIP=;mbP(gV3BHi0+5(joc~_9Y7Y zk~Vy)2b(}5Hi0<8QVGeW7{bz8yvOx9{O+W|n{r!=x7}pX7Ua@0YyvIVDg)t5lN=Z9 zOM#YI=s49I%KzI0Qo6>JSDPN=juU_-)q7kg93ma=t=cM6D!s`YidV~Ha>pGS{S9~A zn%BGc3T%}>;XUpuHUZUp+yhY*Sh7aP9T!BPD9gRSxe-gZsM8%iGDP+V-1><>8FU=x_+bCFBK zc-vLI$4QV&h%# z00E37qa1g}FP@V`B!FxTar@+%P7@Kr#Ws)xaVPFW1M(fKYyI}O^?f4g_(gu&^V{Fv zYp=ETey_f+u3)pv^^b4=Lv8DU50}5}a=G02`_}>d_!qY;&-Jn^*!*GhkDKtntJE`7 z-e0lVyWMxUYP@={e@(;M#$8RZz)bT8!H1#N)+eF;L03yS@NUzp#4V zd!b^gyv#F~nMxOoZBJbu9!M@7nm2enaVtLDd$wm!cR}n(baCWVcuC|)G(Q&Vj`!T| zy&jJwiU(gG>Q7!C-kvHLn@-PW=6fc}FIH?q{8ZIsb(?=(!>Y#jnmPmSmi@sei2pG3 zL2$bHlfbT~HI3^VLjLLMAFKSnP2K@3{$#pvtSkcA|9ZrKx9L$Q6 zbYUbMUX1rMe!S=V-mCG`iNe9x5dZ7p9jUyrsdOe&=9$F%-@yCtRi&%%oC`JDJ@c!+oLhJq0>ZAuN_YmB4qd|g>+$`We~)Jx_4lT?2Je^ruWsCp_djnw6nqqF zL;epSerMqKh`+XBuc^Np)ZakGWcfVLbF2Qo9qv!QhWMxO{Wbr`qpwD~!mmb-9|HWi-*pK&5;`{Uc7m)vY-;apjhWxK-Y-oz&{fDjoI}pq?M*?_Y=do2tHJ`u}3Z1it^Asei>E55B+DU#MH^KZ5)pk7iDH;QQak`&obT z{_W_0`Tn!`{%?7=`X1u_+JAgM^UwM_6r6320e`&c|Gnsc>A${;Y2=^ZzX<*R&G1*r zMMLw^|BTP~=L3JF|5$&mrvGl5_b*2M>-V2S|4aSX0{^C~gQ&lijql+5OaDv%xmx)B zi9a1C|23xmB>p7u*KhTo2j71ruKE8M^&boWP2?o%FWCKM&q(ixqyE_clj*t4JmAj& z@SpfMQQZ#wU5Wgk1pe(e_5Uz*82A$b{;zD@VBv2)>Tke$|1aZ@_I{bgf5AWE|C#Lf zUpjOldBwtC)<5Tu&-C9U;(LLAyG;Et|Lwqk;$Ii=SMtyKBk!L9{z?7US@Wk1?^paG z{w}ck-;MZ!Kb?s(;1Bz+E>%31M*SCiW=;G$-yP&X$u$qVyG>YwqyLH`qf-B$d~UO(c?{9BFh9}c*Xf8xI# zzp`;n!+!tM>IdfioWHC;;y>%ZANW%=7){(T-(ULwRp9?3gTF!KpZzcOe*ySkXXc;c z59hzkU%{U))c*&;`=JixpWmPTR|))K{oMur`+$GUzr?RY|Mww&vBCeFc>kX6LR0?{ z^#8GF9_s&d;O}+BFGK%dGVd=k`7gouC;s^nU+eGvrsIJE%-^3d{~v_@fce{n`M09+ zjfS9^|2upeykDXJJ)S(*vvdjY=Q8H+(xI}!6DI#>ds+3qz;DZ{_&eD}dW z+QENTg8xL!{CR}@6aSur|Lkg7+qfF_C;Ughzr^wn7PU+*A(2K?s<@c$9&Z`O*x2K+0H`txV!pWF2`?ZN#0&di@uga0>y zKP^`MMYHoy_z&N|4ERI-$^PT~Wo~!sR<}dk=;7{)RbNTNS-cSC~hyK&~ zL;Sm#T-`m4?8ALiuS{~GjPX_o(!f0BQ5{tN$}K>YQnKjFWJ4FA*l zNBy(Dp$+&;{!RTU@zda+hA^5Ax5<>Al^bV*YUcl|p~@f&bT} zO2(d<{M-DK^JgviFZD0^FZIWR&>w?SMt@cU|JyA7Dg2xISNPB6;R~4m#lYX|@$bR^ z+rhu7|8)K-{+=}a{wMKe z{$Bw97W@*PPwf8^hse=>imKl8!=sDJhQ-!uBJ(xE>^f6M%T$M8SuzZCQb_3tF` zPxMbscK$>Y*YN&0=1*bl&zL_te_PG`k@>sK!GA=5lmFLY{t^GzS@@&)PyI{$-)-uT z`u~oJPyRCx{WpXD^8^3v_mh7FE&i|dPyS)^f2sdceE&Su-z?_;-+JE$|9=Yp?=||1 z{Oh2>AMy|S4?CLHH?G3`llij|{A0X)zNJ59{w)Fi2>zWh?>}O`zx02u{w4oY{VV

W}`*1Mn}M|MXwhq5d@gGXI(XLi8W;hw*Lx?}q-S{#^k6Q(*M>D87Ff{>$>A z^Qiwi!~ZiGiBJ7a{M!rsvHb_mU;00yzgHOkKU4if)eZ;$VSM^8l7ERW`KSLQ`OnMp zFXBJvALoA_=D+G6^8W|O|9<0t>^Az>+5h4{tpopjmgT?H|4#pj{)_N`$^W0C6_FG0 ze~y6vkpJ=fhZ7~}|9<0t6lD1q{TDy_kNy|uzv>Ukzwp1^mi`z={nLNCfcaMp{3ZU> zn)gfpOZ~UP{~`Wx{we>|`V;;y{EzRS0{-&-_Yt4?r}OVH`1iinyTBjvU*fNP|2vpJ z)L%1*pAY_9Y~_C$`akTzpW{aV%lB{YK4<37NlX87{)_%m{w@9!zken0m-R3Hhw@+Q zKl&fkU*i9;|C#@MQ-1?l{JU-WZ^w-OV*GqF|8If+691+D$-n9Uu>aWqHRk&t@UL?4 zFY15ofBJ8#KeikHiTYpkx2^x!f1JOqMt|q>e`o%c|Fi!^f6)IF{3rjW{y7Z%=lnYW z|AGG33h)n^fAu-vpZZ_$U;L+$-gB1z5dKI0t^C7@|EmA!KW)kBKk;7~pYuojM}B{& z|8oiYrwsf*4gEv>?X&zB>Q7sL)Bh0viTa!V8~I;9`hOev-!sf#+ka#Ik^ip%|04e< z{!srOwD`Z*;v5B4AR5A~PiU;U3K;Q!+P>i4JrDEi0dA75ksFT?!pN?f((kND5z-{QZXLH~>Y zw_@mA@*3V>Z2S-U4}B*8_YhzE@03;l%6}rpe^vfb;f62e-e@Xp~8~;=F7xl+p!@tRY=8XSE{&^VvAG7>t^1nw_Z^Qqk|0MID`cL$? z)ZZ}jALuTP{abXI!+)Uu7yi3wXb}FZ_z(17r;PtY{1yLiHS}ND_;2FBivL3XN&QRz zZ=3J8-g6amz#o@u%JAQ>;eRd8&L8T3^8ZDK{~R^`KjUAA|5`Y>GMoPi!@sA%|F%H? zNd3|Or~mGD_)oU}6aSa^L;v4n<)8S={R91f@!vWB1%F?SoB;o`{crLA$p6LvBmWWp zN&Z9si~O?-`;R{Wf2n`ee>>ucVEB}=F$NCffDfP$qYyP$VH2;0*zhdLRssGIR z@AQ9e}?PmX={$COF=a*Lgi@|^Bf6#xKGXC#Gx%y8p?*D{;{Bv-;`QO2R*8>0PziWKE z|2ThD{|Nr+{!8=^=l|KBVZ6W7;$K(Le@^}-`kVf{*YN)+`j7q>{YUkm=>P76|M?L0 zzZw3U%zvrBZ-xhx3x-}EJcj)v=U))|pZ>4#FZI8q|CIlU{$&5_{!8$GmGR%{e~SMv z{)er3`||f&5GM z-}K*q-G9i{f7HLSf7bmc@lW2Lg#J_ia}xYt{154W>c39{Q_%mZ(0=6q5d0VN5Bfhc zf2hCvjsK?jFZDzuSL8o)n)_GT|K?fyANqgXzdHFxDey=4U!uRr|26;Wzl#69 z5&IwMf6ia^U(|o6|3d#s{D0+Nvj3(3HEQwCW!CH7u$ ze(C>6{arx+(f=7m{5a+h{g*|+fBXKx_Wy1FMfT6m{R8(;+`m5u|Dyi2{jW8^pZ)%y z!N0bm|GEFA{?z@i&A)T~C+dIMfBew;6yg50+s5==>G^Dg2B2lm4^pf5`u3|7-7`bNx5rU#kCf{!stY|9xuS zFZTzs|0=Zhj}_VdH|LMkAMr=}?=!Ri;Qm?tXB+?c{keZm8~&fWf9CxG_n+eb$^AjC zh5z(lCe8j${O_0We);|ypY_lEZ#(**^Oyen;vvr89mxM|dOGtP^#1_#_cr7I9Dx4U z`afj(FVtVLz)s-bYO{Z^^+y@vPecET|3v(e`e*%#|H}H~{fXYc$ou;({-yk5AnQL+ z|7iUm!2QV{v;UL(8|qK#Kk^UdKjOcN|Lo+yy8n^;7n#4KhJWh!=lpZIj80sNEx`*wqWa{t5pi~d+XR0#fgC4MJ||JwXd?oT{Mf0F;|{#Exc zx%yl0KY0Hm_cywKm;Gly@JIJw!oSIX=zoa+VEdmR8~*i0)_;Eu_aE1Ww`TWWvVX3z z{J%=;{zCMZ_z$xGlKA9*x_?*ymHSWLKiK}O-XGBa%DsP~|IGMrr^;~u!2O%VSN~7% zkKE?|#>OAnzqZ5w)BVqEcK<5=gYaK_|6==Z;=kWE{KLM#VE<8nQ~ywZssAbaAKqW+ z{$1ve?mzFE`LFj^;{PNa{Ezn!x_|5h|Cjrt7yajYvwu_m|0eD)9#{P@^hc%T|IT6l za{o;KQ~j3>@IQtB3;&yM_AlZ;3I8Sk=lz4;zjVQW`?dWG_kX&75&xh5lguBvzp?eV z@=x7=3jg8!D}n#U{o_{L-w^+$|DF54T>szp-);V--(U7mdVeMNFOR@K)c;ZaL;bDw zr}gjLzmH)5aUS|l_ixgF^q2{Ywz{H_rP%`~HRdKi*%+ z{?ESuyB)s{|7(xszw7&h7XRn{8TE(opGnkTvAMr`3;z4#s-H3c*P8p2PWUgf|C9HB z0{qqf)B0on#eWt5PyEl^`d9xeg!nglZ(;veX7;~w|DgLP=lmD_Dfd^Re?Bz(pPkS@ zvj61%#X0|Z|8d#uzwP@U=l+%cC+`nc|E@6pyWAhj`_E(lyA|~}j{V0*_;1|5lmCeS zsQWkazYcSM;D`UN`v<4~5dG_{f4TqS{L}r1%wOGq>;6ssck-__#(&9J{Ga{D{U7m% z`zO8su;&l?_Z4%0Ap0-XzjA-`3j7!PUmD-$pXz@)_us9!zoGxg{jcnwg@4HXf#`4U z|2M*ap#E^f|1O38(EWpr|8jrE`TOT6^{?z-W&bb!XNjf1rY-+Z_a8d{#s60RBm93a z_|N02zxVwe{4c$~)cY&tKXU)&+`s7eSN~P-57ht3y}z>cr@epI`>R&7|Fr#gr~fPW zkG%hs`%~_JZ2yJ)PyHY6U$}p#{*(SA{*!-+|Hbb1frTV8hyZ@8@!+peO{ptOk+#hoP%=z=K(SMx3+`mZuX?*AY zPxy!MKgQSn|2g2#P4KTG_@8H!*A4&R{!#sJ=l!qlpJo3+|1WIz4;zgCruSFMe|Y~% z|DX3~y8lrA`QrVf?!V~&*!*Ai|1aJj%lqa2nBSlJOZ;EezjA+O*T3H1aQ?FXd4Ku} z?hoe-|CaqT{a5iHd4E!1?%$aITKJE0f2{X!zs5i0{+#nq{a4~2?;mshC-r~+52+eB A;s5{u diff --git a/tone8.wav b/tone8.wav deleted file mode 100644 index 479f78284683e7d8446e7852df053f36f4fd88f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4044 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 TN6_Cj;Gh1-@5dzc