columns5.c 137 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716171717181719172017211722172317241725172617271728172917301731173217331734173517361737173817391740174117421743174417451746174717481749175017511752175317541755175617571758175917601761176217631764176517661767176817691770177117721773177417751776177717781779178017811782178317841785178617871788178917901791179217931794179517961797179817991800180118021803180418051806180718081809181018111812181318141815181618171818181918201821182218231824182518261827182818291830183118321833183418351836183718381839184018411842184318441845184618471848184918501851185218531854185518561857185818591860186118621863186418651866186718681869187018711872187318741875187618771878187918801881188218831884188518861887188818891890189118921893189418951896189718981899190019011902190319041905190619071908190919101911191219131914191519161917191819191920192119221923192419251926192719281929193019311932193319341935193619371938193919401941194219431944194519461947194819491950195119521953195419551956195719581959196019611962196319641965196619671968196919701971197219731974197519761977197819791980198119821983198419851986198719881989199019911992199319941995199619971998199920002001200220032004200520062007200820092010201120122013201420152016201720182019202020212022202320242025202620272028202920302031203220332034203520362037203820392040204120422043204420452046204720482049205020512052205320542055205620572058205920602061206220632064206520662067206820692070207120722073207420752076207720782079208020812082208320842085208620872088208920902091209220932094209520962097209820992100210121022103210421052106210721082109211021112112211321142115211621172118211921202121212221232124212521262127212821292130213121322133213421352136213721382139214021412142214321442145214621472148214921502151215221532154215521562157215821592160216121622163216421652166216721682169217021712172217321742175217621772178217921802181218221832184218521862187218821892190219121922193219421952196219721982199220022012202220322042205220622072208220922102211221222132214221522162217221822192220222122222223222422252226222722282229223022312232223322342235223622372238223922402241224222432244224522462247224822492250225122522253225422552256225722582259226022612262226322642265226622672268226922702271227222732274227522762277227822792280228122822283228422852286228722882289229022912292229322942295229622972298229923002301230223032304230523062307230823092310231123122313231423152316231723182319232023212322232323242325232623272328232923302331233223332334233523362337233823392340234123422343234423452346234723482349235023512352235323542355235623572358235923602361236223632364236523662367236823692370237123722373237423752376237723782379238023812382238323842385238623872388238923902391239223932394239523962397239823992400240124022403240424052406240724082409241024112412241324142415241624172418241924202421242224232424242524262427242824292430243124322433243424352436243724382439244024412442244324442445244624472448244924502451245224532454245524562457245824592460246124622463246424652466246724682469247024712472247324742475247624772478247924802481248224832484248524862487248824892490249124922493249424952496249724982499250025012502250325042505250625072508250925102511251225132514251525162517251825192520252125222523252425252526252725282529253025312532253325342535253625372538253925402541254225432544254525462547254825492550255125522553255425552556255725582559256025612562256325642565256625672568256925702571257225732574257525762577257825792580258125822583258425852586258725882589259025912592259325942595259625972598259926002601260226032604260526062607260826092610261126122613261426152616261726182619262026212622262326242625262626272628262926302631263226332634263526362637263826392640264126422643264426452646264726482649265026512652265326542655265626572658265926602661266226632664266526662667266826692670267126722673267426752676267726782679268026812682268326842685268626872688268926902691269226932694269526962697269826992700270127022703270427052706270727082709271027112712271327142715271627172718271927202721272227232724272527262727272827292730273127322733273427352736273727382739274027412742274327442745274627472748274927502751275227532754275527562757275827592760276127622763276427652766276727682769277027712772277327742775277627772778277927802781278227832784278527862787278827892790279127922793279427952796279727982799280028012802280328042805280628072808280928102811281228132814281528162817281828192820282128222823282428252826282728282829283028312832283328342835283628372838283928402841284228432844284528462847284828492850285128522853285428552856285728582859286028612862286328642865286628672868286928702871287228732874287528762877287828792880288128822883288428852886288728882889289028912892289328942895289628972898289929002901290229032904290529062907290829092910291129122913291429152916291729182919292029212922292329242925292629272928292929302931293229332934293529362937293829392940294129422943294429452946294729482949295029512952295329542955295629572958295929602961296229632964296529662967296829692970297129722973297429752976297729782979298029812982298329842985298629872988298929902991299229932994299529962997299829993000300130023003300430053006300730083009301030113012301330143015301630173018301930203021302230233024302530263027302830293030303130323033303430353036303730383039304030413042304330443045304630473048304930503051305230533054305530563057305830593060306130623063306430653066306730683069307030713072307330743075307630773078307930803081308230833084308530863087308830893090309130923093309430953096309730983099310031013102310331043105310631073108310931103111311231133114311531163117311831193120312131223123312431253126312731283129313031313132313331343135313631373138313931403141314231433144314531463147314831493150315131523153315431553156315731583159316031613162316331643165316631673168316931703171317231733174317531763177317831793180318131823183318431853186318731883189319031913192319331943195319631973198319932003201320232033204320532063207320832093210321132123213321432153216321732183219322032213222322332243225322632273228322932303231323232333234323532363237323832393240324132423243324432453246324732483249325032513252325332543255325632573258325932603261326232633264326532663267326832693270327132723273327432753276327732783279328032813282328332843285328632873288328932903291329232933294329532963297329832993300330133023303330433053306330733083309331033113312331333143315331633173318331933203321332233233324332533263327332833293330333133323333333433353336333733383339334033413342334333443345334633473348334933503351335233533354335533563357335833593360336133623363336433653366336733683369337033713372337333743375337633773378337933803381338233833384338533863387338833893390339133923393339433953396339733983399340034013402340334043405340634073408340934103411341234133414341534163417341834193420342134223423342434253426342734283429343034313432343334343435343634373438343934403441344234433444344534463447344834493450345134523453345434553456345734583459346034613462346334643465346634673468346934703471347234733474347534763477347834793480348134823483348434853486348734883489349034913492349334943495349634973498349935003501350235033504350535063507350835093510351135123513351435153516351735183519352035213522352335243525352635273528352935303531353235333534353535363537353835393540354135423543354435453546354735483549355035513552355335543555355635573558355935603561356235633564356535663567356835693570357135723573357435753576357735783579358035813582358335843585358635873588358935903591359235933594359535963597359835993600360136023603360436053606360736083609361036113612361336143615361636173618361936203621362236233624362536263627362836293630363136323633363436353636363736383639364036413642364336443645364636473648364936503651365236533654365536563657365836593660366136623663366436653666366736683669367036713672367336743675367636773678367936803681368236833684368536863687368836893690369136923693369436953696369736983699370037013702370337043705370637073708370937103711371237133714371537163717371837193720372137223723372437253726372737283729373037313732373337343735373637373738373937403741374237433744374537463747374837493750375137523753375437553756375737583759376037613762376337643765376637673768376937703771377237733774377537763777377837793780378137823783378437853786378737883789379037913792379337943795379637973798379938003801380238033804380538063807380838093810381138123813381438153816381738183819382038213822382338243825382638273828382938303831383238333834383538363837383838393840384138423843384438453846384738483849385038513852385338543855385638573858385938603861386238633864386538663867386838693870387138723873387438753876387738783879388038813882388338843885388638873888388938903891389238933894389538963897389838993900390139023903390439053906390739083909391039113912391339143915391639173918391939203921392239233924392539263927392839293930393139323933393439353936393739383939394039413942394339443945394639473948394939503951395239533954395539563957395839593960396139623963396439653966396739683969397039713972397339743975397639773978397939803981398239833984398539863987398839893990399139923993399439953996399739983999400040014002400340044005400640074008400940104011401240134014401540164017401840194020402140224023402440254026402740284029403040314032403340344035403640374038403940404041404240434044404540464047404840494050405140524053405440554056405740584059406040614062406340644065406640674068406940704071407240734074407540764077407840794080408140824083408440854086408740884089409040914092409340944095409640974098409941004101410241034104410541064107410841094110411141124113411441154116411741184119412041214122412341244125412641274128412941304131413241334134413541364137413841394140414141424143414441454146414741484149415041514152415341544155415641574158415941604161416241634164416541664167416841694170417141724173417441754176417741784179418041814182418341844185418641874188418941904191419241934194419541964197419841994200420142024203420442054206420742084209421042114212421342144215421642174218421942204221422242234224422542264227422842294230423142324233423442354236423742384239424042414242424342444245424642474248424942504251425242534254425542564257425842594260426142624263426442654266426742684269427042714272427342744275427642774278427942804281428242834284428542864287428842894290429142924293429442954296429742984299430043014302430343044305430643074308430943104311431243134314431543164317431843194320432143224323432443254326432743284329433043314332433343344335433643374338433943404341434243434344434543464347434843494350435143524353435443554356435743584359436043614362436343644365436643674368436943704371437243734374437543764377437843794380438143824383438443854386438743884389439043914392439343944395439643974398439944004401440244034404440544064407440844094410441144124413441444154416441744184419442044214422442344244425442644274428442944304431443244334434443544364437443844394440444144424443444444454446444744484449445044514452445344544455445644574458445944604461446244634464446544664467446844694470447144724473447444754476447744784479448044814482448344844485448644874488448944904491449244934494449544964497449844994500450145024503450445054506450745084509451045114512451345144515451645174518
  1. /*
  2. * Copyright (c) 1983-2013 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 <columns.h>
  22. #include <cdplib.h>
  23. //#ifdef unix
  24. #define round(x) lround((x))
  25. //#endif
  26. #define MIN_TEMPO (.01666667) /* 1 beat per hour ! */
  27. #define MAX_TEMPO (60000) /* 1 beat per millisecond ! */
  28. int alphabetical_order(char *,char *);
  29. double leveltodb(double,int);
  30. double dbtolevel(double);
  31. void hinsert(int m,int t,int *perm,int permlen);
  32. void ascending_sort_cells(int *perm,int ccnt);
  33. void hshuflup(int k,int *perm,int permlen);
  34. void hprefix(int m,int *perm,int permlen);
  35. void randperm(int *perm, int permlen);
  36. static void invertenv(double piv);
  37. static void docross
  38. (double lastnval,double lastmval,double thisnval, double thismval,double time,int *j,double *out,int typ);
  39. static void hhinsert(int m,int t,int setlen,int *perm);
  40. static void hhprefix(int m,int setlen,int *perm);
  41. static void hhshuflup(int k,int setlen,int *perm);
  42. static void do_repet_restricted_perm(int *arr, int *perm, int arrsiz, int allowed, int endval);
  43. static void get_metre(char [],int *barlen,int *beatsize);
  44. static double get_tempo(char *str);
  45. static double get_beat(int n,int barlen);
  46. static void get_offset(char *str,double *offset);
  47. static double randoffset(double scatter);
  48. static double readbrk(float *warpvals,double time,int wcnt);
  49. /***************************** PRODUCT ***************************/
  50. void product(void)
  51. {
  52. int n;
  53. double sum = number[0];
  54. for(n=1;n<cnt;n++)
  55. sum *= number[n];
  56. do_valout_as_message(sum);
  57. fflush(stdout);
  58. }
  59. /*************************** HZ_TO_MIDI ************************/
  60. void hz_to_midi(void)
  61. {
  62. int n;
  63. for(n=0;n<cnt;n++) {
  64. number[n] = hztomidi(number[n]);
  65. do_valout(number[n]);
  66. }
  67. fflush(stdout);
  68. }
  69. /******************************** FIND_MEAN *************************/
  70. void find_mean(void)
  71. {
  72. double sum = 0.0;
  73. int n;
  74. for(n=0;n<cnt;n++)
  75. sum += number[n];
  76. sum /= (double)cnt;
  77. do_valout_as_message(sum);
  78. fflush(stdout);
  79. }
  80. /******************************** MIDI_TO_HZ **************************/
  81. void midi_to_hz(void)
  82. {
  83. int n;
  84. for(n=0;n<cnt;n++) {
  85. number[n] = miditohz(number[n]);
  86. do_valout(number[n]);
  87. }
  88. fflush(stdout);
  89. }
  90. /*************************** MAJOR_TO_MINOR *************************/
  91. void major_to_minor(void)
  92. {
  93. int n;
  94. int m3 = (4 + ifactor)%12; /* MIDI location of major 3rd */
  95. int m6 = (9 + ifactor)%12; /* MIDI location of major 6th */
  96. for(n=0;n<cnt;n++) {
  97. factor = fmod(number[n],TWELVE);
  98. if(flteq(factor,(double)m3) || flteq(factor,(double)m6))
  99. number[n] -= 1.0;
  100. do_valout(number[n]);
  101. }
  102. fflush(stdout);
  103. }
  104. /****************** REMOVE_MIDI_PITCHCLASS_DUPLICATES *******************/
  105. void remove_midi_pitchclass_duplicates(void)
  106. {
  107. int n, m, move;
  108. int k = cnt-ifactor;
  109. int failed = 0;
  110. for(n=0;n<k;n++) {
  111. for(m=1;m<=ifactor;m++) {
  112. if(n+m >= cnt)
  113. break;
  114. if(flteq(fmod(number[n],12.0),fmod(number[n+m],12.0))) {
  115. if((move = m_repos(n+m))<0) {
  116. failed++;
  117. } else {
  118. n += move; /* list shufld forwd, or not */
  119. m--; /* m+1th item now at m */
  120. }
  121. }
  122. }
  123. }
  124. if(failed)
  125. fprintf(stdout,"WARNING: %d items failed to be separated.\n",failed);
  126. for(n=0;n<cnt;n++)
  127. do_valout(number[n]);
  128. fflush(stdout);
  129. }
  130. /************************** REVERSE_LIST *************************/
  131. void reverse_list(void)
  132. {
  133. int n;
  134. for(n=stringscnt-1;n>=0;n--)
  135. do_stringout(strings[n]);
  136. fflush(stdout);
  137. }
  138. /************************* ROTATE_MOTIF *************************/
  139. void rotate_motif(void)
  140. {
  141. int n;
  142. for(n=cnt-ifactor;n<cnt;n++)
  143. do_valout(number[n]);
  144. for(n=0;n<cnt-ifactor;n++)
  145. do_valout(number[n]);
  146. fflush(stdout);
  147. }
  148. /************************** RATIOS ****************************/
  149. void ratios(void)
  150. {
  151. int n;
  152. for(n=1;n<cnt;n++) {
  153. if(flteq(number[n-1],0.0))
  154. do_stringout("INF\n");
  155. else
  156. do_valout(number[n]/number[n-1]);
  157. }
  158. fflush(stdout);
  159. }
  160. /******************************** RECIPROCALS ***********************/
  161. void reciprocals(int positive_vals_only)
  162. {
  163. int n;
  164. if(positive_vals_only) {
  165. for(n=0;n<cnt;n++) {
  166. if(number[n] < FLTERR) {
  167. fprintf(stdout,"ERROR: Invalid value %d (%lf) for this process\n",n+1,number[n]);
  168. fflush(stdout);
  169. exit(1);
  170. }
  171. }
  172. }
  173. for(n=0;n<cnt;n++) {
  174. switch(condit) {
  175. case(0):
  176. if(flteq(number[n],0.0)) {
  177. if(!sloom && !sloombatch)
  178. fprintf(fp[1],"INFINITE\n");
  179. else if(sloombatch) {
  180. fprintf(stdout,"INFINITE\n");
  181. fflush(stdout);
  182. } else {
  183. fprintf(stdout,"ERROR: Division by zero encountered (item %d) : Impossible\n",n+1);
  184. fflush(stdout);
  185. exit(1);
  186. }
  187. } else
  188. do_valout(factor/number[n]);
  189. break;
  190. case('>'):
  191. if(number[n]>thresh) {
  192. if(flteq(number[n],0.0)) {
  193. if(!sloom && !sloombatch)
  194. fprintf(fp[1],"INFINITE\n");
  195. else if(sloombatch) {
  196. fprintf(stdout,"INFINITE\n");
  197. fflush(stdout);
  198. } else {
  199. fprintf(stdout,"ERROR: Division by zero encountered (item %d) : Impossible\n",n+1);
  200. fflush(stdout);
  201. exit(1);
  202. }
  203. } else
  204. do_valout(factor/number[n]);
  205. } else
  206. do_valout(number[n]);
  207. break;
  208. case('<'):
  209. if(number[n]<thresh) {
  210. if(flteq(number[n],0.0)) {
  211. if(!sloom && !sloombatch)
  212. fprintf(fp[1],"INFINITE\n");
  213. else if(sloombatch) {
  214. fprintf(stdout,"INFINITE\n");
  215. fflush(stdout);
  216. } else {
  217. fprintf(stdout,"ERROR: Division by zero encountered (item %d) : Impossible\n",n+1);
  218. fflush(stdout);
  219. exit(1);
  220. }
  221. } else
  222. do_valout(factor/number[n]);
  223. } else
  224. do_valout(number[n]);
  225. break;
  226. }
  227. }
  228. fflush(stdout);
  229. }
  230. /****************************** RANDOMISE_ORDER *********************/
  231. void randomise_order(int *perm)
  232. {
  233. int n;
  234. randperm(perm,stringscnt);
  235. for(n=0;n<stringscnt;n++)
  236. do_stringout(strings[perm[n]]);
  237. fflush(stdout);
  238. }
  239. /****************************** RANDOMISE_ORDER *********************/
  240. void randomise_Ntimes(int *perm)
  241. {
  242. int n = 0, m, lastperm;
  243. for(m = 0;m< ifactor;m++) {
  244. if(n == 0)
  245. randperm(perm,stringscnt);
  246. else {
  247. lastperm = perm[stringscnt - 1];
  248. randperm(perm,stringscnt);
  249. while(perm[0] == lastperm)
  250. randperm(perm,stringscnt);
  251. }
  252. for(n=0;n<stringscnt;n++)
  253. do_stringout(strings[perm[n]]);
  254. }
  255. fflush(stdout);
  256. }
  257. /************************** ADD_RANDVAL_PLUS_OR_MINUS ********************/
  258. void add_randval_plus_or_minus(void)
  259. {
  260. int n;
  261. for(n=0;n<cnt;n++) {
  262. number[n] += ((drand48() * 2.0) - 1.0) * factor;
  263. do_valout(number[n]);
  264. }
  265. fflush(stdout);
  266. }
  267. /****************************** ADD_RANDVAL ***************************/
  268. void add_randval(void)
  269. {
  270. int n;
  271. for(n=0;n<cnt;n++) {
  272. number[n] += drand48() * factor;
  273. do_valout(number[n]);
  274. }
  275. fflush(stdout);
  276. }
  277. /************************ MULTIPLY_BY_RANDVAL ************************/
  278. void multiply_by_randval(void)
  279. {
  280. int n;
  281. for(n=0;n<cnt;n++) {
  282. number[n] *= drand48() * factor;
  283. do_valout(number[n]);
  284. }
  285. fflush(stdout);
  286. }
  287. /***************************** RANDCHUNKS ************************/
  288. void randchunks(void)
  289. {
  290. double sum = 0.0;
  291. double randrange = fabs(number[1] - number[0]);
  292. double minn = min(number[1],number[0]);
  293. while(sum<factor) {
  294. do_valout(sum);
  295. sum += (drand48() * randrange) + minn;
  296. }
  297. fflush(stdout);
  298. }
  299. /************************** GENERATE_RANDOM_VALUES ***********************/
  300. void generate_random_values(void)
  301. {
  302. double randrange = number[1] - number[0];
  303. int n;
  304. for(n=0;n<factor;n++)
  305. do_valout((drand48() * randrange) + number[0]);
  306. fflush(stdout);
  307. }
  308. /****************************** RANDOM_0S_AND_1S ********************/
  309. void random_0s_and_1s(void)
  310. {
  311. int n;
  312. double sum;
  313. int totcnt = (int)round(number[0]);
  314. for(n=0;n<totcnt;n++) {
  315. sum = drand48() * 2.0;
  316. if(sum>=1.0)
  317. do_stringout("1\n");
  318. else
  319. do_stringout("0\n");
  320. }
  321. fflush(stdout);
  322. }
  323. /****************************** RANDOM_PAIRS ********************/
  324. void random_pairs(void)
  325. {
  326. int n;
  327. double sum;
  328. int totcnt = (int)round(number[2]);
  329. char tempa[200];
  330. char tempb[200];
  331. sprintf(tempa,"%d",(int)round(number[0]));
  332. sprintf(tempb,"%d",(int)round(number[1]));
  333. for(n=0;n<totcnt;n++) {
  334. sum = drand48() * 2.0;
  335. if(sum>=1.0)
  336. do_stringout(tempb);
  337. else
  338. do_stringout(tempa);
  339. }
  340. fflush(stdout);
  341. }
  342. /****************************** RANDOM_0S_AND_1S_RESTRAINED ********************/
  343. void random_0s_and_1s_restrained(void)
  344. {
  345. int n, cnt0 = 0, cnt1 = 0;
  346. double sum;
  347. int totcnt = (int)round(number[0]);
  348. int limit = (int)round(number[1]);
  349. for(n=0;n<totcnt;n++) {
  350. sum = drand48() * 2.0;
  351. if(sum>=1.0) {
  352. cnt1++;
  353. if(cnt1 <= limit) {
  354. do_stringout("1\n");
  355. cnt0 = 0;
  356. } else {
  357. do_stringout("0\n");
  358. cnt1 = 0;
  359. cnt0 = 1;
  360. }
  361. } else {
  362. cnt0++;
  363. if(cnt0 <= limit) {
  364. do_stringout("0\n");
  365. cnt1 = 0;
  366. } else {
  367. do_stringout("1\n");
  368. cnt0 = 0;
  369. cnt1 = 1;
  370. }
  371. }
  372. }
  373. fflush(stdout);
  374. }
  375. /****************************** RANDOM_PAIRS_RESTRAINED ********************/
  376. void random_pairs_restrained(void)
  377. {
  378. int n, cnt0 = 0, cnt1 = 0;
  379. double sum;
  380. int totcnt = (int)round(number[2]);
  381. int limit = (int)round(number[3]);
  382. char tempa[200];
  383. char tempb[200];
  384. sprintf(tempa,"%d",(int)round(number[0]));
  385. sprintf(tempb,"%d",(int)round(number[1]));
  386. for(n=0;n<totcnt;n++) {
  387. sum = drand48() * 2.0;
  388. if(sum>=1.0) {
  389. cnt1++;
  390. if(cnt1 <= limit) {
  391. do_stringout(tempb);
  392. cnt0 = 0;
  393. } else {
  394. do_stringout(tempa);
  395. cnt1 = 0;
  396. cnt0 = 1;
  397. }
  398. } else {
  399. cnt0++;
  400. if(cnt0 <= limit) {
  401. do_stringout(tempa);
  402. cnt1 = 0;
  403. } else {
  404. do_stringout(tempb);
  405. cnt0 = 0;
  406. cnt1 = 1;
  407. }
  408. }
  409. }
  410. fflush(stdout);
  411. }
  412. /****************************** RANDOM_SCATTER **********************/
  413. void random_scatter(void)
  414. {
  415. int n;
  416. double dscatter;
  417. double *diffs = (double *)exmalloc((cnt-1)*sizeof(double));
  418. for(n=0;n<cnt-1;n++) {
  419. diffs[n] = number[n+1] - number[n];
  420. diffs[n] /= 2.0;
  421. }
  422. for(n=1;n<cnt-1;n++) {
  423. dscatter = ((drand48() * 2.0) - 1.0) * factor;
  424. if(dscatter > 0.0)
  425. number[n] += diffs[n] * dscatter;
  426. else
  427. number[n] += diffs[n-1] * dscatter;
  428. }
  429. print_numbers();
  430. }
  431. /************************** RANDOM_ELIMINATION ***********************/
  432. void random_elimination(void)
  433. {
  434. int n, m;
  435. for(n=0;n<ifactor;n++) {
  436. m = (int)(drand48() * cnt); /* TRUNCATE */
  437. eliminate(m);
  438. }
  439. print_numbers();
  440. }
  441. /*************************** EQUAL_DIVISIONS ************************/
  442. void equal_divisions(void)
  443. {
  444. double interval = (number[1] - number[0])/factor;
  445. double sum = number[0];
  446. if(interval > 0.0) {
  447. while(sum<=number[1]) {
  448. do_valout(sum);
  449. sum += interval;
  450. }
  451. } else {
  452. while(sum>=number[1]) {
  453. do_valout(sum);
  454. sum += interval;
  455. }
  456. }
  457. fflush(stdout);
  458. }
  459. /************************* LOG_EQUAL_DIVISIONS ***********************/
  460. void log_equal_divisions(void)
  461. {
  462. double sum = log(number[0]);
  463. double top = log(number[1]);
  464. double interval = (top - sum)/factor;
  465. if(sum < top) {
  466. while(sum <= top - FLTERR) {
  467. do_valout(exp(sum));
  468. sum += interval;
  469. }
  470. } else {
  471. while(sum >= top + FLTERR) {
  472. do_valout(exp(sum));
  473. sum += interval;
  474. }
  475. }
  476. do_valout(number[1]);
  477. fflush(stdout);
  478. }
  479. /****************************** QUADRATIC_CURVE_STEPS ******************/
  480. void quadratic_curve_steps(void)
  481. {
  482. double sum, diff = number[1] - number[0];
  483. double step = fabs(1.0/(factor - 1.0));
  484. double thisstep = 0.0;
  485. int icnt = 0, i_factor = round(factor);
  486. if(diff>0.0)
  487. number[2] = 1.0/number[2];
  488. for(;;) {
  489. sum = pow(thisstep,number[2]);
  490. sum = (sum * diff) + number[0];
  491. do_valout(sum);
  492. if(++icnt >= i_factor)
  493. break;
  494. thisstep += step;
  495. }
  496. fflush(stdout);
  497. }
  498. /*************************** PLAIN_BOB ***************************/
  499. void plain_bob(void)
  500. {
  501. int n, m, k;
  502. for(n=0;n<cnt;n++)
  503. do_valout(number[n]);
  504. for(m=0;m<cnt-1;m++) {
  505. for(k=0;k<cnt-1;k++) {
  506. bellperm1();
  507. for(n=0;n<cnt;n++)
  508. do_valout(number[n]);
  509. bellperm2();
  510. for(n=0;n<cnt;n++)
  511. do_valout(number[n]);
  512. }
  513. bellperm1();
  514. for(n=0;n<cnt;n++)
  515. do_valout(number[n]);
  516. bellperm3();
  517. for(n=0;n<cnt;n++)
  518. do_valout(number[n]);
  519. }
  520. fflush(stdout);
  521. }
  522. /*********************** REPEAT_INTERVALS *************************/
  523. void repeat_intervals(void)
  524. {
  525. int n, m;
  526. double z, k;
  527. for(n=0;n<cnt-1;n++)
  528. do_valout(number[n]);
  529. z = k = number[n] - number[0];
  530. for(m=1;m<=ifactor;m++) {
  531. for(n=0;n<cnt-1;n++) /*TW Feb 2005*/
  532. do_valout(number[n] + z);
  533. z += k;
  534. }
  535. fflush(stdout);
  536. }
  537. /************** MAKE_EQUAL_INTEVALS_BTWN_GIVEN_VALS ************/
  538. void make_equal_intevals_btwn_given_vals(void)
  539. {
  540. double top = number[1];
  541. double sum = number[0];
  542. if(factor > 0.0) {
  543. if(number[0] > number[1]) {
  544. top = number[0];
  545. sum = number[1];
  546. }
  547. } else {
  548. if(number[0] < number[1]) {
  549. top = number[0];
  550. sum = number[1];
  551. }
  552. }
  553. if(top >= sum ) {
  554. while(sum<=top) {
  555. do_valout(sum);
  556. sum += factor;
  557. }
  558. } else {
  559. while(sum>=top) {
  560. do_valout(sum);
  561. sum += factor;
  562. }
  563. }
  564. fflush(stdout);
  565. }
  566. /********************** CREATE_INTERVALS ***********************/
  567. void create_intervals(void)
  568. {
  569. int n;
  570. for(n=0;n<ifactor;n++) {
  571. do_valout(number[0] * n);
  572. }
  573. fflush(stdout);
  574. }
  575. /********************** CREATE_INTERVALS_FROM_BASE ***********************/
  576. void create_intervals_from_base(void)
  577. {
  578. int n;
  579. double sum = number[1];
  580. for(n=0;n<ifactor;n++) {
  581. do_valout(sum);
  582. sum += number[0];
  583. }
  584. fflush(stdout);
  585. }
  586. /********************** CREATE_RATIOS_FROM_BASE ***********************/
  587. void create_ratios_from_base(void)
  588. {
  589. int n;
  590. double sum = number[1];
  591. for(n=0;n<ifactor;n++) {
  592. do_valout(sum);
  593. if(sum > HUGE/2.0 || sum < -HUGE/2.0) {
  594. sprintf(errstr,"Calculation overflows.\n");
  595. do_error();
  596. }
  597. sum *= number[0];
  598. }
  599. fflush(stdout);
  600. }
  601. /********************** CREATE_EQUAL_STEPS ***********************/
  602. void create_equal_steps(void)
  603. {
  604. int n;
  605. double sum = number[0];
  606. double step = (number[1] - number[0])/((double)ifactor - 1.0);
  607. for(n=0;n<ifactor;n++) {
  608. do_valout(sum);
  609. sum += step;
  610. }
  611. fflush(stdout);
  612. }
  613. /********************** CREATE_EQUAL_VALS ***********************/
  614. void create_equal_vals(void)
  615. {
  616. int n;
  617. for(n=0;n<ifactor;n++) {
  618. do_valout(number[0]);
  619. }
  620. fflush(stdout);
  621. }
  622. /************************ CHANGE_VALUE_OF_INTERVALS ********************/
  623. void change_value_of_intervals(void)
  624. {
  625. double interval, sum = number[0];
  626. int n;
  627. for(n=1;n<cnt;n++) {
  628. do_valout(sum);
  629. switch(ro) {
  630. case('a'): interval=(number[n]-number[n-1])+factor; break;
  631. case('m'): interval=(number[n]-number[n-1])*factor; break;
  632. default:
  633. fprintf(stdout,"ERROR: Unkonwn case in change_value_of_intervals()\n");
  634. fflush(stdout);
  635. exit(1);
  636. break;
  637. }
  638. sum += interval;
  639. }
  640. do_valout(sum);
  641. fflush(stdout);
  642. }
  643. /******************** MOTIVICALLY_INVERT_MIDI **********************/
  644. void motivically_invert_midi(void)
  645. {
  646. double dfactor = 2.0 * number[0];
  647. int n;
  648. for(n=1;n<cnt;n++)
  649. number[n] = dfactor - number[n];
  650. print_numbers();
  651. }
  652. /********************** MOTIVICALLY_INVERT_HZ **********************/
  653. void motivically_invert_hz(void)
  654. {
  655. double dfactor;
  656. int n;
  657. if(flteq((dfactor = number[0] * number[0]),0.0)) {
  658. sprintf(errstr,"First frq is zero : can't proceed.\n");
  659. do_error();
  660. }
  661. for(n=1;n<cnt;n++)
  662. number[n] = dfactor/number[n];
  663. print_numbers();
  664. }
  665. /******************** GET_INTERMEDIATE_VALUES ************************/
  666. void get_intermediate_values(void)
  667. {
  668. int n;
  669. double d;
  670. for(n=1;n<cnt;n++) {
  671. d = (number[n] + number[n-1])/2.0;
  672. do_valout(d);
  673. }
  674. fflush(stdout);
  675. }
  676. /******************** INSERT_INTERMEDIATE_VALUES ************************/
  677. void insert_intermediate_values(void)
  678. {
  679. int n;
  680. double d;
  681. fprintf(stdout,"INFO: %lf\n",number[0]);
  682. for(n=1;n<cnt;n++) {
  683. d = (number[n] + number[n-1])/2.0;
  684. fprintf(stdout,"INFO: %lf\n",d);
  685. fprintf(stdout,"INFO: %lf\n",number[n]);
  686. }
  687. fflush(stdout);
  688. }
  689. /******************** INSERT_INTERMEDIATE_VALP ************************/
  690. void insert_intermediate_valp(void)
  691. {
  692. int n;
  693. double d;
  694. for(n=1;n<cnt;n+=2) {
  695. fprintf(stdout,"INFO: %lf\n",number[n-1]);
  696. d = (number[n] + number[n-1])/2.0;
  697. fprintf(stdout,"INFO: %lf\n",d);
  698. fprintf(stdout,"INFO: %lf\n",number[n]);
  699. }
  700. fflush(stdout);
  701. }
  702. /************************** GET_INTERVALS ***********************/
  703. void get_intervals(void)
  704. {
  705. int n;
  706. for(n=1;n<cnt;n++)
  707. do_valout(number[n]-number[n-1]);
  708. fflush(stdout);
  709. }
  710. /************************ GET_ONE_SKIP_N ************************/
  711. void get_one_skip_n(void)
  712. {
  713. int n = 0;
  714. ifactor = round(factor);
  715. if(ifactor < 1) {
  716. sprintf(errstr,"Invalid parameter (%d)\n",ifactor);
  717. do_error();
  718. }
  719. while(n<stringscnt) {
  720. do_stringout(strings[n++]);
  721. n += ifactor;
  722. }
  723. fflush(stdout);
  724. }
  725. /************************ GET_N_SKIP_ONE *************************/
  726. void get_n_skip_one(void)
  727. {
  728. int m, n = 0;
  729. int k, i_factor = round(factor);
  730. if(ifactor < 1) {
  731. sprintf(errstr,"Invalid parameter (%d)\n",i_factor);
  732. do_error();
  733. }
  734. while(n<stringscnt) {
  735. if((k = n + i_factor) >= stringscnt) {
  736. for(m=n;m<stringscnt;m++)
  737. do_stringout(strings[m]);
  738. break;
  739. }
  740. for(m=n;m<k;m++)
  741. do_stringout(strings[m]);
  742. n+= i_factor+1;
  743. }
  744. fflush(stdout);
  745. }
  746. /************************* SUM_NWISE **************************/
  747. void sum_nwise(void)
  748. {
  749. int n, m;
  750. ifactor = round(factor);
  751. /* RWD */
  752. if(ifactor > cnt) {
  753. sprintf(errstr,"group size (N) too large for infile\n");
  754. do_error();
  755. }
  756. for(n=0;n<=cnt-ifactor;n++) { /*RWD: test was just < */
  757. for(m=1;m<ifactor;m++)
  758. number[n] += number[n+m];
  759. do_valout(number[n]);
  760. }
  761. fflush(stdout);
  762. }
  763. /************************* SUM_MINUS_OVERLAPS *********************/
  764. void sum_minus_overlaps(void)
  765. {
  766. int n;
  767. double sum = 0.0;
  768. for(n=0;n<cnt;n++)
  769. sum += number[n];
  770. sum -= (double)(cnt-1) * factor;
  771. do_valout_as_message(sum);
  772. fflush(stdout);
  773. }
  774. /******************** SUM_ABSOLUTE_DIFFERENCES ********************/
  775. void sum_absolute_differences(void)
  776. {
  777. int n;
  778. double sum = 0.0;
  779. for(n=1;n<cnt;n++)
  780. sum += fabs(number[n] - number[n-1]);
  781. sum -= (double)(cnt-1) * factor;
  782. do_valout_as_message(sum);
  783. fflush(stdout);
  784. }
  785. /**************************** STACK ***************************/
  786. void stack(int with_last)
  787. {
  788. int n;
  789. double sum = 0.0;
  790. for(n=0;n<cnt;n++) {
  791. do_valout(sum);
  792. sum += number[n] - factor;
  793. }
  794. if(with_last) {
  795. sum += factor;
  796. do_valout(sum);
  797. }
  798. fflush(stdout);
  799. }
  800. /*********************** DUPLICATE_VALUES **************************/
  801. void duplicate_values(void)
  802. {
  803. int n, m;
  804. for(n=0;n<stringscnt;n++) {
  805. for(m=0;m<ifactor;m++)
  806. do_stringout(strings[n]);
  807. }
  808. fflush(stdout);
  809. }
  810. /*********************** DUPLICATE_VALUES_STEPPED **************************/
  811. void duplicate_values_stepped(void)
  812. {
  813. int n, m;
  814. double step = number[cnt+1];
  815. double offset = 0.0;
  816. ifactor = round(number[cnt]);
  817. for(m=0;m<ifactor;m++) {
  818. for(n=0;n<cnt;n++)
  819. fprintf(stdout,"INFO: %lf\n",number[n] + offset);
  820. offset += step;
  821. }
  822. fflush(stdout);
  823. }
  824. /**************************** DUPLICATE_LIST **********************/
  825. void duplicate_list(void)
  826. {
  827. int n, m;
  828. for(m=0;m<ifactor;m++) {
  829. for(n=0;n<stringscnt;n++)
  830. do_stringout(strings[n]);
  831. }
  832. fflush(stdout);
  833. }
  834. /****************************** FORMAT_VALS ****************************/
  835. void format_vals(void)
  836. { /*RWD new Format option : recast by TW */
  837. int n, m, OK = 1;
  838. double d = (double)cnt/(double)ifactor;
  839. int rowcnt = cnt/ifactor;
  840. char ctemp[64];
  841. errstr[0] = ENDOFSTR;
  842. if(d > (double)rowcnt)
  843. rowcnt++;
  844. if((rowcnt > 82) && sloom) {
  845. sprintf(errstr,"Too many (%d) rows to handle",rowcnt);
  846. do_error();
  847. }
  848. for(n=0;n<cnt;n+=rowcnt) {
  849. for(m=0;m<rowcnt;m++) {
  850. if(!sloom && !sloombatch) {
  851. if(n!=0 && m==0)
  852. fprintf(fp[1],"\n");
  853. if(n+m < cnt)
  854. fprintf(fp[1],"%.5lf ",number[n+m]);
  855. else
  856. OK = 0;
  857. } else {
  858. if(n!=0 && m==0) {
  859. fprintf(stdout,"INFO: %s\n",errstr);
  860. errstr[0] = ENDOFSTR;
  861. }
  862. if(n+m < cnt) {
  863. sprintf(temp,"%.5lf ",number[n+m]);
  864. strcat(errstr,ctemp);
  865. } else
  866. OK = 0;
  867. }
  868. }
  869. if(!OK)
  870. break;
  871. }
  872. if(!sloom && !sloombatch)
  873. fprintf(fp[1],"\n");
  874. else
  875. fprintf(stdout,"INFO: %s\n",errstr);
  876. fflush(stdout);
  877. }
  878. /****************************** COLUMN_FORMAT_VALS ****************************/
  879. void column_format_vals(void)
  880. { int n, m;
  881. double d = (double)cnt/(double)ifactor;
  882. int rowcnt = cnt/ifactor;
  883. char ctemp[64];
  884. errstr[0] = ENDOFSTR;
  885. if(d > (double)rowcnt)
  886. rowcnt++;
  887. for(n=0;n<rowcnt;n++) {
  888. for(m=n;m<cnt;m+=rowcnt) {
  889. if(!sloom && !sloombatch)
  890. fprintf(fp[1],"%.5lf ",number[m]);
  891. else {
  892. sprintf(temp,"%.5lf ",number[m]);
  893. strcat(errstr,ctemp);
  894. }
  895. }
  896. if(!sloom && !sloombatch)
  897. fprintf(fp[1],"\n");
  898. else {
  899. fprintf(stdout,"INFO: %s\n",errstr);
  900. errstr[0] = ENDOFSTR;
  901. }
  902. }
  903. fflush(stdout);
  904. }
  905. /************************ INTERVAL_LIMIT() ********************/
  906. void interval_limit(void)
  907. {
  908. double interval, sum = number[0];
  909. int n;
  910. do_valout(sum);
  911. for(n=1;n<cnt;n++) {
  912. interval=number[n]-number[n-1];
  913. switch(ro) {
  914. case('l'): interval = max(interval,factor); break;
  915. case('L'): interval = min(interval,factor); break;
  916. }
  917. sum += interval;
  918. do_valout(sum);
  919. }
  920. fflush(stdout);
  921. }
  922. /********************************** TIME_DENSITY ******************************/
  923. void time_density(void)
  924. {
  925. int n, m = 0, k, ended = 0;
  926. double min_endtime, *endtime = (double *)exmalloc(ifactor * sizeof(double));
  927. for(n=0;n<ifactor;n++)
  928. endtime[n] = 0.0;
  929. min_endtime = 0.0;
  930. for(;;) {
  931. for(n=0;n<ifactor;n++) {
  932. if(flteq(endtime[n],min_endtime)) {
  933. do_valout(endtime[n]);
  934. endtime[n] += number[m];
  935. if(++m >= cnt) {
  936. ended = 1;
  937. break;
  938. }
  939. min_endtime = endtime[n];
  940. for(k=0;k<ifactor;k++) {
  941. if(endtime[k] < min_endtime)
  942. min_endtime = endtime[k];
  943. }
  944. }
  945. }
  946. if(ended)
  947. break;
  948. }
  949. fflush(stdout);
  950. }
  951. /********************************** DIVIDE_LIST ******************************/
  952. void divide_list(void)
  953. {
  954. int n;
  955. for(n=0;n<cnt;n++) {
  956. switch(condit) {
  957. case(0):
  958. number[n] /= factor;
  959. break;
  960. case('>'):
  961. if(number[n]>thresh)
  962. number[n] /= factor;
  963. break;
  964. case('<'):
  965. if(number[n]<thresh)
  966. number[n] /= factor;
  967. break;
  968. }
  969. do_valout(number[n]);
  970. }
  971. fflush(stdout);
  972. }
  973. /********************************** GROUP ******************************/
  974. void group(void)
  975. {
  976. int n, m = 0;
  977. while(m < ifactor) {
  978. for(n=m;n<stringscnt;n+=ifactor) {
  979. do_stringout(strings[n]);
  980. }
  981. if(!sloom && !sloombatch)
  982. fprintf(fp[1],"\n");
  983. m++;
  984. }
  985. fflush(stdout);
  986. }
  987. /********************************** DUPLICATE_OCTAVES ******************************/
  988. void duplicate_octaves(void)
  989. {
  990. int n, m;
  991. double d;
  992. for(n=0;n<cnt;n++)
  993. do_valout(number[n]);
  994. for(m=1;m<=ifactor;m++) {
  995. d = 12.0 * m;
  996. for(n=0;n<cnt;n++)
  997. do_valout(number[n] + d);
  998. }
  999. fflush(stdout);
  1000. }
  1001. /********************************** DUPLICATE_OCTFRQ ******************************/
  1002. void duplicate_octfrq(void)
  1003. {
  1004. int n, m;
  1005. double d;
  1006. for(n=0;n<cnt;n++)
  1007. do_valout(number[n]);
  1008. for(m=1;m<=ifactor;m++) {
  1009. d = pow(2.0,(double)m);
  1010. for(n=0;n<cnt;n++)
  1011. do_valout(number[n] * d);
  1012. }
  1013. fflush(stdout);
  1014. }
  1015. /********************************** INTERVAL_TO_RATIO ******************************/
  1016. void interval_to_ratio(int semitones,int tstretch)
  1017. {
  1018. int n;
  1019. double bum = 0.0;
  1020. for(n=0;n<cnt;n++) {
  1021. if(semitones) {
  1022. bum = number[n];
  1023. number[n] /= 12.0;
  1024. }
  1025. if(fabs(number[n]) > MAXOCTTRANS) {
  1026. if(!semitones)
  1027. bum = number[n];
  1028. sprintf(errstr,"Item %d (%lf) is too large or small to convert.\n",n+1,bum);
  1029. do_error();
  1030. }
  1031. }
  1032. for(n=0;n<cnt;n++) {
  1033. number[n] = pow(2.0,number[n]);
  1034. if(tstretch)
  1035. number[n] = 1.0/number[n];
  1036. do_valout(number[n]);
  1037. }
  1038. fflush(stdout);
  1039. }
  1040. /********************************** RATIO_TO_INTERVAL ******************************/
  1041. void ratio_to_interval(int semitones,int tstretch)
  1042. {
  1043. int n;
  1044. for(n=0;n<cnt;n++) {
  1045. if(number[n] < FLTERR) {
  1046. fprintf(stdout,"ERROR: ratio %d (%lf) is too small or an impossible (negative) value.\n",n+1,number[n]);
  1047. fflush(stdout);
  1048. exit(1);
  1049. }
  1050. if(tstretch)
  1051. number[n] = 1.0/number[n];
  1052. }
  1053. for(n=0;n<cnt;n++) {
  1054. number[n] = log(number[n]) * ONE_OVER_LN2;
  1055. if(semitones)
  1056. number[n] *= 12.0;
  1057. fprintf(stdout,"INFO: %lf\n",number[n]);
  1058. }
  1059. fflush(stdout);
  1060. }
  1061. /********************************** DO_SLOPE ******************************/
  1062. void do_slope(void)
  1063. {
  1064. int n;
  1065. double ddiff;
  1066. do_valout(number[0]);
  1067. for(n=1;n<cnt;n++) {
  1068. ddiff = number[n] - number[0];
  1069. ddiff *= factor;
  1070. number[n] = number[0] + ddiff;
  1071. do_valout(number[n]);
  1072. }
  1073. fflush(stdout);
  1074. }
  1075. /********************************** ALPHABETIC_SORT ******************************/
  1076. void alphabetic_sort(void)
  1077. {
  1078. int n,m;
  1079. char tempp[200],*p;
  1080. for(n=1;n<stringscnt;n++) {
  1081. p = strings[n];
  1082. strcpy(tempp,strings[n]);
  1083. m = n-1;
  1084. while(m >= 0 && alphabetical_order(tempp,strings[m])) {
  1085. strings[m+1] = strings[m];
  1086. m--;
  1087. }
  1088. strings[m+1] = p;
  1089. }
  1090. for(n=0;n<stringscnt;n++)
  1091. do_stringout(strings[n]);
  1092. fflush(stdout);
  1093. }
  1094. /******************************* ALPHABETICAL_ORDER **************************/
  1095. #define UPPERCASE(x) ((x) >= 'A' && (x) < 'Z')
  1096. int alphabetical_order(char *str1,char *str2)
  1097. {
  1098. char p, q;
  1099. int n,m;
  1100. int j = strlen(str1);
  1101. int k = strlen(str2);
  1102. m = min(j,k);
  1103. for(n=0;n<m;n++) {
  1104. p = str1[n];
  1105. q = str2[n];
  1106. if(UPPERCASE(p)) p += 32;
  1107. if(UPPERCASE(q)) q += 32;
  1108. if(p > q) return(0);
  1109. if(p < q) return(1);
  1110. }
  1111. if(k<j)
  1112. return(0);
  1113. return(1);
  1114. }
  1115. /********************************** LEVEL_TO_DB ******************************/
  1116. void level_to_db(int sampleval)
  1117. {
  1118. int n;
  1119. for(n=0;n<cnt;n++) {
  1120. if(sampleval)
  1121. number[n] /= (double)MAXSAMP;
  1122. number[n] = leveltodb(number[n],n);
  1123. sprintf(errstr,"%lfdB\n",number[n]);
  1124. do_stringout(errstr);
  1125. }
  1126. fflush(stdout);
  1127. }
  1128. /********************************** DB_TO_LEVEL ******************************/
  1129. void db_to_level(int sampleval)
  1130. {
  1131. int n;
  1132. for(n=0;n<cnt;n++) {
  1133. number[n] = dbtolevel(number[n]);
  1134. if(sampleval)
  1135. number[n] *= (double)MAXSAMP;
  1136. do_valout(number[n]);
  1137. }
  1138. fflush(stdout);
  1139. }
  1140. /******************************** LEVELTODB ***********************/
  1141. double leveltodb(double val,int n)
  1142. {
  1143. if(val <= 0.0) {
  1144. sprintf(errstr,"Gain value %d <= 0.0: Cannot proceed\n",n+1);
  1145. do_error();
  1146. }
  1147. val = log10(val);
  1148. val *= 20.0;
  1149. return(val);
  1150. }
  1151. /******************************** DBTOLEVEL ***********************/
  1152. double dbtolevel(double val)
  1153. {
  1154. int isneg = 0;
  1155. if(flteq(val,0.0))
  1156. return(1.0);
  1157. if(val < 0.0) {
  1158. val = -val;
  1159. isneg = 1;
  1160. }
  1161. val /= 20.0;
  1162. val = pow(10.0,val);
  1163. if(isneg)
  1164. val = 1.0/val;
  1165. return(val);
  1166. }
  1167. /******************************** COLUMNATE ***********************/
  1168. void columnate(void)
  1169. {
  1170. int n;
  1171. for(n=0;n<cnt;n++)
  1172. do_valout(number[n]);
  1173. fflush(stdout);
  1174. }
  1175. /******************************** SAMP_TO_TIME ***********************/
  1176. void samp_to_time(void)
  1177. {
  1178. int n;
  1179. double inv_sr = 1.0/(double)ifactor;
  1180. for(n=0;n<cnt;n++)
  1181. do_valout(number[n] * inv_sr);
  1182. fflush(stdout);
  1183. }
  1184. /******************************** TIME_TO_SAMP ***********************/
  1185. void time_to_samp(void)
  1186. {
  1187. int n;
  1188. for(n=0;n<cnt;n++) {
  1189. do_valout(number[n] * (double)ifactor);
  1190. }
  1191. fflush(stdout);
  1192. }
  1193. /******************************** DELETE_SMALL_INTERVALS ***********************/
  1194. void delete_small_intervals(void)
  1195. {
  1196. int n, m;
  1197. int start = 1, end = 1, shrink;
  1198. double diff;
  1199. for(n=1;n<cnt;n++) {
  1200. if((diff = number[n] - number[n-1]) < 0) {
  1201. fprintf(stdout,"WARNING: Numbers must be in ascending order for this option.\n");
  1202. fflush(stdout);
  1203. exit(1);
  1204. }
  1205. if(diff <= factor)
  1206. end++;
  1207. else {
  1208. if((shrink = (end - start))) {
  1209. for(m = n-1;m < cnt; m++)
  1210. number[m-shrink] = number[m];
  1211. end = start;
  1212. cnt -= shrink;
  1213. n -= shrink;
  1214. }
  1215. start++;
  1216. end++;
  1217. }
  1218. }
  1219. for(n=0;n<cnt;n++)
  1220. do_valout(number[n]);
  1221. fflush(stdout);
  1222. }
  1223. /******************************** MARK_EVENT_GROUPS ***********************/
  1224. void mark_event_groups(void)
  1225. {
  1226. int n, m;
  1227. int start = 1, end = 1, shrink;
  1228. int orig_cnt = cnt;
  1229. double diff;
  1230. for(n=1;n<cnt;n++) {
  1231. if((diff = number[n] - number[n-1]) < 0) {
  1232. fprintf(stdout,"WARNING: Numbers must be in ascending order for this option.\n");
  1233. fflush(stdout);
  1234. exit(1);
  1235. }
  1236. if(diff <= factor) {
  1237. end++;
  1238. } else {
  1239. shrink = end - start;
  1240. switch(shrink) {
  1241. case(1): /* 2 in group, preserve */
  1242. start++;
  1243. break;
  1244. case(0): /* 1 isolated point, duplicate */
  1245. cnt++;
  1246. if(cnt > orig_cnt) {
  1247. if((number = (double *)realloc((char *)number,cnt * sizeof(double)))==NULL) {
  1248. fprintf(stdout,"WARNING: Out of memory for storing numbers.\n");
  1249. fflush(stdout);
  1250. exit(1);
  1251. }
  1252. orig_cnt = cnt;
  1253. }
  1254. for(m = cnt-1; m >= n; m--)
  1255. number[m] = number[m-1];
  1256. n++;
  1257. start++;
  1258. end++;
  1259. break;
  1260. default: /* >2 in group, bracket */
  1261. shrink--;
  1262. for(m = n-1;m < cnt; m++)
  1263. number[m-shrink] = number[m];
  1264. end = start;
  1265. cnt -= shrink;
  1266. n -= shrink;
  1267. break;
  1268. }
  1269. start++;
  1270. end++;
  1271. }
  1272. }
  1273. shrink = end - start;
  1274. switch(shrink) {
  1275. case(0):
  1276. cnt++;
  1277. if(cnt > orig_cnt) {
  1278. if((number = (double *)realloc((char *)number,cnt * sizeof(double)))==NULL) {
  1279. fprintf(stdout,"WARNING: Out of memory for storing numbers.\n");
  1280. fflush(stdout);
  1281. exit(1);
  1282. }
  1283. }
  1284. for(m = cnt-1; m >= n; m--)
  1285. number[m] = number[m-1];
  1286. break;
  1287. case(1):
  1288. break;
  1289. default:
  1290. shrink--;
  1291. for(m = n-1;m < cnt; m++)
  1292. number[m-shrink] = number[m];
  1293. cnt -= shrink;
  1294. break;
  1295. }
  1296. for(n=0;n<cnt;n++)
  1297. do_valout(number[n]);
  1298. fflush(stdout);
  1299. }
  1300. /******************************** SPANPAIR ***********************
  1301. *
  1302. * span pairs of values.
  1303. */
  1304. void spanpair(void)
  1305. {
  1306. int n, m, is_even = 1;
  1307. int cnt2 = cnt * 2;
  1308. if(cnt & 1) {
  1309. fprintf(stdout,"WARNING: This process only works on an even number of values.\n");
  1310. fflush(stdout);
  1311. exit(1);
  1312. }
  1313. if((number = (double *)realloc((char *)number,cnt2 * sizeof(double)))==NULL) {
  1314. fprintf(stdout,"WARNING: Out of memory for storing numbers.\n");
  1315. fflush(stdout);
  1316. exit(1);
  1317. }
  1318. m = cnt2-1;
  1319. for(n=cnt-1;n>=0;n--) {
  1320. if(number[n] < 0.0) {
  1321. fprintf(stdout,"WARNING: No negative numbers allowed in this option.\n");
  1322. fflush(stdout);
  1323. exit(1);
  1324. }
  1325. if(is_even) {
  1326. number[m--] = number[n] + factor + thresh;
  1327. number[m--] = number[n] + factor;
  1328. } else {
  1329. number[m--] = number[n];
  1330. number[m--] = max(number[n] - thresh, 0.0);
  1331. }
  1332. is_even = !is_even;
  1333. }
  1334. for(n=0;n<cnt2;n++)
  1335. do_valout(number[n]);
  1336. fflush(stdout);
  1337. }
  1338. /******************************** SPAN ***********************
  1339. *
  1340. * span single values with a pair.
  1341. */
  1342. void span(void)
  1343. {
  1344. int n, m;
  1345. int cnt2 = cnt * 4;
  1346. if((number = (double *)realloc((char *)number,cnt2 * sizeof(double)))==NULL) {
  1347. fprintf(stdout,"WARNING: Out of memory for storing numbers.\n");
  1348. fflush(stdout);
  1349. exit(1);
  1350. }
  1351. m = cnt2-1;
  1352. for(n=cnt-1;n>=0;n--) {
  1353. if(number[n] < 0.0) {
  1354. fprintf(stdout,"WARNING: No negative numbers allowed in this option.\n");
  1355. fflush(stdout);
  1356. exit(1);
  1357. }
  1358. number[m--] = number[n] + factor + thresh;
  1359. number[m--] = number[n] + factor;
  1360. number[m--] = number[n];
  1361. number[m--] = max(number[n] - thresh, 0.0);
  1362. }
  1363. for(n=0;n<cnt2;n++)
  1364. do_valout(number[n]);
  1365. fflush(stdout);
  1366. }
  1367. /******************************** SPAN_XALL ***********************
  1368. *
  1369. * span single values.
  1370. */
  1371. void span_xall(void)
  1372. {
  1373. int n, m;
  1374. int cnt2 = cnt * 3;
  1375. if((number = (double *)realloc((char *)number,cnt2 * sizeof(double)))==NULL) {
  1376. fprintf(stdout,"WARNING: Out of memory for storing numbers.\n");
  1377. fflush(stdout);
  1378. exit(1);
  1379. }
  1380. m = cnt2-1;
  1381. for(n=cnt-1;n>=0;n--) {
  1382. if(number[n] < 0.0) {
  1383. fprintf(stdout,"WARNING: No negative numbers allowed in this option.\n");
  1384. fflush(stdout);
  1385. exit(1);
  1386. }
  1387. number[m--] = number[n] + thresh;
  1388. number[m--] = number[n];
  1389. number[m--] = max(number[n] - thresh, 0.0);
  1390. }
  1391. for(n=0;n<cnt2;n++)
  1392. do_valout(number[n]);
  1393. fflush(stdout);
  1394. }
  1395. /******************************** ALTERNATION PATTERNS ***********************/
  1396. void alt0101(void) {
  1397. int n;
  1398. for(n=0;n<cnt;n++)
  1399. fprintf(stdout,"INFO: %lf\n",number[n & 1]);
  1400. fflush(stdout);
  1401. }
  1402. void alt0011(void) {
  1403. int n;
  1404. for(n=0;n<cnt;n++)
  1405. fprintf(stdout,"INFO: %lf\n",number[n & 2]);
  1406. fflush(stdout);
  1407. }
  1408. void alt01100(void) {
  1409. int n;
  1410. fprintf(stdout,"INFO: %lf\n",number[0]);
  1411. cnt--;
  1412. for(n=0;n<cnt;n++)
  1413. fprintf(stdout,"INFO: %lf\n",number[!(n & 2)]);
  1414. fflush(stdout);
  1415. }
  1416. void alt0r0r(void) {
  1417. int n;
  1418. double rrange = number[2] - number[1];
  1419. for(n=0;n<cnt;n++) {
  1420. if(n & 1) {
  1421. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1422. } else {
  1423. fprintf(stdout,"INFO: %lf\n",number[0]);
  1424. }
  1425. }
  1426. fflush(stdout);
  1427. }
  1428. void altr0r0(void) {
  1429. int n;
  1430. double rrange = number[2] - number[1];
  1431. for(n=0;n<cnt;n++) {
  1432. if(n & 1) {
  1433. fprintf(stdout,"INFO: %lf\n",number[0]);
  1434. } else {
  1435. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1436. }
  1437. }
  1438. fflush(stdout);
  1439. }
  1440. void altrr00(void) {
  1441. int n;
  1442. double rrange = number[2] - number[1];
  1443. for(n=0;n<cnt;n++) {
  1444. if(n & 2) {
  1445. fprintf(stdout,"INFO: %lf\n",number[0]);
  1446. } else {
  1447. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1448. }
  1449. }
  1450. fflush(stdout);
  1451. }
  1452. void alt00rr(void) {
  1453. int n;
  1454. double rrange = number[2] - number[1];
  1455. for(n=0;n<cnt;n++) {
  1456. if(n & 2) {
  1457. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1458. } else {
  1459. fprintf(stdout,"INFO: %lf\n",number[0]);
  1460. }
  1461. }
  1462. fflush(stdout);
  1463. }
  1464. void alt0rr00r(void) {
  1465. int n;
  1466. double rrange = number[2] - number[1];
  1467. fprintf(stdout,"INFO: %lf\n",number[0]);
  1468. cnt--;
  1469. for(n=0;n<cnt;n++) {
  1470. if(n & 2) {
  1471. fprintf(stdout,"INFO: %lf\n",number[0]);
  1472. } else {
  1473. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1474. }
  1475. }
  1476. fflush(stdout);
  1477. }
  1478. void altr00rr0(void) {
  1479. int n;
  1480. double rrange = number[2] - number[1];
  1481. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1482. cnt--;
  1483. for(n=0;n<cnt;n++) {
  1484. if(n & 2) {
  1485. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1486. } else {
  1487. fprintf(stdout,"INFO: %lf\n",number[0]);
  1488. }
  1489. }
  1490. fflush(stdout);
  1491. }
  1492. void altRR00(void) {
  1493. int n;
  1494. double k = 0.0;
  1495. double rrange = number[2] - number[1];
  1496. for(n=0;n<cnt;n++) {
  1497. if(n & 2) {
  1498. fprintf(stdout,"INFO: %lf\n",number[0]);
  1499. } else {
  1500. if (!(n & 1)) {
  1501. k = (drand48() * rrange) + number[1];
  1502. }
  1503. fprintf(stdout,"INFO: %lf\n",k);
  1504. }
  1505. }
  1506. fflush(stdout);
  1507. }
  1508. void alt00RR(void) {
  1509. int n;
  1510. double k = 0.0;
  1511. double rrange = number[2] - number[1];
  1512. for(n=0;n<cnt;n++) {
  1513. if(n & 2) {
  1514. if (!(n & 1)) {
  1515. k = (drand48() * rrange) + number[1];
  1516. }
  1517. fprintf(stdout,"INFO: %lf\n",k);
  1518. } else {
  1519. fprintf(stdout,"INFO: %lf\n",number[0]);
  1520. }
  1521. }
  1522. fflush(stdout);
  1523. }
  1524. void alt0RR00R(void) {
  1525. int n;
  1526. double k = 0.0;
  1527. double rrange = number[2] - number[1];
  1528. fprintf(stdout,"INFO: %lf\n",number[0]);
  1529. cnt--;
  1530. for(n=0;n<cnt;n++) {
  1531. if(n & 2) {
  1532. fprintf(stdout,"INFO: %lf\n",number[0]);
  1533. } else {
  1534. if (!(n & 1)) {
  1535. k = (drand48() * rrange) + number[1];
  1536. }
  1537. fprintf(stdout,"INFO: %lf\n",k);
  1538. }
  1539. }
  1540. fflush(stdout);
  1541. }
  1542. void altR00RR0(void) {
  1543. int n;
  1544. double k = 0.0;
  1545. double rrange = number[2] - number[1];
  1546. fprintf(stdout,"INFO: %lf\n",(drand48() * rrange) + number[1]);
  1547. cnt--;
  1548. for(n=0;n<cnt;n++) {
  1549. if(n & 2) {
  1550. if (!(n & 1)) {
  1551. k = (drand48() * rrange) + number[1];
  1552. }
  1553. fprintf(stdout,"INFO: %lf\n",k);
  1554. } else {
  1555. fprintf(stdout,"INFO: %lf\n",number[0]);
  1556. }
  1557. }
  1558. fflush(stdout);
  1559. }
  1560. /******************************** CHECK FOR ASCENDING_ORDER ***********************/
  1561. void ascending_order(void) {
  1562. int n, OK = 1;
  1563. for(n=1;n<cnt;n++) {
  1564. if(number[n] <= number[n-1]) {
  1565. OK = 0;
  1566. break;
  1567. }
  1568. }
  1569. if(!sloom && !sloombatch) {
  1570. if(OK)
  1571. fprintf(stdout, "sequence is in ascending order.");
  1572. else
  1573. fprintf(stdout, "sequence is NOT in ascending order at item %d (%lf)",n+1,number[n]);
  1574. } else {
  1575. if(OK)
  1576. fprintf(stdout, "WARNING: sequence is in ascending order.");
  1577. else
  1578. fprintf(stdout, "WARNING: sequence is NOT in ascending order at item %d (%lf)",n+1,number[n]);
  1579. }
  1580. fflush(stdout);
  1581. }
  1582. /******************************** EDIT INDIVIDUAL VALUES ***********************/
  1583. void delete_vals(void) {
  1584. int n, m, k = (int)factor;
  1585. if(k < ifactor) {
  1586. n = ifactor;
  1587. ifactor = k;
  1588. k = n;
  1589. }
  1590. k = min(k,cnt);
  1591. if(k < cnt) {
  1592. for(n=ifactor-1,m=k;m<cnt;m++,n++)
  1593. number[n] = number[m];
  1594. cnt -= (k - ifactor + 1);
  1595. } else {
  1596. cnt = ifactor-1;
  1597. }
  1598. for(n=0;n<cnt;n++)
  1599. fprintf(stdout,"INFO: %lf\n",number[n]);
  1600. fflush(stdout);
  1601. }
  1602. void replace_val(void) {
  1603. int n;
  1604. number[ifactor-1] = factor;
  1605. for(n=0;n<cnt;n++)
  1606. fprintf(stdout,"INFO: %lf\n",number[n]);
  1607. fflush(stdout);
  1608. }
  1609. void insert_val(void) { /* NB we have already malloced the extra space required */
  1610. int n;
  1611. ifactor--;
  1612. if(ifactor < cnt) {
  1613. for(n = cnt;n >= ifactor; n--)
  1614. number[n] = number[n-1];
  1615. }
  1616. number[ifactor] = factor;
  1617. cnt++;
  1618. for(n=0;n<cnt;n++)
  1619. fprintf(stdout,"INFO: %lf\n",number[n]);
  1620. fflush(stdout);
  1621. }
  1622. /*************************** QUANTISED_SCATTER *******************************
  1623. *
  1624. * number[0] = quantisation;
  1625. * number[1] = duration;
  1626. * number[2] = scatter;
  1627. */
  1628. void quantised_scatter(int *perm,int permlen)
  1629. {
  1630. int n, m, here, k, q_per_step, q_scat, q_hscat, total_q, iscat;
  1631. double quantisation = number[0], dur = number[1], scat = number[2];
  1632. total_q = (int)floor(dur/quantisation) + 1;
  1633. q_per_step = (int)ceil(total_q/(cnt-1));
  1634. n = 0;
  1635. number[n++] = 0.0;
  1636. if(scat <= 1.0) {
  1637. q_scat = (int)round(q_per_step * scat);
  1638. q_hscat = q_scat/2;
  1639. here = q_per_step;
  1640. while(n < cnt) {
  1641. k = (int)floor(drand48() * (double)q_scat) - q_hscat;
  1642. number[n++] = here + k;
  1643. here += q_per_step;
  1644. }
  1645. } else {
  1646. iscat = round(scat);
  1647. q_per_step *= iscat;
  1648. here = 0;
  1649. while(n < cnt) {
  1650. randperm(perm,permlen); /* permute the next group of quantisation cells */
  1651. ascending_sort_cells(perm,iscat); /* sort the first 'iscat' into ascending order */
  1652. for(m=0;m<iscat;m++)
  1653. perm[m]++; /* change range to range 1 to N, rather than 0 to N-1 */
  1654. for(m=0;m<iscat;m++) { /* position items above base-cellcnt */
  1655. number[n] = here + perm[m];
  1656. if(++n >= cnt)
  1657. break;
  1658. }
  1659. here += q_per_step;
  1660. }
  1661. free(perm);
  1662. }
  1663. for(n=0;n<cnt;n++)
  1664. number[n] *= quantisation;
  1665. print_numbers();
  1666. }
  1667. /*************************** RANDPERM *******************************
  1668. *
  1669. * Produce a random permutation of k integers.
  1670. */
  1671. void randperm(int *perm,int permlen)
  1672. {
  1673. int n, t;
  1674. for(n=0;n<permlen;n++) {
  1675. t = (int)floor(drand48() * (n+1));
  1676. if(t==n) {
  1677. hprefix(n,perm,permlen);
  1678. } else {
  1679. hinsert(n,t,perm,permlen);
  1680. }
  1681. }
  1682. }
  1683. void hinsert(int m,int t,int *perm,int permlen)
  1684. {
  1685. hshuflup(t+1,perm,permlen);
  1686. perm[t+1] = m;
  1687. }
  1688. void hprefix(int m,int *perm,int permlen)
  1689. {
  1690. hshuflup(0,perm,permlen);
  1691. perm[0] = m;
  1692. }
  1693. void hshuflup(int k,int *perm,int permlen)
  1694. {
  1695. int n, *i;
  1696. int z = permlen - 1;
  1697. i = perm+z;
  1698. for(n = z;n > k;n--) {
  1699. *i = *(i-1);
  1700. i--;
  1701. }
  1702. }
  1703. void ascending_sort_cells(int *perm,int ccnt)
  1704. {
  1705. int n, m, sct;
  1706. for(n=0;n<(ccnt-1);n++) {
  1707. for(m=n+1;m<ccnt;m++) {
  1708. if(*(perm+m) < *(perm+n)) {
  1709. sct = *(perm+m);
  1710. *(perm+m) = *(perm+n);
  1711. *(perm+n) = sct;
  1712. }
  1713. }
  1714. }
  1715. }
  1716. /************* REPLACING VALUES EQUAL TO > OR < A GIVEN VAL ****************/
  1717. void replace_equal(void) {
  1718. int n;
  1719. double maxe = number[cnt] + FLTERR;
  1720. double mine = number[cnt] - FLTERR;
  1721. double replace = number[cnt+1];
  1722. for(n=0;n<cnt;n++) {
  1723. if((number[n] < maxe) && (number[n] > mine))
  1724. number[n] = replace;
  1725. fprintf(stdout,"INFO: %lf\n",number[n]);
  1726. }
  1727. fflush(stdout);
  1728. }
  1729. void replace_less(void) {
  1730. int n;
  1731. double mine = number[cnt];
  1732. double replace = number[cnt+1];
  1733. for(n=0;n<cnt;n++) {
  1734. if(number[n] < mine)
  1735. number[n] = replace;
  1736. fprintf(stdout,"INFO: %lf\n",number[n]);
  1737. }
  1738. fflush(stdout);
  1739. }
  1740. void replace_greater(void) {
  1741. int n;
  1742. double maxe = number[cnt];
  1743. double replace = number[cnt+1];
  1744. for(n=0;n<cnt;n++) {
  1745. if(number[n] > maxe)
  1746. number[n] = replace;
  1747. fprintf(stdout,"INFO: %lf\n",number[n]);
  1748. }
  1749. fflush(stdout);
  1750. }
  1751. /*************************** GAPPED QUANTISED GRIDS *************************/
  1752. void grid(int is_outside)
  1753. {
  1754. int n, k, tot;
  1755. double quant = number[cnt], sum, dogrid = 0;
  1756. if(quant <= .001) {
  1757. fprintf(stdout,"ERROR: Quantisation step too small.\n");
  1758. fflush(stdout);
  1759. return;
  1760. } else if((tot = (int)ceil(number[cnt-1]/quant)) > 10000) {
  1761. fprintf(stdout,"ERROR: Quantisation too small, relative to total duration.\n");
  1762. fflush(stdout);
  1763. return;
  1764. } else if(tot < 2) {
  1765. fprintf(stdout,"ERROR: Quantisation too large, relative to total duration.\n");
  1766. fflush(stdout);
  1767. return;
  1768. }
  1769. if((permm = (double *)malloc(tot * sizeof(double))) == NULL) {
  1770. fprintf(stdout,"ERROR: Out of memory.\n");
  1771. fflush(stdout);
  1772. return;
  1773. }
  1774. if(is_outside)
  1775. dogrid = 1;
  1776. n = 0;
  1777. k = 0;
  1778. sum = 0.0;
  1779. while(n < cnt) {
  1780. if(dogrid) {
  1781. while(sum < number[n]) {
  1782. permm[k++] = sum;
  1783. sum += quant;
  1784. }
  1785. } else {
  1786. while(sum < number[n])
  1787. sum += quant;
  1788. }
  1789. dogrid = !dogrid;
  1790. n++;
  1791. }
  1792. for(n=0;n<k;n++)
  1793. fprintf(stdout,"INFO: %lf\n",permm[n]);
  1794. fflush(stdout);
  1795. }
  1796. /****** DELETE N VALS AT RANDOM : NOT MORE THAN M ADJACENT VALS DELETED : NOT MORE THAN K ADJACENT VALS UNDELETED ******/
  1797. void randdel_not_adjacent(void)
  1798. {
  1799. int adj, gap, sum, i, j, k, n, z;
  1800. int delitems, keptitems, keepset_cnt, delset_cnt;
  1801. int *vacuum, *box, *boxcnt, *box_assocd_with_cntr_no, *cntr_assocd_with_box_no;
  1802. int remainder, unfilled_boxes, inverted = 0;
  1803. delitems = round(number[cnt]); /* number of items to delete */
  1804. adj = round(number[cnt+1]); /* max no of adjacent items to delete */
  1805. gap = round(number[cnt+2]); /* max no of adjacent non-deleted items */
  1806. if(delitems >= cnt) {
  1807. fprintf(stdout,"ERROR: This will delete the whole column.");
  1808. fflush(stdout);
  1809. return;
  1810. }
  1811. if(delitems < 1) {
  1812. fprintf(stdout,"ERROR: Must delete 1 or more items.");
  1813. fflush(stdout);
  1814. return;
  1815. }
  1816. if(delitems > cnt/2) {
  1817. /* Invert the algorithm */
  1818. inverted = 1;
  1819. keptitems = delitems;
  1820. delitems = cnt - keptitems;
  1821. k = adj;
  1822. adj = gap;
  1823. gap = k;
  1824. } else {
  1825. keptitems = cnt - delitems;
  1826. }
  1827. if((vacuum = (int *)malloc(delitems * sizeof(int)))==NULL) {
  1828. fprintf(stdout,"ERROR: Out of memory.\n");
  1829. fflush(stdout);
  1830. return;
  1831. }
  1832. delset_cnt = 0;
  1833. sum = 0;
  1834. while(sum < delitems-1) { /* generating deletable groups of random sizes */
  1835. k = (int)floor(drand48()*adj) + 1; /* within range set by 'adj' */
  1836. if((sum+k) > delitems-1) /* once enough items deleted, break */
  1837. break;
  1838. else {
  1839. vacuum[delset_cnt++] = k; /* otherwise store the size of deletable group */
  1840. sum += k;
  1841. }
  1842. }
  1843. if(sum < delitems) /* fix the size of final deletable group, to make deleted total correct */
  1844. vacuum[delset_cnt++] = delitems - sum;
  1845. if((vacuum = (int *)realloc((char *)vacuum,delset_cnt * sizeof(int)))==NULL) {
  1846. fprintf(stdout,"ERROR: Memory reallocation error.\n");
  1847. fflush(stdout);
  1848. return;
  1849. }
  1850. if(delset_cnt > keptitems) { /* must be as many kept items as deleted groups, to separate those groups */
  1851. fprintf(stdout,"ERROR: Not enough undeleted items remaining to complete the task.\n");
  1852. fflush(stdout);
  1853. return;
  1854. } else if(delset_cnt == keptitems) { /* exactly as many keptitems as deleted groups, they must alternate */
  1855. j = 0;
  1856. n = 0;
  1857. i = (int)floor(drand48() * 2.0); /* select at random whether to start with deletes or not */
  1858. if(inverted) {
  1859. if(i) { /* and either ... */
  1860. while(j < delset_cnt) {
  1861. for(k=0;k<vacuum[j];k++) { /* print x items */
  1862. fprintf(stdout,"INFO: %lf\n",number[n]);
  1863. if(++n > cnt) {
  1864. fprintf(stdout,"ERROR: Program anomaly in counting data. 6\n");
  1865. break;
  1866. }
  1867. } /* then skip 1 */
  1868. if(++n > cnt) {
  1869. fprintf(stdout,"ERROR: Program anomaly in counting data. 7\n");
  1870. break;
  1871. }
  1872. j++;
  1873. }
  1874. fflush(stdout);
  1875. return;
  1876. } else { /* or .... */
  1877. while(j < delset_cnt) { /* skip 1 */
  1878. if(++n > cnt) {
  1879. fprintf(stdout,"ERROR: Program anomaly in counting data. 8\n");
  1880. break;
  1881. }
  1882. for(k=0;k<vacuum[j];k++) { /* then print x items */
  1883. fprintf(stdout,"INFO: %lf\n",number[n]);
  1884. if(++n > cnt) {
  1885. fprintf(stdout,"ERROR: Program anomaly in counting data. 9\n");
  1886. break;
  1887. }
  1888. }
  1889. j++;
  1890. }
  1891. fflush(stdout);
  1892. return;
  1893. }
  1894. } else {
  1895. if(i) { /* and either ... */
  1896. while(j < delset_cnt) {
  1897. for(k=0;k<vacuum[j];k++) { /* skip x items */
  1898. if(++n > cnt) {
  1899. fprintf(stdout,"ERROR: Program anomaly in counting data. 10\n");
  1900. break;
  1901. }
  1902. } /* then print 1 */
  1903. fprintf(stdout,"INFO: %lf\n",number[n]);
  1904. if(++n > cnt) {
  1905. fprintf(stdout,"ERROR: Program anomaly in counting data. 11\n");
  1906. break;
  1907. }
  1908. j++;
  1909. }
  1910. fflush(stdout);
  1911. return;
  1912. } else { /* or .... */
  1913. while(j < delset_cnt) { /* print 1 */
  1914. fprintf(stdout,"INFO: %lf\n",number[n]);
  1915. if(++n > cnt) {
  1916. fprintf(stdout,"ERROR: Program anomaly in counting data. 12\n");
  1917. break;
  1918. }
  1919. for(k=0;k<vacuum[j];k++) { /* then skip x items */
  1920. if(++n > cnt) {
  1921. fprintf(stdout,"ERROR: Program anomaly in counting data. 13\n");
  1922. break;
  1923. }
  1924. }
  1925. j++;
  1926. }
  1927. fflush(stdout);
  1928. return;
  1929. }
  1930. }
  1931. }
  1932. keepset_cnt = delset_cnt+1; /* otherwise, let there be 1 more sets of kept items then of deleted items */
  1933. /* This is an aesthetic, choice.. there could be an equal number */
  1934. if(( k = (int)ceil((double)keptitems/(double)keepset_cnt)) > gap) {
  1935. gap = k + 1; /* if min-size of largest kept group is > gap, can't use gap value */
  1936. fprintf(stdout,"ERROR: Intergap distance incompatible with other demands. Adjusting to %d.\n",gap);
  1937. fflush(stdout);
  1938. }
  1939. if(((box = (int *)malloc(keepset_cnt * sizeof(int)))==NULL)
  1940. || ((boxcnt = (int *)malloc(keepset_cnt * sizeof(int)))==NULL)
  1941. || ((box_assocd_with_cntr_no = (int *)malloc(keepset_cnt * sizeof(int)))==NULL)
  1942. || ((cntr_assocd_with_box_no = (int *)malloc(keepset_cnt * sizeof(int)))==NULL)) {
  1943. fprintf(stdout,"ERROR: Out of memory.\n");
  1944. fflush(stdout);
  1945. return;
  1946. }
  1947. for(n=0;n<keepset_cnt;n++) { /* regard each set of kept items as a box */
  1948. box_assocd_with_cntr_no[n] = n; /* link each ball-counter to each box */
  1949. cntr_assocd_with_box_no[n] = n; /* link each box to each ball-counter */
  1950. box[n] = 1; /* Put 1 ball in each box: every kept set must have at least 1 item */
  1951. boxcnt[n] = 0; /* preset the boxcnts to zero */
  1952. }
  1953. if((remainder = keptitems - keepset_cnt) > 0) { /* if any leftover balls */
  1954. unfilled_boxes = keepset_cnt; /* set number of unfilled boxes */
  1955. for(n=0;n<remainder;n++) { /* for all remaining balls */
  1956. z = (int)floor(drand48() * unfilled_boxes);
  1957. box[z]++; /* distribute each ball to a random box */
  1958. if(box[z] >= gap) { /* if the box getting the ball is now full */
  1959. boxcnt[cntr_assocd_with_box_no[z]] = box[z]; /* store the count of balls in the box */
  1960. unfilled_boxes--; /* reduce number of boxes to put random balls into */
  1961. while(z < unfilled_boxes) {
  1962. box[z] = box[z+1]; /* eliminate full box, by shuffling boxes above downwards */
  1963. k = cntr_assocd_with_box_no[z+1]; /* get the boxcnter associated with the next box */
  1964. box_assocd_with_cntr_no[k]--; /* force it to point to next lower box (as boxes have moved down 1) */
  1965. j = box_assocd_with_cntr_no[k]; /* get the box it now points to */
  1966. cntr_assocd_with_box_no[j] = k; /* get that to point back to the box counter */
  1967. z++;
  1968. }
  1969. }
  1970. }
  1971. }
  1972. for(n=0;n<keepset_cnt;n++) { /* save counts of balls in remaining boxes */
  1973. if(boxcnt[n] <= 0)
  1974. boxcnt[n] = box[box_assocd_with_cntr_no[n]];
  1975. }
  1976. j = 0;
  1977. n = 0;
  1978. if(inverted) {
  1979. while(j < delset_cnt) {
  1980. for(k=0;k<boxcnt[j];k++) { /* skip x items */
  1981. if(++n > cnt) {
  1982. fprintf(stdout,"ERROR: Program anomaly in counting data 4.\n");
  1983. return;
  1984. }
  1985. }
  1986. for(k=0;k<vacuum[j];k++) { /* print y items */
  1987. fprintf(stdout,"INFO: %lf\n",number[n]);
  1988. if(++n > cnt) {
  1989. fprintf(stdout,"ERROR: Program anomaly in counting data 5.\n");
  1990. return;
  1991. }
  1992. } /* Note, all inverted patterns start and end with OFF events - an aesthetic decision */
  1993. j++;
  1994. }
  1995. } else {
  1996. while(j < delset_cnt) {
  1997. for(k=0;k<boxcnt[j];k++) { /* print x items */
  1998. fprintf(stdout,"INFO: %lf\n",number[n]);
  1999. if(++n > cnt) {
  2000. fprintf(stdout,"ERROR: Program anomaly in counting data 1.\n");
  2001. return;
  2002. }
  2003. }
  2004. for(k=0;k<vacuum[j];k++) { /* skip y items */
  2005. if(++n > cnt) {
  2006. fprintf(stdout,"ERROR: Program anomaly in counting data 2.\n");
  2007. return;
  2008. }
  2009. }
  2010. j++;
  2011. }
  2012. for(k=0;k<boxcnt[j];k++) { /* print last x items */
  2013. fprintf(stdout,"INFO: %lf\n",number[n]);
  2014. if(++n > cnt) {
  2015. fprintf(stdout,"ERROR: Program anomaly in counting data 3.\n");
  2016. break;
  2017. } /* Note, all patterns start and end with ON events - an aesthetic decision */
  2018. }
  2019. }
  2020. fflush(stdout);
  2021. }
  2022. /****************************** REPLACE_WITH_RAND ******************************/
  2023. void replace_with_rand(int type) {
  2024. int n;
  2025. double lim = number[cnt], randlo = number[cnt+1], randhi = number[cnt+2];
  2026. double k, randrang, limhi, limlo;
  2027. if(randhi < randlo) {
  2028. k = randhi;
  2029. randhi = randlo;
  2030. randlo = k;
  2031. }
  2032. randrang = randhi - randlo;
  2033. switch(type) {
  2034. case(0): /* equal */
  2035. limhi = lim + FLTERR;
  2036. limlo = lim - FLTERR;
  2037. for(n=0;n<cnt;n++) {
  2038. if((number[n] < limhi) && (number[n] > limlo))
  2039. number[n] = (drand48() * randrang) + randlo;
  2040. fprintf(stdout,"INFO: %lf\n",number[n]);
  2041. }
  2042. break;
  2043. case(-1): /* less */
  2044. for(n=0;n<cnt;n++) {
  2045. if(number[n] < lim)
  2046. number[n] = (drand48() * randrang) + randlo;
  2047. fprintf(stdout,"INFO: %lf\n",number[n]);
  2048. }
  2049. break;
  2050. case(1): /* greater */
  2051. for(n=0;n<cnt;n++) {
  2052. if(number[n] > lim)
  2053. number[n] = (drand48() * randrang) + randlo;
  2054. fprintf(stdout,"INFO: %lf\n",number[n]);
  2055. }
  2056. break;
  2057. }
  2058. fflush(stdout);
  2059. }
  2060. /****************************** RANDQUANTA_IN_GAPS ******************************/
  2061. void randquanta_in_gaps(void)
  2062. {
  2063. int totcnt = round(number[cnt]); /* number of vals to make */
  2064. double q = number[cnt+1]; /* quantisation of grid */
  2065. int mincnt = round(number[cnt+2]), maxcnt = round(number[cnt+3]); /* min & max no of events in each time-interval */
  2066. int k,j,n,m, posibmax = 0, maxqpnts = 0, tot_boxes,minpos,maxpos,remainder,unfilled_boxes;
  2067. int boxpos, orig_boxpos;
  2068. int *perm,*box,*boxcnt,*qpnts,*box_assocd_with_cntr_no,*cntr_assocd_with_box_no;
  2069. double mintim,maxtim;
  2070. double *qbas;
  2071. if(maxcnt < mincnt) { /* orient cnt-range */
  2072. n = maxcnt;
  2073. maxcnt = mincnt;
  2074. mincnt = n;
  2075. }
  2076. if(mincnt < 1) {
  2077. fprintf(stdout,"ERROR: Invalid count of number of items (%d)\n",mincnt);
  2078. fflush(stdout);
  2079. exit(1);
  2080. }
  2081. if(cnt & 1) /* Force even number of pairs */
  2082. cnt--;
  2083. if((tot_boxes = cnt/2) < 1) {
  2084. fprintf(stdout,"Too few value pairs in input column.\n");
  2085. fflush(stdout);
  2086. exit(1);
  2087. }
  2088. if(totcnt < tot_boxes * mincnt) {
  2089. fprintf(stdout,"Insufficient items to distribute amongst the %d pairs.\n",tot_boxes);
  2090. fflush(stdout);
  2091. exit(1);
  2092. }
  2093. if(((box = (int *)malloc(tot_boxes * sizeof(int)))==NULL) /* 'boxes' store random placed 'balls' */
  2094. || ((boxcnt = (int *)malloc(tot_boxes * sizeof(int)))==NULL) /* counts of balls in 'boxes' */
  2095. || ((qpnts = (int *)malloc(tot_boxes * sizeof(int)))==NULL) /* no. of q-points in each time-interval */
  2096. /* = maximum number of balls for each box */
  2097. || ((qbas = (double *)malloc(tot_boxes * sizeof(double)))==NULL) /* first q-point time in each time-interval */
  2098. || ((box_assocd_with_cntr_no = (int *)malloc(tot_boxes * sizeof(int)))==NULL)
  2099. || ((cntr_assocd_with_box_no = (int *)malloc(tot_boxes * sizeof(int)))==NULL)) {
  2100. fprintf(stdout,"Out of memory.\n"); /* because boxes are 'deleted' & shuffled down */
  2101. fflush(stdout);
  2102. exit(1);
  2103. }
  2104. for(n=0, m =0; n < cnt; n += 2,m++) {
  2105. mintim = number[n];
  2106. maxtim = number[n+1];
  2107. minpos = (int)floor(mintim/q);
  2108. if(((double)minpos * q) < mintim)
  2109. minpos++;
  2110. maxpos = (int)floor(maxtim/q);
  2111. qpnts[m] = maxpos - minpos + 1;
  2112. if(qpnts[m] < mincnt) {
  2113. fprintf(stdout,"ERROR: timegap between %lf and %lf will not take %d items\n",number[n],number[n+1],mincnt);
  2114. fflush(stdout);
  2115. exit(1);
  2116. }
  2117. if(m == 0) maxqpnts = qpnts[0];
  2118. else maxqpnts = max(maxqpnts,qpnts[m]);
  2119. qbas[m] = minpos * q;
  2120. posibmax += min(qpnts[m],maxcnt);
  2121. }
  2122. if(posibmax < totcnt) {
  2123. fprintf(stdout, "ERROR: total count of items exceeds available spaces.\n");
  2124. fflush(stdout);
  2125. exit(1);
  2126. }
  2127. if((perm = (int *)malloc(maxqpnts * sizeof(int)))==NULL) {
  2128. fprintf(stdout,"Out of memory.\n");
  2129. fflush(stdout);
  2130. exit(1);
  2131. }
  2132. remainder = totcnt;
  2133. /* DISTRIBUTE THE REMAINING ITEMS AT RANDOM (with constraints) BETWEEN THE boxcnt BOXES */
  2134. for(n=0;n<tot_boxes;n++) { /* regard each set of kept items as a box */
  2135. box_assocd_with_cntr_no[n] = n; /* link each ball-counter to each box */
  2136. cntr_assocd_with_box_no[n] = n; /* link each box to each ball-counter */
  2137. box[n] = mincnt; /* Put min no of balls in each box */
  2138. remainder -= mincnt;
  2139. boxcnt[n] = 0; /* preset the boxcnts to zero */
  2140. }
  2141. if(remainder > 0) { /* if any leftover balls */
  2142. /* ELIMINATE ANY BOXES WHICH ARE ALREADY FULL */
  2143. unfilled_boxes = tot_boxes; /* set number of unfilled boxes as total no of boxes */
  2144. boxpos = 0;
  2145. for(n=0,m=0;n<tot_boxes;n++) { /* for all boxes */
  2146. if(box[boxpos] >= qpnts[n]) { /* if the box is already full */
  2147. boxcnt[n] = box[boxpos]; /* store the count of balls that are in the box */
  2148. unfilled_boxes--; /* reduce number of boxes to put random balls into */
  2149. orig_boxpos = boxpos; /* save the position of the full-box which is being eliminated */
  2150. while(boxpos < unfilled_boxes) {
  2151. box[boxpos] = box[boxpos+1]; /* eliminate full box, by shuffling boxes above downwards */
  2152. k = cntr_assocd_with_box_no[boxpos+1]; /* get the boxcnter associated with the next box */
  2153. box_assocd_with_cntr_no[k]--; /* force it to point to next lower box (as boxes have moved down 1) */
  2154. j = box_assocd_with_cntr_no[k]; /* get the box it now points to */
  2155. cntr_assocd_with_box_no[j] = k; /* get that to point back to the box counter */
  2156. boxpos++;
  2157. }
  2158. boxpos = orig_boxpos; /* reset box position to where it was: now points to new box */
  2159. } else {
  2160. boxpos++; /* if box getting ball is NOT full, go on to next box */
  2161. }
  2162. }
  2163. /* DISTRIBUTE REMAINING BALLS */
  2164. for(n=0;n<remainder;n++) { /* for all remaining balls */
  2165. boxpos = (int)floor(drand48() * unfilled_boxes);
  2166. box[boxpos]++; /* distribute each ball to a random box */
  2167. k = cntr_assocd_with_box_no[boxpos];
  2168. if(box[boxpos] >= qpnts[k]) { /* if the box getting the ball is now full */
  2169. boxcnt[k] = box[boxpos]; /* store the count of balls that are in the box */
  2170. unfilled_boxes--; /* reduce number of boxes to put random balls into */
  2171. while(boxpos < unfilled_boxes) {
  2172. box[boxpos] = box[boxpos+1]; /* eliminate full box, by shuffling boxes above downwards */
  2173. k = cntr_assocd_with_box_no[boxpos+1]; /* get the boxcnter associated with the next box */
  2174. box_assocd_with_cntr_no[k]--; /* force it to point to next lower box (as boxes have moved down 1) */
  2175. j = box_assocd_with_cntr_no[k]; /* get the box it now points to */
  2176. cntr_assocd_with_box_no[j] = k; /* get that to point back to the box counter */
  2177. boxpos++;
  2178. }
  2179. }
  2180. }
  2181. }
  2182. for(n=0;n<tot_boxes;n++) { /* save counts of balls in remaining boxes */
  2183. if(boxcnt[n] <= 0)
  2184. boxcnt[n] = box[box_assocd_with_cntr_no[n]];
  2185. }
  2186. /* DISTRIBUTE THE VALS AT RANDOM WITHIN THE BOXES */
  2187. for(n=0;n<tot_boxes;n++) {
  2188. randperm(perm,qpnts[n]); /* permute the current group of quantisation cells */
  2189. ascending_sort_cells(perm,boxcnt[n]); /* sort the first 'boxcnt' of the perm, into ascending order */
  2190. for(m=0;m<boxcnt[n];m++) /* for each random value, multiply it by quantisation val */
  2191. fprintf(stdout,"INFO: %lf\n",qbas[n] + (perm[m] * q));
  2192. } /* & add to to 1st quantised position in current time-interval */
  2193. fflush(stdout);
  2194. }
  2195. /****************************** INVERT_NORMD_ENV ******************************/
  2196. void invert_normd_env(void)
  2197. {
  2198. invertenv(1.0);
  2199. }
  2200. /****************************** INVERT_AROUND_PIVOT ******************************/
  2201. void invert_around_pivot(void)
  2202. {
  2203. invertenv(number[cnt] * 2.0);
  2204. }
  2205. /****************************** INVERT_OVER_RANGE ******************************/
  2206. void invert_over_range(void)
  2207. {
  2208. invertenv(number[cnt] + number[cnt+1]);
  2209. }
  2210. /****************************** ENV_SUPERIMPOS ******************************/
  2211. void env_superimpos(int inverse,int typ) /* PRODUCT SHOULD INVOLVE LOGS !! */
  2212. {
  2213. double *out, *no1, *no2, tdiff, tratio, vdiff, vhere;
  2214. int n, m, j, cnt2, skipped;
  2215. double thisnval, thismval, lastnval, lastmval, time = 0.0, lastval = 0.0;
  2216. if((out = (double *)malloc((cnt * 2) * sizeof(double)))==NULL) {
  2217. fprintf(stdout,"ERROR: Out of memory.\n");
  2218. fflush(stdout);
  2219. exit(1);
  2220. }
  2221. if(factor != 0.0) { /* if inserted after time zero, move it to start time */
  2222. for(n=firstcnt;n<cnt;n+=2)
  2223. number[n] += factor;
  2224. }
  2225. if(inverse) { /* If working with inverse of env, invert it */
  2226. for(n=firstcnt+1;n<cnt;n+=2)
  2227. number[n] = 1.0 - number[n];
  2228. }
  2229. if(number[firstcnt] < number[0]) {
  2230. no1 = &(number[firstcnt]); /* If inserted env starts BEFORE orig env, 'invert' process */
  2231. no2 = number;
  2232. cnt = cnt - firstcnt; /* establish independent counters for each infile */
  2233. cnt2 = firstcnt;
  2234. } else {
  2235. no1 = number;
  2236. no2 = &(number[firstcnt]);
  2237. cnt2 = cnt - firstcnt; /* establish independent counters for each infile */
  2238. cnt = firstcnt;
  2239. }
  2240. n = 0;
  2241. m = 0;
  2242. j = 0;
  2243. thisnval = 0.0;
  2244. thismval = 0.0;
  2245. while(no1[n] < no2[0]) {
  2246. out[j++] = no1[n++];
  2247. thisnval = no1[n];
  2248. thismval = no2[1];
  2249. switch(typ) {
  2250. case(MULT): out[j++] = no1[n++] * no2[1]; break;
  2251. case(ADD): out[j++] = no1[n++] + no2[1]; break;
  2252. case(SUBTRACT): out[j++] = no1[n++] - no2[1]; break;
  2253. case(ENVMAX):
  2254. out[j++] = max(no1[n],no2[1]);
  2255. n++;
  2256. break;
  2257. }
  2258. if(n >= cnt)
  2259. break;
  2260. }
  2261. while(n < cnt) {
  2262. if(no1[n] == no2[m]) { /* brkpnts coincide */
  2263. out[j++] = no1[n++];
  2264. m++; /* new brkpnt val is product of origs */
  2265. lastnval = thisnval;
  2266. lastmval = thismval;
  2267. thisnval = no1[n];
  2268. thismval = no2[m];
  2269. switch(typ) {
  2270. case(MULT): out[j++] = no1[n++] * no2[m++]; break;
  2271. case(ADD): out[j++] = no1[n++] + no2[m++]; break;
  2272. case(SUBTRACT): out[j++] = no1[n++] - no2[m++]; break;
  2273. case(ENVMAX):
  2274. out[j++] = max(no1[n],no2[m]);
  2275. n++;
  2276. m++;
  2277. break;
  2278. }
  2279. if(m >= cnt2) /* If at end of inserted env, break from loop */
  2280. break;
  2281. } else if(no1[n] > no2[m]) { /* inserted brkpnt falls before next orig-brkpnt */
  2282. while(no1[n] > no2[m]) {
  2283. time = no2[m]; /* take time from inserted brkpnt */
  2284. tdiff = no1[n] - no1[n-2];
  2285. tratio = (no2[m++] - no1[n-2])/tdiff;
  2286. n++;
  2287. vdiff = no1[n] - no1[n-2];
  2288. vhere = (vdiff * tratio) + no1[n-2]; /* value of orig brkpnt, at this time */
  2289. lastnval = thisnval;
  2290. lastmval = thismval;
  2291. thisnval = vhere;
  2292. thismval = no2[m];
  2293. docross(lastnval,lastmval,thisnval,thismval,time,&j,out,typ);
  2294. out[j++] = time;
  2295. switch(typ) {
  2296. case(MULT): out[j++] = vhere * no2[m++]; break;
  2297. case(ADD): out[j++] = vhere + no2[m++]; break;
  2298. case(SUBTRACT): out[j++] = vhere - no2[m++]; break;
  2299. case(ENVMAX):
  2300. out[j++] = max(vhere,no2[m]);
  2301. m++;
  2302. break;
  2303. }
  2304. n--; /* remain at same point in orig-brkfile */
  2305. if(m >= cnt2)
  2306. break; /* If at end of inserted env, break from loop */
  2307. }
  2308. } else { /* orig-brkpnt falls before next inserted brkpnt */
  2309. while(no2[m] > no1[n]) {
  2310. time = no1[n]; /* take time from orig brkpnt */
  2311. tdiff = no2[m] - no2[m-2];
  2312. tratio = (no1[n++] - no2[m-2])/tdiff;
  2313. m++;
  2314. vdiff = no2[m] - no2[m-2];
  2315. vhere = (vdiff * tratio) + no2[m-2]; /* value of inserted brkpnt, at this time */
  2316. lastnval = thisnval;
  2317. lastmval = thismval;
  2318. thismval = vhere;
  2319. thisnval = no1[n];
  2320. docross(lastnval,lastmval,thisnval,thismval,time,&j,out,typ);
  2321. out[j++] = time;
  2322. switch(typ) {
  2323. case(MULT): out[j++] = vhere * no1[n++]; break;
  2324. case(ADD): out[j++] = vhere + no1[n++]; break;
  2325. case(SUBTRACT): out[j++] = vhere - no1[n++]; break;
  2326. case(ENVMAX):
  2327. out[j++] = max(vhere,no1[n]);
  2328. n++;
  2329. break;
  2330. }
  2331. m--; /* remain at same point in inserted-brkfile */
  2332. if(n >= cnt) { /* if it at end of orig file */
  2333. while(m < cnt2) { /* calc remaining inserted file points */
  2334. out[j++] = no2[m++];
  2335. switch(typ) {
  2336. case(MULT): out[j++] = no2[m++] * no1[cnt-1]; break;
  2337. case(ADD): out[j++] = no2[m++] + no1[cnt-1]; break;
  2338. case(SUBTRACT): out[j++] = no2[m++] - no1[cnt-1]; break;
  2339. case(ENVMAX):
  2340. out[j++] = max(no2[m],no1[cnt-1]);
  2341. m++;
  2342. break;
  2343. }
  2344. }
  2345. break; /* and break from loop */
  2346. }
  2347. }
  2348. }
  2349. if(m >= cnt2)
  2350. break; /* If at end of inserted env, break from outer loop */
  2351. }
  2352. /* on leaving loop either m > cnt2 or n > cnt */
  2353. while (n < cnt) { /* if orig brkfile extends beyond inserted file */
  2354. out[j++] = no1[n++]; /* calculate remaining points */
  2355. switch(typ) {
  2356. case(MULT): out[j++] = no1[n++] * no2[cnt2 - 1]; break;
  2357. case(ADD): out[j++] = no1[n++] + no2[cnt2 - 1]; break;
  2358. case(SUBTRACT): out[j++] = no1[n++] - no2[cnt2 - 1]; break;
  2359. case(ENVMAX):
  2360. out[j++] = max(no1[n],no2[cnt2 - 1]);
  2361. n++;
  2362. break;
  2363. }
  2364. }
  2365. while (m < cnt2) { /* if inserted brkfile extends beyond orig file */
  2366. out[j++] = no2[m++]; /* calculate remaining points */
  2367. switch(typ) {
  2368. case(MULT): out[j++] = no2[m++] * no1[cnt - 1]; break;
  2369. case(ADD): out[j++] = no2[m++] + no1[cnt - 1]; break;
  2370. case(SUBTRACT): out[j++] = no2[m++] - no1[cnt - 1]; break;
  2371. case(ENVMAX):
  2372. out[j++] = max(no2[m],no1[cnt - 1]);
  2373. m++;
  2374. break;
  2375. }
  2376. }
  2377. fprintf(stdout,"INFO: %lf %lf\n",out[0],out[1]);
  2378. skipped = 0;
  2379. for(n=2;n<j-2;n += 2) {
  2380. if(!flteq(out[n-1],out[n+1])) { /* elementary datareduce */
  2381. if(skipped)
  2382. fprintf(stdout,"INFO: %lf %lf\n",time,lastval);
  2383. fprintf(stdout,"INFO: %lf %lf\n",out[n],out[n+1]);
  2384. skipped = 0;
  2385. } else {
  2386. skipped = 1;
  2387. time = out[n];
  2388. lastval = out[n+1];
  2389. }
  2390. }
  2391. fprintf(stdout,"INFO: %lf %lf\n",out[n],out[n+1]);
  2392. fflush(stdout);
  2393. }
  2394. /****************************** DOCROSS ******************************/
  2395. void docross(double lastnval,double lastmval,double thisnval, double thismval,double time,int *j,double *out,int typ)
  2396. {
  2397. int prehi = 0, posthi = 0;
  2398. double lasttime, timediff, timecross, valcross, gradn, gradm;
  2399. if(lastnval > lastmval)
  2400. prehi = 1;
  2401. else if(lastnval < lastmval)
  2402. prehi = -1;
  2403. if(thisnval > thismval)
  2404. posthi = 1;
  2405. else if(thisnval < thismval)
  2406. posthi = -1;
  2407. if(prehi && posthi && (prehi != posthi)) { /* curves intersect */
  2408. lasttime = out[*(j)-2];
  2409. timediff = time - lasttime;
  2410. if(flteq(timediff,0.0)) {
  2411. fprintf(stdout,"ERROR: Came across time step too small to calculate.\n");
  2412. fflush(stdout);
  2413. exit(1);
  2414. }
  2415. gradn = (thisnval - lastnval)/timediff;
  2416. gradm = (thismval - lastmval)/timediff;
  2417. if(flteq(gradn,gradm)) {
  2418. fprintf(stdout,"ERROR: possible error in curve crossing algorithm.\n");
  2419. fflush(stdout);
  2420. exit(1);
  2421. }
  2422. timecross = (lastmval - lastnval)/(gradn - gradm);
  2423. valcross = (gradn * timecross) + lastnval;
  2424. out[(*j)++] = timecross + lasttime;
  2425. switch(typ) {
  2426. case(MULT): out[(*j)++] = (valcross * valcross); break;
  2427. case(ADD): out[(*j)++] = (valcross + valcross); break;
  2428. case(SUBTRACT): out[(*j)++] = 0.0; break;
  2429. case(ENVMAX): out[(*j)++] = valcross; break;
  2430. }
  2431. }
  2432. }
  2433. /****************************** ENV_DEL_INV ******************************/
  2434. void env_del_inv(void)
  2435. {
  2436. int n, m;
  2437. cnt += 2;
  2438. if((number = (double *)realloc((char *)number,cnt * sizeof(double)))==NULL) {
  2439. fprintf(stdout,"ERROR: Out of memory.\n");
  2440. fflush(stdout);
  2441. exit(1);
  2442. }
  2443. m = cnt - 1;
  2444. n = cnt - 3;
  2445. while(n > 0) {
  2446. number[m--] = 1.0 - number[n--]; /* inverse */
  2447. number[m--] = number[n--] + factor; /* delay */
  2448. }
  2449. number[1] = number[3]; /* extend initial val.. */
  2450. number[0] = 0.0; /* ...back to zero time */
  2451. for(n=0;n<cnt;n+=2)
  2452. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  2453. fflush(stdout);
  2454. }
  2455. /****************************** ENV_DEL_INV ******************************/
  2456. void env_plateau(void)
  2457. {
  2458. double plateau;
  2459. int n;
  2460. n = ifactor;
  2461. n--; /* get true line number */
  2462. n *= 2; /* get brkpnt pair */
  2463. n++; /* get val in brkpnt pair */
  2464. plateau = number[n]; /* get plateau val */
  2465. n -= 2;
  2466. number[n] = plateau; /* put plateau val in previous val*/
  2467. n--;
  2468. number[n] = 0.0; /* set time here to zero */
  2469. while(n < cnt) {
  2470. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  2471. n += 2;
  2472. }
  2473. fflush(stdout);
  2474. }
  2475. /****************************** TIME_FROM_BEAT_POSITION ******************************/
  2476. void time_from_beat_position(int has_offset)
  2477. {
  2478. int n;
  2479. double k;
  2480. if(factor <= FLTERR) {
  2481. fprintf(stdout,"ERROR: Beat duration is less than or equal to zero.\n");
  2482. fflush(stdout);
  2483. exit(1);
  2484. }
  2485. if(has_offset && !condit) {
  2486. fprintf(stdout,"ERROR: No time offset given.\n");
  2487. fflush(stdout);
  2488. exit(1);
  2489. }
  2490. for(n=0;n< cnt;n++) {
  2491. if((k = number[n] - 1.0) < 0.0) {
  2492. fprintf(stdout,"ERROR: Position of beat %d is less than 1. Impossible.\n",n+1);
  2493. fflush(stdout);
  2494. exit(1);
  2495. }
  2496. number[n] = k * factor;
  2497. if(has_offset)
  2498. number[n] += thresh;
  2499. }
  2500. for(n=0;n< cnt;n++)
  2501. fprintf(stdout,"INFO: %lf\n",number[n]);
  2502. fflush(stdout);
  2503. }
  2504. /****************************** INSERT_AFTER_VAL ******************************/
  2505. void insert_after_val(void)
  2506. {
  2507. int n, m, has_started = 0;
  2508. for(n=0;n<cnt;n++) {
  2509. if (!has_started) {
  2510. if(number[n] == number[cnt]) {
  2511. for(m=0;m <= n; m++)
  2512. fprintf(stdout,"INFO: %lf\n",number[m]);
  2513. fprintf(stdout,"INFO: %lf\n",number[cnt+1]);
  2514. has_started = 1;
  2515. }
  2516. } else {
  2517. fprintf(stdout,"INFO: %lf\n",number[n]);
  2518. }
  2519. }
  2520. if(!has_started) {
  2521. fprintf(stdout,"ERROR: Value %lf not found in the table.\n",number[cnt]);
  2522. fflush(stdout);
  2523. exit(1);
  2524. }
  2525. fflush(stdout);
  2526. }
  2527. /****************************** MIN_INTERVAL ******************************/
  2528. void min_interval(int ismax) {
  2529. int n, ipos;
  2530. double min_int, max_int, this_int;
  2531. if(cnt < 2) {
  2532. fprintf(stdout,"ERROR: Too few values to run this process.\n");
  2533. fflush(stdout);
  2534. exit(1);
  2535. }
  2536. ipos = 1;
  2537. if (ismax) {
  2538. max_int = number[1] - number[0];
  2539. for(n=2;n<cnt;n++) {
  2540. if((this_int = number[n] - number[n-1]) > max_int) {
  2541. max_int = this_int;
  2542. ipos = n;
  2543. }
  2544. }
  2545. fprintf(stdout,"WARNING: Maximum interval is %lf between entries %d and %d.\n",max_int,ipos,ipos+1);
  2546. fflush(stdout);
  2547. } else {
  2548. min_int = number[1] - number[0];
  2549. for(n=2;n<cnt;n++) {
  2550. if((this_int = number[n] - number[n-1]) < min_int) {
  2551. min_int = this_int;
  2552. ipos = n;
  2553. }
  2554. }
  2555. fprintf(stdout,"WARNING: Minimum interval is %lf between entries %d and %d.\n",min_int,ipos,ipos+1);
  2556. fflush(stdout);
  2557. }
  2558. }
  2559. /****************************** INSERT_IN_ORDER ******************************/
  2560. void insert_in_order(void) {
  2561. int n, ipos = -1;
  2562. for(n=0;n<cnt-1;n++) {
  2563. if(number[n+1] <= number[n]) {
  2564. fprintf(stdout,"ERROR: column not in ascending order.\n");
  2565. fflush(stdout);
  2566. exit(1);
  2567. }
  2568. if ((ipos < 0) && (number[cnt] <= number[n])) { /* position not found & new number goes here */
  2569. ipos = n;
  2570. }
  2571. }
  2572. if ((ipos < 0) && (number[cnt] <= number[n])) { /* position not found & new number goes here */
  2573. ipos = n;
  2574. }
  2575. if(ipos < 0) /* new number larger than all in column, goes at end */
  2576. ipos = cnt;
  2577. if(ipos > 0) { /* if new number not at start of column */
  2578. for(n=0;n<ipos;n++)
  2579. fprintf(stdout,"INFO: %lf\n",number[n]);
  2580. } /* insert new number */
  2581. fprintf(stdout,"INFO: %lf\n",number[cnt]);
  2582. if(ipos < cnt) { /* if new mumber not at end of column */
  2583. for(n=ipos;n<cnt;n++)
  2584. fprintf(stdout,"INFO: %lf\n",number[n]);
  2585. }
  2586. fflush(stdout);
  2587. }
  2588. /****************************** INSERT_AT_START ******************************/
  2589. void insert_at_start(void) {
  2590. int n;
  2591. fprintf(stdout,"INFO: %lf\n",number[cnt]);
  2592. for(n=0;n<cnt;n++)
  2593. fprintf(stdout,"INFO: %lf\n",number[n]);
  2594. fflush(stdout);
  2595. }
  2596. /****************************** INSERT_AT_END ******************************/
  2597. void insert_at_end(void) {
  2598. int n;
  2599. for(n=0;n<=cnt;n++)
  2600. fprintf(stdout,"INFO: %lf\n",number[n]);
  2601. fflush(stdout);
  2602. }
  2603. /****************************** FORMAT_STRS ****************************/
  2604. void format_strs(void)
  2605. {
  2606. int n, m, OK = 1;
  2607. double d = (double)stringscnt/(double)ifactor;
  2608. int rowcnt = stringscnt/ifactor;
  2609. char ctemp[64];
  2610. errstr[0] = ENDOFSTR;
  2611. if(d > (double)rowcnt)
  2612. rowcnt++;
  2613. for(n=0;n<stringscnt;n+=rowcnt) {
  2614. for(m=0;m<rowcnt;m++) {
  2615. if(n!=0 && m==0) {
  2616. fprintf(stdout,"INFO: %s\n",errstr);
  2617. errstr[0] = ENDOFSTR;
  2618. }
  2619. if(n+m < stringscnt) {
  2620. sprintf(ctemp,"%s ",strings[n+m]);
  2621. strcat(errstr,ctemp);
  2622. } else
  2623. OK = 0;
  2624. }
  2625. if(!OK)
  2626. break;
  2627. }
  2628. fprintf(stdout,"INFO: %s\n",errstr);
  2629. fflush(stdout);
  2630. }
  2631. /****************************** COLUMN_FORMAT_STRS ****************************/
  2632. void column_format_strs(void)
  2633. { int n, m;
  2634. double d = (double)stringscnt/(double)ifactor;
  2635. int rowcnt = stringscnt/ifactor;
  2636. char ctemp[64];
  2637. errstr[0] = ENDOFSTR;
  2638. if(d > (double)rowcnt)
  2639. rowcnt++;
  2640. for(n=0;n<rowcnt;n++) {
  2641. for(m=n;m<stringscnt;m+=rowcnt) {
  2642. sprintf(ctemp,"%s ",strings[m]);
  2643. strcat(errstr,ctemp);
  2644. }
  2645. fprintf(stdout,"INFO: %s\n",errstr);
  2646. errstr[0] = ENDOFSTR;
  2647. }
  2648. fflush(stdout);
  2649. }
  2650. /****************************** RANDOM_INTEGERS ****************************/
  2651. void random_integers(void)
  2652. {
  2653. int n, i, j = round(number[1]);
  2654. int range = abs(j - 1) + 1;
  2655. int rangbot = (int)min(j,1);
  2656. ifactor = round(number[0]);
  2657. for(n=0;n<ifactor;n++) {
  2658. i = (int)floor(drand48() * range) + rangbot;
  2659. fprintf(stdout,"INFO: %d\n",i);
  2660. }
  2661. fflush(stdout);
  2662. }
  2663. /****************************** RANDOM_INTEGERS_EVENLY_SPREAD ****************************/
  2664. void random_integers_evenly_spread(void)
  2665. {
  2666. int z, n, m, i, k, j, repets;
  2667. int range, rangbot, arrsiz, endcnt, endval, allowed, checkpart;
  2668. int *arr, *arr2, *perm;
  2669. repets = round(number[2]);
  2670. j = round(number[1]);
  2671. range = abs(j - 1) + 1;
  2672. rangbot = (int)min(j,1);
  2673. arrsiz = range * repets;
  2674. ifactor = round(number[0]);
  2675. if((arr = (int *)malloc(arrsiz * sizeof(int)))==NULL) {
  2676. fprintf(stdout,"ERROR: Out of memory.\n");
  2677. fflush(stdout);
  2678. exit(1);
  2679. }
  2680. if((perm = (int *)malloc(arrsiz * sizeof(int)))==NULL) {
  2681. fprintf(stdout,"ERROR: Out of memory.\n");
  2682. fflush(stdout);
  2683. exit(1);
  2684. }
  2685. if((arr2 = (int *)malloc(repets * sizeof(int)))==NULL) {
  2686. fprintf(stdout,"ERROR: Out of memory.\n");
  2687. fflush(stdout);
  2688. exit(1);
  2689. }
  2690. n = 0;
  2691. for(j=0;j<repets;j++) { /* fill array with REPET copies of values */
  2692. z = rangbot;
  2693. for(i=0;i<range;i++)
  2694. arr[n++] = z++;
  2695. }
  2696. endcnt = 0; /* number of items repeated at end of previous perm */
  2697. endval = 1; /* value (possibly repeated) at end of previous perm */
  2698. allowed = -1; /* number of permissible repetitions of this val at start of NEW perm */
  2699. checkpart = arrsiz - repets; /* items at end of array to test for repetitions */
  2700. n = 0;
  2701. while(n < ifactor) {
  2702. do_repet_restricted_perm(arr,perm,arrsiz,allowed,endval);
  2703. j = 0;
  2704. for(m = 0;m <arrsiz;m++,n++) {
  2705. if(n >= ifactor)
  2706. break;
  2707. k = arr[perm[m]];
  2708. fprintf(stdout,"INFO: %d\n",k);
  2709. if(m >= checkpart) /* save last checkable stretch of perm */
  2710. arr2[j++] = k;
  2711. }
  2712. fflush(stdout);
  2713. if(n >= ifactor)
  2714. break;
  2715. j--;
  2716. endval = arr2[j--]; /* note the val at end of perm */
  2717. endcnt = 1; /* and count it */
  2718. for(k = j; k>= 0; k--) {
  2719. if(arr2[k] == endval) /* check adjacent vals, for repetition of value: count */
  2720. endcnt++;
  2721. else /* if no more repetitions, finish counting */
  2722. break;
  2723. }
  2724. allowed = repets - endcnt; /* get number of permissible repets at start of next perm */
  2725. }
  2726. }
  2727. /****************************** DO_REPET_RESTRICTED_PERM ****************************/
  2728. void do_repet_restricted_perm(int *arr, int *perm, int arrsiz, int allowed, int endval)
  2729. {
  2730. int n, t;
  2731. int checklen = allowed + 1;
  2732. int done = 0;
  2733. while(!done) {
  2734. for(n=0;n<arrsiz;n++) {
  2735. t = (int)(drand48() * (double)(n+1)); /* TRUNCATE */
  2736. if(t==n)
  2737. hhprefix(n,arrsiz,perm);
  2738. else
  2739. hhinsert(n,t,arrsiz,perm);
  2740. }
  2741. if(checklen <= 0)
  2742. break;
  2743. for(n=0;n<checklen;n++) {
  2744. if(arr[perm[n]] == endval) { /* if this is val (repeated) at end of last perm */
  2745. if(allowed == 0) /* if repetition not allowed, force a new perm val */
  2746. break;
  2747. else /* else, repetitions still allowed */
  2748. allowed--; /* decrement number of permissible further repets */
  2749. } else {
  2750. done = 1; /* if this is not val at end of last perm */
  2751. break; /* perm is OK */
  2752. }
  2753. }
  2754. }
  2755. }
  2756. /***************************** HHINSERT **********************************
  2757. *
  2758. * Insert the value m AFTER the T-th element in perm[].
  2759. */
  2760. void hhinsert(int m,int t,int setlen,int *perm)
  2761. {
  2762. hhshuflup(t+1,setlen,perm);
  2763. perm[t+1] = m;
  2764. }
  2765. /***************************** HHPREFIX ************************************
  2766. *
  2767. * Insert the value m at start of the permutation perm[].
  2768. */
  2769. void hhprefix(int m,int setlen,int *perm)
  2770. {
  2771. hhshuflup(0,setlen,perm);
  2772. perm[0] = m;
  2773. }
  2774. /****************************** HHSHUFLUP ***********************************
  2775. *
  2776. * move set members in perm[] upwards, starting from element k.
  2777. */
  2778. void hhshuflup(int k,int setlen,int *perm)
  2779. {
  2780. int n, *i;
  2781. int z = setlen - 1;
  2782. i = (perm+z);
  2783. for(n = z;n > k;n--) {
  2784. *i = *(i-1);
  2785. i--;
  2786. }
  2787. }
  2788. /****************************** TIME_FROM_BAR_BEAT_METRE_TEMPO ***********************************/
  2789. void time_from_bar_beat_metre_tempo(int has_offset)
  2790. {
  2791. int barlen, beatsize, n;
  2792. double tempo,beat,beatdur,time, offset = 0.0;
  2793. if((tempo = get_tempo(strings[cnt+1])) <= 0.0)
  2794. exit(1);
  2795. if(has_offset)
  2796. get_offset(strings[cnt+2],&offset);
  2797. get_metre(strings[cnt],&barlen,&beatsize);
  2798. beatdur = (60.0/(double)tempo) * (4.0/(double)beatsize);
  2799. for(n=0;n<cnt;n++) {
  2800. beat = get_beat(n,barlen);
  2801. time = beat * beatdur;
  2802. time += offset;
  2803. fprintf(stdout,"INFO: %lf\n",time);
  2804. }
  2805. fflush(stdout);
  2806. }
  2807. /****************************** GET_METRE ***********************************/
  2808. void get_metre(char str[],int *barlen,int *beatsize)
  2809. {
  2810. int pointcnt = 0, isvalid = 0, mask;
  2811. char *q, *start, *p = str;
  2812. start = p;
  2813. q = start;
  2814. p += strlen(p);
  2815. /* strip trailing zeros */
  2816. if(p == start) {
  2817. fprintf(stdout, "ERROR: Invalid metre value. (No data).\n");
  2818. fflush(stdout);
  2819. exit(1);
  2820. }
  2821. p--;
  2822. while(*p == '0') {
  2823. *p = ENDOFSTR;
  2824. if(p == start)
  2825. break;
  2826. p--;
  2827. }
  2828. p = start;
  2829. while(*p != ENDOFSTR) {
  2830. if(*p == '.') {
  2831. pointcnt++;
  2832. q = p;
  2833. } else if (!isdigit(*p)) {
  2834. fprintf(stdout, "ERROR: Invalid metre value. non_digit = '%c' in numerator.\n",*p);
  2835. fflush(stdout);
  2836. exit(1);
  2837. }
  2838. p++;
  2839. }
  2840. if(q == start) {
  2841. fprintf(stdout, "ERROR: Invalid metre value. No numerator.\n");
  2842. fflush(stdout);
  2843. exit(1);
  2844. }
  2845. if (pointcnt!=1) {
  2846. if(pointcnt > 1)
  2847. fprintf(stdout, "ERROR: Invalid metre value. %d decimal points : must be one only.\n",pointcnt);
  2848. else
  2849. fprintf(stdout, "ERROR: Invalid metre value. No decimal point\n");
  2850. fflush(stdout);
  2851. exit(1);
  2852. }
  2853. *q = ENDOFSTR;
  2854. if(sscanf(start,"%d",barlen)<1) { /* SAFETY (redundant) */
  2855. fprintf(stdout, "ERROR: Invalid metre value. Cannot read barlength.\n");
  2856. fflush(stdout);
  2857. exit(1);
  2858. }
  2859. p = q+1;
  2860. if(*p==ENDOFSTR) {
  2861. fprintf(stdout, "ERROR: Invalid metre value. (No denominator).\n");
  2862. fflush(stdout);
  2863. exit(1);
  2864. }
  2865. start = p;
  2866. if(*p == '0') {
  2867. fprintf(stdout, "ERROR: Invalid metre value. (leading zeros in denominator).\n"); /* leading zero(s) */
  2868. fflush(stdout);
  2869. exit(1);
  2870. }
  2871. while(*p != ENDOFSTR) {
  2872. if(!isdigit(*p)) { /* non-numeric characters */
  2873. fprintf(stdout, "ERROR: Invalid metre value. (non-digit character '%c' in denominator )\n",*p);
  2874. fflush(stdout);
  2875. exit(1);
  2876. }
  2877. p++;
  2878. }
  2879. if(sscanf(start,"%d",beatsize)<1) { /* SAFETY (redundant) */
  2880. fprintf(stdout, "ERROR: Invalid metre value. Failed to read beatsize from %s\n",start);
  2881. fflush(stdout);
  2882. exit(1);
  2883. }
  2884. mask = 1;
  2885. while(mask < 512) { /* Powers of 2 only !! Need special dispensation for Ferneyhovian metres like 4:10 */
  2886. if((*beatsize) == mask) {
  2887. isvalid = 1;
  2888. break;
  2889. }
  2890. mask <<= 1;
  2891. }
  2892. if(!isvalid) {
  2893. fprintf(stdout, "ERROR: Invalid metre value. beatsize (%d) is invalid in standard usage\n",*beatsize);
  2894. fflush(stdout);
  2895. exit(1);
  2896. }
  2897. }
  2898. /****************************** GET_BEAT ***********************************/
  2899. double get_beat(int n,int barlen)
  2900. {
  2901. int pointcnt = 0;
  2902. char *q = NULL, *p, *start;
  2903. int bar;
  2904. double beat;
  2905. if(strlen(strings[n]) == 0) {
  2906. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. (No value found)\n",n+1);
  2907. fflush(stdout);
  2908. exit(1);
  2909. }
  2910. p = strings[n];
  2911. /* must have COLON */
  2912. while(*p != ENDOFSTR) {
  2913. if(*p == ':') {
  2914. pointcnt++;
  2915. q = p;
  2916. } else if (!isdigit(*p) && (*p != '.')) {
  2917. pointcnt = -1;
  2918. break;
  2919. }
  2920. p++;
  2921. }
  2922. if(pointcnt != 1) {
  2923. switch(pointcnt) {
  2924. case(-1):
  2925. fprintf(stdout, "ERROR: Invalid character (%c) in bar:beat value '%s' in item %d\n",*p,strings[n],n+1);
  2926. break;
  2927. case(0):
  2928. fprintf(stdout, "ERROR: Invalid bar:beat value '%s' at item %d. (No colon found)\n",strings[n],n+1);
  2929. break;
  2930. default:
  2931. fprintf(stdout, "ERROR: Invalid bar:beat value '%s' at item %d : %d colons found (should be only 1)\n",
  2932. strings[n],n+1,pointcnt);
  2933. break;
  2934. }
  2935. fflush(stdout);
  2936. exit(1);
  2937. }
  2938. *q = ENDOFSTR;
  2939. if(sscanf(strings[n],"%d",&bar)<1) { /* SAFETY (redundant) */
  2940. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. Failed to read bar count.\n",n+1);
  2941. fflush(stdout);
  2942. exit(1);
  2943. }
  2944. if(bar < 1) {
  2945. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. Bar count less than 1.\n",n+1);
  2946. fflush(stdout);
  2947. exit(1);
  2948. }
  2949. bar--;
  2950. start = q+1;
  2951. if(*start==ENDOFSTR) {
  2952. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. No beatcount.\n",n+1);
  2953. fflush(stdout);
  2954. exit(1);
  2955. }
  2956. if(sscanf(start,"%lf",&beat)<1) { /* SAFETY (redundant) */
  2957. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. Failed to read beatcount.\n",n+1);
  2958. fflush(stdout);
  2959. exit(1);
  2960. }
  2961. if(beat < 1.0) {
  2962. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. Beat count less than 1.\n",n+1);
  2963. fflush(stdout);
  2964. exit(1);
  2965. } else if(beat >= (double)(barlen + 1)) {
  2966. fprintf(stdout, "ERROR: Invalid bar:beat value at item %d. Beat count beyond bar end.\n",n+1);
  2967. fflush(stdout);
  2968. exit(1);
  2969. }
  2970. beat -= 1.0;
  2971. beat += (bar * (double)barlen);
  2972. return beat;
  2973. }
  2974. /****************************** SCALE_FROM ***********************************/
  2975. void scale_from(void) {
  2976. double interval, pivot = number[cnt];
  2977. double scaler = number[cnt+1];
  2978. int n;
  2979. for(n = 0;n<cnt;n++) {
  2980. interval = number[n] - pivot;
  2981. interval *= scaler;
  2982. fprintf(stdout,"INFO: %lf\n",pivot + interval);
  2983. }
  2984. fflush(stdout);
  2985. }
  2986. /****************************** SCALE_ABOVE ***********************************/
  2987. void scale_above(void) {
  2988. double interval, pivot = number[cnt];
  2989. double scaler = number[cnt+1];
  2990. int n;
  2991. for(n = 0;n<cnt;n++) {
  2992. interval = number[n] - pivot;
  2993. if(interval > 0.0) {
  2994. interval *= scaler;
  2995. fprintf(stdout,"INFO: %lf\n",pivot + interval);
  2996. } else
  2997. fprintf(stdout,"INFO: %lf\n",number[n]);
  2998. }
  2999. fflush(stdout);
  3000. }
  3001. /****************************** SCALE_BELOW ***********************************/
  3002. void scale_below(void) {
  3003. double interval, pivot = number[cnt];
  3004. double scaler = number[cnt+1];
  3005. int n;
  3006. for(n = 0;n<cnt;n++) {
  3007. interval = number[n] - pivot;
  3008. if(interval < 0.0) {
  3009. interval *= scaler;
  3010. fprintf(stdout,"INFO: %lf\n",pivot + interval);
  3011. } else
  3012. fprintf(stdout,"INFO: %lf\n",number[n]);
  3013. }
  3014. fflush(stdout);
  3015. }
  3016. /************************** SPAN_RISE ********************************/
  3017. void span_rise(void) {
  3018. int n;
  3019. if(number[0] < 0.0) {
  3020. fprintf(stdout,"ERROR: This option only works with ascending values greater than or equal to zero.\n");
  3021. fflush(stdout);
  3022. exit(1);
  3023. }
  3024. for(n = 1;n<cnt;n++) {
  3025. if(number[n] - number[n-1] <= thresh) {
  3026. fprintf(stdout,"ERROR: No space for span between number %d (%lf) and number %d (%lf)\n",
  3027. n,number[n-1],n+1,number[n]);
  3028. fflush(stdout);
  3029. exit(1);
  3030. }
  3031. }
  3032. if(number[0] < thresh) {
  3033. fprintf(stdout,"WARNING: First value too close to zero: NO span inserted.\n");
  3034. fflush(stdout);
  3035. } else {
  3036. fprintf(stdout,"INFO: %lf\n",number[0] - thresh);
  3037. }
  3038. fprintf(stdout,"INFO: %lf\n",number[0]);
  3039. for(n = 1;n<cnt;n++) {
  3040. fprintf(stdout,"INFO: %lf\n",number[n] - thresh);
  3041. fprintf(stdout,"INFO: %lf\n",number[n]);
  3042. }
  3043. fflush(stdout);
  3044. }
  3045. /************************** SPAN_FALL ********************************/
  3046. void span_fall(void) {
  3047. int n;
  3048. if(number[0] < 0.0) {
  3049. fprintf(stdout,"ERROR: This option only works with ascending values greater than or equal to zero.\n");
  3050. fflush(stdout);
  3051. exit(1);
  3052. }
  3053. for(n = 1;n<cnt;n++) {
  3054. if(number[n] - number[n-1] <= thresh) {
  3055. fprintf(stdout,"ERROR: No space for span between number %d (%lf) and number %d (%lf)\n",
  3056. n,number[n-1],n+1,number[n]);
  3057. fflush(stdout);
  3058. exit(1);
  3059. }
  3060. }
  3061. for(n = 0;n<cnt;n++) {
  3062. fprintf(stdout,"INFO: %lf\n",number[n]);
  3063. fprintf(stdout,"INFO: %lf\n",number[n] + thresh);
  3064. }
  3065. fflush(stdout);
  3066. }
  3067. /************************** CYCLIC_SELECT ********************************/
  3068. void cyclic_select(char c) {
  3069. int n, m, start, step, k = (int)c, startpos = 0, steppos=0;
  3070. double item = 0.0;
  3071. switch(k) {
  3072. case('s'):
  3073. steppos = cnt;
  3074. startpos = cnt+1;
  3075. break;
  3076. case('a'):
  3077. case('m'):
  3078. steppos = cnt+1;
  3079. startpos = cnt+2;
  3080. break;
  3081. }
  3082. if((start = (int)round(number[startpos])) > cnt) {
  3083. fprintf(stdout,"ERROR: There are no numbers at or beyond position %d\n",start);
  3084. fflush(stdout);
  3085. exit(1);
  3086. } else if(start < 1) {
  3087. fprintf(stdout,"ERROR: There are no numbers at or before position %d\n",start);
  3088. fflush(stdout);
  3089. exit(1);
  3090. }
  3091. start--;
  3092. if(abs(step = (int)round(number[steppos])) < 1) {
  3093. fprintf(stdout,"ERROR: Step between values cannot be zero.\n");
  3094. fflush(stdout);
  3095. exit(1);
  3096. }
  3097. if(c != 's') {
  3098. if(step < 0) {
  3099. fprintf(stdout,"ERROR: Step between values cannot be negative.\n");
  3100. fflush(stdout);
  3101. exit(1);
  3102. }
  3103. item = number[cnt];
  3104. }
  3105. switch(k) {
  3106. case('s'):
  3107. if(step > 0) {
  3108. for(n = start;n<cnt;n+=step)
  3109. fprintf(stdout,"INFO: %lf\n",number[n]);
  3110. } else {
  3111. for(n = start;n>=0;n+=step)
  3112. fprintf(stdout,"INFO: %lf\n",number[n]);
  3113. }
  3114. break;
  3115. case('a'):
  3116. case('m'):
  3117. n = 0;
  3118. while(n < start)
  3119. fprintf(stdout,"INFO: %lf\n",number[n++]);
  3120. for(m = 0;n<cnt;m++,n++) {
  3121. m %= step;
  3122. if(m == 0) {
  3123. switch(k) {
  3124. case('a'): fprintf(stdout,"INFO: %lf\n",number[n] + item); break;
  3125. case('m'): fprintf(stdout,"INFO: %lf\n",number[n] * item); break;
  3126. }
  3127. } else {
  3128. fprintf(stdout,"INFO: %lf\n",number[n]);
  3129. }
  3130. }
  3131. break;
  3132. }
  3133. fflush(stdout);
  3134. }
  3135. /************************** SPAN_ALL ********************************/
  3136. void span_all(void) {
  3137. int n, zero_exists = 0, top_exists = 0;
  3138. if(number[0] < 0.0) {
  3139. fprintf(stdout,"ERROR: Numbers begin before zero.\n");
  3140. fflush(stdout);
  3141. exit(1);
  3142. }
  3143. if(number[cnt-1] > factor) {
  3144. fprintf(stdout,"ERROR: Numbers already run beyond %lf\n",factor);
  3145. fflush(stdout);
  3146. exit(1);
  3147. }
  3148. if(number[0] <= 0.0)
  3149. zero_exists = 1;
  3150. if(number[cnt-1] >= factor)
  3151. top_exists = 1;
  3152. if(zero_exists) {
  3153. if(top_exists) {
  3154. fprintf(stdout,"ERROR: Numbers already begin at zero and end at %lf\n",factor);
  3155. fflush(stdout);
  3156. exit(1);
  3157. } else {
  3158. fprintf(stdout,"WARNING: Numbers already start at zero\n");
  3159. fflush(stdout);
  3160. }
  3161. }
  3162. if(top_exists) {
  3163. fprintf(stdout,"WARNING: Numbers already end at %lf\n",factor);
  3164. fflush(stdout);
  3165. }
  3166. if(!zero_exists)
  3167. fprintf(stdout,"INFO: %lf\n",0.0);
  3168. for(n=0;n<cnt;n++)
  3169. fprintf(stdout,"INFO: %lf\n",number[n]);
  3170. if(!top_exists)
  3171. fprintf(stdout,"INFO: %lf\n",factor);
  3172. fflush(stdout);
  3173. }
  3174. /************************** GET_TEMPO ********************************/
  3175. double get_tempo(char *str)
  3176. {
  3177. char *p = str;
  3178. double tempo;
  3179. int pointcnt = 0;
  3180. while(*p != ENDOFSTR) {
  3181. if(*p == '.') {
  3182. pointcnt++;
  3183. } else if(!isdigit(*p)) {
  3184. pointcnt = -1;
  3185. break;
  3186. }
  3187. p++;
  3188. }
  3189. if(pointcnt < 0 || pointcnt > 1) {
  3190. fprintf(stdout, "ERROR: Invalid tempo value.\n");
  3191. fflush(stdout);
  3192. return(-1.0);
  3193. }
  3194. if(sscanf(str,"%lf",&tempo)!=1) {
  3195. fprintf(stdout, "ERROR: Invalid tempo value.\n");
  3196. fflush(stdout);
  3197. return(-1.0);
  3198. }
  3199. if(tempo <= 0.0) {
  3200. fprintf(stdout, "ERROR: Zero or negative tempo: impossible.\n");
  3201. fflush(stdout);
  3202. return(-1.0);
  3203. } else if(tempo > MAX_TEMPO) {
  3204. fprintf(stdout, "ERROR: Invalid tempo value. Beats shorter than 1 millisecond (!!).\n");
  3205. fflush(stdout);
  3206. return(-1.0);
  3207. } else if(tempo < MIN_TEMPO) {
  3208. fprintf(stdout, "ERROR: Invalid tempo value. Beats longer than 1 hour (!!).\n");
  3209. fflush(stdout);
  3210. return(-1.0);
  3211. }
  3212. return tempo;
  3213. }
  3214. /************************** GENERATE_RANDOMISED_VALS ********************************/
  3215. /* RWD changed 'temp' below to 'dtemp', also declared in columns.h as char array !*/
  3216. /* ditto 'scatter' also clashes with global decl */
  3217. void generate_randomised_vals(void)
  3218. {
  3219. double dscatter = number[2], span = number[0], sum = 0.0, mean, range, *dtemp = NULL, d;
  3220. int icnt = (int) round(number[1]), n, m, j, subcnt;
  3221. int bigscat = 0;
  3222. if(dscatter > 1.0)
  3223. bigscat = (int) round(dscatter);
  3224. if(bigscat) {
  3225. if((dtemp = (double *)malloc(bigscat * sizeof(double)))==NULL) {
  3226. fprintf(stdout,"Out of memory.\n");
  3227. fflush(stdout);
  3228. exit(1);
  3229. }
  3230. }
  3231. if((number = (double *)realloc((char *)number,(icnt+1) * sizeof(double)))==NULL) {
  3232. fprintf(stdout,"Out of memory.\n");
  3233. fflush(stdout);
  3234. exit(1);
  3235. }
  3236. mean = span/(double)icnt;
  3237. number[0] = 0.0;
  3238. number[cnt] = span;
  3239. if(bigscat) {
  3240. for(n=1;n < icnt;n+= bigscat) {
  3241. if((subcnt = n + bigscat) > icnt) /* find position of last number in this pass */
  3242. subcnt = icnt; /* set end position of pass */
  3243. subcnt--; /* allow for item already written at 1 */
  3244. if((subcnt %= bigscat) == 0) /* set size of pass */
  3245. subcnt = bigscat;
  3246. range = mean * subcnt; /* set range of pass */
  3247. for(m = 0; m < subcnt; m++)
  3248. dtemp[m] = sum + (drand48() * range); /* generate values within this range */
  3249. for(m=0;m < subcnt - 1; m++) {
  3250. for(j=1;j < subcnt; j++) {
  3251. if(dtemp[m] > dtemp[j]) { /* sort */
  3252. d = dtemp[j];
  3253. dtemp[j] = dtemp[m];
  3254. dtemp[m] = d;
  3255. }
  3256. }
  3257. }
  3258. for(m=0;m<subcnt;m++) /* concatenate to list of numbers */
  3259. number[n+m] = dtemp[m];
  3260. sum += range; /* step over range */
  3261. }
  3262. } else {
  3263. for(n=1;n < icnt;n++) {
  3264. sum += mean;
  3265. number[n] = sum + (mean * randoffset(dscatter));
  3266. }
  3267. }
  3268. for(n=0;n<=icnt;n++)
  3269. fprintf(stdout,"INFO: %lf\n",number[n]);
  3270. fflush(stdout);
  3271. /* RWD Nov 2025 */
  3272. if(dtemp != NULL)
  3273. free(dtemp);
  3274. }
  3275. /************************** RAND_OFFSET ********************************
  3276. *
  3277. * rand number in maximal range -half to +half
  3278. */
  3279. double randoffset(double dscatter)
  3280. {
  3281. return (((drand48() * 2.0) - 1.0) * 0.5) * dscatter;
  3282. }
  3283. /************************** GET_OFFSET ********************************/
  3284. void get_offset(char *str,double *offset)
  3285. {
  3286. if(sscanf(str,"%lf",offset)!=1) {
  3287. fprintf(stdout,"Cannot read time offset.\n");
  3288. fflush(stdout);
  3289. exit(1);
  3290. }
  3291. }
  3292. /************************** PITCH_TO_DELAY ********************************/
  3293. void pitch_to_delay(int midi)
  3294. {
  3295. int n;
  3296. for(n = 0;n < cnt; n++) {
  3297. if(midi) {
  3298. if(number[n] < MIDIMIN || number[n] > MIDIMAX) {
  3299. fprintf(stdout,"MIDI value %d (%lf) is out of range.\n", n+1,number[n]);
  3300. fflush(stdout);
  3301. exit(1);
  3302. }
  3303. number[n] = miditohz(number[n]);
  3304. } else if(number[n] < FLTERR || number[n] > 24000.0) {
  3305. fprintf(stdout,"Frequency value %d (%lf) is out or range.\n",n+1,number[n]);
  3306. fflush(stdout);
  3307. exit(1);
  3308. }
  3309. number[n] = 1000.0/number[n];
  3310. }
  3311. for(n=0;n<cnt;n++)
  3312. fprintf(stdout,"INFO: %lf\n",number[n]);
  3313. fflush(stdout);
  3314. }
  3315. /************************** DELAY_TO_PITCH ********************************/
  3316. void delay_to_pitch(int midi)
  3317. {
  3318. int n;
  3319. for(n = 0;n < cnt; n++) {
  3320. number[n] /= 1000;
  3321. if(number[n] < FLTERR) {
  3322. fprintf(stdout,"Delay value %d (%lf) is out or range for conversion to pitch value.\n",n+1,number[n]);
  3323. fflush(stdout);
  3324. exit(1);
  3325. }
  3326. number[n] = 1.0/number[n];
  3327. if(midi) {
  3328. if(number[n] < MIDIMINFRQ || number[n] > MIDIMAXFRQ) {
  3329. fprintf(stdout,"delay value %d (%lf) is out of range for conversion to MIDI.\n", n+1,number[n]);
  3330. fflush(stdout);
  3331. exit(1);
  3332. }
  3333. number[n] = hztomidi(number[n]);
  3334. } else if(number[n] < FLTERR || number[n] > 24000) {
  3335. fprintf(stdout,"Delay value %d (%lf) is out or range for conversion to frq.\n",n+1,number[n]);
  3336. fflush(stdout);
  3337. exit(1);
  3338. }
  3339. }
  3340. for(n=0;n<cnt;n++)
  3341. fprintf(stdout,"INFO: %lf\n",number[n]);
  3342. fflush(stdout);
  3343. }
  3344. /* NEW FUNCS HANDLING BRKTABLES DIRECTLY ***** JUNE 2000 ***/
  3345. /****************************** REVERSE_TIME_INTERVALS ******************************/
  3346. void reverse_time_intervals(void)
  3347. {
  3348. int n, m;
  3349. double k = number[0];
  3350. fprintf(stdout,"INFO: %lf %lf\n",k,number[1]);
  3351. for(n=3,m = cnt-2;n<cnt;m-=2,n+=2) {
  3352. k += (number[m] - number[m-2]);
  3353. fprintf(stdout,"INFO: %lf %lf\n",k,number[n]);
  3354. }
  3355. fflush(stdout);
  3356. }
  3357. /****************************** REVERSE_ORDER_OF_BRKVALS ******************************/
  3358. void reverse_order_of_brkvals(void)
  3359. {
  3360. int n, m;
  3361. for(n=0,m = cnt-1;n<cnt;m-=2,n+=2)
  3362. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[m]);
  3363. fflush(stdout);
  3364. }
  3365. /****************************** INVERTENV ******************************/
  3366. void invertenv(double piv)
  3367. {
  3368. int n;
  3369. for(n=1;n<cnt;n+=2)
  3370. fprintf(stdout,"INFO: %lf %lf\n",number[n-1],piv - number[n]);
  3371. fflush(stdout);
  3372. }
  3373. /******************************** THRESH_CUT ****************************/
  3374. void thresh_cut(void)
  3375. {
  3376. int n,m, k = 0;
  3377. double ratio, *time;
  3378. int isgreater = 0;
  3379. if((cnt <= 0) || ((time = (double *)malloc(cnt * sizeof(double)))==NULL)) {
  3380. fprintf(stdout,"ERROR: Insufficient memory.\n");
  3381. return;
  3382. }
  3383. if(number[1] > factor)
  3384. isgreater = 1;
  3385. for(m=2,n=3;n<cnt;n+=2,m+=2) {
  3386. switch(isgreater) {
  3387. case(0):
  3388. if(number[n] > factor) {
  3389. ratio = (factor - number[n-2])/(number[n] - number[n-2]);
  3390. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3391. isgreater = 1;
  3392. }
  3393. break;
  3394. case(1):
  3395. if(number[n] <= factor) {
  3396. ratio = (factor - number[n-2])/(number[n] - number[n-2]);
  3397. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3398. isgreater = 0;
  3399. }
  3400. break;
  3401. }
  3402. }
  3403. if(k == 0) {
  3404. fprintf(stdout,"ERROR: The values do not cross the threshold.\n");
  3405. free(time);
  3406. return;
  3407. }
  3408. for(n=0;n<k;n++)
  3409. do_valout(time[n]);
  3410. free(time);
  3411. }
  3412. /******************************** BAND_CUT ****************************/
  3413. void band_cut(void)
  3414. {
  3415. int n,m, k = 0;
  3416. double ratio, *time, z, hibnd, lobnd;
  3417. int bandpos;
  3418. if((cnt <= 0) || ((time = (double *)malloc(cnt * sizeof(double)))==NULL)) {
  3419. fprintf(stdout,"ERROR: Insufficient memory.\n");
  3420. return;
  3421. }
  3422. lobnd = number[cnt];
  3423. hibnd = number[cnt+1];
  3424. if(lobnd > hibnd) {
  3425. z = lobnd;
  3426. lobnd = hibnd;
  3427. hibnd = z;
  3428. }
  3429. if(number[1] >= lobnd && number[1] <= hibnd)
  3430. bandpos = 0;
  3431. else if(number[1] < lobnd)
  3432. bandpos = -1;
  3433. else
  3434. bandpos = 1;
  3435. for(m=2,n=3;n<cnt;n+=2,m+=2) {
  3436. switch(bandpos) {
  3437. case(0):
  3438. if(number[n] < lobnd) { /* crosses out downwards */
  3439. ratio = (lobnd - number[n-2])/(number[n] - number[n-2]);
  3440. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3441. bandpos = -1;
  3442. } else if(number[n] > hibnd) { /* crosses out upwards */
  3443. ratio = (hibnd - number[n-2])/(number[n] - number[n-2]);
  3444. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3445. bandpos = 1;
  3446. }
  3447. break;
  3448. case(1):
  3449. if(number[n] <= hibnd) { /* crosses in from above */
  3450. ratio = (hibnd - number[n-2])/(number[n] - number[n-2]);
  3451. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3452. bandpos = 0;
  3453. }
  3454. if(number[n] < lobnd) { /* then possibly out below */
  3455. ratio = (lobnd - number[n-2])/(number[n] - number[n-2]);
  3456. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3457. bandpos = -1;
  3458. }
  3459. break;
  3460. case(-1):
  3461. if(number[n] >= lobnd) { /* crosses in from below */
  3462. ratio = (lobnd - number[n-2])/(number[n] - number[n-2]);
  3463. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3464. bandpos = 0;
  3465. }
  3466. if(number[n] > hibnd) { /* then possibly out above */
  3467. ratio = (hibnd - number[n-2])/(number[n] - number[n-2]);
  3468. time[k++] = ((number[m] - number[m-2]) * ratio) + number[m-2];
  3469. bandpos = 1;
  3470. }
  3471. break;
  3472. }
  3473. }
  3474. if(k == 0) {
  3475. fprintf(stdout,"ERROR: The values in the 2nd column do not cross into or out of the specified band.\n");
  3476. free(time);
  3477. return;
  3478. }
  3479. for(n=0;n<k;n++)
  3480. do_valout(time[n]);
  3481. fflush(stdout);
  3482. free(time);
  3483. }
  3484. /****************************** ENV_APPEND ******************************/
  3485. void env_append(void)
  3486. {
  3487. int n, dojoin = 0;
  3488. double first_endtime;
  3489. first_endtime = number[firstcnt-2];
  3490. if (factor < first_endtime) {
  3491. fprintf(stdout,"ERROR: Second envelope starts before first one ends.\n");
  3492. fflush(stdout);
  3493. exit(1);
  3494. } else if(flteq(factor,first_endtime)) {
  3495. if(!flteq(number[firstcnt-1],number[firstcnt+1])) {
  3496. fprintf(stdout,"ERROR: Abutting envelopes are not at same level (%lf and %lf).\n",number[firstcnt-1],number[firstcnt+1]);
  3497. fflush(stdout);
  3498. exit(1);
  3499. }
  3500. dojoin = 1;
  3501. }
  3502. for(n = firstcnt; n < cnt; n+=2) {
  3503. number[n] += factor;
  3504. }
  3505. if(dojoin) {
  3506. for(n=0;n<firstcnt;n+=2)
  3507. do_valpair_out(number[n],number[n+1]);
  3508. for(n=firstcnt+2;n<cnt;n+=2)
  3509. do_valpair_out(number[n],number[n+1]);
  3510. } else {
  3511. for(n=0;n<cnt;n+=2)
  3512. do_valpair_out(number[n],number[n+1]);
  3513. }
  3514. fflush(stdout);
  3515. }
  3516. /****************************** ABUTT ******************************/
  3517. void abutt(void)
  3518. {
  3519. int n,m = 0, i;
  3520. double displace;
  3521. int indx = 0;
  3522. for(i=0;i<infilecnt-1;i++) { /* check abutting values match */
  3523. indx += file_cnt[i];
  3524. if(!flteq(number[indx-1],number[indx+1])) {
  3525. fprintf(stdout,"ERROR: Abutting values between files %d and %d do not match\n",i+1,i+2);
  3526. fflush(stdout);
  3527. exit(1);
  3528. }
  3529. }
  3530. for(n=0;n < file_cnt[0]; n+=2) { /* print all of file 1 */
  3531. fprintf(stdout, "INFO: %lf %lf\n",number[m],number[m+1]);
  3532. m += 2;
  3533. }
  3534. displace = number[m-2]; /* displace by last time in 1st file */
  3535. for(i = 1; i <infilecnt; i++) { /* for all other files */
  3536. m += 2; /* skip first (abutting) value */
  3537. for(n=2;n < file_cnt[i]; n+=2) { /* for all other values in file - displace time values */
  3538. fprintf(stdout, "INFO: %lf %lf\n",number[m] + displace,number[m+1]);
  3539. m += 2;
  3540. }
  3541. displace += number[m-2]; /* increase displacement by last time in this file */
  3542. }
  3543. fflush(stdout);
  3544. }
  3545. /****************************** QUANTISE_TIME ******************************/
  3546. void quantise_time(void)
  3547. {
  3548. int n;
  3549. for(n=0;n<cnt;n+=2)
  3550. fprintf(stdout,"INFO: %lf %lf\n",round(number[n]/factor) * factor,number[n+1]);
  3551. fflush(stdout);
  3552. }
  3553. /****************************** QUANTISE_VAL ******************************/
  3554. void quantise_val(void)
  3555. {
  3556. int n;
  3557. for(n=0;n<cnt;n+=2)
  3558. fprintf(stdout,"INFO: %lf %lf\n",number[n],round(number[n+1]/factor) * factor);
  3559. fflush(stdout);
  3560. }
  3561. /****************************** EXPAND_TABLE_DUR_BY_FACTOR ******************************/
  3562. void expand_table_dur_by_factor(void)
  3563. {
  3564. int n;
  3565. for(n=0;n<cnt;n+=2)
  3566. fprintf(stdout,"INFO: %lf %lf\n",number[n] * factor,number[n+1]);
  3567. fflush(stdout);
  3568. }
  3569. /****************************** EXPAND_TABLE_VALS_BY_FACTOR ******************************/
  3570. void expand_table_vals_by_factor(void)
  3571. {
  3572. int n;
  3573. for(n=0;n<cnt;n+=2)
  3574. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1] * factor);
  3575. fflush(stdout);
  3576. }
  3577. /****************************** EXPAND_TABLE_TO_DUR ******************************/
  3578. void expand_table_to_dur(void)
  3579. {
  3580. int n;
  3581. double ratio;
  3582. if(number[cnt-2] <= 0.0) {
  3583. fprintf(stdout,"ERROR: Final time in table is zero: cannot proceed.\n");
  3584. return;
  3585. }
  3586. ratio = factor/number[cnt-2];
  3587. for(n=0;n<cnt;n+=2)
  3588. fprintf(stdout,"INFO: %lf %lf\n",number[n] * ratio,number[n+1]);
  3589. fflush(stdout);
  3590. }
  3591. /****************************** CUT_TABLE_AT_TIME ******************************/
  3592. void cut_table_at_time(void)
  3593. {
  3594. int n;
  3595. double timediff,valdiff,timeratio,outval;
  3596. for(n=0;n<cnt;n+=2) {
  3597. if(flteq(number[n],factor)) {
  3598. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  3599. break;
  3600. } else if(number[n] < factor) {
  3601. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  3602. } else if(n==0) {
  3603. fprintf(stdout,"WARNING: No values occur before the cut-off time\n");
  3604. break;
  3605. } else {
  3606. timediff = number[n] - number[n-2];
  3607. valdiff = number[n+1] - number[n-1];
  3608. timeratio = (factor - number[n-2])/timediff;
  3609. valdiff *= timeratio;
  3610. outval = number[n-1] + valdiff;
  3611. fprintf(stdout,"INFO: %lf %lf\n",factor,outval);
  3612. break;
  3613. }
  3614. }
  3615. fflush(stdout);
  3616. }
  3617. /****************************** EXTEND_TABLE_TO_DUR ******************************/
  3618. void extend_table_to_dur(void)
  3619. {
  3620. int n;
  3621. for(n=0;n<cnt;n+=2)
  3622. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  3623. fprintf(stdout,"INFO: %lf %lf\n",factor,number[n-1]);
  3624. fflush(stdout);
  3625. }
  3626. /****************************** LIMIT_TABLE_VAL_RANGE ******************************/
  3627. void limit_table_val_range(void)
  3628. {
  3629. int n;
  3630. if(condit) {
  3631. for(n=1;n<cnt;n+=2) {
  3632. number[n] = min(factor, number[n]);
  3633. number[n] = max(number[n],thresh);
  3634. fprintf(stdout,"INFO: %lf %lf\n",number[n-1],number[n]);
  3635. }
  3636. } else {
  3637. for(n=1;n<cnt;n+=2) {
  3638. number[n] = min(factor,number[n]);
  3639. fprintf(stdout,"INFO: %lf %lf\n",number[n-1],number[n]);
  3640. }
  3641. }
  3642. fflush(stdout);
  3643. }
  3644. /****************************** SUBSTITUTE ******************************/
  3645. void substitute(void)
  3646. {
  3647. int n;
  3648. for(n=0;n<cnt;n++) {
  3649. if(flteq(number[n],thresh))
  3650. number[n] = factor;
  3651. fprintf(stdout,"INFO: %lf\n",number[n]);
  3652. }
  3653. fflush(stdout);
  3654. }
  3655. /****************************** SUBSTITUTE_ALL ******************************/
  3656. void substitute_all(void)
  3657. {
  3658. int n;
  3659. for(n=0;n<stringscnt;n++)
  3660. fprintf(stdout,"INFO: %s\n",string);
  3661. fflush(stdout);
  3662. }
  3663. /****************************** SUBSTITUTE ******************************/
  3664. void mean_of_reversed_pairs(void)
  3665. {
  3666. int n;
  3667. double z1;
  3668. for(n=1;n<cnt;n++) {
  3669. if(number[n]<number[n-1]) {
  3670. z1 = (number[n] + number[n-1])/2.0;
  3671. number[n-1] = z1 - FLTERR;
  3672. if((n-2 > 0) && number[n-2] >= number[n-1]) {
  3673. fprintf(stdout,"WARNING: numbers %d (%lf) and %d (%lf) failed to be separated.\n",
  3674. n,number[n-1],n+1,number[n]);
  3675. fflush(stdout);
  3676. return;
  3677. }
  3678. number[n] = z1 + FLTERR;
  3679. if((n+1 < cnt) && number[n+1] <= number[n]) {
  3680. fprintf(stdout,"WARNING: numbers %d (%lf) and %d (%lf) failed to be separated.\n",
  3681. n+1,number[n],n+2,number[n+1]);
  3682. fflush(stdout);
  3683. return;
  3684. }
  3685. }
  3686. }
  3687. for(n=0;n<cnt;n++)
  3688. fprintf(stdout,"INFO: %lf\n",number[n]);
  3689. fflush(stdout);
  3690. }
  3691. /****************************** CONVERT_SPACE_TEX_TO_PAN ******************************/
  3692. void convert_space_tex_to_pan(void)
  3693. {
  3694. int n;
  3695. for(n=1;n<cnt;n+=2) {
  3696. number[n] *=2.0;
  3697. number[n] -=1.0;
  3698. }
  3699. for(n=0;n<cnt;n+=2)
  3700. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  3701. fflush(stdout);
  3702. }
  3703. /****************************** CONVERT_SPACE_PAN_TO_TEX ******************************/
  3704. void convert_space_pan_to_tex(void)
  3705. {
  3706. int n;
  3707. for(n=1;n<cnt;n+=2) {
  3708. number[n] *=0.5;
  3709. number[n] +=0.5;
  3710. }
  3711. for(n=0;n<cnt;n+=2)
  3712. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  3713. fflush(stdout);
  3714. }
  3715. /****************************** CONVERT_TO_EDITS ******************************/
  3716. void convert_to_edits(void)
  3717. {
  3718. int n;
  3719. double start, end;
  3720. for(n=0;n<cnt-1;n++) {
  3721. start = max(0.0,number[n] - factor);
  3722. end = max(0.0,number[n+1] + factor);
  3723. fprintf(stdout,"INFO: %lf %lf\n",start,end);
  3724. }
  3725. fflush(stdout);
  3726. }
  3727. /****************************** COSIN_SPLINE ******************************/
  3728. void cosin_spline(void)
  3729. {
  3730. int n, cnt_less_one;
  3731. double val, valchange, skew, startval ,endval;
  3732. skew = number[3];
  3733. startval = number[1];
  3734. endval = number[2];
  3735. valchange = endval - startval;
  3736. cnt_less_one = cnt - 1;
  3737. if(flteq(skew,1.0)) {
  3738. for(n=0;n<cnt;n++) {
  3739. val = ((double)n/(double)cnt_less_one) * PI;
  3740. val = cos(val);
  3741. val += 1.0;
  3742. val /= 2.0;
  3743. val = 1.0 - val;
  3744. val = max(0.0,val);
  3745. val = min(val,1.0);
  3746. val *= valchange;
  3747. val += startval;
  3748. fprintf(stdout,"INFO: %lf\n",val);
  3749. }
  3750. } else {
  3751. for(n=0;n<cnt;n++) {
  3752. val = ((double)n/(double)cnt_less_one); /* val in 0 -1 range */
  3753. val = pow(val,skew); /* val skewed, still in 0-1 range */
  3754. val = val * PI; /* (skewed) val in range 0 to PI */
  3755. val = cos(val); /* cosin val running from 1 to -1 */
  3756. val += 1.0; /* cosin val running from 2 to 0 */
  3757. val /= 2.0; /* cosin val running from 1 to 0 */
  3758. val = 1.0 - val; /* cosin val running from 0 to 1 */
  3759. val = max(0.0,val); /* ensure 0-1 range not exceeeded */
  3760. val = min(val,1.0);
  3761. val *= valchange; /* apply cosin shape to val change */
  3762. val += startval; /* add cosin change to initial val */
  3763. fprintf(stdout,"INFO: %lf\n",val);
  3764. }
  3765. }
  3766. fflush(stdout);
  3767. }
  3768. /****************************** DISTANCE_FROM_GRID ******************************/
  3769. void distance_from_grid(void)
  3770. {
  3771. int n, m, besterror;
  3772. double *diff = (double *)exmalloc((cnt-1)*sizeof(double));
  3773. double *error = (double *)exmalloc(21 * sizeof(double));
  3774. double maxdiff = 0.0, mindiff = 0.0, lastmindiff, diffrange, diffstep, thisdiff, thisgrid, minerror;
  3775. double lowlimit = FLTERR/10000;
  3776. for(n=0;n<cnt-1;n++) {
  3777. diff[n] = number[n+1] - number[n];
  3778. /*
  3779. if(diff[n] <= 0.0) {
  3780. fprintf(stdout, "ERROR: Process only works with increasing sequences of numbers.\n");
  3781. fflush(stdout);
  3782. exit(1);
  3783. }
  3784. */
  3785. if(n==0) {
  3786. mindiff = diff[0];
  3787. maxdiff = diff[0];
  3788. } else {
  3789. mindiff = min(diff[n],mindiff);
  3790. maxdiff = max(diff[n],maxdiff);
  3791. }
  3792. }
  3793. lastmindiff = mindiff;
  3794. while((diffrange = maxdiff - mindiff) > lowlimit * 20.0) {
  3795. diffstep = diffrange/20.0;
  3796. thisdiff = mindiff;
  3797. for(m=0;m<=20;m++) {
  3798. error[m] = 0;
  3799. thisgrid = number[0];
  3800. for(n=1;n<cnt;n++) {
  3801. thisgrid += thisdiff;
  3802. error[m] += fabs(number[n] - thisgrid);
  3803. }
  3804. thisdiff += diffstep;
  3805. }
  3806. minerror = error[0];
  3807. besterror = 0;
  3808. for(m=1;m<=20;m++) {
  3809. if(minerror > error[m]) {
  3810. minerror = error[m];
  3811. besterror = m;
  3812. }
  3813. }
  3814. mindiff = mindiff + (besterror * diffstep);
  3815. lastmindiff = mindiff;
  3816. maxdiff = mindiff + diffstep;
  3817. mindiff -= diffstep;
  3818. }
  3819. thisgrid = number[0];
  3820. for(n=0;n<cnt;n++) {
  3821. thisdiff = number[n] - thisgrid;
  3822. if(thisdiff < 0.0 && thisdiff > -FLTERR)
  3823. thisdiff = 0.0;
  3824. fprintf(stdout,"INFO: %lf\n",thisdiff);
  3825. thisgrid += lastmindiff;
  3826. }
  3827. fflush(stdout);
  3828. }
  3829. /****************************** SINUSOID ******************************/
  3830. void sinusoid(void) {
  3831. double maxval = number[0], minval = number[1];
  3832. double range = maxval - minval;
  3833. double phase = (fmod(number[2],360.0)/360.0) * TWOPI;
  3834. double periods = number[3];
  3835. double valdens = number[4];
  3836. int n, valcnt = (int)floor((periods * valdens) + 1.0);
  3837. double val, phasestep = TWOPI/valdens;
  3838. for(n = 0; n < valcnt; n++) {
  3839. val = (sin(phase) + 1.0)/2.0;
  3840. val *= range;
  3841. val += minval;
  3842. fprintf(stdout,"INFO: %lf\n",val);
  3843. phase = phase + phasestep; /* should be fmod by TWOPI, but seems to work without this */
  3844. }
  3845. fflush(stdout);
  3846. }
  3847. /****************************** RAND_INTS_WITH_FIXED_ENDS ****************************/
  3848. void rand_ints_with_fixed_ends(void)
  3849. {
  3850. int z, n, m, i, k, j, j1, j2, repets, fullperms, partperm, startval, finval;
  3851. int range, rangbot, arrsiz, endcnt, endval, allowed, checkpart, done = 0;
  3852. int *arr, *arr2, *perm;
  3853. repets = round(number[5]);
  3854. startval = round(number[3]);
  3855. finval = round(number[4]);
  3856. j1 = round(number[1]);
  3857. j2 = round(number[2]);
  3858. range = abs(j2 - j1) + 1;
  3859. rangbot = (int)min(j1,j2);
  3860. arrsiz = range * repets;
  3861. ifactor = round(number[0]) - 2;
  3862. fullperms = ifactor / arrsiz;
  3863. partperm = ifactor - (fullperms * arrsiz);
  3864. if(partperm == 0) {
  3865. fullperms--; /* The last set of vals has to be calculated separately */
  3866. partperm = arrsiz; /* as, unlike others, it will have to be compared with the finval */
  3867. }
  3868. if((arr = (int *)malloc(arrsiz * sizeof(int)))==NULL) {
  3869. fprintf(stdout,"ERROR: Out of memory.\n");
  3870. fflush(stdout);
  3871. exit(1);
  3872. }
  3873. if((perm = (int *)malloc(arrsiz * sizeof(int)))==NULL) {
  3874. fprintf(stdout,"ERROR: Out of memory.\n");
  3875. fflush(stdout);
  3876. exit(1);
  3877. }
  3878. if((arr2 = (int *)malloc(repets * sizeof(int)))==NULL) {
  3879. fprintf(stdout,"ERROR: Out of memory.\n");
  3880. fflush(stdout);
  3881. exit(1);
  3882. }
  3883. n = 0;
  3884. for(j=0;j<repets;j++) { /* fill array with REPET copies of values. */
  3885. z = rangbot; /* this set can be permd AS A WHOLE, as repet adjacent copies of any val */
  3886. for(i=0;i<range;i++) /* which might arise in perming this set, are allowed */
  3887. arr[n++] = z++;
  3888. }
  3889. endcnt = 0; /* number of items repeated at end of previous perm */
  3890. endval = startval; /* value (possibly repeated) at end of previous perm */
  3891. /* initially this is just the 'startval' fixed by the user */
  3892. allowed = repets - 1; /* number of permissible repetitions of this val at start of NEW perm */
  3893. checkpart = arrsiz - repets; /* items at end of array to test for repetitions */
  3894. n = 0;
  3895. fprintf(stdout,"INFO: %d\n",startval); /* Output user-specified first value */
  3896. while(n < fullperms) {
  3897. do_repet_restricted_perm(arr,perm,arrsiz,allowed,endval);
  3898. j = 0;
  3899. for(m = 0;m <arrsiz;m++) {
  3900. k = arr[perm[m]];
  3901. fprintf(stdout,"INFO: %d\n",k);
  3902. if(m >= checkpart) /* save last checkable stretch of perm */
  3903. arr2[j++] = k;
  3904. }
  3905. fflush(stdout);
  3906. j--;
  3907. endval = arr2[j--]; /* note the val at end of perm */
  3908. endcnt = 1; /* and count it */
  3909. for(k = j; k>= 0; k--) {
  3910. if(arr2[k] == endval) /* check adjacent vals, for repetition of value: count */
  3911. endcnt++;
  3912. else /* if no more repetitions, finish counting */
  3913. break;
  3914. }
  3915. allowed = repets - endcnt; /* get number of permissible repets at start of next perm */
  3916. n++;
  3917. }
  3918. k = partperm - 1; /* index of last item of next perm which will actually be outputted */
  3919. j = repets - 1; /* How many items at end of partperm, other than item k, which need to be checked for value-repetition */
  3920. while(!done) {
  3921. do_repet_restricted_perm(arr,perm,arrsiz,allowed,endval);
  3922. for(n=k;n>=k - j;n--) {
  3923. if(arr[perm[n]] == finval) { /* Check end vals of the-set-of-values-in-the-final-perm-which-will-actually-be-outputted */
  3924. if(allowed == 0) /* against 'finval', to avoid too many value-repetitions at end of output */
  3925. break;
  3926. else
  3927. allowed--;
  3928. } else {
  3929. done = 1;
  3930. break;
  3931. }
  3932. }
  3933. }
  3934. for(m = 0;m <partperm;m++) {
  3935. k = arr[perm[m]];
  3936. fprintf(stdout,"INFO: %d\n",k);
  3937. }
  3938. fprintf(stdout,"INFO: %d\n",finval);
  3939. fflush(stdout);
  3940. }
  3941. /****************************** RAND_ZIGS ****************************/
  3942. void rand_zigs(void)
  3943. {
  3944. int n, k, j, j1, j2, finval, range, rangbot, arrsiz, outvals, lastval, t, done;
  3945. int *arr, *perm;
  3946. outvals = round(number[0]);
  3947. j1 = round(number[1]);
  3948. j2 = round(number[2]);
  3949. finval = round(number[3]);
  3950. range = abs(j2 - j1) + 1;
  3951. rangbot = (int)min(j1,j2);
  3952. if(finval < rangbot || finval > (int)max(j1,j2)) {
  3953. fprintf(stdout,"ERROR: Final value specified does not lie within the range of values specified.\n");
  3954. fflush(stdout);
  3955. exit(1);
  3956. }
  3957. arrsiz = range;
  3958. if((arr = (int *)malloc(arrsiz * sizeof(int)))==NULL) {
  3959. fprintf(stdout,"ERROR: Out of memory.\n");
  3960. fflush(stdout);
  3961. exit(1);
  3962. }
  3963. if((perm = (int *)malloc(arrsiz * sizeof(int)))==NULL) {
  3964. fprintf(stdout,"ERROR: Out of memory.\n");
  3965. fflush(stdout);
  3966. exit(1);
  3967. }
  3968. k = rangbot; /* this set can be permd AS A WHOLE, as repet adjacent copies of any val */
  3969. for(n=0;n<range;n++) /* which might arise in perming this set, are allowed */
  3970. arr[n] = k++;
  3971. j = 0;
  3972. lastval = rangbot - 1;
  3973. done = 0;
  3974. while(j < outvals) {
  3975. for(n=0;n<arrsiz;n++) {
  3976. t = (int)(drand48() * (double)(n+1)); /* Do Perm */
  3977. if(t==n)
  3978. hhprefix(n,arrsiz,perm);
  3979. else
  3980. hhinsert(n,t,arrsiz,perm);
  3981. }
  3982. for(n=0;n<arrsiz;n++) {
  3983. if (lastval < arr[perm[n]]) {
  3984. k = lastval + 1;
  3985. while(k < arr[perm[n]]) {
  3986. fprintf(stdout,"INFO: %d\n",k);
  3987. if(++j >= outvals) {
  3988. lastval = k;
  3989. done = 1;
  3990. break;
  3991. }
  3992. k++;
  3993. }
  3994. } else if(lastval > arr[perm[n]]) {
  3995. k = lastval - 1;
  3996. while(k > arr[perm[n]]) {
  3997. fprintf(stdout,"INFO: %d\n",k);
  3998. if(++j >= outvals) {
  3999. lastval = k;
  4000. done = 1;
  4001. break;
  4002. }
  4003. k--;
  4004. }
  4005. } else { /* next perm val can only be equal to previous at join of two different perms */
  4006. break; /* in this case, get a different perm */
  4007. }
  4008. if(done) {
  4009. break;
  4010. }
  4011. lastval = arr[perm[n]];
  4012. fprintf(stdout,"INFO: %d\n",lastval);
  4013. j++;
  4014. }
  4015. }
  4016. if(lastval < finval) {
  4017. lastval++;
  4018. while(lastval <= finval) {
  4019. fprintf(stdout,"INFO: %d\n",lastval);
  4020. lastval++;
  4021. }
  4022. } else if(lastval > finval) {
  4023. lastval--;
  4024. while(lastval >= finval) {
  4025. fprintf(stdout,"INFO: %d\n",lastval);
  4026. lastval--;
  4027. }
  4028. }
  4029. fflush(stdout);
  4030. }
  4031. /************************** ELIMINATE_DUPLTEXT *************************/
  4032. void eliminate_dupltext(void)
  4033. {
  4034. int m,n,k;
  4035. for(n=0;n<stringscnt-1;n++) {
  4036. for(m=n+1;m<stringscnt;m++) {
  4037. if(!strcmp(strings[n],strings[m])) {
  4038. for(k = m;k < stringscnt-1; k++)
  4039. strings[k] = strings[k+1];
  4040. m--;
  4041. stringscnt--;
  4042. }
  4043. }
  4044. }
  4045. for(n=0; n < stringscnt;n++)
  4046. do_stringout(strings[n]);
  4047. fflush(stdout);
  4048. }
  4049. /************************** RANDOM_WARP *************************/
  4050. /* RWD 2025 'fp' changed to 'myfp', avoid clash with global decl */
  4051. void random_warp(void)
  4052. {
  4053. int n, wcnt;
  4054. float *warpvals, *number2;
  4055. double lastsum, diff, warp, dummy;
  4056. FILE *myfp;
  4057. char *p;
  4058. arraysize = 100;
  4059. if((warpvals = (float *)malloc(arraysize * sizeof(float)))==NULL) {
  4060. fprintf(stdout,"ERROR: Out of memory.\n");
  4061. fflush(stdout);
  4062. return;
  4063. }
  4064. if((myfp = fopen(string,"r"))==NULL) {
  4065. sprintf(errstr,"Cannot open infile %s\n",string);
  4066. do_error();
  4067. }
  4068. wcnt = 0;
  4069. while(fgets(temp,20000,myfp)!=NULL) {
  4070. p = temp;
  4071. while(strgetfloat(&p,&dummy)) {
  4072. warpvals[wcnt] = (float)dummy;
  4073. if(++wcnt >= arraysize) {
  4074. arraysize += BIGARRAY;
  4075. if((number2=(float *)malloc(arraysize*sizeof(float)))==NULL) {
  4076. sprintf(errstr,"Out of memory for more warp values at %d numbers\n",cnt);
  4077. do_error();
  4078. }
  4079. memcpy((void *)number2,(void *)warpvals,cnt * sizeof(float));
  4080. warpvals = number2;
  4081. }
  4082. }
  4083. }
  4084. fclose(myfp);
  4085. if(wcnt ==0 || (wcnt & 1)) {
  4086. sprintf(errstr,"Invalid or missing warp data.\n");
  4087. do_error();
  4088. }
  4089. lastsum = number[0];
  4090. do_valout(lastsum);
  4091. for(n=1;n<cnt;n++) {
  4092. diff = number[n] - number[n-1];
  4093. warp = readbrk(warpvals,number[n],wcnt);
  4094. warp = (((drand48() * 2.0) - 1.0) * warp) + 1.0;
  4095. diff *= warp;
  4096. lastsum += diff;
  4097. do_valout(lastsum);
  4098. }
  4099. }
  4100. double readbrk(float *warpvals,double time,int wcnt)
  4101. {
  4102. int n, got = 0;
  4103. double wlasttime = 0.0, wlastval=0.0, wthistime=0.0, wthisval=0.0, val;
  4104. double timeratio, valdiff;
  4105. for(n = 0; n< wcnt; n+= 2) {
  4106. if(warpvals[n] < time) {
  4107. wlasttime = warpvals[n];
  4108. wlastval = warpvals[n+1];
  4109. } else {
  4110. wthistime = warpvals[n];
  4111. wthisval = warpvals[n+1];
  4112. got = 1;
  4113. break;
  4114. }
  4115. }
  4116. if(!got)
  4117. return (double)warpvals[wcnt - 1];
  4118. valdiff = wthisval - wlastval;
  4119. timeratio = (time - wlasttime)/(wthistime - wlasttime);
  4120. val = (valdiff * timeratio) + wlastval;
  4121. return val;
  4122. }