retime.c 182 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117211821192120212121222123212421252126212721282129213021312132213321342135213621372138213921402141214221432144214521462147214821492150215121522153215421552156215721582159216021612162216321642165216621672168216921702171217221732174217521762177217821792180218121822183218421852186218721882189219021912192219321942195219621972198219922002201220222032204220522062207220822092210221122122213221422152216221722182219222022212222222322242225222622272228222922302231223222332234223522362237223822392240224122422243224422452246224722482249225022512252225322542255225622572258225922602261226222632264226522662267226822692270227122722273227422752276227722782279228022812282228322842285228622872288228922902291229222932294229522962297229822992300230123022303230423052306230723082309231023112312231323142315231623172318231923202321232223232324232523262327232823292330233123322333233423352336233723382339234023412342234323442345234623472348234923502351235223532354235523562357235823592360236123622363236423652366236723682369237023712372237323742375237623772378237923802381238223832384238523862387238823892390239123922393239423952396239723982399240024012402240324042405240624072408240924102411241224132414241524162417241824192420242124222423242424252426242724282429243024312432243324342435243624372438243924402441244224432444244524462447244824492450245124522453245424552456245724582459246024612462246324642465246624672468246924702471247224732474247524762477247824792480248124822483248424852486248724882489249024912492249324942495249624972498249925002501250225032504250525062507250825092510251125122513251425152516251725182519252025212522252325242525252625272528252925302531253225332534253525362537253825392540254125422543254425452546254725482549255025512552255325542555255625572558255925602561256225632564256525662567256825692570257125722573257425752576257725782579258025812582258325842585258625872588258925902591259225932594259525962597259825992600260126022603260426052606260726082609261026112612261326142615261626172618261926202621262226232624262526262627262826292630263126322633263426352636263726382639264026412642264326442645264626472648264926502651265226532654265526562657265826592660266126622663266426652666266726682669267026712672267326742675267626772678267926802681268226832684268526862687268826892690269126922693269426952696269726982699270027012702270327042705270627072708270927102711271227132714271527162717271827192720272127222723272427252726272727282729273027312732273327342735273627372738273927402741274227432744274527462747274827492750275127522753275427552756275727582759276027612762276327642765276627672768276927702771277227732774277527762777277827792780278127822783278427852786278727882789279027912792279327942795279627972798279928002801280228032804280528062807280828092810281128122813281428152816281728182819282028212822282328242825282628272828282928302831283228332834283528362837283828392840284128422843284428452846284728482849285028512852285328542855285628572858285928602861286228632864286528662867286828692870287128722873287428752876287728782879288028812882288328842885288628872888288928902891289228932894289528962897289828992900290129022903290429052906290729082909291029112912291329142915291629172918291929202921292229232924292529262927292829292930293129322933293429352936293729382939294029412942294329442945294629472948294929502951295229532954295529562957295829592960296129622963296429652966296729682969297029712972297329742975297629772978297929802981298229832984298529862987298829892990299129922993299429952996299729982999300030013002300330043005300630073008300930103011301230133014301530163017301830193020302130223023302430253026302730283029303030313032303330343035303630373038303930403041304230433044304530463047304830493050305130523053305430553056305730583059306030613062306330643065306630673068306930703071307230733074307530763077307830793080308130823083308430853086308730883089309030913092309330943095309630973098309931003101310231033104310531063107310831093110311131123113311431153116311731183119312031213122312331243125312631273128312931303131313231333134313531363137313831393140314131423143314431453146314731483149315031513152315331543155315631573158315931603161316231633164316531663167316831693170317131723173317431753176317731783179318031813182318331843185318631873188318931903191319231933194319531963197319831993200320132023203320432053206320732083209321032113212321332143215321632173218321932203221322232233224322532263227322832293230323132323233323432353236323732383239324032413242324332443245324632473248324932503251325232533254325532563257325832593260326132623263326432653266326732683269327032713272327332743275327632773278327932803281328232833284328532863287328832893290329132923293329432953296329732983299330033013302330333043305330633073308330933103311331233133314331533163317331833193320332133223323332433253326332733283329333033313332333333343335333633373338333933403341334233433344334533463347334833493350335133523353335433553356335733583359336033613362336333643365336633673368336933703371337233733374337533763377337833793380338133823383338433853386338733883389339033913392339333943395339633973398339934003401340234033404340534063407340834093410341134123413341434153416341734183419342034213422342334243425342634273428342934303431343234333434343534363437343834393440344134423443344434453446344734483449345034513452345334543455345634573458345934603461346234633464346534663467346834693470347134723473347434753476347734783479348034813482348334843485348634873488348934903491349234933494349534963497349834993500350135023503350435053506350735083509351035113512351335143515351635173518351935203521352235233524352535263527352835293530353135323533353435353536353735383539354035413542354335443545354635473548354935503551355235533554355535563557355835593560356135623563356435653566356735683569357035713572357335743575357635773578357935803581358235833584358535863587358835893590359135923593359435953596359735983599360036013602360336043605360636073608360936103611361236133614361536163617361836193620362136223623362436253626362736283629363036313632363336343635363636373638363936403641364236433644364536463647364836493650365136523653365436553656365736583659366036613662366336643665366636673668366936703671367236733674367536763677367836793680368136823683368436853686368736883689369036913692369336943695369636973698369937003701370237033704370537063707370837093710371137123713371437153716371737183719372037213722372337243725372637273728372937303731373237333734373537363737373837393740374137423743374437453746374737483749375037513752375337543755375637573758375937603761376237633764376537663767376837693770377137723773377437753776377737783779378037813782378337843785378637873788378937903791379237933794379537963797379837993800380138023803380438053806380738083809381038113812381338143815381638173818381938203821382238233824382538263827382838293830383138323833383438353836383738383839384038413842384338443845384638473848384938503851385238533854385538563857385838593860386138623863386438653866386738683869387038713872387338743875387638773878387938803881388238833884388538863887388838893890389138923893389438953896389738983899390039013902390339043905390639073908390939103911391239133914391539163917391839193920392139223923392439253926392739283929393039313932393339343935393639373938393939403941394239433944394539463947394839493950395139523953395439553956395739583959396039613962396339643965396639673968396939703971397239733974397539763977397839793980398139823983398439853986398739883989399039913992399339943995399639973998399940004001400240034004400540064007400840094010401140124013401440154016401740184019402040214022402340244025402640274028402940304031403240334034403540364037403840394040404140424043404440454046404740484049405040514052405340544055405640574058405940604061406240634064406540664067406840694070407140724073407440754076407740784079408040814082408340844085408640874088408940904091409240934094409540964097409840994100410141024103410441054106410741084109411041114112411341144115411641174118411941204121412241234124412541264127412841294130413141324133413441354136413741384139414041414142414341444145414641474148414941504151415241534154415541564157415841594160416141624163416441654166416741684169417041714172417341744175417641774178417941804181418241834184418541864187418841894190419141924193419441954196419741984199420042014202420342044205420642074208420942104211421242134214421542164217421842194220422142224223422442254226422742284229423042314232423342344235423642374238423942404241424242434244424542464247424842494250425142524253425442554256425742584259426042614262426342644265426642674268426942704271427242734274427542764277427842794280428142824283428442854286428742884289429042914292429342944295429642974298429943004301430243034304430543064307430843094310431143124313431443154316431743184319432043214322432343244325432643274328432943304331433243334334433543364337433843394340434143424343434443454346434743484349435043514352435343544355435643574358435943604361436243634364436543664367436843694370437143724373437443754376437743784379438043814382438343844385438643874388438943904391439243934394439543964397439843994400440144024403440444054406440744084409441044114412441344144415441644174418441944204421442244234424442544264427
  1. /*
  2. * Copyright (c) 1983-2023 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <structures.h>
  24. #include <tkglobals.h>
  25. #include <pnames.h>
  26. #include <filetype.h>
  27. #include <processno.h>
  28. #include <modeno.h>
  29. #include <logic.h>
  30. #include <globcon.h>
  31. #include <cdpmain.h>
  32. #include <math.h>
  33. #include <mixxcon.h>
  34. #include <osbind.h>
  35. #include <standalone.h>
  36. #include <ctype.h>
  37. #include <sfsys.h>
  38. #include <string.h>
  39. #include <srates.h>
  40. #include <limits.h>
  41. #if defined unix || defined __GNUC__
  42. #define round(x) lround((x))
  43. #endif
  44. #ifndef HUGE
  45. #define HUGE 3.40282347e+38F
  46. #endif
  47. char errstr[2400];
  48. int anal_infiles = 1;
  49. int sloom = 0;
  50. int sloombatch = 0;
  51. const char* cdp_version = "7.1.0";
  52. char infilename[1000];
  53. #define BIGGERSIL (8) /* keep only silences which are more than 1/8 length of max silence */
  54. #define RETIME_ENVSIZE (1000)
  55. #define RETIME_WINSIZE (20)
  56. //CDP LIB REPLACEMENTS
  57. static int check_retime_param_validity_and_consistency(dataptr dz);
  58. static int setup_retime_application(dataptr dz);
  59. static int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz);
  60. static int parse_infile_and_check_type(char **cmdline,dataptr dz);
  61. static int setup_retime_param_ranges_and_defaults(dataptr dz);
  62. static int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz);
  63. static int setup_and_init_input_param_activity(dataptr dz,int tipc);
  64. static int setup_input_param_defaultval_stores(int tipc,aplptr ap);
  65. static int establish_application(dataptr dz);
  66. static int initialise_vflags(dataptr dz);
  67. static int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz);
  68. static int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz);
  69. static int mark_parameter_types(dataptr dz,aplptr ap);
  70. static int assign_file_data_storage(int infilecnt,dataptr dz);
  71. static int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q);
  72. static int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz);
  73. static int get_the_mode_from_cmdline(char *str,dataptr dz);
  74. static int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt);
  75. static int handle_the_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz);
  76. static int create_retime_sndbufs(dataptr dz);
  77. static int retime(dataptr dz);
  78. static int setup_the_special_data_ranges(int mode,int srate,double duration,double nyquist,int wlength,int channels,aplptr ap);
  79. static int advance_obuf(int *obufpos,dataptr dz);
  80. static int advance_ibuf(int *abs_read_start,int *read_end_in_buf,int *last_time_in_inbuf,int *next_time_in_inbuf,
  81. int *min_energy_point,int silcnt,int *silat,dataptr dz);
  82. static int find_min_energy_point(int *min_energy_point,int last_time_in_inbuf,int next_time_in_inbuf,int winsize,float *ibuf,float *env,int *pos,dataptr dz);
  83. static int read_ideal_data(char *filename,dataptr dz);
  84. static int read_retime_data(char *filename,dataptr dz);
  85. static int read_retempo_data(char *filename,dataptr dz);
  86. static int read_retime_mask(char *filename,dataptr dz);
  87. static int ideal_retime(dataptr dz);
  88. static int shave(dataptr dz);
  89. static int retime_found_peaks(dataptr dz);
  90. static int locate_peaks(dataptr dz);
  91. static int establish_cuts_array(dataptr dz);
  92. static int eliminate_lost_ideal_and_real_events(int *lost,int lostcnt,dataptr dz);
  93. static int reposition_peak(dataptr dz);
  94. static int repeat_beats(dataptr dz);
  95. static int get_initial_silence(int *initial_silence,dataptr dz);
  96. static int find_sound_start(dataptr dz);
  97. static int read_retime_fnam(char *filename,dataptr dz);
  98. static int find_shortest_event(dataptr dz);
  99. static int count_events(int paramno,int arrayno,int *eventsegscnt, dataptr dz);
  100. static int equalise_event_levels(dataptr dz);
  101. static int retempo_events(dataptr dz);
  102. static int mask_events(dataptr dz);
  103. static int usage22(char *str,char *str2);
  104. #define MMin scalefact /* Use 'dz->scalefact' param to store MM */
  105. #define offset chwidth /* use 'dz->chwidth' param to store offset */
  106. /**************************************** MAIN *********************************************/
  107. int main(int argc,char *argv[])
  108. {
  109. int exit_status;
  110. dataptr dz = NULL;
  111. char **cmdline;
  112. int cmdlinecnt;
  113. //aplptr ap;
  114. int is_launched = FALSE;
  115. if(argc==2 && (strcmp(argv[1],"--version") == 0)) {
  116. fprintf(stdout,"%s\n",cdp_version);
  117. fflush(stdout);
  118. return 0;
  119. }
  120. /* CHECK FOR SOUNDLOOM */
  121. if((sloom = sound_loom_in_use(&argc,&argv)) > 1) {
  122. sloom = 0;
  123. sloombatch = 1;
  124. }
  125. if(sflinit("cdp")){
  126. sfperror("cdp: initialisation\n");
  127. return(FAILED);
  128. }
  129. /* SET UP THE PRINCIPLE DATASTRUCTURE */
  130. if((exit_status = establish_datastructure(&dz))<0) { // CDP LIB
  131. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  132. return(FAILED);
  133. }
  134. if(!sloom) {
  135. if(argc == 1) {
  136. usage1();
  137. return(FAILED);
  138. } else if(argc == 2) {
  139. usage2(argv[1]);
  140. return(FAILED);
  141. } else if(argc == 3) {
  142. usage22(argv[1],argv[2]);
  143. return(FAILED);
  144. }
  145. }
  146. dz->maxmode = 14;
  147. if(!sloom) {
  148. if((exit_status = make_initial_cmdline_check(&argc,&argv))<0) { // CDP LIB
  149. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  150. return(FAILED);
  151. }
  152. cmdline = argv;
  153. cmdlinecnt = argc;
  154. if((get_the_process_no(argv[0],dz))<0)
  155. return(FAILED);
  156. cmdline++;
  157. cmdlinecnt--;
  158. if((exit_status = get_the_mode_from_cmdline(cmdline[0],dz))<0) {
  159. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  160. return(exit_status);
  161. }
  162. cmdline++;
  163. cmdlinecnt--;
  164. // setup_particular_application =
  165. if((exit_status = setup_retime_application(dz))<0) {
  166. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  167. return(FAILED);
  168. }
  169. if((exit_status = count_and_allocate_for_infiles(cmdlinecnt,cmdline,dz))<0) { // CDP LIB
  170. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  171. return(FAILED);
  172. }
  173. } else {
  174. //parse_TK_data() =
  175. if((exit_status = parse_sloom_data(argc,argv,&cmdline,&cmdlinecnt,dz))<0) {
  176. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  177. return(exit_status);
  178. }
  179. }
  180. //ap = dz->application;
  181. // parse_infile_and_hone_type() =
  182. if((exit_status = parse_infile_and_check_type(cmdline,dz))<0) {
  183. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  184. return(FAILED);
  185. }
  186. // setup_param_ranges_and_defaults() =
  187. if((exit_status = setup_retime_param_ranges_and_defaults(dz))<0) {
  188. exit_status = print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  189. return(FAILED);
  190. }
  191. // open_first_infile CDP LIB
  192. strcpy(infilename,cmdline[0]);
  193. if((exit_status = open_first_infile(cmdline[0],dz))<0) {
  194. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  195. return(FAILED);
  196. }
  197. cmdlinecnt--;
  198. cmdline++;
  199. // handle_extra_infiles() : redundant
  200. // handle_outfile() =
  201. if(dz->mode != 11) {
  202. if(dz->mode != 10) {
  203. if((exit_status = handle_the_outfile(&cmdlinecnt,&cmdline,dz))<0) {
  204. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  205. return(FAILED);
  206. }
  207. } else if(sloom) { // mode 10, no outfile
  208. cmdlinecnt--; // in sloom, always an outfile name in cmdline
  209. cmdline++;
  210. }
  211. }
  212. // handle_formants() redundant
  213. // handle_formant_quiksearch() redundant
  214. if((exit_status = handle_the_special_data(&cmdlinecnt,&cmdline,dz))<0) {
  215. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  216. return(FAILED);
  217. }
  218. if((exit_status = read_parameters_and_flags(&cmdline,&cmdlinecnt,dz))<0) { // CDP LIB
  219. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  220. return(FAILED);
  221. }
  222. // check_param_validity_and_consistency....
  223. if((exit_status = check_retime_param_validity_and_consistency(dz))<0) {
  224. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  225. return(FAILED);
  226. }
  227. is_launched = TRUE;
  228. switch(dz->mode) {
  229. case(0):
  230. dz->bufcnt = 5;
  231. break;
  232. case(1):
  233. dz->bufcnt = 4;
  234. break;
  235. case(2):
  236. case(8):
  237. case(10):
  238. case(11):
  239. dz->bufcnt = 1;
  240. break;
  241. case(3):
  242. case(4):
  243. case(5):
  244. case(6):
  245. dz->bufcnt = 3;
  246. break;
  247. case(7):
  248. dz->bufcnt = 4;
  249. break;
  250. case(9):
  251. dz->bufcnt = 1;
  252. break;
  253. case(12):
  254. case(13):
  255. dz->bufcnt = 2;
  256. break;
  257. }
  258. if((dz->sampbuf = (float **)malloc(sizeof(float *) * (dz->bufcnt+1)))==NULL) {
  259. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffers.\n");
  260. return(MEMORY_ERROR);
  261. }
  262. if((dz->sbufptr = (float **)malloc(sizeof(float *) * dz->bufcnt))==NULL) {
  263. sprintf(errstr,"INSUFFICIENT MEMORY establishing sample buffer pointers.\n");
  264. return(MEMORY_ERROR);
  265. }
  266. if((exit_status = create_retime_sndbufs(dz))<0) {
  267. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  268. return(FAILED);
  269. }
  270. //param_preprocess() redundant
  271. //spec_process_file =
  272. switch(dz->mode) {
  273. case(0):
  274. if((exit_status = retime(dz))<0) {
  275. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  276. return(FAILED);
  277. }
  278. break;
  279. case(1):
  280. if((exit_status = ideal_retime(dz))<0) {
  281. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  282. return(FAILED);
  283. }
  284. break;
  285. case(2):
  286. if((exit_status = shave(dz))<0) {
  287. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  288. return(FAILED);
  289. }
  290. break;
  291. case(3):
  292. case(4):
  293. if((exit_status = retime_found_peaks(dz))<0) {
  294. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  295. return(FAILED);
  296. }
  297. break;
  298. case(5):
  299. case(6):
  300. if((exit_status = retempo_events(dz))<0) {
  301. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  302. return(FAILED);
  303. }
  304. break;
  305. case(7):
  306. if((exit_status = repeat_beats(dz))<0) {
  307. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  308. return(FAILED);
  309. }
  310. break;
  311. case(8):
  312. if((exit_status = mask_events(dz))<0) {
  313. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  314. return(FAILED);
  315. }
  316. break;
  317. case(9):
  318. if((exit_status = equalise_event_levels(dz))<0) {
  319. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  320. return(FAILED);
  321. }
  322. break;
  323. case(10):
  324. if((exit_status = find_shortest_event(dz))<0) {
  325. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  326. return(FAILED);
  327. }
  328. break;
  329. case(11):
  330. if((exit_status = find_sound_start(dz))<0) {
  331. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  332. return(FAILED);
  333. }
  334. break;
  335. case(12):
  336. case(13):
  337. if((exit_status = reposition_peak(dz))<0) {
  338. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  339. return(FAILED);
  340. }
  341. break;
  342. }
  343. if((exit_status = complete_output(dz))<0) { // CDP LIB
  344. print_messages_and_close_sndfiles(exit_status,is_launched,dz);
  345. return(FAILED);
  346. }
  347. exit_status = print_messages_and_close_sndfiles(FINISHED,is_launched,dz); // CDP LIB
  348. free(dz);
  349. return(SUCCEEDED);
  350. }
  351. /**********************************************
  352. REPLACED CDP LIB FUNCTIONS
  353. **********************************************/
  354. /****************************** SET_PARAM_DATA *********************************/
  355. int set_param_data(aplptr ap, int special_data,int maxparamcnt,int paramcnt,char *paramlist)
  356. {
  357. ap->special_data = (char)special_data;
  358. ap->param_cnt = (char)paramcnt;
  359. ap->max_param_cnt = (char)maxparamcnt;
  360. if(ap->max_param_cnt>0) {
  361. if((ap->param_list = (char *)malloc((size_t)(ap->max_param_cnt+1)))==NULL) {
  362. sprintf(errstr,"INSUFFICIENT MEMORY: for param_list\n");
  363. return(MEMORY_ERROR);
  364. }
  365. strcpy(ap->param_list,paramlist);
  366. }
  367. return(FINISHED);
  368. }
  369. /****************************** SET_VFLGS *********************************/
  370. int set_vflgs
  371. (aplptr ap,char *optflags,int optcnt,char *optlist,char *varflags,int vflagcnt, int vparamcnt,char *varlist)
  372. {
  373. ap->option_cnt = (char) optcnt; /*RWD added cast */
  374. if(optcnt) {
  375. if((ap->option_list = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  376. sprintf(errstr,"INSUFFICIENT MEMORY: for option_list\n");
  377. return(MEMORY_ERROR);
  378. }
  379. strcpy(ap->option_list,optlist);
  380. if((ap->option_flags = (char *)malloc((size_t)(optcnt+1)))==NULL) {
  381. sprintf(errstr,"INSUFFICIENT MEMORY: for option_flags\n");
  382. return(MEMORY_ERROR);
  383. }
  384. strcpy(ap->option_flags,optflags);
  385. }
  386. ap->vflag_cnt = (char) vflagcnt;
  387. ap->variant_param_cnt = (char) vparamcnt;
  388. if(vflagcnt) {
  389. if((ap->variant_list = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  390. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_list\n");
  391. return(MEMORY_ERROR);
  392. }
  393. strcpy(ap->variant_list,varlist);
  394. if((ap->variant_flags = (char *)malloc((size_t)(vflagcnt+1)))==NULL) {
  395. sprintf(errstr,"INSUFFICIENT MEMORY: for variant_flags\n");
  396. return(MEMORY_ERROR);
  397. }
  398. strcpy(ap->variant_flags,varflags);
  399. }
  400. return(FINISHED);
  401. }
  402. /***************************** APPLICATION_INIT **************************/
  403. int application_init(dataptr dz)
  404. {
  405. int exit_status;
  406. int storage_cnt;
  407. int tipc, brkcnt;
  408. aplptr ap = dz->application;
  409. if(ap->vflag_cnt>0)
  410. initialise_vflags(dz);
  411. tipc = ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt;
  412. ap->total_input_param_cnt = (char)tipc;
  413. if(tipc>0) {
  414. if((exit_status = setup_input_param_range_stores(tipc,ap))<0)
  415. return(exit_status);
  416. if((exit_status = setup_input_param_defaultval_stores(tipc,ap))<0)
  417. return(exit_status);
  418. if((exit_status = setup_and_init_input_param_activity(dz,tipc))<0)
  419. return(exit_status);
  420. }
  421. brkcnt = tipc;
  422. if(brkcnt>0) {
  423. if((exit_status = setup_and_init_input_brktable_constants(dz,brkcnt))<0)
  424. return(exit_status);
  425. }
  426. if((storage_cnt = tipc + ap->internal_param_cnt)>0) {
  427. if((exit_status = setup_parameter_storage_and_constants(storage_cnt,dz))<0)
  428. return(exit_status);
  429. if((exit_status = initialise_is_int_and_no_brk_constants(storage_cnt,dz))<0)
  430. return(exit_status);
  431. }
  432. if((exit_status = mark_parameter_types(dz,ap))<0)
  433. return(exit_status);
  434. // establish_infile_constants() replaced by
  435. dz->infilecnt = 1;
  436. //establish_bufptrs_and_extra_buffers():
  437. if((exit_status = setup_internal_arrays_and_array_pointers(dz))<0)
  438. return(exit_status);
  439. return(FINISHED);
  440. }
  441. /********************** SETUP_PARAMETER_STORAGE_AND_CONSTANTS ********************/
  442. /* RWD mallo changed to calloc; helps debug verison run as release! */
  443. int setup_parameter_storage_and_constants(int storage_cnt,dataptr dz)
  444. {
  445. if((dz->param = (double *)calloc(storage_cnt, sizeof(double)))==NULL) {
  446. sprintf(errstr,"setup_parameter_storage_and_constants(): 1\n");
  447. return(MEMORY_ERROR);
  448. }
  449. if((dz->iparam = (int *)calloc(storage_cnt, sizeof(int) ))==NULL) {
  450. sprintf(errstr,"setup_parameter_storage_and_constants(): 2\n");
  451. return(MEMORY_ERROR);
  452. }
  453. if((dz->is_int = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  454. sprintf(errstr,"setup_parameter_storage_and_constants(): 3\n");
  455. return(MEMORY_ERROR);
  456. }
  457. if((dz->no_brk = (char *)calloc(storage_cnt, sizeof(char)))==NULL) {
  458. sprintf(errstr,"setup_parameter_storage_and_constants(): 5\n");
  459. return(MEMORY_ERROR);
  460. }
  461. return(FINISHED);
  462. }
  463. /************** INITIALISE_IS_INT_AND_NO_BRK_CONSTANTS *****************/
  464. int initialise_is_int_and_no_brk_constants(int storage_cnt,dataptr dz)
  465. {
  466. int n;
  467. for(n=0;n<storage_cnt;n++) {
  468. dz->is_int[n] = (char)0;
  469. dz->no_brk[n] = (char)0;
  470. }
  471. return(FINISHED);
  472. }
  473. /***************************** MARK_PARAMETER_TYPES **************************/
  474. int mark_parameter_types(dataptr dz,aplptr ap)
  475. {
  476. int n, m; /* PARAMS */
  477. for(n=0;n<ap->max_param_cnt;n++) {
  478. switch(ap->param_list[n]) {
  479. case('0'): break; /* dz->is_active[n] = 0 is default */
  480. case('i'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1;dz->no_brk[n] = (char)1; break;
  481. case('I'): dz->is_active[n] = (char)1; dz->is_int[n] = (char)1; break;
  482. case('d'): dz->is_active[n] = (char)1; dz->no_brk[n] = (char)1; break;
  483. case('D'): dz->is_active[n] = (char)1; /* normal case: double val or brkpnt file */ break;
  484. default:
  485. sprintf(errstr,"Programming error: invalid parameter type in mark_parameter_types()\n");
  486. return(PROGRAM_ERROR);
  487. }
  488. } /* OPTIONS */
  489. for(n=0,m=ap->max_param_cnt;n<ap->option_cnt;n++,m++) {
  490. switch(ap->option_list[n]) {
  491. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  492. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  493. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  494. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  495. default:
  496. sprintf(errstr,"Programming error: invalid option type in mark_parameter_types()\n");
  497. return(PROGRAM_ERROR);
  498. }
  499. } /* VARIANTS */
  500. for(n=0,m=ap->max_param_cnt + ap->option_cnt;n < ap->variant_param_cnt; n++, m++) {
  501. switch(ap->variant_list[n]) {
  502. case('0'): break;
  503. case('i'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  504. case('I'): dz->is_active[m] = (char)1; dz->is_int[m] = (char)1; break;
  505. case('d'): dz->is_active[m] = (char)1; dz->no_brk[m] = (char)1; break;
  506. case('D'): dz->is_active[m] = (char)1; /* normal case: double val or brkpnt file */ break;
  507. default:
  508. sprintf(errstr,"Programming error: invalid variant type in mark_parameter_types()\n");
  509. return(PROGRAM_ERROR);
  510. }
  511. } /* INTERNAL */
  512. for(n=0,
  513. m=ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt; n<ap->internal_param_cnt; n++,m++) {
  514. switch(ap->internal_param_list[n]) {
  515. case('0'): break; /* dummy variables: variables not used: but important for internal paream numbering!! */
  516. case('i'): dz->is_int[m] = (char)1; dz->no_brk[m] = (char)1; break;
  517. case('d'): dz->no_brk[m] = (char)1; break;
  518. default:
  519. sprintf(errstr,"Programming error: invalid internal param type in mark_parameter_types()\n");
  520. return(PROGRAM_ERROR);
  521. }
  522. }
  523. return(FINISHED);
  524. }
  525. /************************ HANDLE_THE_OUTFILE *********************/
  526. int handle_the_outfile(int *cmdlinecnt,char ***cmdline,dataptr dz)
  527. {
  528. int exit_status;
  529. char *filename = (*cmdline)[0];
  530. if(filename[0]=='-' && filename[1]=='f') {
  531. dz->floatsam_output = 1;
  532. dz->true_outfile_stype = SAMP_FLOAT;
  533. filename+= 2;
  534. }
  535. if(!sloom) {
  536. if(file_has_invalid_startchar(filename) || value_is_numeric(filename)) {
  537. sprintf(errstr,"Outfile name %s has invalid start character(s) or looks too much like a number.\n",filename);
  538. return(DATA_ERROR);
  539. }
  540. }
  541. strcpy(dz->outfilename,filename);
  542. if((exit_status = create_sized_outfile(filename,dz))<0)
  543. return(exit_status);
  544. (*cmdline)++;
  545. (*cmdlinecnt)--;
  546. return(FINISHED);
  547. }
  548. /***************************** ESTABLISH_APPLICATION **************************/
  549. int establish_application(dataptr dz)
  550. {
  551. aplptr ap;
  552. if((dz->application = (aplptr)malloc(sizeof (struct applic)))==NULL) {
  553. sprintf(errstr,"establish_application()\n");
  554. return(MEMORY_ERROR);
  555. }
  556. ap = dz->application;
  557. memset((char *)ap,0,sizeof(struct applic));
  558. return(FINISHED);
  559. }
  560. /************************* INITIALISE_VFLAGS *************************/
  561. int initialise_vflags(dataptr dz)
  562. {
  563. int n;
  564. if((dz->vflag = (char *)malloc(dz->application->vflag_cnt * sizeof(char)))==NULL) {
  565. sprintf(errstr,"INSUFFICIENT MEMORY: vflag store,\n");
  566. return(MEMORY_ERROR);
  567. }
  568. for(n=0;n<dz->application->vflag_cnt;n++)
  569. dz->vflag[n] = FALSE;
  570. return FINISHED;
  571. }
  572. /************************* SETUP_INPUT_PARAM_DEFAULTVALS *************************/
  573. int setup_input_param_defaultval_stores(int tipc,aplptr ap)
  574. {
  575. int n;
  576. if((ap->default_val = (double *)malloc(tipc * sizeof(double)))==NULL) {
  577. sprintf(errstr,"INSUFFICIENT MEMORY for application default values store\n");
  578. return(MEMORY_ERROR);
  579. }
  580. for(n=0;n<tipc;n++)
  581. ap->default_val[n] = 0.0;
  582. return(FINISHED);
  583. }
  584. /***************************** SETUP_AND_INIT_INPUT_PARAM_ACTIVITY **************************/
  585. int setup_and_init_input_param_activity(dataptr dz,int tipc)
  586. {
  587. int n;
  588. if((dz->is_active = (char *)malloc((size_t)tipc))==NULL) {
  589. sprintf(errstr,"setup_and_init_input_param_activity()\n");
  590. return(MEMORY_ERROR);
  591. }
  592. for(n=0;n<tipc;n++)
  593. dz->is_active[n] = (char)0;
  594. return(FINISHED);
  595. }
  596. /************************* SETUP_RETIME_APPLICATION *******************/
  597. int setup_retime_application(dataptr dz)
  598. {
  599. int exit_status;
  600. aplptr ap;
  601. if((exit_status = establish_application(dz))<0) // GLOBAL
  602. return(FAILED);
  603. ap = dz->application;
  604. // SEE parstruct FOR EXPLANATION of next 2 functions
  605. switch(dz->mode) {
  606. case(0):
  607. if((exit_status = set_param_data(ap,RETIME_DATA ,1,1,"d"))<0)
  608. return(FAILED);
  609. break;
  610. case(1):
  611. if((exit_status = set_param_data(ap,IDEAL_DATA ,3,3,"dDd"))<0)
  612. return(FAILED);
  613. break;
  614. case(2):
  615. if((exit_status = set_param_data(ap,0 ,4,4,"dddd"))<0)
  616. return(FAILED);
  617. break;
  618. case(3):
  619. if((exit_status = set_param_data(ap,0,3,3,"ddd"))<0)
  620. return(FAILED);
  621. break;
  622. case(4):
  623. if((exit_status = set_param_data(ap,0,2,2,"Dd"))<0)
  624. return(FAILED);
  625. break;
  626. case(5):
  627. if((exit_status = set_param_data(ap,RETEMPO_DATA,4,4,"dddd"))<0)
  628. return(FAILED);
  629. break;
  630. case(6):
  631. if((exit_status = set_param_data(ap,RETEMPO_DATA,3,3,"ddd"))<0)
  632. return(FAILED);
  633. break;
  634. case(7):
  635. if((exit_status = set_param_data(ap,0,5,5,"ddiid"))<0)
  636. return(FAILED);
  637. break;
  638. case(8):
  639. if((exit_status = set_param_data(ap,RETIME_MASK,1,1,"d"))<0)
  640. return(FAILED);
  641. break;
  642. case(9):
  643. if((exit_status = set_param_data(ap,0,2,2,"dd"))<0)
  644. return(FAILED);
  645. break;
  646. case(10):
  647. if((exit_status = set_param_data(ap,0,1,1,"d"))<0)
  648. return(FAILED);
  649. break;
  650. case(11):
  651. if((exit_status = set_param_data(ap,RETIME_FNAM,0,0,""))<0)
  652. return(FAILED);
  653. break;
  654. case(12):
  655. if((exit_status = set_param_data(ap,0,1,1,"d"))<0)
  656. return(FAILED);
  657. break;
  658. case(13):
  659. if((exit_status = set_param_data(ap,0,2,2,"dd"))<0)
  660. return(FAILED);
  661. break;
  662. }
  663. switch(dz->mode) {
  664. case(4):
  665. if((exit_status = set_vflgs(ap,"sea",3,"ddd","",0,0,""))<0)
  666. return(FAILED);
  667. break;
  668. case(9):
  669. if((exit_status = set_vflgs(ap,"mp",2,"id","",0,0,""))<0)
  670. return(FAILED);
  671. break;
  672. default:
  673. if((exit_status = set_vflgs(ap,"",0,"","",0,0,""))<0)
  674. return(FAILED);
  675. break;
  676. }
  677. // set_legal_infile_structure -->
  678. dz->has_otherfile = FALSE;
  679. // assign_process_logic -->
  680. switch(dz->mode) {
  681. case(8):
  682. case(9):
  683. dz->input_data_type = SNDFILES_ONLY;
  684. dz->process_type = EQUAL_SNDFILE;
  685. dz->outfiletype = SNDFILE_OUT;
  686. break;
  687. case(10):
  688. case(11):
  689. dz->input_data_type = SNDFILES_ONLY;
  690. dz->process_type = OTHER_PROCESS;
  691. dz->outfiletype = NO_OUTPUTFILE;
  692. break;
  693. default:
  694. dz->input_data_type = SNDFILES_ONLY;
  695. dz->process_type = UNEQUAL_SNDFILE;
  696. dz->outfiletype = SNDFILE_OUT;
  697. break;
  698. }
  699. return application_init(dz); //GLOBAL
  700. }
  701. /************************* PARSE_INFILE_AND_CHECK_TYPE *******************/
  702. int parse_infile_and_check_type(char **cmdline,dataptr dz)
  703. {
  704. int exit_status;
  705. infileptr infile_info;
  706. if(!sloom) {
  707. if((infile_info = (infileptr)malloc(sizeof(struct filedata)))==NULL) {
  708. sprintf(errstr,"INSUFFICIENT MEMORY for infile structure to test file data.");
  709. return(MEMORY_ERROR);
  710. } else if((exit_status = cdparse(cmdline[0],infile_info))<0) {
  711. sprintf(errstr,"Failed to parse input file %s\n",cmdline[0]);
  712. return(PROGRAM_ERROR);
  713. } else if(infile_info->filetype != SNDFILE) {
  714. sprintf(errstr,"File %s is not of correct type\n",cmdline[0]);
  715. return(DATA_ERROR);
  716. } else if((exit_status = copy_parse_info_to_main_structure(infile_info,dz))<0) {
  717. sprintf(errstr,"Failed to copy file parsing information\n");
  718. return(PROGRAM_ERROR);
  719. }
  720. free(infile_info);
  721. }
  722. return(FINISHED);
  723. }
  724. /************************* SETUP_RETIME_PARAM_RANGES_AND_DEFAULTS *******************/
  725. int setup_retime_param_ranges_and_defaults(dataptr dz)
  726. {
  727. int exit_status;
  728. double srate = (double)dz->infile->srate;
  729. int chans = dz->infile->channels;
  730. aplptr ap = dz->application;
  731. // set_param_ranges()
  732. ap->total_input_param_cnt = (char)(ap->max_param_cnt + ap->option_cnt + ap->variant_param_cnt);
  733. // NB total_input_param_cnt is > 0 !!!
  734. if((exit_status = setup_input_param_range_stores(ap->total_input_param_cnt,ap))<0)
  735. return(FAILED);
  736. // get_param_ranges()
  737. switch(dz->mode) {
  738. case(0):
  739. ap->lo[0] = 0.0;
  740. ap->hi[0] = 400.0;
  741. ap->default_val[0] = 60;
  742. break;
  743. case(1):
  744. ap->lo[0] = 0.0;
  745. ap->hi[0] = 400.0;
  746. ap->default_val[0] = 60;
  747. ap->lo[1] = 1.0;
  748. ap->hi[1] = 1000.0;
  749. ap->default_val[1] = 20;
  750. ap->lo[2] = 1.0;
  751. ap->hi[2] = 1000.0;
  752. ap->default_val[2] = 10;
  753. break;
  754. case(2):
  755. ap->lo[0] = (2.0/srate) * SECS_TO_MS;
  756. ap->hi[0] = 10000.0;
  757. ap->default_val[0] = (2.0/srate) * SECS_TO_MS;
  758. ap->lo[1] = 1.0;
  759. ap->hi[1] = 1000.0;
  760. ap->default_val[1] = 40;
  761. ap->lo[2] = 1.0;
  762. ap->hi[2] = 1000.0;
  763. ap->default_val[2] = 10;
  764. ap->lo[3] = 1.0;
  765. ap->hi[3] = 1000.0;
  766. ap->default_val[3] = 20;
  767. break;
  768. case(3):
  769. ap->lo[0] = 0.0;
  770. ap->hi[0] = 6000.0;
  771. ap->default_val[0] = 60;
  772. ap->lo[1] = (2.0/srate) * SECS_TO_MS;
  773. ap->hi[1] = 10000.0;
  774. ap->default_val[1] = 10;
  775. ap->lo[2] = 0.0;
  776. ap->hi[2] = 1.0;
  777. ap->default_val[2] = 1;
  778. break;
  779. case(4):
  780. ap->lo[0] = 0.01;
  781. ap->hi[0] = 100.0;
  782. ap->default_val[0] = 1.0;
  783. ap->lo[1] = (2.0/srate) * SECS_TO_MS;
  784. ap->hi[1] = 10000.0;
  785. ap->default_val[1] = 10;
  786. ap->lo[2] = 0.0;
  787. ap->hi[2] = (double)(dz->insams[0]/chans)/srate;
  788. ap->default_val[2] = 0.0;
  789. ap->lo[3] = 0.0;
  790. ap->hi[3] = (double)(dz->insams[0]/chans)/srate;
  791. ap->default_val[3] = (double)(dz->insams[0]/chans)/srate;
  792. ap->lo[4] = 0.0;
  793. ap->hi[4] = (double)(dz->insams[0]/chans)/srate;
  794. ap->default_val[4] = 0.0;
  795. break;
  796. case(5):
  797. ap->lo[0] = 0.01; // MM
  798. ap->hi[0] = 1000.0;
  799. ap->default_val[0] = 60.0;
  800. ap->lo[1] = 0.00; // Offset
  801. ap->hi[1] = 1000.0;
  802. ap->default_val[1] = 0.0;
  803. ap->lo[2] = (2.0/srate) * SECS_TO_MS;
  804. ap->hi[2] = 10000.0; // Minsil
  805. ap->default_val[2] = (2.0/srate) * SECS_TO_MS;
  806. ap->lo[3] = 0.0;
  807. ap->hi[3] = 1.0; // Pregain
  808. ap->default_val[3] = 1.0;
  809. break;
  810. case(6):
  811. ap->lo[0] = 0.00; // Offset
  812. ap->hi[0] = 1000.0;
  813. ap->default_val[0] = 0.0;
  814. ap->lo[1] = (2.0/srate) * SECS_TO_MS;
  815. ap->hi[1] = 10000.0; // Minsil
  816. ap->default_val[1] = (2.0/srate) * SECS_TO_MS;
  817. ap->lo[2] = 0.0;
  818. ap->hi[2] = 1.0; // Pregain
  819. ap->default_val[2] = 1.0;
  820. break;
  821. case(7):
  822. ap->lo[MM] = 0.01;
  823. ap->hi[MM] = 1000.0;
  824. ap->default_val[MM] = 60.0;
  825. ap->lo[BEAT_AT] = 0.0;
  826. ap->hi[BEAT_AT] = (double)(dz->insams[0]/chans)/srate;
  827. ap->default_val[BEAT_AT] = 0.0;
  828. ap->lo[BEAT_CNT] = 1.0;
  829. ap->hi[BEAT_CNT] = 24.0;
  830. ap->default_val[BEAT_CNT] = 1.0;
  831. ap->lo[BEAT_REPEATS] = 1.0;
  832. ap->hi[BEAT_REPEATS] = 1000.0;
  833. ap->default_val[BEAT_REPEATS] = 1.0;
  834. ap->lo[BEAT_SILMIN] = (2.0/srate) * SECS_TO_MS;
  835. ap->hi[BEAT_SILMIN] = 10000.0;
  836. ap->default_val[BEAT_SILMIN] = (2.0/srate) * SECS_TO_MS;
  837. break;
  838. case(8):
  839. ap->lo[0] = (2.0/srate) * SECS_TO_MS;
  840. ap->hi[0] = 10000.0; // Minsil
  841. ap->default_val[0] = (2.0/srate) * SECS_TO_MS;
  842. break;
  843. case(9):
  844. ap->lo[0] = (2.0/srate) * SECS_TO_MS;
  845. ap->hi[0] = 10000.0;
  846. ap->default_val[0] = (2.0/srate) * SECS_TO_MS;
  847. ap->lo[1] = 0.0;
  848. ap->hi[1] = 1.0;
  849. ap->default_val[1] = 0.5;
  850. ap->lo[2] = 0.0;
  851. ap->hi[2] = 32767.0;
  852. ap->default_val[2] = 0.0;
  853. ap->lo[3] = 0.0;
  854. ap->hi[3] = 1.0;
  855. ap->default_val[3] = 1.0;
  856. break;
  857. case(10):
  858. ap->lo[0] = (2.0/srate) * SECS_TO_MS;
  859. ap->hi[0] = 10000.0;
  860. ap->default_val[0] = (2.0/srate) * SECS_TO_MS;
  861. break;
  862. case(11):
  863. break;
  864. case(12):
  865. ap->lo[0] = 0.0;
  866. ap->hi[0] = 3600.0;
  867. ap->default_val[0] = 0.0;
  868. break;
  869. case(13):
  870. ap->lo[0] = 0.0;
  871. ap->hi[0] = 3600.0;
  872. ap->default_val[0] = 0.0;
  873. ap->lo[1] = 0.0;
  874. ap->hi[1] = 3600.0;
  875. ap->default_val[1] = 0.0;
  876. break;
  877. }
  878. if(!sloom)
  879. put_default_vals_in_all_params(dz);
  880. return(FINISHED);
  881. }
  882. /********************************* PARSE_SLOOM_DATA *********************************/
  883. int parse_sloom_data(int argc,char *argv[],char ***cmdline,int *cmdlinecnt,dataptr dz)
  884. {
  885. int exit_status;
  886. int cnt = 1, infilecnt;
  887. int filesize, insams, inbrksize;
  888. double dummy;
  889. int true_cnt = 0;
  890. //aplptr ap;
  891. while(cnt<=PRE_CMDLINE_DATACNT) {
  892. if(cnt > argc) {
  893. sprintf(errstr,"Insufficient data sent from TK\n");
  894. return(DATA_ERROR);
  895. }
  896. switch(cnt) {
  897. case(1):
  898. if(sscanf(argv[cnt],"%d",&dz->process)!=1) {
  899. sprintf(errstr,"Cannot read process no. sent from TK\n");
  900. return(DATA_ERROR);
  901. }
  902. break;
  903. case(2):
  904. if(sscanf(argv[cnt],"%d",&dz->mode)!=1) {
  905. sprintf(errstr,"Cannot read mode no. sent from TK\n");
  906. return(DATA_ERROR);
  907. }
  908. if(dz->mode > 0)
  909. dz->mode--;
  910. //setup_particular_application() =
  911. if((exit_status = setup_retime_application(dz))<0)
  912. return(exit_status);
  913. //ap = dz->application;
  914. break;
  915. case(3):
  916. if(sscanf(argv[cnt],"%d",&infilecnt)!=1) {
  917. sprintf(errstr,"Cannot read infilecnt sent from TK\n");
  918. return(DATA_ERROR);
  919. }
  920. if(infilecnt < 1) {
  921. true_cnt = cnt + 1;
  922. cnt = PRE_CMDLINE_DATACNT; /* force exit from loop after assign_file_data_storage */
  923. }
  924. if((exit_status = assign_file_data_storage(infilecnt,dz))<0)
  925. return(exit_status);
  926. break;
  927. case(INPUT_FILETYPE+4):
  928. if(sscanf(argv[cnt],"%d",&dz->infile->filetype)!=1) {
  929. sprintf(errstr,"Cannot read filetype sent from TK (%s)\n",argv[cnt]);
  930. return(DATA_ERROR);
  931. }
  932. break;
  933. case(INPUT_FILESIZE+4):
  934. if(sscanf(argv[cnt],"%d",&filesize)!=1) {
  935. sprintf(errstr,"Cannot read infilesize sent from TK\n");
  936. return(DATA_ERROR);
  937. }
  938. dz->insams[0] = filesize;
  939. break;
  940. case(INPUT_INSAMS+4):
  941. if(sscanf(argv[cnt],"%d",&insams)!=1) {
  942. sprintf(errstr,"Cannot read insams sent from TK\n");
  943. return(DATA_ERROR);
  944. }
  945. dz->insams[0] = insams;
  946. break;
  947. case(INPUT_SRATE+4):
  948. if(sscanf(argv[cnt],"%d",&dz->infile->srate)!=1) {
  949. sprintf(errstr,"Cannot read srate sent from TK\n");
  950. return(DATA_ERROR);
  951. }
  952. break;
  953. case(INPUT_CHANNELS+4):
  954. if(sscanf(argv[cnt],"%d",&dz->infile->channels)!=1) {
  955. sprintf(errstr,"Cannot read channels sent from TK\n");
  956. return(DATA_ERROR);
  957. }
  958. break;
  959. case(INPUT_STYPE+4):
  960. if(sscanf(argv[cnt],"%d",&dz->infile->stype)!=1) {
  961. sprintf(errstr,"Cannot read stype sent from TK\n");
  962. return(DATA_ERROR);
  963. }
  964. break;
  965. case(INPUT_ORIGSTYPE+4):
  966. if(sscanf(argv[cnt],"%d",&dz->infile->origstype)!=1) {
  967. sprintf(errstr,"Cannot read origstype sent from TK\n");
  968. return(DATA_ERROR);
  969. }
  970. break;
  971. case(INPUT_ORIGRATE+4):
  972. if(sscanf(argv[cnt],"%d",&dz->infile->origrate)!=1) {
  973. sprintf(errstr,"Cannot read origrate sent from TK\n");
  974. return(DATA_ERROR);
  975. }
  976. break;
  977. case(INPUT_MLEN+4):
  978. if(sscanf(argv[cnt],"%d",&dz->infile->Mlen)!=1) {
  979. sprintf(errstr,"Cannot read Mlen sent from TK\n");
  980. return(DATA_ERROR);
  981. }
  982. break;
  983. case(INPUT_DFAC+4):
  984. if(sscanf(argv[cnt],"%d",&dz->infile->Dfac)!=1) {
  985. sprintf(errstr,"Cannot read Dfac sent from TK\n");
  986. return(DATA_ERROR);
  987. }
  988. break;
  989. case(INPUT_ORIGCHANS+4):
  990. if(sscanf(argv[cnt],"%d",&dz->infile->origchans)!=1) {
  991. sprintf(errstr,"Cannot read origchans sent from TK\n");
  992. return(DATA_ERROR);
  993. }
  994. break;
  995. case(INPUT_SPECENVCNT+4):
  996. if(sscanf(argv[cnt],"%d",&dz->infile->specenvcnt)!=1) {
  997. sprintf(errstr,"Cannot read specenvcnt sent from TK\n");
  998. return(DATA_ERROR);
  999. }
  1000. dz->specenvcnt = dz->infile->specenvcnt;
  1001. break;
  1002. case(INPUT_WANTED+4):
  1003. if(sscanf(argv[cnt],"%d",&dz->wanted)!=1) {
  1004. sprintf(errstr,"Cannot read wanted sent from TK\n");
  1005. return(DATA_ERROR);
  1006. }
  1007. break;
  1008. case(INPUT_WLENGTH+4):
  1009. if(sscanf(argv[cnt],"%d",&dz->wlength)!=1) {
  1010. sprintf(errstr,"Cannot read wlength sent from TK\n");
  1011. return(DATA_ERROR);
  1012. }
  1013. break;
  1014. case(INPUT_OUT_CHANS+4):
  1015. if(sscanf(argv[cnt],"%d",&dz->out_chans)!=1) {
  1016. sprintf(errstr,"Cannot read out_chans sent from TK\n");
  1017. return(DATA_ERROR);
  1018. }
  1019. break;
  1020. /* RWD these chanegs to samps - tk will have to deal with that! */
  1021. case(INPUT_DESCRIPTOR_BYTES+4):
  1022. if(sscanf(argv[cnt],"%d",&dz->descriptor_samps)!=1) {
  1023. sprintf(errstr,"Cannot read descriptor_samps sent from TK\n");
  1024. return(DATA_ERROR);
  1025. }
  1026. break;
  1027. case(INPUT_IS_TRANSPOS+4):
  1028. if(sscanf(argv[cnt],"%d",&dz->is_transpos)!=1) {
  1029. sprintf(errstr,"Cannot read is_transpos sent from TK\n");
  1030. return(DATA_ERROR);
  1031. }
  1032. break;
  1033. case(INPUT_COULD_BE_TRANSPOS+4):
  1034. if(sscanf(argv[cnt],"%d",&dz->could_be_transpos)!=1) {
  1035. sprintf(errstr,"Cannot read could_be_transpos sent from TK\n");
  1036. return(DATA_ERROR);
  1037. }
  1038. break;
  1039. case(INPUT_COULD_BE_PITCH+4):
  1040. if(sscanf(argv[cnt],"%d",&dz->could_be_pitch)!=1) {
  1041. sprintf(errstr,"Cannot read could_be_pitch sent from TK\n");
  1042. return(DATA_ERROR);
  1043. }
  1044. break;
  1045. case(INPUT_DIFFERENT_SRATES+4):
  1046. if(sscanf(argv[cnt],"%d",&dz->different_srates)!=1) {
  1047. sprintf(errstr,"Cannot read different_srates sent from TK\n");
  1048. return(DATA_ERROR);
  1049. }
  1050. break;
  1051. case(INPUT_DUPLICATE_SNDS+4):
  1052. if(sscanf(argv[cnt],"%d",&dz->duplicate_snds)!=1) {
  1053. sprintf(errstr,"Cannot read duplicate_snds sent from TK\n");
  1054. return(DATA_ERROR);
  1055. }
  1056. break;
  1057. case(INPUT_BRKSIZE+4):
  1058. if(sscanf(argv[cnt],"%d",&inbrksize)!=1) {
  1059. sprintf(errstr,"Cannot read brksize sent from TK\n");
  1060. return(DATA_ERROR);
  1061. }
  1062. if(inbrksize > 0) {
  1063. switch(dz->input_data_type) {
  1064. case(WORDLIST_ONLY):
  1065. break;
  1066. case(PITCH_AND_PITCH):
  1067. case(PITCH_AND_TRANSPOS):
  1068. case(TRANSPOS_AND_TRANSPOS):
  1069. dz->tempsize = inbrksize;
  1070. break;
  1071. case(BRKFILES_ONLY):
  1072. case(UNRANGED_BRKFILE_ONLY):
  1073. case(DB_BRKFILES_ONLY):
  1074. case(ALL_FILES):
  1075. case(ANY_NUMBER_OF_ANY_FILES):
  1076. if(dz->extrabrkno < 0) {
  1077. sprintf(errstr,"Storage location number for brktable not established by CDP.\n");
  1078. return(DATA_ERROR);
  1079. }
  1080. if(dz->brksize == NULL) {
  1081. sprintf(errstr,"CDP has not established storage space for input brktable.\n");
  1082. return(PROGRAM_ERROR);
  1083. }
  1084. dz->brksize[dz->extrabrkno] = inbrksize;
  1085. break;
  1086. default:
  1087. sprintf(errstr,"TK sent brktablesize > 0 for input_data_type [%d] not using brktables.\n",
  1088. dz->input_data_type);
  1089. return(PROGRAM_ERROR);
  1090. }
  1091. break;
  1092. }
  1093. break;
  1094. case(INPUT_NUMSIZE+4):
  1095. if(sscanf(argv[cnt],"%d",&dz->numsize)!=1) {
  1096. sprintf(errstr,"Cannot read numsize sent from TK\n");
  1097. return(DATA_ERROR);
  1098. }
  1099. break;
  1100. case(INPUT_LINECNT+4):
  1101. if(sscanf(argv[cnt],"%d",&dz->linecnt)!=1) {
  1102. sprintf(errstr,"Cannot read linecnt sent from TK\n");
  1103. return(DATA_ERROR);
  1104. }
  1105. break;
  1106. case(INPUT_ALL_WORDS+4):
  1107. if(sscanf(argv[cnt],"%d",&dz->all_words)!=1) {
  1108. sprintf(errstr,"Cannot read all_words sent from TK\n");
  1109. return(DATA_ERROR);
  1110. }
  1111. break;
  1112. case(INPUT_ARATE+4):
  1113. if(sscanf(argv[cnt],"%f",&dz->infile->arate)!=1) {
  1114. sprintf(errstr,"Cannot read arate sent from TK\n");
  1115. return(DATA_ERROR);
  1116. }
  1117. break;
  1118. case(INPUT_FRAMETIME+4):
  1119. if(sscanf(argv[cnt],"%lf",&dummy)!=1) {
  1120. sprintf(errstr,"Cannot read frametime sent from TK\n");
  1121. return(DATA_ERROR);
  1122. }
  1123. dz->frametime = (float)dummy;
  1124. break;
  1125. case(INPUT_WINDOW_SIZE+4):
  1126. if(sscanf(argv[cnt],"%f",&dz->infile->window_size)!=1) {
  1127. sprintf(errstr,"Cannot read window_size sent from TK\n");
  1128. return(DATA_ERROR);
  1129. }
  1130. break;
  1131. case(INPUT_NYQUIST+4):
  1132. if(sscanf(argv[cnt],"%lf",&dz->nyquist)!=1) {
  1133. sprintf(errstr,"Cannot read nyquist sent from TK\n");
  1134. return(DATA_ERROR);
  1135. }
  1136. break;
  1137. case(INPUT_DURATION+4):
  1138. if(sscanf(argv[cnt],"%lf",&dz->duration)!=1) {
  1139. sprintf(errstr,"Cannot read duration sent from TK\n");
  1140. return(DATA_ERROR);
  1141. }
  1142. break;
  1143. case(INPUT_MINBRK+4):
  1144. if(sscanf(argv[cnt],"%lf",&dz->minbrk)!=1) {
  1145. sprintf(errstr,"Cannot read minbrk sent from TK\n");
  1146. return(DATA_ERROR);
  1147. }
  1148. break;
  1149. case(INPUT_MAXBRK+4):
  1150. if(sscanf(argv[cnt],"%lf",&dz->maxbrk)!=1) {
  1151. sprintf(errstr,"Cannot read maxbrk sent from TK\n");
  1152. return(DATA_ERROR);
  1153. }
  1154. break;
  1155. case(INPUT_MINNUM+4):
  1156. if(sscanf(argv[cnt],"%lf",&dz->minnum)!=1) {
  1157. sprintf(errstr,"Cannot read minnum sent from TK\n");
  1158. return(DATA_ERROR);
  1159. }
  1160. break;
  1161. case(INPUT_MAXNUM+4):
  1162. if(sscanf(argv[cnt],"%lf",&dz->maxnum)!=1) {
  1163. sprintf(errstr,"Cannot read maxnum sent from TK\n");
  1164. return(DATA_ERROR);
  1165. }
  1166. break;
  1167. default:
  1168. sprintf(errstr,"case switch item missing: parse_sloom_data()\n");
  1169. return(PROGRAM_ERROR);
  1170. }
  1171. cnt++;
  1172. }
  1173. if(cnt!=PRE_CMDLINE_DATACNT+1) {
  1174. sprintf(errstr,"Insufficient pre-cmdline params sent from TK\n");
  1175. return(DATA_ERROR);
  1176. }
  1177. if(true_cnt)
  1178. cnt = true_cnt;
  1179. *cmdlinecnt = 0;
  1180. while(cnt < argc) {
  1181. if((exit_status = get_tk_cmdline_word(cmdlinecnt,cmdline,argv[cnt]))<0)
  1182. return(exit_status);
  1183. cnt++;
  1184. }
  1185. return(FINISHED);
  1186. }
  1187. /********************************* GET_TK_CMDLINE_WORD *********************************/
  1188. int get_tk_cmdline_word(int *cmdlinecnt,char ***cmdline,char *q)
  1189. {
  1190. if(*cmdlinecnt==0) {
  1191. if((*cmdline = (char **)malloc(sizeof(char *)))==NULL) {
  1192. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1193. return(MEMORY_ERROR);
  1194. }
  1195. } else {
  1196. if((*cmdline = (char **)realloc(*cmdline,((*cmdlinecnt)+1) * sizeof(char *)))==NULL) {
  1197. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline array.\n");
  1198. return(MEMORY_ERROR);
  1199. }
  1200. }
  1201. if(((*cmdline)[*cmdlinecnt] = (char *)malloc((strlen(q) + 1) * sizeof(char)))==NULL) {
  1202. sprintf(errstr,"INSUFFICIENT MEMORY for TK cmdline item %d.\n",(*cmdlinecnt)+1);
  1203. return(MEMORY_ERROR);
  1204. }
  1205. strcpy((*cmdline)[*cmdlinecnt],q);
  1206. (*cmdlinecnt)++;
  1207. return(FINISHED);
  1208. }
  1209. /****************************** ASSIGN_FILE_DATA_STORAGE *********************************/
  1210. int assign_file_data_storage(int infilecnt,dataptr dz)
  1211. {
  1212. int exit_status;
  1213. int no_sndfile_system_files = FALSE;
  1214. dz->infilecnt = infilecnt;
  1215. if((exit_status = allocate_filespace(dz))<0)
  1216. return(exit_status);
  1217. if(no_sndfile_system_files)
  1218. dz->infilecnt = 0;
  1219. return(FINISHED);
  1220. }
  1221. /************************* redundant functions: to ensure libs compile OK *******************/
  1222. int assign_process_logic(dataptr dz)
  1223. {
  1224. return(FINISHED);
  1225. }
  1226. void set_legal_infile_structure(dataptr dz)
  1227. {}
  1228. int set_legal_internalparam_structure(int process,int mode,aplptr ap)
  1229. {
  1230. return(FINISHED);
  1231. }
  1232. int establish_bufptrs_and_extra_buffers(dataptr dz)
  1233. {
  1234. return(FINISHED);
  1235. }
  1236. int inner_loop
  1237. (int *peakscore,int *descnt,int *in_start_portion,int *least,int *pitchcnt,int windows_in_buf,dataptr dz)
  1238. {
  1239. return(FINISHED);
  1240. }
  1241. int get_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1242. {
  1243. return(FINISHED);
  1244. }
  1245. /******************************** USAGE1 ********************************/
  1246. int usage1(void)
  1247. {
  1248. usage2("retime");
  1249. return(USAGE_ONLY);
  1250. }
  1251. /********************************************************************************************/
  1252. int get_the_process_no(char *prog_identifier_from_cmdline,dataptr dz)
  1253. {
  1254. if(!strcmp(prog_identifier_from_cmdline,"retime")) dz->process = RETIME;
  1255. else {
  1256. sprintf(errstr,"Unknown program identification string '%s'\n",prog_identifier_from_cmdline);
  1257. return(USAGE_ONLY);
  1258. }
  1259. return(FINISHED);
  1260. }
  1261. /****************************** GET_MODE *********************************/
  1262. int get_the_mode_from_cmdline(char *str,dataptr dz)
  1263. {
  1264. if(sscanf(str,"%d",&dz->mode)!=1) {
  1265. sprintf(errstr,"Cannot read mode of program.\n");
  1266. return(USAGE_ONLY);
  1267. }
  1268. if(dz->mode <= 0 || dz->mode > dz->maxmode) {
  1269. sprintf(errstr,"Program mode value [%d] is out of range [1 - %d].\n",dz->mode,dz->maxmode);
  1270. return(USAGE_ONLY);
  1271. }
  1272. dz->mode--; /* CHANGE TO INTERNAL REPRESENTATION OF MODE NO */
  1273. return(FINISHED);
  1274. }
  1275. /******************************** SETUP_AND_INIT_INPUT_BRKTABLE_CONSTANTS ********************************/
  1276. int setup_and_init_input_brktable_constants(dataptr dz,int brkcnt)
  1277. {
  1278. int n;
  1279. if((dz->brk = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1280. sprintf(errstr,"setup_and_init_input_brktable_constants(): 1\n");
  1281. return(MEMORY_ERROR);
  1282. }
  1283. if((dz->brkptr = (double **)malloc(brkcnt * sizeof(double *)))==NULL) {
  1284. sprintf(errstr,"setup_and_init_input_brktable_constants(): 6\n");
  1285. return(MEMORY_ERROR);
  1286. }
  1287. if((dz->brksize = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1288. sprintf(errstr,"setup_and_init_input_brktable_constants(): 2\n");
  1289. return(MEMORY_ERROR);
  1290. }
  1291. if((dz->firstval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1292. sprintf(errstr,"setup_and_init_input_brktable_constants(): 3\n");
  1293. return(MEMORY_ERROR);
  1294. }
  1295. if((dz->lastind = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1296. sprintf(errstr,"setup_and_init_input_brktable_constants(): 4\n");
  1297. return(MEMORY_ERROR);
  1298. }
  1299. if((dz->lastval = (double *)malloc(brkcnt * sizeof(double)))==NULL) {
  1300. sprintf(errstr,"setup_and_init_input_brktable_constants(): 5\n");
  1301. return(MEMORY_ERROR);
  1302. }
  1303. if((dz->brkinit = (int *)malloc(brkcnt * sizeof(int)))==NULL) {
  1304. sprintf(errstr,"setup_and_init_input_brktable_constants(): 7\n");
  1305. return(MEMORY_ERROR);
  1306. }
  1307. for(n=0;n<brkcnt;n++) {
  1308. dz->brk[n] = NULL;
  1309. dz->brkptr[n] = NULL;
  1310. dz->brkinit[n] = 0;
  1311. dz->brksize[n] = 0;
  1312. }
  1313. return(FINISHED);
  1314. }
  1315. /******************************** USAGE2 ********************************/
  1316. int usage2(char *str)
  1317. {
  1318. if(!strcmp(str,"retime")) {
  1319. fprintf(stderr,
  1320. "USAGE:\n"
  1321. "retime retime modenumber parameters.....\n"
  1322. "\n"
  1323. "MODE 1 Output user-specified peaks at regular pulse at given tempo.\n"
  1324. "MODE 3 Shorten existing (silence-separated) events.\n"
  1325. "MODE 4 Find existing (silence-separated) events and output at regular MM.\n"
  1326. "MODE 5 Find existing (silence-separated) events and change speed by factor.\n"
  1327. "MODE 6 Find existing (silence-separated) events: position at specified beats.\n"
  1328. "MODE 7 Find existing (silence-separated) events: position at specified times.\n"
  1329. "MODE 8 Mark (silence-separated) event within sound & repeat at specified tempo.\n"
  1330. "MODE 9 Replace by silence (silence-separated) events in specified pattern.\n"
  1331. "MODE 10 Adjusts levels (silence-separated) events, so more equal, or accented.\n"
  1332. "MODE 11 Finds durations of shortest and longest (silence-separated) event.\n"
  1333. "MODE 12 Find start of sound in file (1st non-zero sample).\n"
  1334. "MODE 13 Find peak and move all data so peak goes to specified time.\n"
  1335. "MODE 14 Mark peak, then move all data so peak goes to specified time.\n"
  1336. "\n"
  1337. "Retime works by editing existing files (removing sound or adding silence)\n"
  1338. "and is best suited to making small changes to rhythmic placement.\n"
  1339. "\n"
  1340. "Type \"retime retime modenumber\" for more details\n");
  1341. } else
  1342. fprintf(stdout,"Unknown option '%s'\n",str);
  1343. return(USAGE_ONLY);
  1344. }
  1345. int usage3(char *str1,char *str2)
  1346. {
  1347. fprintf(stderr,"Insufficient parameters on command line.\n");
  1348. return(USAGE_ONLY);
  1349. }
  1350. /******************************** USAGE22 ********************************/
  1351. int usage22(char *str,char *str2)
  1352. {
  1353. if(strcmp(str,"retime")) {
  1354. fprintf(stdout,"Unknown option '%s'\n",str);
  1355. } else if(!strcmp(str2,"1")) {
  1356. fprintf(stderr,
  1357. "USAGE:\n"
  1358. "retime retime 1 infile outfile refpoints tempo\n"
  1359. "\n"
  1360. "Output user-specified peaks at regular pulse at given tempo.\n"
  1361. "\n"
  1362. "Best applied to files with clear peaks.\n"
  1363. "\n"
  1364. "REFPOINTS times of peaks in the infile which will become on-the-beat events\n"
  1365. " in the outfile.\n"
  1366. "TEMPO Tempo of OUTFILE, as a MM (vals > 20 to 400)\n"
  1367. " OR (for vals below 1.0) a beat duration in secs.\n");
  1368. } else if(!strcmp(str2,"2")) {
  1369. fprintf(stderr,"Mode only accessible via Sound Loom Properties Files\n");
  1370. } else if(!strcmp(str2,"3")) {
  1371. fprintf(stderr,
  1372. "USAGE:\n"
  1373. "retime retime 3 infile outfile minsil inevwidth outevwidth splicelen\n"
  1374. "\n"
  1375. "Shorten existing (silence-separated) events.\n"
  1376. "\n"
  1377. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n"
  1378. "INEVWIDTH (Min) width (in mS) of events in infile (Range 1 -1000)\n"
  1379. "OUTEVWIDTH Width (in mS) of events in outfile (Range 1- 1000)\n"
  1380. "SPLICELEN Dur of splices (mS) cutting events in outfile (Range 1- 1000).\n");
  1381. } else if(!strcmp(str2,"4")) {
  1382. fprintf(stderr,
  1383. "USAGE:\n"
  1384. "retime retime 4 infile outfile tempo minsil pregain\n"
  1385. "\n"
  1386. "Find existing (silence-separated) events and output at regular MM.\n"
  1387. "\n"
  1388. "TEMPO Tempo of OUTFILE, as a MM (vals > 20 to 6000)\n"
  1389. " OR (for vals below 1.0) a beat duration in secs.\n"
  1390. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n"
  1391. "PREGAIN Gain of input signal (Range >0 to 1).\n");
  1392. } else if(!strcmp(str2,"5")) {
  1393. fprintf(stderr,
  1394. "USAGE:\n"
  1395. "retime retime 5 infile outfile factor minsil [-sstart -eend -async]\n"
  1396. "\n"
  1397. "Find existing (silence-separated) events and change speed by factor.\n"
  1398. "\n"
  1399. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n"
  1400. "FACTOR Speed-change factor (can vary over time) (Range 0.01 - 100).\n"
  1401. "START Time at which speed changing begins.\n"
  1402. "END Time at which speed changing ends.\n"
  1403. "SYNC Approx time of infile-event which syncs with its copy in output.\n"
  1404. " (Time should be WITHIN the event. Zero implies sync at 1st event).\n");
  1405. } else if(!strcmp(str2,"6")) {
  1406. fprintf(stderr,
  1407. "USAGE:\n"
  1408. "retime retime 6 infile outfile retempodata tempo offset minsil pregain\n"
  1409. "\n"
  1410. "Find existing (silence-separated) events: position at specified beats.\n"
  1411. "\n"
  1412. "RETEMPODATA File contains position of events in outfile, in BEATS,\n"
  1413. " where events assumed to start at beat zero.\n"
  1414. "TEMPO Tempo of OUTFILE, as a MM (vals > 20 to 1000)\n"
  1415. " OR (for vals below 1.0) a beat duration in secs.\n"
  1416. "OFFSET Time of first sounding event in output file (Range 0 -1000).\n"
  1417. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n"
  1418. "PREGAIN Gain of input signal (Range >0 to 1).\n");
  1419. } else if(!strcmp(str2,"7")) {
  1420. fprintf(stderr,
  1421. "USAGE:\n"
  1422. "retime retime 7 infile outfile retempodata offset minsil pregain\n"
  1423. "\n"
  1424. "Find existing (silence-separated) events: position at specified times.\n"
  1425. "\n"
  1426. "RETEMPODATA File contains position of events in outfile, in SECONDS,\n"
  1427. " where events assumed to start at time zero.\n"
  1428. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n"
  1429. "PREGAIN Gain of input signal (Range >0 to 1).\n"
  1430. "OFFSET Time of first sounding event in output file (range 0 - 1000).\n");
  1431. } else if(!strcmp(str2,"8")) {
  1432. fprintf(stderr,
  1433. "USAGE:\n"
  1434. "retime retime 8 infile outfile tempo eventtime cnt repeats minsil\n"
  1435. "\n"
  1436. "Mark one (silence-separated) event within a soundfile,\n"
  1437. "OR the 1st event of \"cnt\" events (see below),\n"
  1438. "and repeat it (or them) at a specified tempo WITHIN the original sound.\n"
  1439. "\n"
  1440. "TEMPO Tempo of OUTFILE, as a MM (vals > 20 to 1000)\n"
  1441. " OR (for vals below 1.0) a beat duration in secs.\n"
  1442. "EVENTTIME Time (roughly) of (1st) event to repeat (time must be INSIDE event).\n"
  1443. "CNT Number of (silence-separated) events to capture (Range 1 to 24).\n"
  1444. "REPEATS No. of times to repeat event(s): (NB: 2 repeats of A produces AAA).\n"
  1445. " (Range 1 to 1000).\n"
  1446. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n");
  1447. } else if(!strcmp(str2,"9")) {
  1448. fprintf(stderr,
  1449. "USAGE:\n"
  1450. "retime retime 9 infile outfile maskdata minsil\n"
  1451. "\n"
  1452. "Replace by silence (silence-separated) events in specified pattern.\n"
  1453. "\n"
  1454. "MASKDATA File with sequence of 0s and 1s: 0 masks event: 1 reveals event.\n"
  1455. " 0s and 1s must be separated by space, or on different lines.\n"
  1456. " Pattern of masking is repeated once its end is reached.\n"
  1457. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n");
  1458. } else if(!strcmp(str2,"10")) {
  1459. fprintf(stderr,
  1460. "USAGE:\n"
  1461. "retime retime 10 infile outfile minsil evening [-mmeter] [-mpregain]\n"
  1462. "\n"
  1463. "Adjust levels (silence-separated) events, so more equal, or accented.\n"
  1464. "\n"
  1465. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n"
  1466. "PREGAIN Gain of input signal (Range >0 to 1).\n"
  1467. "METER Pattern of accented beats.\n"
  1468. " 0 : no events emphasized.\n"
  1469. " 3 : every 3rd event accented.\n"
  1470. "EVENING Range 0 - 1.\n"
  1471. " With METER 0: the events are evened-out in level by \"EVENING\".\n"
  1472. " 0 has no effect, while 1 tries to make event-levels equal.\n"
  1473. " Intermediate values produce more or less evening-out of levels.\n"
  1474. " With nonzero METER e.g. 3,\n"
  1475. " unaccented beats take level relative specified in \"EVENING\".\n"
  1476. " e.g. Evening = 0.3 sets unaccented beats to 1/3 level of accented.\n");
  1477. } else if(!strcmp(str2,"11")) {
  1478. fprintf(stderr,
  1479. "USAGE:\n"
  1480. "retime retime 11 infile minsil\n"
  1481. "\n"
  1482. "MODE 11 Finds durations of shortest and longest (silence-separated) event.\n"
  1483. "\n"
  1484. "MINSIL Dur (mS) of min silence between events (Range 2000/srate to 10000).\n");
  1485. } else if(!strcmp(str2,"12")) {
  1486. fprintf(stderr,
  1487. "USAGE:\n"
  1488. "retime retime 12 infile outfile.txt\n"
  1489. "\n"
  1490. "Find start of sound in file (1st non-zero sample).\n"
  1491. "\n"
  1492. "Outfile must have '.txt' extension.\n"
  1493. "If file already exists, output is APPENDED to that file.\n");
  1494. } else if(!strcmp(str2,"13")) {
  1495. fprintf(stderr,
  1496. "USAGE:\n"
  1497. "retime retime 13 infile outfile goalpeaktime\n"
  1498. "\n"
  1499. "Find sound peak and move all data so peak goes to specified time.\n"
  1500. "\n"
  1501. "GOALPEAKTIME Time to which file peak is moved (Range 0 - 3600)\n"
  1502. "(must be greater than the original peaktime).\n");
  1503. } else if(!strcmp(str2,"14")) {
  1504. fprintf(stderr,
  1505. "USAGE:\n"
  1506. "retime retime 14 infile outfile goalpeaktime peaktime\n"
  1507. "\n"
  1508. "Specify peak position, then move data so peak goes to specified time.\n"
  1509. "\n"
  1510. "GOALPEAKTIME Time to which file peak is moved (Range 0 - 3600).\n"
  1511. " (must be greater than the original peaktime).\n"
  1512. "PEAKTIME Time of existing peak in file.\n");
  1513. } else {
  1514. fprintf(stdout,"Unknown mode '%s'\n",str);
  1515. }
  1516. return(USAGE_ONLY);
  1517. }
  1518. /******************************** CHECK_RETIME_PARAM_VALIDITY_AND_CONSISTENCY **********************************/
  1519. int check_retime_param_validity_and_consistency(dataptr dz)
  1520. {
  1521. int exit_status;
  1522. double srate = (double)dz->infile->srate;
  1523. int chans = dz->infile->channels;
  1524. switch(dz->mode) {
  1525. case(3):
  1526. if(dz->param[2] == 0.0) {
  1527. sprintf(errstr,"Pregain parameter of zero, will produce silent output.\n");
  1528. return(DATA_ERROR);
  1529. }
  1530. /* fall thro */
  1531. case(0):
  1532. if(dz->param[MM] >= 20)
  1533. dz->param[MM] = 60.0 / dz->param[MM];
  1534. else if(dz->param[MM] > 1.0 || dz->param[MM] < FLTERR) {
  1535. sprintf(errstr,"Output tempo vals must be > 0 AND less than 1 (beat duration) OR >= 20 (MM)\n");
  1536. return(DATA_ERROR);
  1537. }
  1538. dz->iparam[MM] = (int)round(dz->param[MM] * srate) * chans;
  1539. break;
  1540. case(1):
  1541. if(dz->param[MM] >= 20)
  1542. dz->param[MM] = 60.0 / dz->param[MM];
  1543. else if(dz->param[MM] > 1.0 || dz->param[MM] < FLTERR) {
  1544. sprintf(errstr,"Output tempo vals must be > 0 AND less than 1 (beat duration) OR >= 20 (MM)\n");
  1545. return(DATA_ERROR);
  1546. }
  1547. dz->iparam[MM] = (int)round(dz->param[MM] * srate) * chans;
  1548. dz->iparam[RETIME_SPLICE] = (int)round(dz->param[RETIME_SPLICE] * MS_TO_SECS * srate) * chans;
  1549. if(dz->brksize[RETIME_WIDTH] == 0)
  1550. dz->iparam[RETIME_WIDTH] = (int)round(dz->param[RETIME_WIDTH] * MS_TO_SECS * srate) * chans;
  1551. if((exit_status = establish_cuts_array(dz)) < 0)
  1552. return(exit_status);
  1553. break;
  1554. case(2):
  1555. dz->iparam[0] = (int)round(dz->param[0] * MS_TO_SECS * srate) * chans;
  1556. dz->iparam[1] = (int)round(dz->param[1] * MS_TO_SECS * srate) * chans;
  1557. dz->iparam[2] = (int)round(dz->param[2] * MS_TO_SECS * srate) * chans;
  1558. //JUNE 2010
  1559. dz->iparam[3] = (int)round(dz->param[3] * MS_TO_SECS * srate) * chans;
  1560. break;
  1561. case(13):
  1562. dz->iparam[1] = (int)round(dz->param[1] * srate) * chans;
  1563. /* fall thro */
  1564. case(12):
  1565. dz->iparam[0] = (int)round(dz->param[0] * srate) * chans;
  1566. break;
  1567. }
  1568. switch(dz->mode) {
  1569. case(4):
  1570. if((!dz->brksize[0]) && (dz->param[0] == 1)) {
  1571. sprintf(errstr,"No change in tempo.\n");
  1572. return(DATA_ERROR);
  1573. }
  1574. dz->iparam[2] = (int)round(dz->param[2] * srate) * chans;
  1575. dz->iparam[3] = (int)round(dz->param[3] * srate) * chans;
  1576. dz->iparam[4] = (int)round(dz->param[4] * srate) * chans;
  1577. /* fall thro */
  1578. case(3):
  1579. dz->iparam[1] = (int)round(dz->param[1] * MS_TO_SECS * srate) * chans;
  1580. if((exit_status = locate_peaks(dz)) < 0)
  1581. return(exit_status);
  1582. break;
  1583. case(5):
  1584. dz->iparam[0] = (int)round((60.0/dz->param[0]) * srate);
  1585. dz->iparam[1] = (int)round(dz->param[1] * srate) * chans;
  1586. dz->iparam[2] = (int)round(dz->param[2] * MS_TO_SECS * srate) * chans;
  1587. if(flteq(dz->param[3],0.0)) {
  1588. sprintf(errstr,"Pregain is (effectively) zero: output will be silence.\n");
  1589. return(DATA_ERROR);
  1590. }
  1591. break;
  1592. case(6):
  1593. dz->iparam[0] = (int)round(dz->param[0] * srate) * chans;
  1594. dz->iparam[1] = (int)round(dz->param[1] * MS_TO_SECS * srate) * chans;
  1595. if(flteq(dz->param[2],0.0)) {
  1596. sprintf(errstr,"Pregain is (effectively) zero: output will be silence.\n");
  1597. return(DATA_ERROR);
  1598. }
  1599. break;
  1600. case(7):
  1601. if(dz->param[MM] >= 20)
  1602. dz->param[MM] = 60.0 / dz->param[MM];
  1603. else if(dz->param[MM] > 1.0 || dz->param[MM] < FLTERR) {
  1604. sprintf(errstr,"Output tempo vals must be > 0 AND less than 1 (beat duration) OR >= 20 (MM)\n");
  1605. return(DATA_ERROR);
  1606. }
  1607. dz->iparam[MM] = (int)round(dz->param[MM] * srate) * chans;
  1608. dz->iparam[BEAT_AT] = (int)round(dz->param[BEAT_AT] * srate) * chans;
  1609. dz->iparam[BEAT_SILMIN] = (int)round(dz->param[BEAT_SILMIN] * MS_TO_SECS * srate) * chans;
  1610. break;
  1611. case(8):
  1612. dz->iparam[0] = (int)round(dz->param[0] * MS_TO_SECS * srate) * chans;
  1613. break;
  1614. case(9):
  1615. dz->iparam[0] = (int)round(dz->param[0] * MS_TO_SECS * srate) * chans;
  1616. break;
  1617. case(10):
  1618. dz->iparam[0] = (int)round(dz->param[0] * MS_TO_SECS * srate) * chans;
  1619. break;
  1620. }
  1621. return FINISHED;
  1622. }
  1623. /*************************************** READ_RETIME_DATA *********************************/
  1624. int read_retime_data(char *filename,dataptr dz)
  1625. {
  1626. double d, lasttime;
  1627. int *p, arraysize = 0;
  1628. char temp[200], *q;
  1629. FILE *fp;
  1630. if((fp = fopen(filename,"r"))==NULL) {
  1631. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  1632. return(DATA_ERROR);
  1633. }
  1634. while(fgets(temp,200,fp)!=NULL) {
  1635. q = temp;
  1636. while(get_float_from_within_string(&q,&d)) {
  1637. arraysize++;
  1638. }
  1639. }
  1640. dz->itemcnt = arraysize;
  1641. if((dz->lparray[0] = (int *) malloc(arraysize * sizeof(int)))==NULL) {
  1642. sprintf(errstr,"INSUFFICIENT MEMORY to store retiming data.\n");
  1643. return(MEMORY_ERROR);
  1644. }
  1645. p = dz->lparray[0];
  1646. fseek(fp,0,0);
  1647. lasttime = -1.0;
  1648. while(fgets(temp,200,fp)!=NULL) {
  1649. q = temp;
  1650. while(get_float_from_within_string(&q,&d)) {
  1651. if(d < 0.0 || d < lasttime) {
  1652. sprintf(errstr,"TIME (%lf) OUT OF SEQUENCE OR INVALID, IN FILE %s.\n",d,filename);
  1653. return(DATA_ERROR);
  1654. }
  1655. lasttime = d;
  1656. *p = (int)(round(d * (double)dz->infile->srate) * dz->infile->channels);
  1657. p++;
  1658. }
  1659. }
  1660. return(FINISHED);
  1661. }
  1662. /*************************************** READ_RETEMPO_DATA *********************************/
  1663. int read_retempo_data(char *filename,dataptr dz)
  1664. {
  1665. double d, lastbeat, *p;
  1666. int arraysize = 0, beatcnt;
  1667. char temp[200], *q;
  1668. FILE *fp;
  1669. if((fp = fopen(filename,"r"))==NULL) {
  1670. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  1671. return(DATA_ERROR);
  1672. }
  1673. while(fgets(temp,200,fp)!=NULL) {
  1674. q = temp;
  1675. while(get_float_from_within_string(&q,&d)) {
  1676. arraysize++;
  1677. }
  1678. }
  1679. dz->itemcnt = arraysize;
  1680. if((dz->parray[0] = (double *) malloc(arraysize * sizeof(double)))==NULL) {
  1681. sprintf(errstr,"INSUFFICIENT MEMORY to store retiming data.\n");
  1682. return(MEMORY_ERROR);
  1683. }
  1684. p = dz->parray[0];
  1685. fseek(fp,0,0);
  1686. lastbeat = -1.0;
  1687. beatcnt = 1;
  1688. while(fgets(temp,200,fp)!=NULL) {
  1689. q = temp;
  1690. while(get_float_from_within_string(&q,&d)) {
  1691. if(d < dz->application->min_special || d > dz->application->max_special) {
  1692. sprintf(errstr,"BEAT (%lf) OUT OF RANGE (%lf to %lf), IN FILE %s.\n",d,dz->application->min_special,dz->application->max_special,filename);
  1693. return(DATA_ERROR);
  1694. }
  1695. if(d <= lastbeat) {
  1696. sprintf(errstr,"BEAT %d (= %lf) OUT OF SEQUENCE IN FILE %s.\n",beatcnt,d,filename);
  1697. return(DATA_ERROR);
  1698. }
  1699. lastbeat = d;
  1700. *p = d;
  1701. p++;
  1702. beatcnt++;
  1703. }
  1704. }
  1705. return(FINISHED);
  1706. }
  1707. /*************************************** READ_RETIME_MASK *********************************/
  1708. int read_retime_mask(char *filename,dataptr dz)
  1709. {
  1710. double d;
  1711. int arraysize = 0, *p;
  1712. char temp[200], *q;
  1713. FILE *fp;
  1714. if((fp = fopen(filename,"r"))==NULL) {
  1715. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  1716. return(DATA_ERROR);
  1717. }
  1718. while(fgets(temp,200,fp)!=NULL) {
  1719. q = temp;
  1720. while(get_float_from_within_string(&q,&d)) {
  1721. arraysize++;
  1722. }
  1723. }
  1724. dz->itemcnt = arraysize;
  1725. if((dz->lparray[0] = (int *) malloc(arraysize * sizeof(int)))==NULL) {
  1726. sprintf(errstr,"INSUFFICIENT MEMORY to store retiming data.\n");
  1727. return(MEMORY_ERROR);
  1728. }
  1729. p = dz->lparray[0];
  1730. fseek(fp,0,0);
  1731. while(fgets(temp,200,fp)!=NULL) {
  1732. q = temp;
  1733. while(get_float_from_within_string(&q,&d)) {
  1734. if(d < 0.0 || d > 1.0 || (d > 0.0 && d < 1.0)) {
  1735. sprintf(errstr,"MASK VALUE (%lf) INVALID IN FILE %s.\n",d,filename);
  1736. return(DATA_ERROR);
  1737. }
  1738. *p = (int)round(d);
  1739. p++;
  1740. }
  1741. }
  1742. return(FINISHED);
  1743. }
  1744. /*************************************** READ_IDEAL_DATA *********************************/
  1745. int read_ideal_data(char *filename,dataptr dz)
  1746. {
  1747. double d, lasttime0, lasttime1, *idealtimes, *realtimes;
  1748. int finished;
  1749. int *realtimesamps, arraysize = 0, cnt;
  1750. char temp[200], *q;
  1751. FILE *fp;
  1752. if((fp = fopen(filename,"r"))==NULL) {
  1753. sprintf(errstr,"Failed to open file %s for input.\n",filename);
  1754. return(DATA_ERROR);
  1755. }
  1756. while(fgets(temp,200,fp)!=NULL) {
  1757. q = temp;
  1758. while(get_float_from_within_string(&q,&d)) {
  1759. arraysize++;
  1760. }
  1761. }
  1762. if(ODD(arraysize)) {
  1763. sprintf(errstr,"Bad count of data in file %s.\n",filename);
  1764. return(DATA_ERROR);
  1765. }
  1766. arraysize -= 2;
  1767. if(arraysize <= 0) {
  1768. sprintf(errstr,"Insufficient data in file %s.\n",filename);
  1769. return(DATA_ERROR);
  1770. }
  1771. arraysize /= 2;
  1772. dz->itemcnt = arraysize;
  1773. if((dz->parray[0] = (double *) malloc(arraysize * sizeof(double)))==NULL) { // realtimes
  1774. sprintf(errstr,"INSUFFICIENT MEMORY to store event data(1).\n");
  1775. return(MEMORY_ERROR);
  1776. }
  1777. if((dz->parray[1] = (double *) malloc(arraysize * sizeof(double)))==NULL) { // idealtimes
  1778. sprintf(errstr,"INSUFFICIENT MEMORY to store event data(2).\n");
  1779. return(MEMORY_ERROR);
  1780. }
  1781. if((dz->lparray[0] = (int *) malloc(arraysize * sizeof(int)))==NULL) { // realtimes as samps
  1782. sprintf(errstr,"INSUFFICIENT MEMORY to store event data(3).\n");
  1783. return(MEMORY_ERROR);
  1784. }
  1785. if((dz->lparray[1] = (int *) malloc(arraysize * sizeof(int)))==NULL) { // idealtimes as samps
  1786. sprintf(errstr,"INSUFFICIENT MEMORY to store event data(4).\n");
  1787. return(MEMORY_ERROR);
  1788. }
  1789. if((dz->lparray[2] = (int *) malloc(arraysize * 4 * sizeof(int)))==NULL) { // realtime start & end of both splices, in samples
  1790. sprintf(errstr,"INSUFFICIENT MEMORY to store event data(5).\n");
  1791. return(MEMORY_ERROR);
  1792. }
  1793. finished = 0;
  1794. realtimesamps = dz->lparray[0];
  1795. realtimes = dz->parray[0];
  1796. idealtimes = dz->parray[1];
  1797. fseek(fp,0,0);
  1798. lasttime0 = -1.0;
  1799. lasttime1 = -1.0;
  1800. cnt = 0;
  1801. while(fgets(temp,200,fp)!=NULL) {
  1802. q = temp;
  1803. while(get_float_from_within_string(&q,&d)) {
  1804. switch(cnt) {
  1805. case(0):
  1806. if(d <= 10 || d >= 600) {
  1807. sprintf(errstr,"MM (%lf) INVALID, IN FILE %s.\n",d,filename);
  1808. return(DATA_ERROR);
  1809. }
  1810. dz->MMin = d;
  1811. break;
  1812. case(1):
  1813. if(d < 0) {
  1814. sprintf(errstr,"OFFSET (%lf) INVALID, IN FILE %s.\n",d,filename);
  1815. return(DATA_ERROR);
  1816. }
  1817. dz->offset = d;
  1818. break;
  1819. default:
  1820. if(EVEN(cnt)) {
  1821. if(d < 0.0 || d < lasttime0) {
  1822. sprintf(errstr,"LHS TIME (%lf) OUT OF SEQUENCE OR INVALID, IN FILE %s.\n",d,filename);
  1823. return(DATA_ERROR);
  1824. }
  1825. *realtimes = d;
  1826. realtimes++;
  1827. *realtimesamps = (int)(round(d * (double)dz->infile->srate) * dz->infile->channels);
  1828. if(*realtimesamps >= dz->insams[0]) {
  1829. dz->itemcnt = realtimesamps - dz->lparray[0];
  1830. finished = 1;
  1831. }
  1832. realtimesamps++;
  1833. lasttime0 = d;
  1834. } else {
  1835. if(d < 0.0 || d < lasttime1) {
  1836. sprintf(errstr,"RHS TIME (%lf) OUT OF SEQUENCE OR INVALID, IN FILE %s.\n",d,filename);
  1837. return(DATA_ERROR);
  1838. }
  1839. *idealtimes = d;
  1840. idealtimes++;
  1841. if(finished)
  1842. break;
  1843. lasttime1 = d;
  1844. }
  1845. break;
  1846. }
  1847. cnt++;
  1848. }
  1849. }
  1850. if(dz->itemcnt <= 0) {
  1851. sprintf(errstr,"LHS TIMES IN FILE %s ARE ALL BEYOND END OF SOUNDFILE.\n",filename);
  1852. return(DATA_ERROR);
  1853. }
  1854. return(FINISHED);
  1855. }
  1856. /************************ HANDLE_THE_SPECIAL_DATA *********************/
  1857. int handle_the_special_data(int *cmdlinecnt,char ***cmdline,dataptr dz)
  1858. {
  1859. int exit_status;
  1860. aplptr ap = dz->application;
  1861. if(ap->special_data) {
  1862. if(!sloom) {
  1863. if(*cmdlinecnt <= 0) {
  1864. sprintf(errstr,"Insufficient parameters on command line.\n");
  1865. return(USAGE_ONLY);
  1866. }
  1867. }
  1868. if((exit_status = setup_the_special_data_ranges
  1869. (dz->mode,dz->infile->srate,dz->duration,dz->nyquist,dz->wlength,dz->infile->channels,ap))<0)
  1870. return(exit_status);
  1871. if((exit_status = read_special_data((*cmdline)[0],dz))<0)
  1872. return(exit_status);
  1873. (*cmdline)++;
  1874. (*cmdlinecnt)--;
  1875. }
  1876. return(FINISHED);
  1877. }
  1878. /************************ SETUP_SPECIAL_DATA_RANGES *********************/
  1879. int setup_the_special_data_ranges(int mode,int srate,double duration,double nyquist,int wlength,int channels,aplptr ap)
  1880. {
  1881. switch(ap->special_data) {
  1882. case(RETIME_DATA):
  1883. case(IDEAL_DATA):
  1884. case(RETEMPO_DATA):
  1885. ap->min_special = 0;
  1886. ap->max_special = 3600; // guestimate of highest poss user silence or max possible beat-cnt
  1887. break;
  1888. case(RETIME_FNAM):
  1889. ap->special_range = FALSE;
  1890. break;
  1891. case(RETIME_MASK):
  1892. ap->min_special = 0;
  1893. ap->max_special = 1;
  1894. break;
  1895. default:
  1896. sprintf(errstr,"Unknown special_data type: setup_the_special_data_ranges()\n");
  1897. return(PROGRAM_ERROR);
  1898. }
  1899. return(FINISHED);
  1900. }
  1901. /************************* READ_SPECIAL_DATA *******************/
  1902. int read_special_data(char *str,dataptr dz)
  1903. {
  1904. aplptr ap = dz->application;
  1905. switch(ap->special_data) {
  1906. case(RETIME_DATA): return read_retime_data(str,dz);
  1907. case(IDEAL_DATA): return read_ideal_data(str,dz);
  1908. case(RETEMPO_DATA): return read_retempo_data(str,dz);
  1909. case(RETIME_FNAM): return read_retime_fnam(str,dz);
  1910. case(RETIME_MASK): return read_retime_mask(str,dz);
  1911. }
  1912. return(FINISHED);
  1913. }
  1914. /*************************** CREATE_RETIME_SNDBUFS **************************/
  1915. int create_retime_sndbufs(dataptr dz)
  1916. {
  1917. size_t bigbufsize;
  1918. int n, step, in, out, minsize = 0;
  1919. size_t framesize = dz->infile->channels * F_SECSIZE;
  1920. int *realcuts, *chunklen;
  1921. switch(dz->mode) {
  1922. case(0):
  1923. for(n=2;n < dz->itemcnt;n++) {
  1924. step = dz->lparray[0][n] - dz->lparray[0][n-1];
  1925. if(step > minsize)
  1926. minsize = step * 4;
  1927. }
  1928. break;
  1929. case(1):
  1930. realcuts = dz->lparray[2];
  1931. minsize = 0;
  1932. for(n=0,in=0,out=3;n < dz->itemcnt;n++,in+=4,out+=4)
  1933. minsize = max(minsize,realcuts[out] - realcuts[in]);
  1934. break;
  1935. case(2):
  1936. case(5):
  1937. case(6):
  1938. case(8):
  1939. case(9):
  1940. case(10):
  1941. case(11):
  1942. case(12):
  1943. case(13):
  1944. minsize = framesize;
  1945. break;
  1946. case(3):
  1947. case(4):
  1948. chunklen = dz->lparray[1];
  1949. minsize = 0;
  1950. for(n=0;n < dz->itemcnt;n++)
  1951. minsize = max(minsize,chunklen[n]);
  1952. break;
  1953. case(7):
  1954. minsize = dz->iparam[MM] * (dz->iparam[BEAT_CNT] + 24); /* 24 is a safety margin, in case grabbable beat is longer than defined */
  1955. break;
  1956. }
  1957. if(dz->sbufptr == 0 || dz->sampbuf==0) {
  1958. sprintf(errstr,"buffer pointers not allocated: create_retime_sndbufs()\n");
  1959. return(PROGRAM_ERROR);
  1960. }
  1961. bigbufsize = (size_t)Malloc(-1);
  1962. dz->buflen = (int)(bigbufsize / sizeof(float));
  1963. dz->buflen = (dz->buflen / (framesize * dz->bufcnt)) * (framesize * dz->bufcnt);
  1964. dz->buflen /= dz->bufcnt;
  1965. while(dz->buflen < minsize)
  1966. dz->buflen += framesize;
  1967. if(dz->buflen <= 0) {
  1968. sprintf(errstr,"BUFFERS TOO LARGE.\n");
  1969. return(PROGRAM_ERROR);
  1970. }
  1971. bigbufsize = dz->buflen * sizeof(float);
  1972. if(bigbufsize * dz->bufcnt <= 0) {
  1973. sprintf(errstr,"BUFFERS TOO LARGE.\n");
  1974. return(PROGRAM_ERROR);
  1975. }
  1976. if((dz->bigbuf = (float *)malloc(bigbufsize * dz->bufcnt)) == NULL) {
  1977. sprintf(errstr,"INSUFFICIENT MEMORY to create sound buffers.\n");
  1978. return(PROGRAM_ERROR);
  1979. }
  1980. for(n=0;n<dz->bufcnt;n++)
  1981. dz->sbufptr[n] = dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1982. dz->sampbuf[n] = dz->bigbuf + (dz->buflen * n);
  1983. memset((char *)dz->sampbuf[0],0,dz->buflen * dz->bufcnt * sizeof(float));
  1984. return(FINISHED);
  1985. }
  1986. /***************************** SETUP_INTERNAL_ARRAYS_AND_ARRAY_POINTERS **************************/
  1987. int setup_internal_arrays_and_array_pointers(dataptr dz)
  1988. {
  1989. int n;
  1990. dz->ptr_cnt = -1; /* base constructor...process */
  1991. dz->array_cnt = -1;
  1992. dz->iarray_cnt = -1;
  1993. dz->larray_cnt = -1;
  1994. switch(dz->mode) {
  1995. case(0):
  1996. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 1; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  1997. break;
  1998. case(1):
  1999. dz->array_cnt = 2; dz->iarray_cnt = 0; dz->larray_cnt = 3; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2000. break;
  2001. case(2):
  2002. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 1; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2003. break;
  2004. case(3):
  2005. case(4):
  2006. case(8):
  2007. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2008. break;
  2009. case(5):
  2010. case(6):
  2011. dz->array_cnt = 1; dz->iarray_cnt = 0; dz->larray_cnt = 1; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2012. break;
  2013. case(7):
  2014. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 1; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2015. break;
  2016. case(9):
  2017. dz->array_cnt = 1; dz->iarray_cnt = 0; dz->larray_cnt = 2; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2018. break;
  2019. case(10):
  2020. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 1; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2021. break;
  2022. case(11):
  2023. case(12):
  2024. case(13):
  2025. dz->array_cnt = 0; dz->iarray_cnt = 0; dz->larray_cnt = 0; dz->ptr_cnt = 0; dz->fptr_cnt = 0;
  2026. break;
  2027. }
  2028. if(dz->array_cnt < 0 || dz->iarray_cnt < 0 || dz->larray_cnt < 0 || dz->ptr_cnt < 0 || dz->fptr_cnt < 0) {
  2029. sprintf(errstr,"array_cnt not set in setup_internal_arrays_and_array_pointers()\n");
  2030. return(PROGRAM_ERROR);
  2031. }
  2032. if(dz->array_cnt) {
  2033. if((dz->parray = (double **)malloc(dz->array_cnt * sizeof(double *)))==NULL) {
  2034. sprintf(errstr,"INSUFFICIENT MEMORY for internal double arrays.\n");
  2035. return(MEMORY_ERROR);
  2036. }
  2037. for(n=0;n<dz->array_cnt;n++)
  2038. dz->parray[n] = NULL;
  2039. }
  2040. if(dz->larray_cnt) {
  2041. if((dz->lparray = (int **)malloc(dz->larray_cnt * sizeof(int *)))==NULL) {
  2042. sprintf(errstr,"INSUFFICIENT MEMORY for internal long arrays.\n");
  2043. return(MEMORY_ERROR);
  2044. }
  2045. for(n=0;n<dz->larray_cnt;n++)
  2046. dz->lparray[n] = NULL;
  2047. }
  2048. return(FINISHED);
  2049. }
  2050. /************************* RETIME **********************************/
  2051. int retime(dataptr dz)
  2052. {
  2053. int exit_status, insig;
  2054. int chans = dz->infile->channels;
  2055. double srate = dz->infile->srate;
  2056. int *intimes = dz->lparray[0];
  2057. int outstep = dz->iparam[MM];
  2058. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[2];
  2059. int obufpos = 0;
  2060. int maxsil = 4;
  2061. int splicelen = (int)round(15.0 * MS_TO_SECS * srate) * chans;
  2062. int winsize = (int)round(RETIME_WINSIZE * MS_TO_SECS * srate) * chans;
  2063. int *silat, *sillen, *pos;
  2064. float *env;
  2065. int abs_read_start, read_end_in_buf, last_time_in_inbuf, next_time_in_inbuf, samps_to_copy, timescnt, lasttime, timestep, timechange;
  2066. int n, m, j, k, silcnt = 0, small_loc, large_loc, this_splicelen, splicestart, splicend, min_energy_point = 0;
  2067. int smallest, largest;
  2068. double spliceincr, spliceval;
  2069. int silence_to_set, this_timechange;
  2070. if ((silat = (int *)malloc((maxsil+1) * sizeof(int)))==NULL) {
  2071. sprintf(errstr,"Insufficient memory to store silence locations between beats\n");
  2072. return(MEMORY_ERROR);
  2073. }
  2074. if ((sillen = (int *)malloc((maxsil+1) * sizeof(int)))==NULL) {
  2075. sprintf(errstr,"Insufficient memory to store lengths of silences between beats\n");
  2076. return(MEMORY_ERROR);
  2077. }
  2078. if ((env = (float *)malloc(RETIME_ENVSIZE * sizeof(float)))==NULL) {
  2079. sprintf(errstr,"Insufficient memory to store envelope data\n");
  2080. return(MEMORY_ERROR);
  2081. }
  2082. if ((pos = (int *)malloc(RETIME_ENVSIZE * sizeof(int)))==NULL) {
  2083. sprintf(errstr,"Insufficient memory to store envelope positions\n");
  2084. return(MEMORY_ERROR);
  2085. }
  2086. memset((char *)dz->bigbuf,0,5 * dz->buflen * sizeof(float));
  2087. /* read sound into (double) inbuf */
  2088. if((exit_status = read_samps(dz->sampbuf[0],dz)) < 0)
  2089. return(exit_status);
  2090. abs_read_start = 0;
  2091. read_end_in_buf = dz->ssampsread;
  2092. if(dz->ssampsread == dz->buflen) {
  2093. if((exit_status = read_samps(dz->sampbuf[1],dz)) < 0) {
  2094. return(exit_status);
  2095. }
  2096. read_end_in_buf += dz->ssampsread;
  2097. }
  2098. last_time_in_inbuf = 0;
  2099. for(n=0;n<dz->itemcnt;n++) {
  2100. if(intimes[n] >= dz->insams[0]) {
  2101. dz->itemcnt = n;
  2102. break;
  2103. }
  2104. }
  2105. if(dz->itemcnt == 0) {
  2106. sprintf(errstr,"ALL ENTERED TIMES ARE TOO LATE FOR THIS SOUND.\n");
  2107. return(DATA_ERROR);
  2108. }
  2109. if(dz->itemcnt < 2) {
  2110. sprintf(errstr,"TOO FEW ENTERED TIMES (MUST BE AT LEAST 2).\n");
  2111. return(DATA_ERROR);
  2112. }
  2113. if(intimes[0] > 0) { /* Deal with first time (copy initial block of sound) */
  2114. samps_to_copy = intimes[0];
  2115. while(samps_to_copy >= dz->buflen) {
  2116. memcpy((char *)obuf,(char *)ibuf,dz->buflen * sizeof(float));
  2117. obufpos = dz->buflen;
  2118. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2119. return(exit_status);
  2120. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2121. return(exit_status);
  2122. samps_to_copy -= dz->buflen;
  2123. }
  2124. if(samps_to_copy) {
  2125. memcpy((char *)obuf,(char *)ibuf,samps_to_copy * sizeof(float));
  2126. obufpos += samps_to_copy;
  2127. if(obufpos >= dz->buflen * 2) {
  2128. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2129. return(exit_status);
  2130. }
  2131. }
  2132. last_time_in_inbuf = samps_to_copy;
  2133. }
  2134. timescnt = 1;
  2135. lasttime = intimes[0];
  2136. next_time_in_inbuf = lasttime - abs_read_start;
  2137. for(timescnt = 1;timescnt < dz->itemcnt;timescnt++) {
  2138. last_time_in_inbuf = next_time_in_inbuf;
  2139. while(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2140. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2141. return(exit_status);
  2142. }
  2143. next_time_in_inbuf = intimes[timescnt] - abs_read_start;
  2144. timestep = next_time_in_inbuf - last_time_in_inbuf;
  2145. /* Find step between marked times */
  2146. timechange = outstep - timestep; /* Find difference bedtween marked times and required times */
  2147. /* IF SILENCE IS TO BE INSERTED */
  2148. if(timechange > chans) {
  2149. /* LOOK FOR EXISTING SILENCES */
  2150. for(n=0;n<maxsil+1;n++)
  2151. sillen[n] = 0;
  2152. silcnt = 0;
  2153. k = last_time_in_inbuf;
  2154. insig = 1;
  2155. while(k < next_time_in_inbuf) {
  2156. if(ibuf[k] == 0.0) {
  2157. insig = 0;
  2158. if(sillen[silcnt] == 0) /* If not started counting zero in this silence */
  2159. silat[silcnt] = k; /* mark where 1st zero is */
  2160. sillen[silcnt]++; /* count zeros */
  2161. } else {
  2162. if(!insig) {
  2163. if(sillen[silcnt] >= chans * 2) { /* if we've counted more than 'chan' zeros' in a previous silence */
  2164. silcnt++; /* this is a valid silence, keep it, and go to next */
  2165. if(silcnt > maxsil) { /* if we've used up the silence array */
  2166. smallest = (int)floor(MAXINT);
  2167. small_loc = 0;
  2168. for(n=0;n<maxsil+1;n++) { /* find shortest silence */
  2169. if(sillen[n] <= smallest) {
  2170. smallest = sillen[n];
  2171. small_loc = n;
  2172. }
  2173. } /* overwrite smallest silence, by shuffling vals back */
  2174. for(n = small_loc+1;n<maxsil+1;n++) {
  2175. sillen[n-1] = sillen[n];
  2176. silat[n-1] = silat[n];
  2177. } /* NB, if smallest is last, this will be overwritten by next silence, if any */
  2178. silcnt--;
  2179. }
  2180. } else {
  2181. sillen[silcnt] = 0; /* else, invalid silence, reset silence-zeroconuter to zero */
  2182. }
  2183. insig = 1;
  2184. }
  2185. }
  2186. k++;
  2187. }
  2188. /* IF SILENCES HAVE BEEN FOUND, INSERT MORE SILENCE WITHIN THE LARGEST OF THESE */
  2189. if(silcnt > 0) {
  2190. if(silcnt > 1) {
  2191. largest = 0;
  2192. large_loc = 0;
  2193. for(n=0;n<silcnt;n++) { /* find largest silence */
  2194. if(sillen[n] > largest) {
  2195. largest = sillen[n];
  2196. large_loc = n;
  2197. }
  2198. }
  2199. for(m=0;m<silcnt;m++) { /* remove too small silences from silences list */
  2200. if(m != large_loc) {
  2201. if((double)largest/(double)sillen[m] > BIGGERSIL) {
  2202. for(n = m+1;n<silcnt;n++) {
  2203. sillen[n-1] = sillen[n];
  2204. silat[n-1] = silat[n];
  2205. } /* NB, if smallest is last, this will be overwritten by next silence, if any */
  2206. if(large_loc > m)
  2207. large_loc--;
  2208. silcnt--;
  2209. m--;
  2210. }
  2211. }
  2212. }
  2213. }
  2214. while(timechange/silcnt < chans) { /* if the individual silence-inserts are too small, ignore some silences */
  2215. smallest = (int)floor(MAXINT);
  2216. small_loc = 0;
  2217. for(n=0;n<silcnt;n++) { /* find shortest silence */
  2218. if(sillen[n] <= smallest) {
  2219. smallest = sillen[n];
  2220. small_loc = n;
  2221. }
  2222. } /* overwrite smallest silence, by shuffling vals back */
  2223. for(n = small_loc+1;n<silcnt;n++) {
  2224. sillen[n-1] = sillen[n];
  2225. silat[n-1] = silat[n];
  2226. } /* NB, if smallest is last, this will be overwritten by next silence, if any */
  2227. silcnt--;
  2228. }
  2229. this_timechange = timechange/silcnt; /* individual inserted silences are 1-over-silcnt * actual timechange */
  2230. this_timechange = (this_timechange/chans) * chans;
  2231. if(this_timechange < chans)
  2232. this_timechange = chans;
  2233. for(n=0;n<silcnt;n++) { /* insert the silences */
  2234. samps_to_copy = silat[n] - last_time_in_inbuf;
  2235. while(samps_to_copy >= dz->buflen) {
  2236. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),dz->buflen * sizeof(float));
  2237. obufpos += dz->buflen;
  2238. if(obufpos >= dz->buflen * 2) {
  2239. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2240. return(exit_status);
  2241. }
  2242. last_time_in_inbuf += dz->buflen;
  2243. if(last_time_in_inbuf >= dz->buflen) {
  2244. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2245. return(exit_status);
  2246. }
  2247. samps_to_copy -= dz->buflen;
  2248. }
  2249. if(samps_to_copy) {
  2250. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),samps_to_copy * sizeof(float));
  2251. obufpos += samps_to_copy;
  2252. if(obufpos >= dz->buflen * 2) {
  2253. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2254. return(exit_status);
  2255. }
  2256. last_time_in_inbuf += samps_to_copy;
  2257. if(last_time_in_inbuf >= dz->buflen) {
  2258. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2259. return(exit_status);
  2260. }
  2261. }
  2262. silence_to_set = this_timechange;
  2263. while(silence_to_set >= dz->buflen) {
  2264. memset((char *)(obuf+obufpos),0,dz->buflen * sizeof(float));
  2265. obufpos += dz->buflen;
  2266. if(obufpos >= dz->buflen * 2) {
  2267. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2268. return(exit_status);
  2269. }
  2270. silence_to_set -= dz->buflen;
  2271. }
  2272. if(silence_to_set) {
  2273. memset((char *)(obuf+obufpos),0,silence_to_set * sizeof(float));
  2274. obufpos += silence_to_set;
  2275. if(obufpos >= dz->buflen * 2) {
  2276. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2277. return(exit_status);
  2278. }
  2279. }
  2280. last_time_in_inbuf = silat[n];
  2281. }
  2282. /* copy any remaining insound before next time-marker */
  2283. samps_to_copy = next_time_in_inbuf - last_time_in_inbuf;
  2284. while(samps_to_copy >= dz->buflen) {
  2285. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),dz->buflen * sizeof(float));
  2286. obufpos += dz->buflen;
  2287. if(obufpos >= dz->buflen * 2) {
  2288. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2289. return(exit_status);
  2290. }
  2291. last_time_in_inbuf += dz->buflen;
  2292. if(last_time_in_inbuf >= dz->buflen) {
  2293. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2294. return(exit_status);
  2295. }
  2296. samps_to_copy -= dz->buflen;
  2297. }
  2298. if(samps_to_copy) {
  2299. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),samps_to_copy * sizeof(float));
  2300. obufpos += samps_to_copy;
  2301. if(obufpos >= dz->buflen * 2) {
  2302. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2303. return(exit_status);
  2304. }
  2305. last_time_in_inbuf += samps_to_copy;
  2306. if(last_time_in_inbuf >= dz->buflen) {
  2307. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2308. return(exit_status);
  2309. }
  2310. }
  2311. } else {
  2312. /* ELSE, NO EXISTING SILENCES ... INSERTING SILENCE AT MIN ENERGY POINT */
  2313. if((exit_status = find_min_energy_point(&min_energy_point,last_time_in_inbuf,next_time_in_inbuf,winsize,ibuf,env,pos,dz)) < 0)
  2314. return(exit_status);
  2315. samps_to_copy = min_energy_point - last_time_in_inbuf;
  2316. while(samps_to_copy >= dz->buflen) {
  2317. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),dz->buflen * sizeof(float));
  2318. obufpos += dz->buflen;
  2319. if(obufpos >= dz->buflen * 2) {
  2320. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2321. return(exit_status);
  2322. }
  2323. last_time_in_inbuf += dz->buflen;
  2324. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2325. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2326. return(exit_status);
  2327. }
  2328. samps_to_copy -= dz->buflen;
  2329. }
  2330. if(samps_to_copy) {
  2331. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),samps_to_copy * sizeof(float));
  2332. obufpos += samps_to_copy; /* copy to min energy pont */
  2333. if(obufpos >= dz->buflen * 2) {
  2334. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2335. return(exit_status);
  2336. } /* insert silence */
  2337. last_time_in_inbuf += samps_to_copy;
  2338. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2339. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2340. return(exit_status);
  2341. }
  2342. }
  2343. while(timechange >= dz->buflen) {
  2344. memset((char *)(obuf+obufpos),0,dz->buflen * sizeof(float));
  2345. obufpos += dz->buflen;
  2346. if(obufpos >= dz->buflen * 2) {
  2347. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2348. return(exit_status);
  2349. }
  2350. timechange -= dz->buflen;
  2351. }
  2352. if(timechange) {
  2353. memset((char *)(obuf+obufpos),0,timechange * sizeof(float));
  2354. obufpos += timechange;
  2355. if(obufpos >= dz->buflen * 2) {
  2356. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2357. return(exit_status);
  2358. } /* copy from min energy point to next-time */
  2359. }
  2360. last_time_in_inbuf = min_energy_point;
  2361. samps_to_copy = next_time_in_inbuf - min_energy_point;
  2362. while(samps_to_copy >= dz->buflen) {
  2363. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),dz->buflen * sizeof(float));
  2364. obufpos += dz->buflen;
  2365. if(obufpos >= dz->buflen * 2) {
  2366. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2367. return(exit_status);
  2368. }
  2369. last_time_in_inbuf += dz->buflen;
  2370. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2371. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2372. return(exit_status);
  2373. }
  2374. samps_to_copy -= dz->buflen;
  2375. }
  2376. if(samps_to_copy) {
  2377. memcpy((char *)(obuf+obufpos),(char *)(ibuf+last_time_in_inbuf),samps_to_copy * sizeof(float));
  2378. obufpos += samps_to_copy;
  2379. if(obufpos >= dz->buflen * 2) {
  2380. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2381. return(exit_status);
  2382. }
  2383. last_time_in_inbuf += samps_to_copy;
  2384. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2385. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2386. return(exit_status);
  2387. }
  2388. }
  2389. }
  2390. } else if(timechange < -chans) { /* Time must be removed, do overlap at min-level point */
  2391. if((exit_status = find_min_energy_point(&min_energy_point,last_time_in_inbuf,next_time_in_inbuf,winsize,ibuf,env,pos,dz)) < 0)
  2392. return(exit_status);
  2393. /* Copy samples up to min energy point */
  2394. samps_to_copy = min_energy_point - last_time_in_inbuf;
  2395. this_splicelen = min(samps_to_copy,splicelen);
  2396. splicestart = samps_to_copy - this_splicelen;
  2397. spliceincr = 1.0 / this_splicelen;
  2398. spliceval = 1.0;
  2399. k = 0;
  2400. while(samps_to_copy >= dz->buflen) {
  2401. for(j=0;j < dz->buflen;j++) {
  2402. if(k >= splicestart)
  2403. spliceval -= spliceincr;
  2404. obuf[obufpos] = (float) (obuf[obufpos] + (ibuf[last_time_in_inbuf] * spliceval));
  2405. last_time_in_inbuf++;
  2406. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2407. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2408. return(exit_status);
  2409. }
  2410. obufpos++;
  2411. k++;
  2412. }
  2413. if(obufpos >= dz->buflen * 2) {
  2414. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2415. return(exit_status);
  2416. }
  2417. samps_to_copy -= dz->buflen;
  2418. }
  2419. while(samps_to_copy > 0) {
  2420. if(k >= splicestart)
  2421. spliceval -= spliceincr;
  2422. obuf[obufpos] = (float) (obuf[obufpos] + (ibuf[last_time_in_inbuf] * spliceval));
  2423. last_time_in_inbuf++;
  2424. obufpos++;
  2425. samps_to_copy--;
  2426. k++;
  2427. }
  2428. obufpos += timechange; /* step back in obuf, (timechange is -ve) so samples overlap, shortening obuf file here */
  2429. if(obufpos < 0) {
  2430. fprintf(stdout,"WARNING: Time modfification too extreme for buffers: Quitting before end of input sound.\n");
  2431. fflush(stdout);
  2432. obufpos -= timechange;
  2433. break;
  2434. }
  2435. if(obufpos >= dz->buflen * 2) {
  2436. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2437. return(exit_status);
  2438. } /* Copy samples from min energy point to next specified time */
  2439. samps_to_copy = next_time_in_inbuf - min_energy_point;
  2440. this_splicelen = min(samps_to_copy,splicelen);
  2441. splicend = this_splicelen;
  2442. spliceincr = 1.0 / this_splicelen;
  2443. spliceval = 0.0;
  2444. k = 0;
  2445. while(samps_to_copy >= dz->buflen) {
  2446. for(j=0;j < dz->buflen;j++) {
  2447. if(k < splicend)
  2448. spliceval += spliceincr;
  2449. obuf[obufpos] = (float) (obuf[obufpos] + (ibuf[last_time_in_inbuf] * spliceval));
  2450. last_time_in_inbuf++;
  2451. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2452. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2453. return(exit_status);
  2454. }
  2455. obufpos++;
  2456. samps_to_copy--;
  2457. k++;
  2458. }
  2459. if(obufpos >= dz->buflen * 2) {
  2460. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2461. return(exit_status);
  2462. }
  2463. samps_to_copy -= dz->buflen;
  2464. }
  2465. while(samps_to_copy > 0) {
  2466. if(k < splicend)
  2467. spliceval += spliceincr;
  2468. obuf[obufpos] = (float) (obuf[obufpos] + (ibuf[last_time_in_inbuf] * spliceval));
  2469. last_time_in_inbuf++;
  2470. if(last_time_in_inbuf >= dz->buflen) { /* advance in inbuf if ness */
  2471. if((exit_status = advance_ibuf(&abs_read_start,&read_end_in_buf,&last_time_in_inbuf,&next_time_in_inbuf,&min_energy_point,silcnt,silat,dz)) < 0)
  2472. return(exit_status);
  2473. }
  2474. obufpos++;
  2475. samps_to_copy--;
  2476. k++;
  2477. }
  2478. if(obufpos >= dz->buflen * 2) {
  2479. if((exit_status = advance_obuf(&obufpos,dz)) < 0)
  2480. return(exit_status);
  2481. }
  2482. }
  2483. }
  2484. if(obufpos > 0) {
  2485. if((exit_status = write_samps(dz->sampbuf[2],obufpos,dz))<0)
  2486. return(exit_status);
  2487. }
  2488. if(read_end_in_buf > last_time_in_inbuf) {
  2489. if((exit_status = write_samps(dz->sampbuf[0] + last_time_in_inbuf,read_end_in_buf - last_time_in_inbuf,dz))<0) /* Write ALL samps remaining in inbuf */
  2490. return(exit_status);
  2491. }
  2492. while(dz->total_samps_read < dz->insams[0]) { /* Read and write any remaining samples in infile */
  2493. if((exit_status = read_samps(dz->sampbuf[0],dz)) < 0)
  2494. return(exit_status);
  2495. if((exit_status = write_samps(dz->sampbuf[0],dz->ssampsread,dz))<0)
  2496. return(exit_status);
  2497. }
  2498. return FINISHED;
  2499. }
  2500. /******************************************* ADVANCE_OBUF *******************************************/
  2501. int advance_obuf(int *obufpos,dataptr dz)
  2502. {
  2503. int exit_status;
  2504. if((exit_status = write_samps(dz->sampbuf[2],dz->buflen,dz))<0)
  2505. return(exit_status);
  2506. memcpy((char *)dz->sampbuf[2],(char *)dz->sampbuf[3],dz->buflen * sizeof(float));
  2507. memcpy((char *)dz->sampbuf[3],(char *)dz->sampbuf[4],dz->buflen * sizeof(float));
  2508. memset((char *)dz->sampbuf[4],0,dz->buflen * sizeof(float));
  2509. *obufpos -= dz->buflen;
  2510. return FINISHED;
  2511. }
  2512. /******************************************* ADVANCE_IBUF *******************************************/
  2513. int advance_ibuf(int *abs_read_start,int *read_end_in_buf,int *last_time_in_inbuf,int *next_time_in_inbuf,int *min_energy_point,int silcnt,int *silat,dataptr dz)
  2514. {
  2515. int exit_status, n;
  2516. memcpy((char *)dz->sampbuf[0],(char *)dz->sampbuf[1],dz->buflen * sizeof(float));
  2517. memset((char *)dz->sampbuf[1],0,dz->buflen * sizeof(float));
  2518. *read_end_in_buf -= dz->buflen;
  2519. *last_time_in_inbuf -= dz->buflen;
  2520. *next_time_in_inbuf -= dz->buflen;
  2521. *min_energy_point -= dz->buflen;
  2522. if(silcnt > 0) {
  2523. for(n= 0;n < silcnt;n++)
  2524. silat[n] -= dz->buflen;
  2525. }
  2526. if((exit_status = read_samps(dz->sampbuf[1],dz)) < 0)
  2527. return(exit_status);
  2528. if(dz->ssampsread > 0) {
  2529. *abs_read_start += dz->buflen;
  2530. *read_end_in_buf += dz->ssampsread;
  2531. }
  2532. return(FINISHED);
  2533. }
  2534. /******************************************* FIND_MIN_ENERGY_POINT *******************************************/
  2535. int find_min_energy_point(int *min_energy_point,int last_time_in_inbuf,int next_time_in_inbuf,int winsize,float *ibuf,float *env,int *pos,dataptr dz)
  2536. {
  2537. int envcnt = 0;
  2538. int envarraycnt = 0;
  2539. double maxsamp = 0.0, minsamp, max_local;
  2540. int dist, k, minloc, startt, endd;
  2541. int chans = dz->infile->channels, phase;
  2542. float min_energy;
  2543. int minpos;
  2544. if((dist = next_time_in_inbuf - last_time_in_inbuf) >= winsize * 2) {
  2545. /* FIND GROSS ENVELOPE USING 20mS WINDOWS */
  2546. for(k = last_time_in_inbuf;k < next_time_in_inbuf; k++,dist--) {
  2547. if(envarraycnt >= RETIME_ENVSIZE) {
  2548. sprintf(errstr,"Envelope overflow at gross envelope stage\n");
  2549. return(MEMORY_ERROR);
  2550. }
  2551. maxsamp = max(fabs(ibuf[k]),maxsamp);
  2552. envcnt++;
  2553. if((envcnt >= winsize) && (dist > winsize)) {
  2554. env[envarraycnt++] = (float)maxsamp;
  2555. envcnt = 0;
  2556. } /* incorporate any final window < wsize in length, into final window */
  2557. }
  2558. if(envcnt > 0)
  2559. envarraycnt++;
  2560. /* FIND MINIMUM IN GROSS ENVELOPE */
  2561. minsamp = HUGE;
  2562. minloc = 0;
  2563. for(k=0;k < envarraycnt;k++) { /* find minimum in envelope */
  2564. if(env[k] < minsamp) {
  2565. minsamp = env[k];
  2566. minloc = k;
  2567. }
  2568. }
  2569. /* FIND START AND END OF MINIMUM ENERGY WINDOW */
  2570. startt = last_time_in_inbuf + (minloc * winsize);
  2571. if(k == envcnt - 1)
  2572. endd = next_time_in_inbuf;
  2573. else
  2574. endd = last_time_in_inbuf + ((minloc+1) * winsize);
  2575. } else {
  2576. /* IF TIMESTEP TOO SHORT FOR 20mS WINDOWING, USE WHOLE LENGTH OF TIMESTEP INSTEAD */
  2577. startt = last_time_in_inbuf;
  2578. endd = next_time_in_inbuf;
  2579. }
  2580. /* FIND MINIMUM ENERGY POINT */
  2581. k = startt;
  2582. while(ibuf[k] == 0.0) {
  2583. k++;
  2584. if(k == endd) { /* if entire window is zero, put min-energy point in middle of it */
  2585. *min_energy_point = (((startt + endd)/2)/chans) * chans;
  2586. return(FINISHED);
  2587. }
  2588. }
  2589. max_local = 0.0;
  2590. envcnt = 0;
  2591. if(ibuf[k] > 0.0)
  2592. phase = 1;
  2593. else
  2594. phase = -1;
  2595. while(k < endd) {
  2596. if(envcnt >= RETIME_ENVSIZE) {
  2597. sprintf(errstr,"Envelope overflow at min-energy stage\n");
  2598. return(MEMORY_ERROR);
  2599. }
  2600. switch(phase) {
  2601. case(1):
  2602. if(ibuf[k] < 0.0) { /* If phase has changed */
  2603. env[envcnt++] = (float)max_local; /* store local energy peak, and go to next envelope-store location */
  2604. max_local = 0.0;
  2605. phase = -1;
  2606. } else {
  2607. if(ibuf[k] > max_local) { /* get local energy peak, and its location */
  2608. pos[envcnt] = k;
  2609. max_local = ibuf[k];
  2610. }
  2611. k++;
  2612. }
  2613. break;
  2614. case(-1):
  2615. if(ibuf[k] > 0.0) {
  2616. env[envcnt] = (float)max_local;
  2617. pos[envcnt++] = k;
  2618. max_local = 0.0;
  2619. phase = 1;
  2620. } else {
  2621. if(fabs(ibuf[k]) > max_local) {
  2622. pos[envcnt] = k;
  2623. max_local = fabs(ibuf[k]);
  2624. }
  2625. k++;
  2626. }
  2627. break;
  2628. }
  2629. }
  2630. env[envcnt++] = (float)max_local;
  2631. /* FIND MINIMUM LOCAL ENERGY-PEAK */
  2632. min_energy = env[0];
  2633. minpos = pos[0];
  2634. for(k = 1;k<envcnt;k++) {
  2635. if(env[k] < min_energy) {
  2636. min_energy = env[k];
  2637. minpos = pos[k];
  2638. }
  2639. }
  2640. /* FIND FIRST ZERO-CROSSING AFTER (OR BEFORE) MIN LOCAL ENERGY-PEAK */
  2641. k = minpos;
  2642. if(ibuf[k] > 0.0) {
  2643. while(ibuf[k] > 0.0) {
  2644. k++;
  2645. if(k == endd) {
  2646. k = minpos;
  2647. while(ibuf[k] > 0.0) {
  2648. k--;
  2649. if(k == startt) {
  2650. *min_energy_point = k;
  2651. fprintf(stdout,"WARNING: Failed to find zero-crossing: try filtering out lowest frqs\n");
  2652. fflush(stdout);
  2653. return(FINISHED);
  2654. }
  2655. }
  2656. }
  2657. }
  2658. } else if(ibuf[k] < 0.0) {
  2659. while(ibuf[k] < 0.0) {
  2660. k++;
  2661. if(k == endd) {
  2662. k = minpos;
  2663. while(ibuf[k] < 0.0) {
  2664. k--;
  2665. if(k == startt) {
  2666. *min_energy_point = k;
  2667. fprintf(stdout,"WARNING: Failed to find zero-crossing: try filtering out lowest frqs\n");
  2668. fflush(stdout);
  2669. return(FINISHED);
  2670. }
  2671. }
  2672. }
  2673. }
  2674. }
  2675. *min_energy_point = k;
  2676. return(FINISHED);
  2677. }
  2678. /******************************************* IDEAL_RETIME *******************************************/
  2679. int ideal_retime(dataptr dz)
  2680. {
  2681. int exit_status;
  2682. int chans = dz->infile->channels, k, thisevent;
  2683. int *cuts = dz->lparray[2], in, on, off, out; // in = start of upsplice, on = start of full-level chunk, off = end of full-level chunk, out = end of downsplice
  2684. int *idealsamps = dz->lparray[1];
  2685. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1], *ovflowbuf = dz->sampbuf[2], *splbuf = dz->sampbuf[3];
  2686. int obufpos, lastwrite, ibufstart, obufstart, overflow, chunklen, upsplen, dnsplen, upsplicecnt, dnsplicecnt, n, m;
  2687. double upincr, dnincr, splval;
  2688. memset((char *)obuf,0,2 * dz->buflen * sizeof(float));
  2689. memset((char *)splbuf,0,dz->buflen * sizeof(float));
  2690. ibufstart = 0;
  2691. obufstart = 0;
  2692. lastwrite = 0;
  2693. /* FOR EVERY OUTCHUNK and INCHUNK */
  2694. for(thisevent=0,in=0,on=1,off=2,out=3;thisevent<dz->itemcnt;thisevent++,in+=4,on+=4,off+=4,out+=4) {
  2695. obufpos = idealsamps[thisevent] - obufstart;
  2696. while(obufpos >= dz->buflen) { // WHERE NESS, WRITE COMPLETED BUFFERS OR SILENT BUFS (e.g. at start)
  2697. if((exit_status = write_samps(obuf,dz->buflen,dz)) < 0)
  2698. return exit_status;
  2699. memset((char *)obuf,0,dz->buflen * sizeof(float));
  2700. if((overflow = lastwrite - dz->buflen) > 0) { // IF LAST WRITE SPILLED OVER INTO OVERFLOW BUFFER, COPY OVERFLOW INTO MAIN OBUF
  2701. memcpy((char *)obuf,(char*)ovflowbuf,overflow * sizeof(float));
  2702. memset((char *)ovflowbuf,0,dz->buflen * sizeof(float));
  2703. }
  2704. lastwrite = 0;
  2705. obufpos -= dz->buflen;
  2706. obufstart += dz->buflen; // INCREMENTING THE SAMPLCNT OF obufstart
  2707. }
  2708. chunklen = cuts[out] - cuts[in]; // GET DATA FOR THIS CHUNK
  2709. upsplen = cuts[on] - cuts[in];
  2710. dnsplen = cuts[out] - cuts[off];
  2711. m = cuts[in] - ibufstart;
  2712. // COPY CHUNK FROM INBUF TO SPLICE BUF
  2713. for(n = 0;n < chunklen;n++) {
  2714. while(m >= dz->ssampsread) { // WHERE NECESSARY, SKIP TO NEXT INBUF
  2715. m -= dz->ssampsread;
  2716. ibufstart += dz->ssampsread; // INCREMENTING THE SAMPLCNT OF ibufstart
  2717. if((exit_status = read_samps(ibuf,dz)) < 0)
  2718. return exit_status;
  2719. if(dz->ssampsread == 0) { // IF END OF FILE REACHED BEFORE END OF CHUNK
  2720. chunklen = n; // SHORTEN CHUNK
  2721. dnsplen = 0; // REMOVE DOWNSPLICE AT END
  2722. dz->itemcnt = thisevent; // FORCE INNER LOOP EXIT
  2723. break;
  2724. }
  2725. }
  2726. if(dz->ssampsread == 0) // AND FORCE OUTER LOOP EXIT
  2727. break;
  2728. splbuf[n] = ibuf[m];
  2729. m++;
  2730. }
  2731. // DO SPLICES IN SPLICE BUF
  2732. upsplicecnt = upsplen/chans;
  2733. upincr = 1.0 /(double)upsplicecnt;
  2734. splval = 0.0;
  2735. m = 0;
  2736. for(n=0;n<upsplicecnt;n++) {
  2737. for(k=0;k<chans;k++)
  2738. splbuf[m+k] = (float)(splbuf[m+k] * splval);
  2739. m += chans;
  2740. splval += upincr;
  2741. }
  2742. m = chunklen - dnsplen;
  2743. dnsplicecnt = dnsplen/chans;
  2744. dnincr = 1.0 /(double)dnsplicecnt;
  2745. splval = 1.0 - dnincr;
  2746. for(n=0;n<dnsplicecnt;n++) {
  2747. for(k=0;k<chans;k++)
  2748. splbuf[m+k] = (float)(splbuf[m+k] * splval);
  2749. m += chans;
  2750. splval -= dnincr;
  2751. }
  2752. // ADD CHUNK FROM SPLICE BUF INTO OUTBUF
  2753. for(n = 0;n < chunklen;n++) {
  2754. obuf[obufpos] = (float)(obuf[obufpos] + splbuf[n]);
  2755. obufpos++; /* NB overflow allowed here */
  2756. }
  2757. // NOTE WHERE FARTHEST WRITE WAS MADE
  2758. lastwrite = max(lastwrite,obufpos);
  2759. }
  2760. if(lastwrite > 0) {
  2761. if((exit_status = write_samps(obuf,lastwrite,dz)) < 0)
  2762. return exit_status;
  2763. }
  2764. return FINISHED;
  2765. }
  2766. /*************************** SHAVE ****************************/
  2767. int shave(dataptr dz)
  2768. {
  2769. int exit_status, chans = dz->infile->channels, warned;
  2770. float *ibuf = dz->sampbuf[0];
  2771. int *events;
  2772. int ibufpos = 0, buf_start, n, m, j, total_shrunk_dur, evlen, data_end;
  2773. int eventsegscnt, orig_eventsegscnt, cnt;
  2774. double splic, splicincr;
  2775. int event_start, orig_event_end, new_event_end, new_event_splice_end;
  2776. splicincr = 1.0/(double)(dz->iparam[2]/chans);
  2777. if((exit_status = count_events(0,0,&eventsegscnt,dz))<0) {
  2778. return(exit_status);
  2779. }
  2780. events = dz->lparray[0];
  2781. /* ELIMININATE ALL EVENTS WHICH CANNOT BE SHORTENED
  2782. * new
  2783. * retained end
  2784. * _________________________splice
  2785. * | \ : old
  2786. * | orig event \ : end
  2787. * | - - - - - - - - - - - -\- -: splice
  2788. * | / \ :\
  2789. * | / \ : \
  2790. * |/ --- found dur of old event-\-----\
  2791. * :
  2792. * Limit
  2793. * :
  2794. */
  2795. warned = 0;
  2796. orig_eventsegscnt = eventsegscnt;
  2797. // JUNE 2010
  2798. total_shrunk_dur = dz->iparam[1] + dz->iparam[3];
  2799. for(n=0;n<eventsegscnt;n+=2) {
  2800. evlen = events[n+1] - events[n];
  2801. evlen -= dz->iparam[3];
  2802. if(evlen <= 0) {
  2803. if(!warned) {
  2804. fprintf(stdout,"WARNING: Some events are shorter than the 'splice length' specified.\n");
  2805. fflush(stdout);
  2806. warned = 1;
  2807. }
  2808. }
  2809. if(evlen <= total_shrunk_dur) {
  2810. for(m = n+2; m < eventsegscnt; m++)
  2811. events[m-2] = events[m];
  2812. eventsegscnt -= 2;
  2813. n -= 2;
  2814. }
  2815. }
  2816. if(eventsegscnt <= 0) {
  2817. sprintf(errstr,"No Events Will Be Shortened, With These Parameter Settings.\n");
  2818. return(DATA_ERROR);
  2819. } else {
  2820. fprintf(stdout,"INFO: %d of %d events will be shortened\n",eventsegscnt/2,orig_eventsegscnt/2);
  2821. fflush(stdout);
  2822. }
  2823. if((sndseekEx(dz->ifd[0],0,0)<0)){
  2824. sprintf(errstr,"sndseek() failed\n");
  2825. return SYSTEM_ERROR;
  2826. }
  2827. reset_filedata_counters(dz);
  2828. buf_start = 0;
  2829. dz->ssampsread = 0;
  2830. cnt = 0;
  2831. event_start = events[cnt++];
  2832. orig_event_end = events[cnt++];
  2833. //JUNE 2010
  2834. new_event_end = event_start + dz->iparam[2];
  2835. //JUNE 2010
  2836. new_event_splice_end = new_event_end + dz->iparam[3];
  2837. if((exit_status = read_samps(ibuf,dz))<0) {
  2838. sprintf(errstr,"Failed to read data from sndfile.\n");
  2839. return(DATA_ERROR);
  2840. }
  2841. while(dz->ssampsread) {
  2842. while(event_start >= dz->buflen) {
  2843. if((exit_status = write_samps(ibuf,dz->buflen,dz))<0) {
  2844. sprintf(errstr,"Failed to write data to sndfile.\n");
  2845. return(DATA_ERROR);
  2846. }
  2847. buf_start += dz->buflen;
  2848. event_start -= dz->buflen;
  2849. new_event_end -= dz->buflen;
  2850. new_event_splice_end -= dz->buflen;
  2851. orig_event_end -= dz->buflen;
  2852. if((exit_status = read_samps(ibuf,dz))<0) {
  2853. sprintf(errstr,"Failed to read data from sndfile.\n");
  2854. return(DATA_ERROR);
  2855. }
  2856. }
  2857. ibufpos = event_start;
  2858. while(ibufpos < new_event_end) {
  2859. if(ibufpos >= dz->buflen) {
  2860. if((exit_status = write_samps(ibuf,dz->buflen,dz))<0) {
  2861. sprintf(errstr,"Failed to write data to sndfile.\n");
  2862. return(DATA_ERROR);
  2863. }
  2864. buf_start += dz->buflen;
  2865. new_event_end -= dz->buflen;
  2866. new_event_splice_end -= dz->buflen;
  2867. orig_event_end -= dz->buflen;
  2868. if((exit_status = read_samps(ibuf,dz))<0) {
  2869. sprintf(errstr,"Failed to read data from sndfile.\n");
  2870. return(DATA_ERROR);
  2871. }
  2872. ibufpos = 0;
  2873. }
  2874. ibufpos++;
  2875. }
  2876. splic = 1.0 - splicincr;
  2877. while(ibufpos < new_event_splice_end) {
  2878. if(ibufpos >= dz->buflen) {
  2879. if((exit_status = write_samps(ibuf,dz->buflen,dz))<0) {
  2880. sprintf(errstr,"Failed to write data to sndfile.\n");
  2881. return(DATA_ERROR);
  2882. }
  2883. buf_start += dz->buflen;
  2884. new_event_splice_end -= dz->buflen;
  2885. orig_event_end -= dz->buflen;
  2886. if((exit_status = read_samps(ibuf,dz))<0) {
  2887. sprintf(errstr,"Failed to read data from sndfile.\n");
  2888. return(DATA_ERROR);
  2889. }
  2890. ibufpos = 0;
  2891. }
  2892. for(j=0;j<chans;j++)
  2893. ibuf[ibufpos+j] = (float)(ibuf[ibufpos+j] * splic);
  2894. splic -= splicincr;
  2895. ibufpos += chans;
  2896. }
  2897. if(cnt >= eventsegscnt)
  2898. break;
  2899. while(ibufpos < orig_event_end) {
  2900. if(ibufpos >= dz->buflen) {
  2901. if((exit_status = write_samps(ibuf,dz->buflen,dz))<0) {
  2902. sprintf(errstr,"Failed to write data to sndfile.\n");
  2903. return(DATA_ERROR);
  2904. }
  2905. buf_start += dz->buflen;
  2906. orig_event_end -= dz->buflen;
  2907. if((exit_status = read_samps(ibuf,dz))<0) {
  2908. sprintf(errstr,"Failed to read data from sndfile.\n");
  2909. return(DATA_ERROR);
  2910. }
  2911. ibufpos = 0;
  2912. }
  2913. ibuf[ibufpos++] = 0.0f;
  2914. }
  2915. if(cnt >= eventsegscnt) // SAFETY, in case of accounting error
  2916. break;
  2917. event_start = events[cnt++] - buf_start;
  2918. orig_event_end = events[cnt++] - buf_start;
  2919. //JUNE 2010
  2920. new_event_end = event_start + dz->iparam[2];
  2921. //JUNE 2010
  2922. new_event_splice_end = new_event_end + dz->iparam[3];
  2923. data_end = dz->insams[0] - buf_start;
  2924. if(new_event_splice_end >= data_end) {
  2925. new_event_end = data_end;
  2926. new_event_splice_end = data_end;
  2927. }
  2928. }
  2929. if(ibufpos > 0) {
  2930. if((exit_status = write_samps(ibuf,ibufpos,dz))<0) {
  2931. sprintf(errstr,"Failed to write data to sndfile.\n");
  2932. return(DATA_ERROR);
  2933. }
  2934. }
  2935. return FINISHED;
  2936. }
  2937. /******************************************* LOCATE-PEAKS *******************************************/
  2938. #define MAX_CHUNKS (4000)
  2939. int locate_peaks(dataptr dz)
  2940. {
  2941. int exit_status;
  2942. double srate = (double)dz->infile->srate;
  2943. int chans = dz->infile->channels;
  2944. float *tempibuf;
  2945. int inchunk = 0;
  2946. int silcnt = 0;
  2947. int thischunklen = 0, thischunkcounter = 0, chunkcnt = 0, n, bufstart;
  2948. int *chunkat, *chunklen;
  2949. int minsil = (int)round((dz->param[1] * MS_TO_SECS) * srate) * chans;
  2950. dz->buflen = F_SECSIZE * chans;
  2951. if((tempibuf = (float *)malloc(dz->buflen * sizeof(float)))==NULL) {
  2952. sprintf(errstr,"Insufficient memory create temp inbuf to read chunklens.\n");
  2953. return(MEMORY_ERROR);
  2954. }
  2955. if((dz->lparray[0] = (int *)malloc(MAX_CHUNKS * sizeof(int)))==NULL) {
  2956. sprintf(errstr,"Insufficient memory to store peak positions\n");
  2957. return(MEMORY_ERROR);
  2958. }
  2959. if((dz->lparray[1] = (int *)malloc(MAX_CHUNKS * sizeof(int)))==NULL) {
  2960. sprintf(errstr,"Insufficient memory to store peak widths\n");
  2961. return(MEMORY_ERROR);
  2962. }
  2963. chunkat = dz->lparray[0];
  2964. chunklen = dz->lparray[1];
  2965. if((exit_status = read_samps(tempibuf,dz)) < 0)
  2966. return exit_status;
  2967. bufstart = 0;
  2968. while (dz->ssampsread > 0) {
  2969. for(n=0;n<dz->ssampsread;n++) {
  2970. if(tempibuf[n] > 0 || tempibuf[n] < 0) {
  2971. if(silcnt && (thischunkcounter > 0)) // If we've been in silence, and still counting chunk
  2972. thischunklen = thischunkcounter; // Reset chunklen to chunkcounter
  2973. silcnt = 0;
  2974. if(inchunk) { // If in a chunk, keep counting until encountering silence
  2975. thischunklen++;
  2976. thischunkcounter++;
  2977. } else {
  2978. chunkat[chunkcnt] = bufstart + n; // If just found chunk start, set up a new chunk and start counting it
  2979. inchunk = 1;
  2980. thischunklen = 1;
  2981. thischunkcounter = 1;
  2982. }
  2983. } else {
  2984. if(inchunk) { // If (was) in a chunk, but come into silence
  2985. thischunkcounter++; // chunklen stops counting (assuming chunk has ended) BUT
  2986. // thischunkcounter continues to count in case this is a silence WITHIN an event
  2987. if(silcnt >= minsil) { // Once we're sure we have minimum silence gap
  2988. chunklen[chunkcnt] = thischunklen; // Then save the chunk
  2989. inchunk = 0;
  2990. thischunklen = 0;
  2991. thischunkcounter = 0; // Set chunkcounter back to zero
  2992. chunkcnt++;
  2993. if(chunkcnt >= MAX_CHUNKS) {
  2994. sprintf(errstr,"More than %d chunks : Cannot proceed\n",MAX_CHUNKS);
  2995. return(DATA_ERROR);
  2996. }
  2997. }
  2998. }
  2999. silcnt++; // Count silence
  3000. }
  3001. }
  3002. bufstart += dz->ssampsread;
  3003. if((exit_status = read_samps(tempibuf,dz)) < 0)
  3004. return exit_status;
  3005. }
  3006. if(inchunk) {
  3007. chunklen[chunkcnt] = thischunklen;
  3008. chunkcnt++;
  3009. }
  3010. dz->itemcnt = chunkcnt;
  3011. switch(dz->itemcnt) {
  3012. case(0):
  3013. sprintf(errstr,"No peaks found in soundfile.\n");
  3014. return(MEMORY_ERROR);
  3015. case(1):
  3016. fprintf(stdout,"WARNING: WARNING: only 1 event found: Change inter-event silence ??\n");
  3017. fflush(stdout);
  3018. break;
  3019. default:
  3020. fprintf(stdout,"INFO: %d events found\n",dz->itemcnt);
  3021. fflush(stdout);
  3022. break;
  3023. }
  3024. free(tempibuf);
  3025. if((sndseekEx(dz->ifd[0],0,0)<0)){
  3026. sprintf(errstr,"sndseek() failed\n");
  3027. return SYSTEM_ERROR;
  3028. }
  3029. reset_filedata_counters(dz);
  3030. return FINISHED;
  3031. }
  3032. /******************************************* RETIME_FOUND_PEAKS *******************************************/
  3033. int retime_found_peaks(dataptr dz)
  3034. {
  3035. int exit_status, done = 0, chans = dz->infile->channels;
  3036. double srate = (double)dz->infile->srate, time, timefact = 1.0;
  3037. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1], *ovflwbuf = dz->sampbuf[2];
  3038. int *chunkat = dz->lparray[0], *chunklen = dz->lparray[1];
  3039. int ibufstart = 0; // position in infile of start of current input buffer
  3040. int obufstart = 0; // position in outfile of start of current output buffer
  3041. int osamppos = 0; // position in outfile
  3042. int obufpos = 0; // position within current buffer
  3043. int lastwrite = 0; // position in current outbuf (or its overflow) of the furthest write
  3044. int n, m, k, chunkstart, chunkend, step, overflow;
  3045. int chanoffset; // in multichan case, ensures output chunk positioned at same channel as input chunk
  3046. int initial_silence = 0;// length of leading silence before 1st event in output
  3047. int pregain = 0;
  3048. if((dz->mode == 3) && dz->param[2] < 1.0)
  3049. pregain = 1;
  3050. memset((char *)obuf,0,dz->buflen * sizeof(float));
  3051. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  3052. if(dz->brksize[0] == 0)
  3053. timefact = 1.0/dz->param[0];
  3054. if((exit_status = get_initial_silence(&initial_silence,dz)) < 0)
  3055. return(exit_status);
  3056. osamppos += initial_silence;
  3057. for(n=0;n<dz->itemcnt;n++) {
  3058. chanoffset = (chunkat[n]/chans) * chans; // Find any channel chanoffset of the in-chunk */
  3059. chanoffset = chunkat[n] - chanoffset;
  3060. while(dz->total_samps_read < chunkat[n]) { // If next chunk to read is beyond current input buffer
  3061. ibufstart += dz->ssampsread; // Get another buffer of data
  3062. if((exit_status = read_samps(ibuf,dz)) < 0)
  3063. return exit_status;
  3064. if(pregain) {
  3065. for(m=0;m<dz->ssampsread;m++)
  3066. ibuf[m] = (float)(ibuf[m] * dz->param[2]);
  3067. }
  3068. if(dz->ssampsread == 0) {
  3069. fprintf(stdout,"WARNING: Ran out of samples in input (1)\n");
  3070. fflush(stdout);
  3071. done = 1;
  3072. break;
  3073. }
  3074. }
  3075. if(done)
  3076. break;
  3077. chunkstart = chunkat[n] - ibufstart; // get address of chunkstart within this buffer
  3078. chunkend = chunkstart + chunklen[n]; // and relative address of chunk end
  3079. if(n > 0) { // After first inchunk, calculate position of next outchunk
  3080. switch(dz->mode) {
  3081. case(3):
  3082. osamppos += dz->iparam[MM]; // Advance by beat-len step
  3083. break;
  3084. case(4):
  3085. if(chunkat[n-1] < dz->iparam[2] || chunkat[n-1] >= dz->iparam[3])
  3086. timefact = 1.0; // If previous chunk lies outside limits, don't time-shrink
  3087. else {
  3088. if(dz->brksize[0]) { // Advance by distance between beats * speed-change factor
  3089. time = (chunkat[n]/chans)/srate;
  3090. read_value_from_brktable(time,0,dz);
  3091. }
  3092. timefact = 1.0/dz->param[0];
  3093. }
  3094. step = (int)round((double)(chunkat[n] - chunkat[n-1]) * timefact);
  3095. step = (step/chans) * chans;
  3096. osamppos += step;
  3097. break;
  3098. }
  3099. }
  3100. osamppos += chanoffset;
  3101. while((obufpos = osamppos - obufstart) >= dz->buflen) { // If next write is beyond buffer end
  3102. if((exit_status = write_samps(obuf,dz->buflen,dz))<0) // Write buffer(s)
  3103. return(exit_status);
  3104. memset((char *)obuf,0,dz->buflen * sizeof(float)); // And set to zero (as buffer is ADDED into)
  3105. if((overflow = lastwrite - dz->buflen) > 0) { // If there wasc anhy buffer overflow
  3106. memcpy((char *)obuf,(char *)ovflwbuf,overflow * sizeof(float)); // Bakcopy it into buffer
  3107. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float)); // and zero overflow buffer
  3108. }
  3109. lastwrite -= dz->buflen;
  3110. obufstart += dz->buflen; // Advance buffer-start count in output samples
  3111. }
  3112. k = chunkstart;
  3113. while(k < chunkend) {
  3114. obuf[obufpos] = (float)(obuf[obufpos] + ibuf[k]); // Add chunk into outbuf
  3115. obufpos++;
  3116. if(++k >= dz->ssampsread) { // If at input buffer end
  3117. ibufstart += dz->ssampsread; // Update address of buffer start
  3118. k -= dz->ssampsread; // decrease both counter, and counter-end marker, by length of last buf
  3119. chunkend -= dz->ssampsread;
  3120. if((exit_status = read_samps(ibuf,dz)) < 0) // Read more insamps
  3121. return exit_status;
  3122. if(dz->ssampsread == 0) {
  3123. if(k != chunkend) {
  3124. fprintf(stdout,"WARNING: Ran out of samples in input (2)\n");
  3125. fflush(stdout);
  3126. }
  3127. done = 1;
  3128. break;
  3129. }
  3130. if(pregain) {
  3131. for(m=0;m<dz->ssampsread;m++)
  3132. ibuf[m] = (float)(ibuf[m] * dz->param[2]);
  3133. }
  3134. }
  3135. lastwrite = max(lastwrite,obufpos); // Note address of MAXIMUM write, withib obuf (or its overflow)
  3136. }
  3137. if(done)
  3138. break;
  3139. }
  3140. if(lastwrite > 0) {
  3141. if((exit_status = write_samps(obuf,lastwrite,dz))<0) // Write last buffer
  3142. return(exit_status);
  3143. }
  3144. if(dz->total_samps_written <= 0) {
  3145. sprintf(errstr,"No output samples written\n");
  3146. return(PROGRAM_ERROR);
  3147. }
  3148. return FINISHED;
  3149. }
  3150. /******************************************* ESTABLISH_CUTS_ARRAY *******************************************/
  3151. int establish_cuts_array(dataptr dz)
  3152. {
  3153. int chans = dz->infile->channels;
  3154. double srate = (double)dz->infile->srate;
  3155. int twosplices, n, in, on, off, out, lastin = 0, laston = 0, lastoff = 0, lastout = 0, gap;
  3156. int eliminated = 0;
  3157. double *realtimes = dz->parray[0];
  3158. double *idealtimes = dz->parray[1];
  3159. int *realsamps = dz->lparray[0];
  3160. int *idealsamps = dz->lparray[1];
  3161. int *realcuts = dz->lparray[2];
  3162. double mm_in, timescaling;
  3163. int *lost,lostcnt;
  3164. if((lost = (int *)malloc(dz->itemcnt * sizeof(int)))==NULL) {
  3165. sprintf(errstr,"Insufficient memory to lost array\n");
  3166. return(MEMORY_ERROR);
  3167. }
  3168. twosplices = dz->iparam[RETIME_SPLICE] * 2;
  3169. mm_in = 60.0 / dz->MMin;
  3170. if (!flteq(mm_in,dz->param[MM])) { // if output tempo != input tempo
  3171. timescaling = dz->param[MM]/mm_in; // Convert to output tempo
  3172. for(n=0;n<dz->itemcnt;n++) { // Retaining 1st accent at same time
  3173. idealtimes[n] -= dz->offset;
  3174. idealtimes[n] *= timescaling;
  3175. idealtimes[n] += dz->offset;
  3176. }
  3177. }
  3178. for(n=0;n<dz->itemcnt;n++) // Convert to samples
  3179. idealsamps[n] = (int)(round(idealtimes[n] * srate) * chans);
  3180. /* FROM THE EVENT TIMING INFO, GENERATE splicestart (in) peakstart (on) peakend (off) and spliceend (out) info */
  3181. /* adjusting splice lengths or event lengths (or eliminating events) where events are TOO close. */
  3182. /* Idea is to avoid output event overlaps which would create echos in the output */
  3183. lostcnt = 0;
  3184. for(n=0,in=0,on=1,off=2,out=3;n<dz->itemcnt;n++,in+=4,on+=4,off+=4,out+=4) { // Get positions of starts and ends of insplice and outsplice for each event
  3185. realcuts[in] = realsamps[n] - dz->iparam[RETIME_SPLICE]; // in,on,off,out in that order...
  3186. if(realcuts[in] < 0)
  3187. realcuts[in] = 0; // First splicestart may be too near file start
  3188. realcuts[on] = realsamps[n];
  3189. if(n >= 1) {
  3190. gap = realcuts[on] - realcuts[lastoff]; // Distance between start of event-proper and last event-proper (ignoring splices)
  3191. if(gap < twosplices) { // If 2 events are too close (less than 2 splices)
  3192. gap = realcuts[on] - (realcuts[laston] + twosplices); // gap between start of previous event + 2 splices (dn-up and current event)
  3193. if(gap >= 0) {
  3194. realcuts[lastout] = realcuts[in];
  3195. realcuts[lastoff] = realcuts[lastout] - dz->iparam[RETIME_SPLICE];
  3196. } else { //Eliminate last event
  3197. realcuts[lastin] = realcuts[in];
  3198. realcuts[laston] = realcuts[on];
  3199. eliminated++;
  3200. in -= 4;
  3201. on -= 4;
  3202. off -= 4;
  3203. out -= 4;
  3204. lost[lostcnt++] = n;
  3205. }
  3206. }
  3207. }
  3208. if(dz->brksize[RETIME_WIDTH]) { // Read brkvals relative to time in INFILE
  3209. read_value_from_brktable(realtimes[n],RETIME_WIDTH,dz);
  3210. dz->iparam[RETIME_WIDTH] = (int)round(dz->param[RETIME_WIDTH] * MS_TO_SECS * srate) * chans;
  3211. }
  3212. realcuts[off] = realsamps[n] + dz->iparam[RETIME_WIDTH];
  3213. realcuts[out] = realcuts[off] + dz->iparam[RETIME_SPLICE];
  3214. lastin = in;
  3215. laston = on;
  3216. lastoff = off;
  3217. lastout = out;
  3218. }
  3219. if(eliminated) {
  3220. fprintf(stdout,"INFO: With this splicelength, %d events have been eliminated\n", eliminated);
  3221. fflush(stdout);
  3222. dz->itemcnt = eliminate_lost_ideal_and_real_events(lost,lostcnt,dz);
  3223. }
  3224. return FINISHED;
  3225. }
  3226. /*************************** ELIMINATE_LOST_IDEAL_AND_REAL_EVENTS ****************************/
  3227. int eliminate_lost_ideal_and_real_events(int *lost,int lostcnt,dataptr dz)
  3228. {
  3229. double *realtimes = dz->parray[0];
  3230. double *idealtimes = dz->parray[1];
  3231. int *realsamps = dz->lparray[0];
  3232. int *idealsamps = dz->lparray[1];
  3233. int outcnt = dz->itemcnt, n, k, j;
  3234. for(n = 0;n < lostcnt;n++) {
  3235. k = lost[n];
  3236. if(k+1 < outcnt) {
  3237. for(j = k+1; j < outcnt; j++) {
  3238. realtimes[j-1] = realtimes[j];
  3239. idealtimes[j-1] = idealtimes[j];
  3240. realsamps[j-1] = realsamps[j];
  3241. idealsamps[j-1] = idealsamps[j];
  3242. }
  3243. }
  3244. outcnt--;
  3245. }
  3246. return outcnt;
  3247. }
  3248. /*************************** REPOSITION_PEAK ****************************/
  3249. int reposition_peak(dataptr dz)
  3250. {
  3251. int exit_status;
  3252. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1];
  3253. double srate =(double)dz->infile->srate;
  3254. int chans = dz->infile->channels, gotstartsig = 0;
  3255. double maxsamp = 0.0, thissamp;
  3256. int startsig = 0, newstartsig;
  3257. int maxpos = 0, n, obufpos, bufstart = 0, shift = 0;
  3258. switch(dz->mode) {
  3259. case(12):
  3260. while(dz->samps_left > 0) {
  3261. if((exit_status = read_samps(ibuf,dz))<0)
  3262. return(exit_status);
  3263. for(n=0;n<dz->ssampsread;n++) {
  3264. if(!gotstartsig) {
  3265. if(ibuf[n] != 0.0) {
  3266. startsig = n + bufstart;
  3267. gotstartsig = 1;
  3268. }
  3269. }
  3270. thissamp = fabs(ibuf[n]);
  3271. if(thissamp > maxsamp) {
  3272. maxsamp = thissamp;
  3273. maxpos = bufstart + n;
  3274. }
  3275. }
  3276. bufstart += dz->ssampsread;
  3277. }
  3278. if((maxpos = (maxpos/chans) * chans) == 0) {
  3279. sprintf(errstr,"No Peak found in file.\n");
  3280. return(DATA_ERROR);
  3281. }
  3282. shift = dz->iparam[0] - maxpos;
  3283. break;
  3284. case(13):
  3285. while(dz->samps_left > 0) {
  3286. if((exit_status = read_samps(ibuf,dz))<0)
  3287. return(exit_status);
  3288. for(n=0;n<dz->ssampsread;n++) {
  3289. if(!gotstartsig) {
  3290. if(ibuf[n] != 0.0) {
  3291. startsig = n + bufstart;
  3292. gotstartsig = 1;
  3293. break;
  3294. }
  3295. }
  3296. }
  3297. if(gotstartsig)
  3298. break;
  3299. bufstart += dz->ssampsread;
  3300. }
  3301. maxpos = (dz->iparam[1]/chans) * chans;
  3302. shift = dz->iparam[0] - maxpos;
  3303. break;
  3304. }
  3305. if(!gotstartsig) {
  3306. sprintf(errstr,"No signal found in soundfile.\n");
  3307. return(DATA_ERROR);
  3308. }
  3309. if((newstartsig = startsig + shift) < 0) {
  3310. sprintf(errstr,"Peak at %lf secs: snd starts at %lf: Cannot move peak to %lf secs\n",
  3311. (double)(maxpos/chans)/srate,(double)(startsig/chans)/srate,dz->param[0]);
  3312. return(DATA_ERROR);
  3313. } else if(shift == 0) {
  3314. sprintf(errstr,"Peak is already at %lf\n",dz->param[0]);
  3315. return(DATA_ERROR);
  3316. }
  3317. if((sndseekEx(dz->ifd[0],0,0)<0)){
  3318. sprintf(errstr,"sndseek() failed\n");
  3319. return SYSTEM_ERROR;
  3320. }
  3321. reset_filedata_counters(dz);
  3322. memset((char *)obuf,0,dz->buflen * sizeof(float));
  3323. memset((char *)ibuf,0,dz->buflen * sizeof(float));
  3324. if(shift > 0) {
  3325. while(shift > dz->buflen) {
  3326. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  3327. return(exit_status);
  3328. shift -= dz->buflen;
  3329. }
  3330. obufpos = shift;
  3331. } else {
  3332. while(newstartsig >= dz->buflen) {
  3333. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  3334. return(exit_status);
  3335. newstartsig -= dz->buflen;
  3336. }
  3337. obufpos = newstartsig;
  3338. if((sndseekEx(dz->ifd[0],startsig,0)<0)){
  3339. sprintf(errstr,"sndseek() failed\n");
  3340. return SYSTEM_ERROR;
  3341. }
  3342. dz->samps_left = dz->insams[0] - startsig;
  3343. }
  3344. while(dz->samps_left > 0) {
  3345. if((exit_status = read_samps(ibuf,dz))<0)
  3346. return(exit_status);
  3347. for(n=0;n<dz->ssampsread;n++) {
  3348. obuf[obufpos++] = ibuf[n];
  3349. if(obufpos >= dz->buflen) {
  3350. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  3351. return(exit_status);
  3352. obufpos = 0;
  3353. }
  3354. }
  3355. }
  3356. if(obufpos > 0) {
  3357. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  3358. return(exit_status);
  3359. }
  3360. return(FINISHED);
  3361. }
  3362. /*************************** REPEAT_BEATS ****************************/
  3363. int repeat_beats(dataptr dz)
  3364. {
  3365. int exit_status;
  3366. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1], *overflw = dz->sampbuf[2], *beatsbuf = dz->sampbuf[3];
  3367. int *events;
  3368. int ibufpos = 0, obufpos, bbufpos, k, j;
  3369. int eventsegscnt;
  3370. int beats_start, beats_end, beats_len, beats_step, skip, beatsloc, input_end;
  3371. memset((char *)obuf,0,dz->buflen * 2 * sizeof(float));
  3372. /* COUNT (VALID-LENGTH) SILENCES IN DATA */
  3373. if((exit_status = count_events(BEAT_SILMIN,0,&eventsegscnt,dz))<0) {
  3374. return(exit_status);
  3375. }
  3376. events = dz->lparray[0];
  3377. fprintf(stdout,"INFO: Found %d events: Locating and cutting event to repeat.\n",eventsegscnt/2);
  3378. fflush(stdout);
  3379. /* LOCATE AND MEASURE THE EVENTS TO BE REPEATED */
  3380. beats_start = -1;
  3381. for(k = 0;k < eventsegscnt; k += 2) {
  3382. /* TEST */
  3383. fprintf(stderr,"dz->iparam[BEAT_AT] = %d events[k] = %d events[k+1] = %d\n",dz->iparam[BEAT_AT],events[k],events[k+1]);
  3384. /* TEST */
  3385. if(dz->iparam[BEAT_AT] >= events[k] && dz->iparam[BEAT_AT] <= events[k+1]) {
  3386. beats_start = events[k];
  3387. break;
  3388. }
  3389. }
  3390. if(beats_start < 0) {
  3391. sprintf(errstr,"Time indicating event position does not lie within a sounding event.\n");
  3392. return(DATA_ERROR);
  3393. }
  3394. beats_step = dz->iparam[MM] * dz->iparam[BEAT_CNT];
  3395. beats_end = beats_start + beats_step;
  3396. while(k < eventsegscnt) { /* beats_end must be after beats_start so we can resume search at k */
  3397. if(beats_end < events[k])
  3398. break;
  3399. k++;
  3400. }
  3401. if(ODD(k)) { /* beatend lies within a new event */
  3402. j = k - 2;
  3403. if((j < 0) || (events[j] <= beats_start)) /* if cannot splice at end of previous event - splice at end of this event, making event longer */
  3404. beats_end = events[k];
  3405. else /* else splice at end of previous event, making event shorter */
  3406. beats_end = events[j];
  3407. } /* ELSE beatend lies within silence, before a new event, OK to splice there */
  3408. if((beats_len = beats_end - beats_start) > dz->buflen) {
  3409. sprintf(errstr,"Buffers too small to store beats-to-copy. Probably too many events not separated by silence.\n"); /* Should be impossible !! */
  3410. return(DATA_ERROR);
  3411. }
  3412. if((skip = beats_step - beats_len) < 0) { /* if events have longer duration than step between them, must step back in obuf when writing output */
  3413. fprintf(stdout,"WARNING: Repeated events will OVERLAP each other.\n");
  3414. fflush(stdout);
  3415. }
  3416. /* COPY EVENTS TO REPEAT, TO A BUFFER */
  3417. beatsloc = (beats_start/dz->buflen) * dz->buflen;
  3418. if((sndseekEx(dz->ifd[0],beatsloc,0)<0)){
  3419. sprintf(errstr,"sndseek() failed\n");
  3420. return SYSTEM_ERROR;
  3421. }
  3422. ibufpos = beats_start - beatsloc;
  3423. if((exit_status = read_samps(ibuf,dz))<0) {
  3424. sprintf(errstr,"Failed to read data from sndfile.\n");
  3425. return(DATA_ERROR);
  3426. }
  3427. bbufpos = 0;
  3428. while(bbufpos < beats_len) {
  3429. beatsbuf[bbufpos] = ibuf[ibufpos++];
  3430. if(ibufpos >= dz->buflen) {
  3431. if((exit_status = read_samps(ibuf,dz))<0) {
  3432. sprintf(errstr,"Failed to read data from sndfile.\n");
  3433. return(DATA_ERROR);
  3434. }
  3435. if(dz->ssampsread == 0) {
  3436. sprintf(errstr,"Ran off end of file before beats could be cut.\n");
  3437. return(DATA_ERROR);
  3438. }
  3439. ibufpos = 0;
  3440. }
  3441. bbufpos++;
  3442. }
  3443. fprintf(stdout,"INFO: Repeating Events.\n");
  3444. fflush(stdout);
  3445. /* COPY START OF ORIG EVENT, BEFORE REPETS START */
  3446. if((sndseekEx(dz->ifd[0],0,0)<0)){
  3447. sprintf(errstr,"sndseek() failed\n");
  3448. return SYSTEM_ERROR;
  3449. }
  3450. reset_filedata_counters(dz);
  3451. dz->ssampsread = 0;
  3452. //buf_start = 0;
  3453. input_end = dz->insams[0];
  3454. if((exit_status = read_samps(ibuf,dz))<0) {
  3455. sprintf(errstr,"Failed to read data from sndfile.\n");
  3456. return(DATA_ERROR);
  3457. }
  3458. while(beats_start >= dz->ssampsread) {
  3459. if((exit_status = write_samps(ibuf,dz->ssampsread,dz))<0)
  3460. return(exit_status);
  3461. beats_start -= dz->ssampsread;
  3462. beats_end -= dz->ssampsread;
  3463. input_end -= dz->ssampsread;
  3464. if((exit_status = read_samps(ibuf,dz))<0) {
  3465. sprintf(errstr,"Failed to read data from sndfile.\n");
  3466. return(DATA_ERROR);
  3467. }
  3468. }
  3469. if(beats_start > 0)
  3470. memcpy((char *)obuf,(char *)ibuf,beats_start * sizeof(float));
  3471. obufpos = beats_start;
  3472. /* COPY THE REPEATED EVENTS */
  3473. for(k = 0;k < dz->iparam[BEAT_REPEATS]; k++) {
  3474. for(bbufpos = 0;bbufpos < beats_len; bbufpos++) {
  3475. obuf[obufpos] = (float)(obuf[obufpos] + beatsbuf[bbufpos]);
  3476. if(++obufpos >= dz->buflen * 2) {
  3477. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  3478. return(exit_status);
  3479. memcpy((char *)obuf,(char *)overflw,dz->buflen * sizeof(float));
  3480. memset((char *)overflw,0,dz->buflen * sizeof(float));
  3481. obufpos -= dz->buflen;
  3482. }
  3483. }
  3484. obufpos += skip;
  3485. if(obufpos < 0) {
  3486. sprintf(errstr,"Overlap of events failed in output buffers.\n");
  3487. return(DATA_ERROR);
  3488. }
  3489. else if(obufpos >= dz->buflen * 2) {
  3490. while (obufpos >= dz->buflen * 2) {
  3491. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  3492. return(exit_status);
  3493. memcpy((char *)obuf,(char *)overflw,dz->buflen * sizeof(float));
  3494. memset((char *)overflw,0,dz->buflen * sizeof(float));
  3495. obufpos -= dz->buflen;
  3496. }
  3497. }
  3498. }
  3499. /* COPY REMAINDER OF ORIGINAL EVENT */
  3500. ibufpos = beats_start;
  3501. k = ibufpos;
  3502. while(k < input_end) {
  3503. if(ibufpos >= dz->ssampsread) {
  3504. if((exit_status = read_samps(ibuf,dz))<0) {
  3505. sprintf(errstr,"Failed to read data from sndfile.\n");
  3506. return(DATA_ERROR);
  3507. }
  3508. if(dz->ssampsread == 0) {
  3509. fprintf(stdout,"WARNING: Reached end of infile too soon.\n");
  3510. fflush(stdout);
  3511. break;
  3512. }
  3513. ibufpos = 0;
  3514. }
  3515. obuf[obufpos] = (float)(obuf[obufpos] + ibuf[ibufpos]);
  3516. if(++obufpos >= dz->buflen * 2) {
  3517. if((exit_status = write_samps(obuf,dz->buflen,dz))<0)
  3518. return(exit_status);
  3519. memcpy((char *)obuf,(char *)overflw,dz->buflen * sizeof(float));
  3520. memset((char *)overflw,0,dz->buflen * sizeof(float));
  3521. obufpos -= dz->buflen;
  3522. }
  3523. ibufpos++;
  3524. k++;
  3525. }
  3526. if(obufpos > 0) {
  3527. if((exit_status = write_samps(obuf,obufpos,dz))<0)
  3528. return(exit_status);
  3529. }
  3530. return(FINISHED);
  3531. }
  3532. /*************************** GET_INITIAL_SILENCE ****************************/
  3533. int get_initial_silence(int *initial_silence,dataptr dz)
  3534. {
  3535. int *chunkat = dz->lparray[0], *chunklen = dz->lparray[1];
  3536. int step, bakstep = INT_MAX, n, syncchunk, synctime, new_synctime, outlen = 0, silence_change;
  3537. int chans = dz->infile->channels;
  3538. double timefact = 1.0, time, srate = (double)dz->infile->srate;
  3539. if(dz->iparam[RETIME_SYNCAT] == 0) { /* If syncpoint for file is specified as start of file, return */
  3540. *initial_silence = chunkat[0];
  3541. return (FINISHED);
  3542. }
  3543. /* FIND WHICH CHUNK IS NEAREST TO SPECIFIED SYNCTIME */
  3544. for(n=0;n<dz->itemcnt;n++) {
  3545. if(chunkat[n] > dz->iparam[RETIME_SYNCAT]) { /* If we're at chunk after synctime */
  3546. step = chunkat[n] - dz->iparam[RETIME_SYNCAT]; /* which chunk is nearer to synctime? this chunkstart */
  3547. if(n > 0) /* OR (the end of) the previous chunk, if there is one */
  3548. bakstep = dz->iparam[RETIME_SYNCAT] - (chunkat[n-1] + chunklen[n-1]);
  3549. if(bakstep < step)
  3550. n--;
  3551. break;
  3552. }
  3553. } /* if no chuck has been found AFTER synctime, n gets to dz->itemcnt */
  3554. if(n == dz->itemcnt) /* But in this case, last chunk is sync-chunk */
  3555. n--; /* so mark last chunk as sync-chunk */
  3556. syncchunk = n;
  3557. if(syncchunk == 0) { /* If sync is at first event ... */
  3558. *initial_silence = chunkat[0]; /* initial silence-offset of events does not change */
  3559. return(FINISHED);
  3560. }
  3561. synctime = chunkat[syncchunk]; /* the original synctime is start of event closest to synctime */
  3562. new_synctime = synctime; /* Prevents error-warnings : new_synctime is always set below */
  3563. for(n=0;n<dz->itemcnt;n++) {
  3564. if(n==0)
  3565. outlen = (chunkat[0]/chans) * chans;
  3566. else {
  3567. if(chunkat[n-1] < dz->iparam[2] || chunkat[n-1] >= dz->iparam[3])
  3568. timefact = 1.0; // If previous chunk lies outside limits, don't time-shrink
  3569. else {
  3570. if(dz->brksize[0]) { // Advance by distance between beats * speed-change factor
  3571. time = (chunkat[n]/chans)/srate;
  3572. read_value_from_brktable(time,0,dz);
  3573. }
  3574. timefact = 1.0/dz->param[0];
  3575. }
  3576. step = (int)round((double)(chunkat[n] - chunkat[n-1]) * timefact);
  3577. step = (step/chans) * chans;
  3578. outlen += step; // Position in output advances by the timechanged step
  3579. if(n == syncchunk) { // If it's the syncchunk that we've just repositioned
  3580. new_synctime = outlen; // It's new start-time is the new syncing time
  3581. break;
  3582. }
  3583. }
  3584. }
  3585. silence_change = synctime - new_synctime;
  3586. *initial_silence = chunkat[0] + silence_change;
  3587. if(*initial_silence < 0) {
  3588. fprintf(stdout,"WARNING: Cannot synchronise accent in output with that in input: syncing at event start.\n");
  3589. fflush(stdout);
  3590. *initial_silence = chunkat[0];
  3591. }
  3592. return(FINISHED);
  3593. }
  3594. /*************************** FIND_SOUND_START ****************************/
  3595. int find_sound_start(dataptr dz)
  3596. {
  3597. int exit_status, gotit = 0;
  3598. float *ibuf = dz->sampbuf[0];
  3599. int n = 0, start_buf = 0;
  3600. double srate = (double)dz->infile->srate, time;
  3601. dz->ssampsread = 0;
  3602. while(dz->samps_left > 0) {
  3603. start_buf += dz->ssampsread;
  3604. if((exit_status = read_samps(ibuf,dz)) < 0)
  3605. return(exit_status);
  3606. for(n=0;n<dz->ssampsread;n++) {
  3607. if(ibuf[n] != 0.0) {
  3608. gotit = 1;
  3609. break;
  3610. }
  3611. }
  3612. if(gotit)
  3613. break;
  3614. }
  3615. time = (double)(n + start_buf)/srate;
  3616. fprintf(dz->fp,"%lf\t%s\n",time,infilename);
  3617. return FINISHED;
  3618. }
  3619. /*************************** READ_RETIME_FNAM ****************************/
  3620. int read_retime_fnam(char *filename,dataptr dz)
  3621. {
  3622. char nufilename[1000];
  3623. char *p = strrchr(filename, '.');
  3624. strcpy(nufilename,filename);
  3625. if(p == NULL)
  3626. strcat(nufilename,".txt");
  3627. else {
  3628. p++;
  3629. if(_stricmp(p,"txt")) {
  3630. sprintf(errstr,"Output textfile (%s) must have a '.txt' extension, or none.\n",filename);
  3631. return(DATA_ERROR);
  3632. }
  3633. }
  3634. if((dz->fp = fopen(nufilename,"a"))==NULL) { /* permits bulk-processing of files to same outfile */
  3635. sprintf(errstr,"Cannot open output file %s\n",nufilename);
  3636. return(USER_ERROR);
  3637. }
  3638. dz->process_type = TO_TEXTFILE;
  3639. dz->outfiletype = TEXTFILE_OUT;
  3640. return(FINISHED);
  3641. }
  3642. /*************************** FIND_SHORTEST_EVENT ****************************/
  3643. int find_shortest_event(dataptr dz)
  3644. {
  3645. int exit_status, inchans = dz->infile->channels;
  3646. int n = 0, evlen, evlenshortest, evlenlongest, eventsegscnt, *events;
  3647. double srate = (double)dz->infile->srate, longest, shortest;
  3648. if((exit_status = count_events(0,0,&eventsegscnt,dz))<0) {
  3649. return(exit_status);
  3650. }
  3651. evlenshortest = dz->insams[0] + 1;
  3652. evlenlongest = -1;
  3653. events = dz->lparray[0];
  3654. for(n=0;n<eventsegscnt;n+=2) {
  3655. evlen = events[n+1] - events[n];
  3656. evlenshortest = min(evlen,evlenshortest);
  3657. evlenlongest = max(evlen,evlenlongest);
  3658. }
  3659. shortest = (double)(evlenshortest/inchans)/srate;
  3660. longest = (double)(evlenlongest/inchans)/srate;
  3661. fprintf(stdout,"INFO: \n");
  3662. fprintf(stdout,"INFO: Shortest event = %lf secs :: = %lf mS \n",shortest,shortest * SECS_TO_MS);
  3663. fprintf(stdout,"INFO: Longest event = %lf secs\n",longest);
  3664. return FINISHED;
  3665. }
  3666. /*************************** COUNT_EVENTS ****************************/
  3667. int count_events(int paramno,int arrayno,int *eventsegscnt, dataptr dz)
  3668. {
  3669. int exit_status;
  3670. float *ibuf = dz->sampbuf[0];
  3671. int *silences, *events;
  3672. int ibufpos = 0, silstart = 0, silend, buf_start, k;
  3673. int insil = 0, event_at_end = 1;
  3674. int silsegscnt = 0;
  3675. fprintf(stdout,"INFO: Counting silences between events.\n");
  3676. fflush(stdout);
  3677. while(dz->samps_left > 0) {
  3678. if((exit_status = read_samps(ibuf,dz))<0) {
  3679. sprintf(errstr,"Failed to read data from sndfile.\n");
  3680. return(DATA_ERROR);
  3681. }
  3682. for(ibufpos=0;ibufpos<dz->ssampsread;ibufpos++) {
  3683. if(ibuf[ibufpos] == 0.0)
  3684. insil++;
  3685. else {
  3686. if(insil) {
  3687. if(insil >= dz->iparam[paramno]) {
  3688. silsegscnt++;
  3689. }
  3690. }
  3691. insil = 0;
  3692. }
  3693. }
  3694. }
  3695. if(insil)
  3696. silsegscnt++;
  3697. if(silsegscnt == 0) {
  3698. sprintf(errstr,"NO SILENCE-GAPS FOUND IN FILE.\n");
  3699. return(DATA_ERROR);
  3700. }
  3701. silsegscnt++; /* in case less silences than sounds */
  3702. if((sndseekEx(dz->ifd[0],0,0)<0)){
  3703. sprintf(errstr,"sndseek() failed\n");
  3704. return SYSTEM_ERROR;
  3705. }
  3706. reset_filedata_counters(dz);
  3707. buf_start = 0;
  3708. /* STORE LOCATION OF STARTS AND ENDS OF SILENCE BLOCKS */
  3709. if((dz->lparray[arrayno] = (int *)malloc((silsegscnt * 2) * sizeof(int)))==NULL) {
  3710. sprintf(errstr,"INSUFFICIENT MEMORY TO STORE SILENCE LOCATIONS.\n");
  3711. return(MEMORY_ERROR);
  3712. }
  3713. silsegscnt = 0;
  3714. insil = 0;
  3715. silences = dz->lparray[arrayno];
  3716. fprintf(stdout,"INFO: Marking silence-separated Events.\n");
  3717. fflush(stdout);
  3718. while(dz->samps_left > 0) {
  3719. if((exit_status = read_samps(ibuf,dz))<0) {
  3720. sprintf(errstr,"Failed to read data from sndfile.\n");
  3721. return(DATA_ERROR);
  3722. }
  3723. for(ibufpos=0;ibufpos<dz->ssampsread;ibufpos++) {
  3724. if(ibuf[ibufpos] == 0.0) {
  3725. if(insil == 0)
  3726. silstart = buf_start + ibufpos;
  3727. insil++;
  3728. } else {
  3729. if(insil) {
  3730. if(insil >= dz->iparam[paramno]) {
  3731. silend = buf_start + ibufpos;
  3732. silences[silsegscnt++] = silstart;
  3733. silences[silsegscnt++] = silend;
  3734. }
  3735. }
  3736. insil = 0;
  3737. }
  3738. }
  3739. buf_start += dz->ssampsread;
  3740. }
  3741. if(insil) { /* if silence at end */
  3742. silend = dz->insams[0];
  3743. silences[silsegscnt++] = silstart;
  3744. silences[silsegscnt++] = silend;
  3745. event_at_end = 0;
  3746. }
  3747. events = dz->lparray[arrayno]; /* we write over the original data store */
  3748. if(silences[0] == 0) { /* If first silence is at time zero */
  3749. for(k=1;k<silsegscnt;k++) /* map gaps between silences backwards into (=) events ( losing first silence in process) */
  3750. events[k-1] = silences[k]; /* --X--X-- to XX-XX- */
  3751. if(event_at_end) /* if last silence does not end at file end, it starts a final event */
  3752. events[silsegscnt-1] = dz->insams[0]; /* so add the end of file as end of final event, and silsegcnt stays same. --X--X-- thro XX-XX- to XX-XX-XX */
  3753. else /* otherwise final silent end, does NOT start a new event, so delete last entry */
  3754. silsegscnt -= 2; /* --X--X-- thro XX-XX- to XX-XX: subtract a start-end pair from count */
  3755. } else { /* first event at time zero */
  3756. for(k=silsegscnt;k>0;k--) /* map gaps between silences forwards into (=) events (eventually using extra address space assigned at end) */
  3757. events[k] = silences[k-1];
  3758. events[0] = 0; /* Add start of file as start of firsst event. --X--X-- to XX-XX-XX- */
  3759. if(event_at_end) { /* if last silence does not end at file end, it starts a final event */
  3760. events[silsegscnt+1] = dz->insams[0]; /* so add the end of file as end of final event */
  3761. silsegscnt += 2; /* --X--X-- thro XX-XX-XX- to XX-XX-XX-XX add a start-end pair to count */
  3762. } else {
  3763. /* last silence is at end of file, and does not start an event .... --X--X-- thro XX-XX-XX- to XX-XX-XX silsegscnt stays as is, last entry forgotten */
  3764. }
  3765. }
  3766. *eventsegscnt = silsegscnt;
  3767. return FINISHED;
  3768. }
  3769. /*************************** EQUALISE_EVENT_LEVELS ****************************/
  3770. int equalise_event_levels(dataptr dz)
  3771. {
  3772. int exit_status, warned = 0, done = 0, accents = dz->iparam[2];
  3773. float *ibuf = dz->sampbuf[0];
  3774. int *events;
  3775. int n;
  3776. int eventsegscnt, abs_samp_cnt, cnt, envcnt, actual_envcnt;
  3777. double *env, maxval, boostrange, maxboost, boost, equaliser = dz->param[1], pregain = dz->param[3];
  3778. int event_start, event_end, bufpos;
  3779. if((exit_status = count_events(0,0,&eventsegscnt,dz))<0) {
  3780. return(exit_status);
  3781. }
  3782. if((envcnt = eventsegscnt/2) * 2 != eventsegscnt)
  3783. envcnt++;
  3784. events = dz->lparray[0];
  3785. if((dz->parray[0] = (double *)malloc(envcnt * sizeof(double))) == NULL) {
  3786. sprintf(errstr,"INSUFFICIENT MEMORY establishing envelope storage.\n");
  3787. return(MEMORY_ERROR);
  3788. }
  3789. env = dz->parray[0];
  3790. if((sndseekEx(dz->ifd[0],0,0)<0)){
  3791. sprintf(errstr,"sndseek() failed\n");
  3792. return SYSTEM_ERROR;
  3793. }
  3794. reset_filedata_counters(dz);
  3795. dz->ssampsread = 0;
  3796. cnt = 0;
  3797. actual_envcnt = 0;
  3798. abs_samp_cnt = 0;
  3799. bufpos = 0;
  3800. event_start = events[cnt++];
  3801. event_end = events[cnt++];
  3802. if((exit_status = read_samps(ibuf,dz))<0) {
  3803. sprintf(errstr,"Failed to read data from sndfile.\n");
  3804. return(DATA_ERROR);
  3805. }
  3806. fprintf(stdout,"INFO: Extracting events envelope\n");
  3807. fflush(stdout);
  3808. while(abs_samp_cnt < dz->insams[0]) {
  3809. while(abs_samp_cnt < event_start) {
  3810. if(bufpos >= dz->ssampsread) {
  3811. if((exit_status = read_samps(ibuf,dz))<0) {
  3812. sprintf(errstr,"Failed to read data from sndfile.\n");
  3813. return(DATA_ERROR);
  3814. }
  3815. bufpos = 0;
  3816. if(dz->ssampsread == 0) {
  3817. done = 1;
  3818. break;
  3819. }
  3820. }
  3821. abs_samp_cnt++;
  3822. bufpos++;
  3823. }
  3824. if(done)
  3825. break;
  3826. maxval = 0.0;
  3827. while(abs_samp_cnt < event_end) {
  3828. if(bufpos >= dz->ssampsread) {
  3829. if((exit_status = read_samps(ibuf,dz))<0) {
  3830. sprintf(errstr,"Failed to read data from sndfile.\n");
  3831. return(DATA_ERROR);
  3832. }
  3833. bufpos = 0;
  3834. if(dz->ssampsread == 0) {
  3835. done = 1;
  3836. break;
  3837. }
  3838. }
  3839. if(fabs(ibuf[bufpos]) > maxval)
  3840. maxval = fabs(ibuf[bufpos]);
  3841. abs_samp_cnt++;
  3842. bufpos++;
  3843. }
  3844. if(actual_envcnt >= envcnt) {
  3845. sprintf(errstr,"Bug : Error in envelope accounting (1)\n");
  3846. return(PROGRAM_ERROR);
  3847. }
  3848. env[actual_envcnt++] = maxval;
  3849. if(done || (cnt >= eventsegscnt))
  3850. break;
  3851. event_start = events[cnt++];
  3852. event_end = events[cnt++];
  3853. }
  3854. if(envcnt != actual_envcnt) {
  3855. fprintf(stdout,"WARNING: Error in envelope accounting (2)\n");
  3856. fflush(stdout);
  3857. }
  3858. maxval = 0;
  3859. for(n=0;n<actual_envcnt;n++)
  3860. maxval = max(maxval,env[n]);
  3861. for(n=0;n<actual_envcnt;n++) {
  3862. maxboost = min(50.0,maxval/env[n]);
  3863. switch(accents) {
  3864. case(0): // No accents
  3865. boostrange = maxboost - env[n]; // Events less than max
  3866. boost = boostrange * equaliser; // Boosted by amount dependent on equaliser
  3867. env[n] = (env[n] + boost)/env[n];
  3868. break;
  3869. case(1): // All events equally accented
  3870. env[n] = maxboost * pregain; // All events get level of max event
  3871. break;
  3872. default:
  3873. if(n % accents == 0) // Accented beats get maxlevel
  3874. env[n] = maxboost * pregain;
  3875. else // Unaccented beats set to equaliser * maxlevel
  3876. env[n] = maxboost * pregain * equaliser;
  3877. break;
  3878. }
  3879. }
  3880. for(n=actual_envcnt;n<envcnt;n++)
  3881. env[n] = 1.0; // Deal with potential accounting problems with envelope
  3882. if((sndseekEx(dz->ifd[0],0,0)<0)){
  3883. sprintf(errstr,"sndseek() failed\n");
  3884. return SYSTEM_ERROR;
  3885. }
  3886. reset_filedata_counters(dz);
  3887. dz->ssampsread = 0;
  3888. if((exit_status = read_samps(ibuf,dz))<0) {
  3889. sprintf(errstr,"Failed to read data from sndfile.\n");
  3890. return(DATA_ERROR);
  3891. }
  3892. cnt = 0;
  3893. n = 0;
  3894. abs_samp_cnt = 0;
  3895. bufpos = 0;
  3896. event_start = events[cnt++];
  3897. event_end = events[cnt++];
  3898. fprintf(stdout,"INFO: Adjusting events loudness\n");
  3899. fflush(stdout);
  3900. while(abs_samp_cnt < dz->insams[0]) {
  3901. while(abs_samp_cnt < event_start) {
  3902. if(bufpos >= dz->ssampsread) {
  3903. if((exit_status = write_samps(ibuf,dz->ssampsread,dz))<0) {
  3904. sprintf(errstr,"Failed to write data to sndfile.\n");
  3905. return(DATA_ERROR);
  3906. }
  3907. if((exit_status = read_samps(ibuf,dz))<0) {
  3908. sprintf(errstr,"Failed to read data from sndfile.\n");
  3909. return(DATA_ERROR);
  3910. }
  3911. bufpos = 0;
  3912. if(dz->ssampsread == 0) {
  3913. done = 1;
  3914. break;
  3915. }
  3916. }
  3917. abs_samp_cnt++;
  3918. bufpos++;
  3919. }
  3920. if(done)
  3921. break;
  3922. while(abs_samp_cnt < event_end) {
  3923. if(n > envcnt) {
  3924. n--;
  3925. if(!warned) {
  3926. fprintf(stdout,"WARNING: Error in envelope accounting (3)\n");
  3927. fflush(stdout);
  3928. warned = 1;
  3929. }
  3930. }
  3931. if(bufpos >= dz->ssampsread) {
  3932. if((exit_status = write_samps(ibuf,dz->ssampsread,dz))<0) {
  3933. sprintf(errstr,"Failed to write data to sndfile.\n");
  3934. return(DATA_ERROR);
  3935. }
  3936. if((exit_status = read_samps(ibuf,dz))<0) {
  3937. sprintf(errstr,"Failed to read data from sndfile.\n");
  3938. return(DATA_ERROR);
  3939. }
  3940. bufpos = 0;
  3941. if(dz->ssampsread == 0) {
  3942. done = 1;
  3943. break;
  3944. }
  3945. }
  3946. ibuf[bufpos] = (float)(ibuf[bufpos] * env[n]);
  3947. abs_samp_cnt++;
  3948. bufpos++;
  3949. }
  3950. if(done)
  3951. break;
  3952. n++;
  3953. if(cnt >= eventsegscnt) {
  3954. event_start = abs_samp_cnt;
  3955. event_end = dz->insams[0];
  3956. } else {
  3957. event_start = events[cnt++];
  3958. event_end = events[cnt++];
  3959. }
  3960. }
  3961. if(bufpos > 0) {
  3962. if((exit_status = write_samps(ibuf,bufpos,dz))<0) {
  3963. sprintf(errstr,"Failed to write data to sndfile.\n");
  3964. return(DATA_ERROR);
  3965. }
  3966. }
  3967. return FINISHED;
  3968. }
  3969. /******************************************* RETEMPO_EVENTS *******************************************/
  3970. int retempo_events(dataptr dz)
  3971. {
  3972. int exit_status, done = 0, chans = dz->infile->channels;
  3973. float *ibuf = dz->sampbuf[0], *obuf = dz->sampbuf[1], *ovflwbuf = dz->sampbuf[2];
  3974. int *chunkat;
  3975. double srate = (double)dz->infile->srate;
  3976. double *beat = dz->parray[0];
  3977. int ibufstart = 0; // position in infile of start of current input buffer
  3978. int obufstart = 0; // position in outfile of start of current output buffer
  3979. int osamppos = 0; // position in outfile
  3980. int obufpos = 0; // position within current output buffer
  3981. int lastwrite = 0; // position in current outbuf (or its overflow) of the furthest write
  3982. int n, m, k, b, chunkstart, chunkend, overflow;
  3983. int chanoffset; // in multichan case, ensures output chunk positioned at same channel as input chunk
  3984. int thisbeat = 0; // Current beat position in outfile, in samples
  3985. int tempo=0, startoffset = 0;
  3986. double pregain = 0.0;
  3987. int eventsegscnt = 0;
  3988. switch(dz->mode) {
  3989. case(5):
  3990. tempo = dz->iparam[0];
  3991. startoffset = dz->iparam[1];
  3992. pregain = dz->param[3];
  3993. if((exit_status = count_events(2,0,&eventsegscnt,dz))<0)
  3994. return(exit_status);
  3995. break;
  3996. case(6):
  3997. startoffset = dz->iparam[0];
  3998. pregain = dz->param[2];
  3999. if((exit_status = count_events(1,0,&eventsegscnt,dz))<0)
  4000. return(exit_status);
  4001. break;
  4002. }
  4003. chunkat = dz->lparray[0];
  4004. if((sndseekEx(dz->ifd[0],0,0)<0)){
  4005. sprintf(errstr,"sndseek() failed\n");
  4006. return SYSTEM_ERROR;
  4007. }
  4008. reset_filedata_counters(dz);
  4009. dz->ssampsread = 0;
  4010. if(dz->itemcnt * 2 < eventsegscnt) {
  4011. sprintf(errstr,"Found %d events, but only %d out-event-beat-placements specified.\n",eventsegscnt/2,dz->itemcnt);
  4012. return(DATA_ERROR);
  4013. } else if(dz->itemcnt * 2 > eventsegscnt) {
  4014. fprintf(stdout,"WARNING: Found %d events : %d out-event-beat-placements specified.\n",eventsegscnt/2,dz->itemcnt);
  4015. fflush(stdout);
  4016. }
  4017. memset((char *)obuf,0,dz->buflen * sizeof(float));
  4018. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float));
  4019. for(n=0, b= 0;n<eventsegscnt;n+=2,b++) {
  4020. chanoffset = (chunkat[n]/chans) * chans; // Find any channel chanoffset; of the in-chunk */
  4021. chanoffset = chunkat[n] - chanoffset;
  4022. while(dz->total_samps_read < chunkat[n]) { // If next chunk to read is beyond current input buffer
  4023. ibufstart += dz->ssampsread; // Get another buffer of data
  4024. if((exit_status = read_samps(ibuf,dz)) < 0)
  4025. return exit_status;
  4026. for(m=0;m<dz->ssampsread;m++)
  4027. ibuf[m] = (float)(ibuf[m] * pregain);
  4028. if(dz->ssampsread == 0) {
  4029. fprintf(stdout,"WARNING: Ran out of samples in input (1)\n");
  4030. fflush(stdout);
  4031. done = 1;
  4032. break;
  4033. }
  4034. }
  4035. if(done)
  4036. break;
  4037. chunkstart = chunkat[n] - ibufstart; // get address of chunkstart within this buffer
  4038. chunkend = chunkat[n+1] - ibufstart; // and relative address of chunk end
  4039. switch(dz->mode) {
  4040. case(5):
  4041. thisbeat = (int)round(beat[b] * (double)tempo) * chans;
  4042. break;
  4043. case(6):
  4044. thisbeat = (int)round(beat[b] * srate) * chans;
  4045. break;
  4046. }
  4047. osamppos = startoffset + thisbeat;
  4048. osamppos += chanoffset;
  4049. obufpos = osamppos - obufstart;
  4050. if(obufpos < 0) {
  4051. sprintf(errstr,"Events too long (relative to silence) to achieve this tempo change.\n");
  4052. return(DATA_ERROR);
  4053. }
  4054. while(obufpos >= dz->buflen) { // If next write is beyond buffer end
  4055. if((exit_status = write_samps(obuf,dz->buflen,dz))<0) // Write buffer(s)
  4056. return(exit_status);
  4057. memset((char *)obuf,0,dz->buflen * sizeof(float)); // And set to zero (as buffer is ADDED into)
  4058. if((overflow = lastwrite - dz->buflen) > 0) { // If there was any buffer overflow
  4059. memcpy((char *)obuf,(char *)ovflwbuf,overflow * sizeof(float)); // Bakcopy it into buffer
  4060. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float)); // and zero overflow buffer
  4061. }
  4062. lastwrite -= dz->buflen;
  4063. obufstart += dz->buflen; // Advance buffer-start count in output samples
  4064. obufpos -= dz->buflen;
  4065. }
  4066. k = chunkstart;
  4067. while(k < chunkend) {
  4068. if(k >= dz->ssampsread) { // If at input buffer end
  4069. ibufstart += dz->ssampsread; // Update address of buffer start
  4070. k -= dz->ssampsread; // decrease both counter, and counter-end marker, by length of last buf
  4071. chunkend -= dz->ssampsread;
  4072. if((exit_status = read_samps(ibuf,dz)) < 0) // Read more insamps
  4073. return exit_status;
  4074. if(dz->ssampsread == 0) {
  4075. if(k != chunkend) {
  4076. fprintf(stdout,"WARNING: Ran out of samples in input (2)\n");
  4077. fflush(stdout);
  4078. }
  4079. done = 1;
  4080. break;
  4081. }
  4082. for(m=0;m<dz->ssampsread;m++)
  4083. ibuf[m] = (float)(ibuf[m] * pregain);
  4084. }
  4085. if(obufpos >= dz->buflen) { // If next write is beyond output buffer end
  4086. if((exit_status = write_samps(obuf,dz->buflen,dz))<0) // Write buffer(s)
  4087. return(exit_status);
  4088. memset((char *)obuf,0,dz->buflen * sizeof(float)); // And set to zero (as buffer is ADDED into)
  4089. if((overflow = lastwrite - dz->buflen) > 0) { // If there was any buffer overflow
  4090. memcpy((char *)obuf,(char *)ovflwbuf,overflow * sizeof(float)); // Bakcopy it into buffer
  4091. memset((char *)ovflwbuf,0,dz->buflen * sizeof(float)); // and zero overflow buffer
  4092. }
  4093. lastwrite -= dz->buflen;
  4094. obufstart += dz->buflen; // Advance buffer-start count in output samples
  4095. obufpos = 0;
  4096. }
  4097. obuf[obufpos] = (float)(obuf[obufpos] + ibuf[k]); // Add chunk into outbuf
  4098. obufpos++;
  4099. k++;
  4100. lastwrite = max(lastwrite,obufpos); // Note address of MAXIMUM write, withib obuf (or its overflow)
  4101. }
  4102. if(done)
  4103. break;
  4104. }
  4105. if(lastwrite > 0) {
  4106. if((exit_status = write_samps(obuf,lastwrite,dz))<0) // Write last buffer
  4107. return(exit_status);
  4108. }
  4109. if(dz->total_samps_written <= 0) {
  4110. sprintf(errstr,"No output samples written\n");
  4111. return(PROGRAM_ERROR);
  4112. }
  4113. return FINISHED;
  4114. }
  4115. /******************************************* MASK_EVENTS *******************************************/
  4116. int mask_events(dataptr dz)
  4117. {
  4118. int exit_status, done = 0, chans = dz->infile->channels;
  4119. float *buf = dz->sampbuf[0];
  4120. int *chunkat, *mask = dz->lparray[0];
  4121. int ibufstart = 0; // position in infile of start of current input buffer
  4122. int n, m, k, chunkstart, chunkend;
  4123. int chanoffset; // in multichan case, ensures output chunk positioned at same channel as input chunk
  4124. int eventsegscnt = 0;
  4125. if((exit_status = count_events(0,1,&eventsegscnt,dz))<0)
  4126. return(exit_status);
  4127. chunkat = dz->lparray[1];
  4128. if((sndseekEx(dz->ifd[0],0,0)<0)){
  4129. sprintf(errstr,"sndseek() failed\n");
  4130. return SYSTEM_ERROR;
  4131. }
  4132. reset_filedata_counters(dz);
  4133. if((exit_status = read_samps(buf,dz)) < 0)
  4134. return exit_status;
  4135. m = 0;
  4136. for(n=0;n<eventsegscnt;n+=2) {
  4137. chanoffset = (chunkat[n]/chans) * chans; // Find any channel chanoffset; of the in-chunk */
  4138. chanoffset = chunkat[n] - chanoffset;
  4139. while(dz->total_samps_read < chunkat[n]) { // If next chunk to read is beyond current input buffer
  4140. ibufstart += dz->ssampsread; // Write cuurent buffer
  4141. if((exit_status = write_samps(buf,dz->ssampsread,dz)) < 0)
  4142. return exit_status;
  4143. if((exit_status = read_samps(buf,dz)) < 0) // Get another buffer of data
  4144. return exit_status;
  4145. if(dz->ssampsread == 0) {
  4146. fprintf(stdout,"WARNING: Ran out of samples in input (1)\n");
  4147. fflush(stdout);
  4148. done = 1;
  4149. break;
  4150. }
  4151. }
  4152. if(done)
  4153. break;
  4154. chunkstart = chunkat[n] - ibufstart; // get address of chunkstart within this buffer
  4155. chunkend = chunkat[n+1] - ibufstart; // and relative address of chunk end
  4156. k = chunkstart;
  4157. while(k < chunkend) {
  4158. if(k >= dz->ssampsread) { // If at input buffer end
  4159. ibufstart += dz->ssampsread; // Update address of buffer start
  4160. k -= dz->ssampsread; // decrease both counter, and counter-end marker, by length of last buf
  4161. chunkend -= dz->ssampsread; // Write data
  4162. if((exit_status = write_samps(buf,dz->ssampsread,dz)) < 0)
  4163. return exit_status;
  4164. if((exit_status = read_samps(buf,dz)) < 0) // Read more insamps
  4165. return exit_status;
  4166. if(dz->ssampsread == 0) {
  4167. if(k != chunkend) {
  4168. fprintf(stdout,"WARNING: Ran out of samples in input (2)\n");
  4169. fflush(stdout);
  4170. }
  4171. done = 1;
  4172. break;
  4173. }
  4174. }
  4175. if(mask[m] == 0) // Zero event, where masked
  4176. buf[k] = 0.0f;
  4177. k++;
  4178. }
  4179. if(done)
  4180. break;
  4181. if(++m >= dz->itemcnt) // Loop around mask
  4182. m = 0;
  4183. }
  4184. while(dz->ssampsread > 0) { // Copy end of file
  4185. if((exit_status = write_samps(buf,dz->ssampsread,dz)) < 0)
  4186. return exit_status;
  4187. if((exit_status = read_samps(buf,dz)) < 0)
  4188. return exit_status;
  4189. }
  4190. return FINISHED;
  4191. }