columns6.c 53 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332133313341335133613371338133913401341134213431344134513461347134813491350135113521353135413551356135713581359136013611362136313641365136613671368136913701371137213731374137513761377137813791380138113821383138413851386138713881389139013911392139313941395139613971398139914001401140214031404140514061407140814091410141114121413141414151416141714181419142014211422142314241425142614271428142914301431143214331434143514361437143814391440144114421443144414451446144714481449145014511452145314541455145614571458145914601461146214631464146514661467146814691470147114721473147414751476147714781479148014811482148314841485148614871488148914901491149214931494149514961497149814991500150115021503150415051506150715081509151015111512151315141515151615171518151915201521152215231524152515261527152815291530153115321533153415351536153715381539154015411542154315441545154615471548154915501551155215531554155515561557155815591560156115621563156415651566156715681569157015711572157315741575157615771578157915801581158215831584158515861587158815891590159115921593159415951596159715981599160016011602160316041605160616071608160916101611161216131614161516161617161816191620162116221623162416251626162716281629163016311632163316341635163616371638163916401641164216431644164516461647164816491650165116521653165416551656165716581659166016611662166316641665166616671668166916701671167216731674167516761677167816791680168116821683168416851686168716881689169016911692169316941695169616971698169917001701170217031704170517061707170817091710171117121713171417151716
  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. #include <time.h>
  24. //#ifdef unix
  25. #define round(x) lround((x))
  26. //#endif
  27. static void sort_set(double *set,int setcnt);
  28. static void do_search(double thisval,double error,int **adjusted);
  29. static void adjust_all_vals(double thisval,double gap,int n,int m);
  30. /************************************** COMPRESS_SEQUENCE ****************************************
  31. *
  32. * parameter is interval compression multiplier.
  33. */
  34. /* RDW Nov 2025 changed 'temp' to ctemp', avoid clash with global decl*/
  35. void compress_sequence(int multi)
  36. {
  37. int n;
  38. int m, hdcnt = ifactor;
  39. char ctemp[200];
  40. double interval, nunote;
  41. if(multi) {
  42. sprintf(errstr,"%lf",number[0]);
  43. for(n=1;n< hdcnt;n++) {
  44. sprintf(ctemp," %lf",number[n]);
  45. strcat(errstr,ctemp);
  46. }
  47. strcat(errstr,"\n");
  48. fprintf(stdout,"INFO: %s\n",errstr);
  49. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  50. number[n] = number[m];
  51. cnt -= hdcnt;
  52. }
  53. if(multi) {
  54. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[0],number[1],number[2],number[3],number[4]);
  55. nunote = number[2];
  56. for(n=5;n<cnt;n+=5) {
  57. interval = (number[n+2] - number[n-3]) * factor;
  58. nunote += interval;
  59. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],nunote,number[n+3],number[n+4]);
  60. }
  61. } else {
  62. for(n=0;n<cnt;n+=3)
  63. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[n+1] * factor,number[n+2]);
  64. }
  65. fflush(stdout);
  66. }
  67. /************************************** TRANSPOSE_SEQUENCE ****************************************
  68. *
  69. * parameter is transposition in semitones.
  70. */
  71. /*RWD Nov 2025 'temp' changed to 'ctemp'*/
  72. void transpose_sequence(int multi)
  73. {
  74. int n;
  75. int m, hdcnt = ifactor;
  76. char ctemp[200];
  77. if(multi) {
  78. sprintf(errstr,"%lf",number[0]);
  79. for(n=1;n< hdcnt;n++) {
  80. sprintf(ctemp," %lf",number[n]);
  81. strcat(errstr,ctemp);
  82. }
  83. strcat(errstr,"\n");
  84. fprintf(stdout,"INFO: %s\n",errstr);
  85. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  86. number[n] = number[m];
  87. cnt -= hdcnt;
  88. }
  89. if(multi) {
  90. for(n=0;n<cnt;n+=5)
  91. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[n+2] + factor,number[n+3],number[n+4]);
  92. } else {
  93. for(n=0;n<cnt;n+=3)
  94. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[n+1] + factor,number[n+2]);
  95. }
  96. fflush(stdout);
  97. }
  98. /************************************** P_INVERTSET_SEQUENCE *****************************************/
  99. void p_invertset_sequence(int multi)
  100. {
  101. double *set;
  102. int setcnt, n, gotit, q;
  103. int m, hdcnt = ifactor;
  104. char ctemp[200];
  105. if(multi) {
  106. sprintf(errstr,"%lf",number[0]);
  107. for(n=1;n< hdcnt;n++) {
  108. sprintf(ctemp," %lf",number[n]);
  109. strcat(errstr,ctemp);
  110. }
  111. strcat(errstr,"\n");
  112. fprintf(stdout,"INFO: %s\n",errstr);
  113. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  114. number[n] = number[m];
  115. cnt -= hdcnt;
  116. }
  117. if((set = (double *)malloc(cnt * sizeof(double)))==NULL) {
  118. fprintf(stdout,"ERROR: Insufficient memory to store pitch set.\n");
  119. fflush(stdout);
  120. exit(1);
  121. }
  122. setcnt = 0;
  123. if(multi) {
  124. for(n=2;n<cnt;n+=5) {
  125. gotit = 0;
  126. for(q = 0; q < setcnt; q++) {
  127. if(flteq(number[n],set[q])) {
  128. gotit = 1;
  129. break;
  130. }
  131. }
  132. if(!gotit)
  133. set[setcnt++] = number[n];
  134. }
  135. sort_set(set,setcnt);
  136. for(n=2;n<cnt;n+=5) {
  137. for(q=0;q<setcnt;q++) {
  138. if(flteq(number[n],set[q])) {
  139. number[n] = set[setcnt - 1 - q];
  140. break;
  141. }
  142. }
  143. }
  144. for(n=0;n<cnt;n+=5)
  145. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[n+2],number[n+3],number[n+4]);
  146. } else {
  147. for(n=1;n<cnt;n+=3) {
  148. gotit = 0;
  149. for(q = 0; q < setcnt; q++) {
  150. if(flteq(number[n],set[q])) {
  151. gotit = 1;
  152. break;
  153. }
  154. }
  155. if(!gotit)
  156. set[setcnt++] = number[n];
  157. }
  158. sort_set(set,setcnt);
  159. for(n=1;n<cnt;n+=3) {
  160. for(q=0;q<setcnt;q++) {
  161. if(flteq(number[n],set[q])) {
  162. number[n] = set[setcnt - 1 - q];
  163. break;
  164. }
  165. }
  166. }
  167. for(n=0;n<cnt;n+=3)
  168. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[n+1],number[n+2]);
  169. }
  170. fflush(stdout);
  171. }
  172. /************************************** P_EXPANDSET_SEQUENCE *****************************************
  173. *
  174. * parameter is set expansion multiplier.
  175. */
  176. void p_expandset_sequence(int multi)
  177. {
  178. double *set=NULL, transpos;
  179. int setcnt, n, gotit, q, qn, qq, qoct;
  180. int m, hdcnt = ifactor;
  181. int lastsetpos=0, lastnusetpos=0, thissetpos, setstep;
  182. char ctemp[200];
  183. if(multi) {
  184. sprintf(errstr,"%lf",number[0]);
  185. for(n=1;n< hdcnt;n++) {
  186. sprintf(ctemp," %lf",number[n]);
  187. strcat(errstr,ctemp);
  188. }
  189. strcat(errstr,"\n");
  190. fprintf(stdout,"INFO: %s\n",errstr);
  191. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  192. number[n] = number[m];
  193. cnt -= hdcnt;
  194. }
  195. if(factor <= 1.0) {
  196. fprintf(stdout,"ERROR: Set expansion must be > 1\n");
  197. fflush(stdout);
  198. exit(1);
  199. }
  200. ifactor = (int)round(factor + 0.5);
  201. if((set = (double *)malloc((cnt * ifactor) * sizeof(double)))==NULL) {
  202. fprintf(stdout,"ERROR: Insufficient memory to store pitch set.\n");
  203. fflush(stdout);
  204. exit(1);
  205. }
  206. setcnt = 0;
  207. if(multi) {
  208. for(n=2;n<cnt;n+=5) {
  209. gotit = 0;
  210. for(q = 0; q < setcnt; q++) {
  211. if(flteq(number[n],set[q])) {
  212. gotit = 1;
  213. break;
  214. }
  215. }
  216. if(!gotit)
  217. set[setcnt++] = number[n];
  218. }
  219. sort_set(set,setcnt);
  220. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[0],number[1],number[2],number[3],number[4]);
  221. for(q=0;q<setcnt;q++) {
  222. if(flteq(number[2],set[q])) { /* find which set-member this is */
  223. lastsetpos = q;
  224. lastnusetpos = q;
  225. break;
  226. }
  227. }
  228. for(n=7;n<cnt;n+=5) {
  229. for(q=0;q<setcnt;q++) {
  230. if(flteq(number[n],set[q])) { /* find which set-member this is */
  231. thissetpos = q;
  232. setstep = thissetpos - lastsetpos;
  233. setstep = (int)round(setstep * factor);
  234. qn = lastnusetpos + setstep;
  235. lastsetpos = thissetpos;
  236. lastnusetpos = qn;
  237. if(qn >= setcnt) { /* if beyond existing set */
  238. qq = qn%setcnt; /* cyclically find appropriate set member */
  239. qoct = qn/setcnt;
  240. transpos = 12.0 * qoct;
  241. number[n] = set[qq] + transpos;
  242. } else if(qn < 0) { /* if below existing set */
  243. qoct = 0; /* simil */
  244. while(qn < 0) {
  245. qn += setcnt;
  246. qoct++;
  247. }
  248. transpos = -(12.0 * qoct);
  249. number[n] = set[qn] + transpos;
  250. } else
  251. number[n] = set[qn];
  252. break;
  253. }
  254. }
  255. }
  256. for(n=5;n<cnt;n+=5)
  257. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[n+2],number[n+3],number[n+4]);
  258. } else {
  259. for(n=1;n<cnt;n+=3) {
  260. gotit = 0;
  261. for(q = 0; q < setcnt; q++) {
  262. if(flteq(number[n],set[q])) {
  263. gotit = 1;
  264. break;
  265. }
  266. }
  267. if(!gotit)
  268. set[setcnt++] = number[n];
  269. }
  270. sort_set(set,setcnt);
  271. for(n=1;n<cnt;n+=3) {
  272. for(q=0;q<setcnt;q++) {
  273. if(flteq(number[n],set[q])) { /* find which set-member this is */
  274. qn = (int)round((q+1) * factor) - 1; /* expand set-position */
  275. if(qn >= setcnt) { /* if beyond existing set */
  276. qq = qn%setcnt; /* cyclically find appropriate set member */
  277. qoct = qn/setcnt;
  278. transpos = 12.0 * qoct;
  279. number[n] = set[qq] + transpos;
  280. } else
  281. number[n] = set[qn];
  282. break;
  283. }
  284. }
  285. }
  286. for(n=0;n<cnt;n+=3)
  287. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[n+1],number[n+2]);
  288. }
  289. fflush(stdout);
  290. /*RWD Nov 2025*/
  291. if (set != NULL)
  292. free(set);
  293. }
  294. /************************************** P_INVERT_SEQUENCE *****************************************/
  295. void p_invert_sequence(int multi)
  296. {
  297. int n;
  298. double adjust;
  299. int m, hdcnt = ifactor;
  300. char ctemp[200];
  301. if(multi) {
  302. sprintf(errstr,"%lf",number[0]);
  303. for(n=1;n< hdcnt;n++) {
  304. sprintf(ctemp," %lf",number[n]);
  305. strcat(errstr,ctemp);
  306. }
  307. strcat(errstr,"\n");
  308. fprintf(stdout,"INFO: %s\n",errstr);
  309. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  310. number[n] = number[m];
  311. cnt -= hdcnt;
  312. }
  313. if(multi) {
  314. adjust = 2 * number[2];
  315. for(n=0;n<cnt;n+=5)
  316. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],adjust - number[n+2],number[n+3],number[n+4]);
  317. } else {
  318. adjust = 2 * number[1];
  319. for(n=0;n<cnt;n+=3)
  320. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],adjust - number[n+1],number[n+2]);
  321. }
  322. fflush(stdout);
  323. }
  324. /************************************** T_REVERSE_SEQUENCE ****************************************/
  325. void t_reverse_sequence(int multi)
  326. {
  327. double totaldur;
  328. int tend, n, te;
  329. int m, hdcnt = ifactor;
  330. char ctemp[200];
  331. if(multi) {
  332. sprintf(errstr,"%lf",number[0]);
  333. for(n=1;n< hdcnt;n++) {
  334. sprintf(ctemp," %lf",number[n]);
  335. strcat(errstr,ctemp);
  336. }
  337. strcat(errstr,"\n");
  338. fprintf(stdout,"INFO: %s\n",errstr);
  339. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  340. number[n] = number[m];
  341. cnt -= hdcnt;
  342. }
  343. totaldur = 0.0;
  344. tend = cnt - 4;
  345. if(multi) {
  346. for(n=0,te = tend;n<cnt;n+=5, te-=5) {
  347. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],totaldur,number[n+2],number[n+3],number[n+4]);
  348. totaldur += number[te] - number[te - 5];
  349. }
  350. } else {
  351. for(n=0,te = tend;n<cnt;n+=3, te-=3) {
  352. fprintf(stdout,"INFO: %lf %lf %lf\n",totaldur,number[n+1],number[n+2]);
  353. totaldur += number[te] - number[te - 3];
  354. }
  355. }
  356. fflush(stdout);
  357. }
  358. /************************************** P_REVERSE_SEQUENCE ****************************************/
  359. void p_reverse_sequence(int multi)
  360. {
  361. int n, pe;
  362. int pend;
  363. int m, hdcnt = ifactor;
  364. char ctemp[200];
  365. if(multi) {
  366. sprintf(errstr,"%lf",number[0]);
  367. for(n=1;n< hdcnt;n++) {
  368. sprintf(ctemp," %lf",number[n]);
  369. strcat(errstr,ctemp);
  370. }
  371. strcat(errstr,"\n");
  372. fprintf(stdout,"INFO: %s\n",errstr);
  373. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  374. number[n] = number[m];
  375. cnt -= hdcnt;
  376. }
  377. pend = cnt-3;
  378. if(multi) {
  379. for(n=0, pe = pend;n<cnt;n+=5, pe -= 5)
  380. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[pe],number[n+3],number[n+4]);
  381. } else {
  382. for(n=0, pe = pend;n<cnt;n+=3, pe -= 3)
  383. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[pe],number[n+2]);
  384. }
  385. fflush(stdout);
  386. }
  387. /************************************** A_REVERSE_SEQUENCE ****************************************/
  388. void a_reverse_sequence(int multi)
  389. {
  390. int n, ae;
  391. int m, hdcnt = ifactor;
  392. int aend = cnt - 2;
  393. char ctemp[200];
  394. if(multi) {
  395. sprintf(errstr,"%lf",number[0]);
  396. for(n=1;n< hdcnt;n++) {
  397. sprintf(ctemp," %lf",number[n]);
  398. strcat(errstr,ctemp);
  399. }
  400. strcat(errstr,"\n");
  401. fprintf(stdout,"INFO: %s\n",errstr);
  402. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  403. number[n] = number[m];
  404. cnt -= hdcnt;
  405. }
  406. if(multi) {
  407. for(n=0, ae = aend;n<cnt;n+=5, ae -= 5)
  408. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[n+2],number[ae],number[n+4]);
  409. } else {
  410. for(n=0, ae = cnt-1;n<cnt;n+=3, ae -= 3)
  411. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[n+1],number[ae]);
  412. }
  413. fflush(stdout);
  414. }
  415. /************************************** PA_REVERSE_SEQUENCE ***************************************/
  416. void pa_reverse_sequence(int multi)
  417. {
  418. int n, pe;
  419. int pend;
  420. int m, hdcnt = ifactor;
  421. char ctemp[200];
  422. if(multi) {
  423. sprintf(errstr,"%lf",number[0]);
  424. for(n=1;n< hdcnt;n++) {
  425. sprintf(ctemp," %lf",number[n]);
  426. strcat(errstr,ctemp);
  427. }
  428. strcat(errstr,"\n");
  429. fprintf(stdout,"INFO: %s\n",errstr);
  430. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  431. number[n] = number[m];
  432. cnt -= hdcnt;
  433. }
  434. pend = cnt-3;
  435. if(multi) {
  436. for(n=0, pe = pend;n<cnt;n+=5, pe -= 5)
  437. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[pe],number[pe+1],number[n+4]);
  438. } else {
  439. for(n=0, pe = pend;n<cnt;n+=3, pe -= 3)
  440. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n],number[pe],number[pe+1]);
  441. }
  442. fflush(stdout);
  443. }
  444. /************************************** TP_REVERSE_SEQUENCE ***************************************/
  445. void tp_reverse_sequence(int multi)
  446. {
  447. double totaldur;
  448. int tend, n, te;
  449. int m, hdcnt = ifactor;
  450. char ctemp[200];
  451. if(multi) {
  452. sprintf(errstr,"%lf",number[0]);
  453. for(n=1;n< hdcnt;n++) {
  454. sprintf(ctemp," %lf",number[n]);
  455. strcat(errstr,ctemp);
  456. }
  457. strcat(errstr,"\n");
  458. fprintf(stdout,"INFO: %s\n",errstr);
  459. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  460. number[n] = number[m];
  461. cnt -= hdcnt;
  462. }
  463. totaldur = 0.0;
  464. tend = cnt-4;
  465. if(multi) {
  466. for(n=0,te = tend;n<cnt;n+=5, te-=5) {
  467. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],totaldur,number[te+1],number[n+3],number[n+4]);
  468. totaldur += number[te] - number[te - 5];
  469. }
  470. } else {
  471. for(n=0,te = tend;n<cnt;n+=3, te-=3) {
  472. fprintf(stdout,"INFO: %lf %lf %lf\n",totaldur,number[te+1],number[n+2]);
  473. totaldur += number[te] - number[te - 3];
  474. }
  475. }
  476. fflush(stdout);
  477. }
  478. /************************************** TA_REVERSE_SEQUENCE ***************************************/
  479. void ta_reverse_sequence(int multi)
  480. {
  481. double totaldur;
  482. int tend, n, te;
  483. int m, hdcnt = ifactor;
  484. char ctemp[200];
  485. if(multi) {
  486. sprintf(errstr,"%lf",number[0]);
  487. for(n=1;n< hdcnt;n++) {
  488. sprintf(ctemp," %lf",number[n]);
  489. strcat(errstr,ctemp);
  490. }
  491. strcat(errstr,"\n");
  492. fprintf(stdout,"INFO: %s\n",errstr);
  493. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  494. number[n] = number[m];
  495. cnt -= hdcnt;
  496. }
  497. totaldur = 0.0;
  498. tend = cnt-4;
  499. if(multi) {
  500. for(n=0,te = tend;n<cnt;n+=5, te-=5) {
  501. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],totaldur,number[n+2],number[te+2],number[n+4]);
  502. totaldur += number[te] - number[te - 5];
  503. }
  504. } else {
  505. for(n=0,te = tend;n<cnt;n+=3, te-=3) {
  506. fprintf(stdout,"INFO: %lf %lf %lf\n",totaldur,number[n+1],number[te+2]);
  507. totaldur += number[te] - number[te - 3];
  508. }
  509. }
  510. fflush(stdout);
  511. }
  512. /************************************** TPA_REVERSE_SEQUENCE **************************************/
  513. void tpa_reverse_sequence(int multi)
  514. {
  515. double totaldur;
  516. int tend, te, n;
  517. int m, hdcnt = ifactor;
  518. char ctemp[200];
  519. if(multi) {
  520. sprintf(errstr,"%lf",number[0]);
  521. for(n=1;n< hdcnt;n++) {
  522. sprintf(ctemp," %lf",number[n]);
  523. strcat(errstr,ctemp);
  524. }
  525. strcat(errstr,"\n");
  526. fprintf(stdout,"INFO: %s\n",errstr);
  527. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  528. number[n] = number[m];
  529. cnt -= hdcnt;
  530. }
  531. totaldur = 0.0;
  532. tend = cnt-4;
  533. if(multi) {
  534. for(n = 0,te = tend;te >= 0;te-=5,n+=5) {
  535. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],totaldur,number[te+1],number[te+2],number[n+4]);
  536. totaldur += number[te] - number[te - 5];
  537. }
  538. } else {
  539. for(te = tend;te >= 0;te-=3) {
  540. fprintf(stdout,"INFO: %lf %lf %lf\n",totaldur,number[te+1],number[te+2]);
  541. totaldur += number[te] - number[te - 3];
  542. }
  543. }
  544. fflush(stdout);
  545. }
  546. /************************************** LOOP_SEQUENCE **************************************
  547. *
  548. * params are loopcnt and lastdur.
  549. */
  550. void loop_sequence(int multi)
  551. {
  552. int n, m, loopcnt = (int)factor;
  553. double lastdur = thresh, totaldur, basetime;
  554. int hdcnt = ifactor;
  555. char ctemp[200];
  556. if(multi) {
  557. sprintf(errstr,"%lf",number[0]);
  558. for(n=1;n< hdcnt;n++) {
  559. sprintf(ctemp," %lf",number[n]);
  560. strcat(errstr,ctemp);
  561. }
  562. strcat(errstr,"\n");
  563. fprintf(stdout,"INFO: %s\n",errstr);
  564. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  565. number[n] = number[m];
  566. cnt -= hdcnt;
  567. totaldur = number[cnt-4] + lastdur;
  568. } else {
  569. totaldur = number[cnt-3] + lastdur;
  570. }
  571. if(lastdur <= 0.0) {
  572. fprintf(stdout,"ERROR: final event duration is <= zero\n");
  573. fflush(stdout);
  574. exit(1);
  575. }
  576. if(loopcnt < 2) {
  577. fprintf(stdout,"ERROR: Loopcnt is <= 1\n");
  578. fflush(stdout);
  579. exit(1);
  580. }
  581. basetime = 0.0;
  582. for(n = 0; n<loopcnt; n++) {
  583. if(multi) {
  584. for(m=0;m < cnt; m+=5)
  585. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[m],number[m+1] + basetime,number[m+2],number[m+3],number[m+4]);
  586. } else {
  587. for(m=0;m < cnt; m+=3)
  588. fprintf(stdout,"INFO: %lf %lf %lf\n",number[m] + basetime,number[m+1],number[m+2]);
  589. }
  590. basetime += totaldur;
  591. }
  592. fflush(stdout);
  593. }
  594. /************************************** ABUT_SEQUENCES **************************************
  595. *
  596. * Read two tables, as strings, like 'jj'
  597. */
  598. void abut_sequences(int multi)
  599. {
  600. int n, m, hdcnt;
  601. double lasttime, time;
  602. char ctemp[264];
  603. if(factor <= 0.0) {
  604. fprintf(stdout,"ERROR: final event duration is less than or equal to zero\n");
  605. fflush(stdout);
  606. exit(1);
  607. }
  608. if(multi) {
  609. hdcnt = ifactor;
  610. sprintf(errstr,"%lf",number[0]);
  611. for(n=1;n< hdcnt;n++) {
  612. sprintf(ctemp," %lf",number[n]);
  613. strcat(errstr,ctemp);
  614. }
  615. strcat(errstr,"\n");
  616. fprintf(stdout,"INFO: %s\n",errstr);
  617. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  618. number[n] = number[m];
  619. cnt -= hdcnt;
  620. firstcnt -= hdcnt;
  621. for(n = 0; n < firstcnt; n+= 5)
  622. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1],number[n+2],number[n+3],number[n+4]);
  623. lasttime = number[n-4];
  624. lasttime += factor;
  625. for(n = firstcnt + hdcnt; n < cnt; n+= 5) {
  626. time = number[n+1] + lasttime;
  627. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],time,number[n+2],number[n+3],number[n+4]);
  628. }
  629. } else {
  630. for(n = 0; n < cnt; n+= 3)
  631. fprintf(stdout,"INFO: %s %s %s\n",strings[n],strings[n+1],strings[n+2]);
  632. lasttime = atof(strings[n-3]);
  633. lasttime += factor;
  634. for(n = cnt; n < stringscnt; n+= 3) {
  635. time = atof(strings[n]) + lasttime;
  636. sprintf(ctemp,"%lf",time);
  637. fprintf(stdout,"INFO: %s %s %s\n",ctemp,strings[n+1],strings[n+2]);
  638. }
  639. }
  640. fflush(stdout);
  641. }
  642. /************************************** SORT_SET **************************************/
  643. void sort_set(double *set,int setcnt)
  644. {
  645. int n, m;
  646. double dtemp;
  647. for(n=0;n<setcnt-1;n++) {
  648. for(m = n; m<setcnt; m++) {
  649. if(set[m] < set[n]) {
  650. dtemp = set[n];
  651. set[n] = set[m];
  652. set[m] = dtemp;
  653. }
  654. }
  655. }
  656. }
  657. /************************************** uptempo_sequence ****************************************
  658. *
  659. * parameter is tempo multiplier.
  660. */
  661. void uptempo_sequence(int multi)
  662. {
  663. int n;
  664. int m, hdcnt = ifactor;
  665. char ctemp[200];
  666. if(multi) {
  667. sprintf(errstr,"%lf",number[0]);
  668. for(n=1;n< hdcnt;n++) {
  669. sprintf(ctemp," %lf",number[n]);
  670. strcat(errstr,ctemp);
  671. }
  672. strcat(errstr,"\n");
  673. fprintf(stdout,"INFO: %s\n",errstr);
  674. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  675. number[n] = number[m];
  676. cnt -= hdcnt;
  677. }
  678. if(multi) {
  679. for(n=0;n<cnt;n+=5)
  680. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],number[n+1] * factor,number[n+2],number[n+3],number[n+4]);
  681. } else {
  682. for(n=0;n<cnt;n+=3)
  683. fprintf(stdout,"INFO: %lf %lf %lf\n",number[n] * factor,number[n+1],number[n+2]);
  684. }
  685. fflush(stdout);
  686. }
  687. /************************************** ACCEL_SEQUENCE ****************************************
  688. *
  689. * parameter is multiplier of final event-time, thresh is curve of accel.
  690. */
  691. void accel_sequence(int multi)
  692. {
  693. int n;
  694. double accel_step = (1.0/factor) - 1.0, lasttime;
  695. double convertor, frac, accel, time, dur;
  696. int m, hdcnt = ifactor;
  697. char ctemp[200];
  698. if(multi) {
  699. sprintf(errstr,"%lf",number[0]);
  700. for(n=1;n< hdcnt;n++) {lasttime = number[cnt-3];
  701. sprintf(ctemp," %lf",number[n]);
  702. strcat(errstr,ctemp);
  703. }
  704. strcat(errstr,"\n");
  705. fprintf(stdout,"INFO: %s\n",errstr);
  706. for(n = 0,m = hdcnt;m < cnt;n++, m++)
  707. number[n] = number[m];
  708. cnt -= hdcnt;
  709. lasttime = number[cnt-4];
  710. } else {
  711. lasttime = number[cnt-3];
  712. }
  713. convertor = 1.0/lasttime;
  714. if(multi) {
  715. for(n=0;n<cnt;n+=5) {
  716. frac = pow(number[n+1] * convertor,thresh);
  717. accel = 1.0 + (accel_step * frac);
  718. time = number[n+1] * accel;
  719. dur = number[n+4] * accel;
  720. fprintf(stdout,"INFO: %d %lf %lf %lf %lf\n",(int)number[n],time,number[n+2],number[n+3],dur);
  721. }
  722. } else {
  723. for(n=0;n<cnt;n+=3) {
  724. frac = pow(number[n] * convertor,thresh);
  725. accel = 1.0 + (accel_step * frac);
  726. time = number[n] * accel;
  727. fprintf(stdout,"INFO: %lf %lf %lf\n",time,number[n+1],number[n+2]);
  728. }
  729. }
  730. fflush(stdout);
  731. }
  732. /************************************** MEAN_TEMPO *****************************************/
  733. void mean_tempo(void)
  734. {
  735. factor = (double)(60 * (cnt-1))/(number[cnt-1] - number[0]);
  736. factor = (round(factor * 100.0))/100.0;
  737. fprintf(stdout,"WARNING: Mean Tempo is %.2lf (assuming times are approx evenly spaced)\n",factor);
  738. fflush(stdout);
  739. }
  740. /************************************** TIME_TO_CROTCHETS *****************************************/
  741. void time_to_crotchets(int beatvals) {
  742. double crotchet = factor;
  743. double semibrev = 4 * crotchet;
  744. double minim = 2 * crotchet;
  745. double quaver = crotchet / 2;
  746. double semiquav = crotchet / 4;
  747. double tripquav = crotchet / 3;
  748. double tripsemiquav = crotchet / 6;
  749. double demisemiquav = crotchet / 8;
  750. double trip = minim / 3;
  751. int n, m;
  752. int **adjusted;
  753. if ((adjusted = (int **)malloc(cnt * sizeof(int *)))==NULL) {
  754. fprintf(stdout,"ERROR: Insufficient memory\n");
  755. fflush(stdout);
  756. exit(1);
  757. }
  758. for(n=0;n<cnt;n++) {
  759. if ((adjusted[n] = (int *)malloc(cnt * sizeof(int)))==NULL) {
  760. fprintf(stdout,"ERROR: Insufficient memory\n");
  761. fflush(stdout);
  762. exit(1);
  763. }
  764. for(m=0;m<cnt;m++)
  765. adjusted[n][m] = 0;
  766. }
  767. do_search(semibrev,tripsemiquav,adjusted);
  768. do_search(minim,tripsemiquav,adjusted);
  769. do_search(crotchet,tripsemiquav,adjusted);
  770. do_search(tripquav,tripsemiquav/2,adjusted);
  771. do_search(trip,tripsemiquav/2,adjusted);
  772. do_search(quaver,demisemiquav,adjusted);
  773. do_search(semiquav,tripsemiquav/2,adjusted);
  774. if(beatvals) {
  775. for(n=1;n<cnt; n++)
  776. number[n-1] = number[n] - number[n-1];
  777. cnt--;
  778. }
  779. for(n=0;n<cnt;n++) {
  780. number[n] /= crotchet;
  781. number[n] = (round(number[n] * 1000))/1000.0;
  782. }
  783. for(n=0;n<cnt;n++)
  784. fprintf(stdout,"INFO: %lf\n",number[n]);
  785. fflush(stdout);
  786. }
  787. void do_search(double thisval,double error,int **adjusted) {
  788. int n, m;
  789. double up = thisval + error;
  790. double dn = thisval - error;
  791. double gap;
  792. for(n=0; n<cnt-1; n++) {
  793. for(m=n+1; m<cnt; m++) {
  794. if(adjusted[n][m])
  795. continue;
  796. gap = number[m] - number[n];
  797. if(gap > dn) {
  798. if(gap < up) {
  799. adjust_all_vals(thisval,gap,n,m);
  800. adjusted[n][m] = 1;
  801. } else
  802. break;
  803. }
  804. }
  805. }
  806. }
  807. void adjust_all_vals(double thisval,double gap,int n,int m) {
  808. int k;
  809. double thisgap;
  810. double adjust_within = thisval/gap;
  811. double discrep_beyond = thisval - gap;
  812. number[m] = number[n] + thisval;
  813. for(k = m+1; k < cnt; k++)
  814. number[k] += discrep_beyond;
  815. for(k = n+1; k < m; k++) {
  816. thisgap = number[k] - number[n];
  817. number[k] = number[n] + (thisgap * adjust_within);
  818. }
  819. }
  820. /************************************** ROTATE_LIST *****************************************/
  821. void rotate_list(int reversed)
  822. {
  823. int n;
  824. if(reversed) {
  825. for(n=1;n < stringscnt; n++)
  826. fprintf(stdout,"INFO: %s\n",strings[n]);
  827. fprintf(stdout,"INFO: %s\n",strings[0]);
  828. } else {
  829. fprintf(stdout,"INFO: %s\n",strings[stringscnt - 1]);
  830. for(n=0;n < stringscnt-1; n++)
  831. fprintf(stdout,"INFO: %s\n",strings[n]);
  832. }
  833. fflush(stdout);
  834. }
  835. /************************************** SPLICE_POS *****************************************/
  836. #define SHSECSIZE 256
  837. void splice_pos(void)
  838. {
  839. double splicelen = (number[cnt]+ .5)/1000.0;
  840. int srate = round(number[cnt+1]);
  841. int chans = round(number[cnt+2]);
  842. int chcnt = round(number[cnt+3]);
  843. int splen = round(splicelen * srate) * chans;
  844. int seccnt, k1, k2;
  845. int n;
  846. if(((seccnt = splen / SHSECSIZE) * SHSECSIZE) < splen)
  847. seccnt++;
  848. splen = seccnt * SHSECSIZE;
  849. splen /= chcnt;
  850. for(n=0;n<cnt;n++) {
  851. if((k1 = round(number[n]) - splen) < 0) {
  852. fprintf(stdout,"ERROR: Splice falls before zero.\n");
  853. exit(1);
  854. }
  855. }
  856. for(n=0;n<cnt;n++) {
  857. k1 = round(number[n]) - splen;
  858. k2 = round(number[n]) + splen;
  859. fprintf(stdout,"INFO: %d %d\n",k1,k2);
  860. }
  861. fflush(stdout);
  862. }
  863. /************************************** WARP_TIMES *****************************************/
  864. void time_warp(void)
  865. {
  866. int m, n;
  867. double thistime, nexttime, lasttime = 0.0, thisval, nextval, step, frac, val, sum, gap;
  868. m = firstcnt;
  869. for(n=0;n<firstcnt;n++) {
  870. if(n==0) {
  871. if(!(flteq(number[n],0.0))) {
  872. fprintf(stdout,"ERROR: Invalid 1st value %lf in list of times (must be ZERO)\n",number[n]);
  873. exit(1);
  874. }
  875. number[n] = 0.0;
  876. lasttime = number[n];
  877. } else if(number[n] <= lasttime) {
  878. fprintf(stdout,"ERROR: Times, in list of times, must be in increasing order\n");
  879. exit(1);
  880. }
  881. }
  882. for(m=firstcnt+1;m<cnt;m+=2) {
  883. if(number[m] < FLTERR) {
  884. fprintf(stdout,"ERROR: Invalid value %lf in warping file (must be > 0)\n",number[m]);
  885. exit(1);
  886. }
  887. }
  888. fprintf(stdout,"INFO: %lf\n",0.0);
  889. sum = 0.0;
  890. m = firstcnt;
  891. for(n=1;n<firstcnt;n++) {
  892. while(number[m] <= number[n]) {
  893. if((m += 2) >= cnt)
  894. break;
  895. }
  896. if(m < cnt) {
  897. nexttime = number[m];
  898. nextval = number[m+1];
  899. thistime = number[m-2];
  900. thisval = number[m-1];
  901. step = nexttime - thistime;
  902. frac = (number[n] - thistime)/step;
  903. val = ((nextval - thisval) * frac) + thisval;
  904. } else {
  905. val = number[cnt-1];
  906. }
  907. gap = number[n] - number[n-1];
  908. val *= gap;
  909. sum += val;
  910. fprintf(stdout,"INFO: %lf\n",sum);
  911. }
  912. fflush(stdout);
  913. }
  914. /************************************** LIST_WARP *****************************************/
  915. void list_warp(void)
  916. {
  917. int m, n;
  918. int sizz = firstcnt-1;
  919. double index, thistime, nexttime, lasttime, thisval, nextval, step, frac, val;
  920. m = firstcnt;
  921. if(!flteq(number[firstcnt],0.0)) {
  922. fprintf(stdout,"ERROR: First time in warping file must be ZERO\n");
  923. exit(1);
  924. }
  925. number[firstcnt] = 0.0;
  926. lasttime = number[cnt-2];
  927. for(m=firstcnt;m<cnt;m+=2)
  928. number[m] /= lasttime;
  929. m = firstcnt;
  930. for(n=0;n<firstcnt;n++) {
  931. index = (double)n/(double)sizz;
  932. while(number[m] <= index) {
  933. if((m += 2) >= cnt)
  934. break;
  935. }
  936. if(m < cnt) {
  937. nexttime = number[m];
  938. nextval = number[m+1];
  939. thistime = number[m-2];
  940. thisval = number[m-1];
  941. step = nexttime - thistime;
  942. frac = (index - thistime)/step;
  943. val = ((nextval - thisval) * frac) + thisval;
  944. } else
  945. val = number[cnt-1];
  946. fprintf(stdout,"INFO: %lf\n",number[n] * val);
  947. }
  948. fflush(stdout);
  949. }
  950. /************************************** BRKWARP_TIMES *****************************************/
  951. void brktime_warp(void)
  952. {
  953. int m, n;
  954. double thistime, nexttime, thisval, nextval, step, frac, val, gap, sum;
  955. for(m=firstcnt+1;m<cnt;m+=2) {
  956. if(number[m] < FLTERR) {
  957. fprintf(stdout,"ERROR: Invalid value %lf in warping file (must be > 0)\n",number[m]);
  958. exit(1);
  959. }
  960. }
  961. if(!flteq(number[0],0.0)) {
  962. fprintf(stdout,"ERROR: Breakpoint file to BE warped must begin at time ZERO\n");
  963. exit(1);
  964. }
  965. number[0] = 0.0;
  966. fprintf(stdout,"INFO: %lf %lf\n",number[0], number[1]);
  967. sum = 0.0;
  968. m = firstcnt;
  969. for(n=2;n<firstcnt;n+=2) {
  970. while(number[m] <= number[n]) {
  971. if((m += 2) >= cnt)
  972. break;
  973. }
  974. if(m < cnt) {
  975. nexttime = number[m];
  976. nextval = number[m+1];
  977. thistime = number[m-2];
  978. thisval = number[m-1];
  979. step = nexttime - thistime;
  980. frac = (number[n] - thistime)/step;
  981. val = ((nextval - thisval) * frac) + thisval;
  982. } else {
  983. val = number[cnt-1];
  984. }
  985. gap = number[n] - number[n-2];
  986. val *= gap;
  987. sum += val;
  988. fprintf(stdout,"INFO: %lf %lf\n",sum, number[n+1]);
  989. }
  990. fflush(stdout);
  991. }
  992. /************************************** SEQWARP_TIMES *****************************************/
  993. void seqtime_warp(void)
  994. {
  995. int m, n, OK = 1;
  996. double thistime, nexttime, thisval, nextval, step, frac, val, gap, sum, lasttime;
  997. if(((firstcnt/3) * 3) != firstcnt)
  998. OK = 0;
  999. else if(!flteq(number[0],0.0))
  1000. OK = 0;
  1001. else {
  1002. number[0] = 0.0;
  1003. lasttime = number[0];
  1004. for(n=3;n<firstcnt;n+=3) {
  1005. if(number[n] <= lasttime) {
  1006. OK = 0;
  1007. break;
  1008. }
  1009. lasttime = number[n];
  1010. }
  1011. }
  1012. if(!OK) {
  1013. fprintf(stdout,"ERROR: First file is not a valid sequnce file.\n");
  1014. exit(1);
  1015. }
  1016. m = firstcnt;
  1017. for(m=firstcnt+1;m<cnt;m+=2) {
  1018. if(number[m] < FLTERR) {
  1019. fprintf(stdout,"ERROR: Invalid value %lf in warping file (must be > 0)\n",number[m]);
  1020. exit(1);
  1021. }
  1022. }
  1023. if(!flteq(number[0],0.0)) {
  1024. fprintf(stdout,"ERROR: Breakpoint file to BE warped must begin at time ZERO\n");
  1025. exit(1);
  1026. }
  1027. number[0] = 0.0;
  1028. fprintf(stdout,"INFO: %lf %lf %lf\n",number[0],number[1],number[2]);
  1029. sum = 0.0;
  1030. m = firstcnt;
  1031. for(n=3;n<firstcnt;n+=3) {
  1032. while(number[m] <= number[n]) {
  1033. if((m += 2) >= cnt)
  1034. break;
  1035. }
  1036. if(m < cnt) {
  1037. nexttime = number[m];
  1038. nextval = number[m+1];
  1039. thistime = number[m-2];
  1040. thisval = number[m-1];
  1041. step = nexttime - thistime;
  1042. frac = (number[n] - thistime)/step;
  1043. val = ((nextval - thisval) * frac) + thisval;
  1044. } else {
  1045. val = number[cnt-1];
  1046. }
  1047. gap = number[n] - number[n-3];
  1048. val *= gap;
  1049. sum += val;
  1050. fprintf(stdout,"INFO: %lf %lf %lf\n",sum, number[n+1], number[n+2]);
  1051. }
  1052. fflush(stdout);
  1053. }
  1054. /************************************** BRKVAL_WARP *****************************************/
  1055. void brkval_warp(void)
  1056. {
  1057. int m, n;
  1058. double thistime, nexttime, thisval, nextval, step, frac, val;
  1059. if(!flteq(number[0],0.0)) {
  1060. fprintf(stdout,"ERROR: Breakpoint file to BE warped must begin at time ZERO\n");
  1061. exit(1);
  1062. }
  1063. if(!flteq(number[firstcnt],0.0)) {
  1064. fprintf(stdout,"ERROR: Warping file must begin at time ZERO\n");
  1065. exit(1);
  1066. }
  1067. m = firstcnt;
  1068. for(n=2;n<firstcnt;n+=2) {
  1069. while(number[m] <= number[n]) {
  1070. if((m += 2) >= cnt)
  1071. break;
  1072. }
  1073. if(m < cnt) {
  1074. nexttime = number[m];
  1075. nextval = number[m+1];
  1076. thistime = number[m-2];
  1077. thisval = number[m-1];
  1078. step = nexttime - thistime;
  1079. frac = (number[n] - thistime)/step;
  1080. val = ((nextval - thisval) * frac) + thisval;
  1081. } else
  1082. val = number[cnt-1];
  1083. fprintf(stdout,"INFO: %lf %lf\n",number[n], number[n+1] * val);
  1084. }
  1085. fflush(stdout);
  1086. }
  1087. /************************************** DUPLICATE_LIST_AT_STEP *****************************************/
  1088. void duplicate_list_at_step(void)
  1089. {
  1090. int n, m;
  1091. double base = 0.0;
  1092. double step = number[cnt+1];
  1093. ifactor = round(number[cnt]);
  1094. step = number[cnt-1] - number[0] + step;
  1095. for(m=0;m<ifactor;m++) {
  1096. for(n=0;n<cnt;n++)
  1097. fprintf(stdout,"INFO: %lf\n",number[n] + base);
  1098. base += step;
  1099. }
  1100. fflush(stdout);
  1101. }
  1102. /************************************ TW_PSEUDO_EXP ************************************/
  1103. void tw_pseudo_exp(void)
  1104. {
  1105. double bottime = number[0];
  1106. double toptime = number[1];
  1107. double botval = number[2];
  1108. double topval = number[3];
  1109. double timefrac = 0.5, valfrac = 0.333333333333, step;
  1110. int valbase = ifactor+1;
  1111. int div, n, index;
  1112. int mask = 1, span;
  1113. cnt = ifactor;
  1114. if(topval < botval)
  1115. valfrac *= 2.0;
  1116. while(mask < (cnt>>1)) {
  1117. if(cnt & mask) {
  1118. fprintf(stdout,"ERROR: Number of steps must be a multiple of 2.\n");
  1119. fflush(stdout);
  1120. exit(1);
  1121. }
  1122. mask <<= 1;
  1123. }
  1124. free(number);
  1125. if((number = (double *)malloc((cnt+1) * 2 * sizeof(double)))==NULL) {
  1126. fprintf(stdout,"ERROR: Insufficient memory to store interpolated values.\n");
  1127. fflush(stdout);
  1128. exit(1);
  1129. }
  1130. number[0] = bottime;
  1131. number[cnt] = toptime;
  1132. number[cnt+1] = botval;
  1133. number[(cnt*2)+1] = topval;
  1134. div = 2;
  1135. span = cnt/2;
  1136. while(div <= cnt) {
  1137. n = 1;
  1138. while(n < div) {
  1139. index = (cnt * n)/div; /* ODD denominators, factor of 2 numerators */
  1140. step = number[index+span] - number[index-span]; /* i.e. 1/2 : 1/4,3/4 : 1/8,3/8,5/8,7/8 etc */
  1141. step *= timefrac;
  1142. number[index] = number[index-span] + step;
  1143. step = number[valbase+index+span] - number[valbase+index-span];
  1144. step *= valfrac;
  1145. number[valbase+index] = number[valbase+index-span] + step;
  1146. n += 2;
  1147. }
  1148. div *= 2;
  1149. span /= 2;
  1150. }
  1151. for(n=0; n<= cnt;n++)
  1152. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[valbase+n]);
  1153. fflush(stdout);
  1154. }
  1155. /****************************** REVERSE_TIME_INTERVALS2 ******************************/
  1156. void reverse_time_intervals2(void)
  1157. {
  1158. int n;
  1159. double k = number[0];
  1160. fprintf(stdout,"INFO: %lf\n",k);
  1161. for(n = cnt-1;n>=1;n--) {
  1162. k += (number[n] - number[n-1]);
  1163. fprintf(stdout,"INFO: %lf\n",k);
  1164. }
  1165. fflush(stdout);
  1166. }
  1167. /****************************** INTERP_N_VALS ******************************/
  1168. void interp_n_vals(void)
  1169. {
  1170. int n, m, subcnt = cnt - 1;
  1171. double k, difdiv, diff;
  1172. if(ifactor < 1) {
  1173. fprintf(stdout,"ERROR: Invalid number (%d) of interpolated values\n",ifactor);
  1174. fflush(stdout);
  1175. exit(1);
  1176. }
  1177. ifactor++;
  1178. difdiv = (double)ifactor;
  1179. for(n = 0;n< subcnt;n++) {
  1180. k = number[n];
  1181. diff = (number[n+1] - k)/difdiv;
  1182. for(m=0;m<ifactor;m++) {
  1183. fprintf(stdout,"INFO: %lf\n",k);
  1184. k += diff;
  1185. }
  1186. }
  1187. fprintf(stdout,"INFO: %lf\n",number[n]);
  1188. fflush(stdout);
  1189. }
  1190. /************************************** GENERAL *****************************************/
  1191. #ifdef NOTDEF
  1192. /*RWD May 2005 lets keepo to one definition in sfsys */
  1193. void
  1194. initrand48()
  1195. {
  1196. srand(time((time_t *)0));
  1197. }
  1198. double
  1199. drand48()
  1200. {
  1201. return (double)rand()/(double)RAND_MAX;
  1202. }
  1203. #endif
  1204. /**************************** WARPED_TIMES *****************************/
  1205. void warped_times(int isdiff)
  1206. {
  1207. int j, k, m, n, lastn, numcnt = cnt - firstcnt, itemp;
  1208. double endtime, endval, frac, val = 0.0, thistime, timediff=0.0, valdiff=0.0, sum, dtemp;
  1209. double timestep = (double)128/48000.0;
  1210. /* This is default window length for standard PVOC analysis under CDP, at srate 48000 (windows 1024 samps: decimation 8)*/
  1211. /* However, the timestep, so long as sufficiently small, is not critical, except for very long time stretches */
  1212. double *vals = (double *)exmalloc(numcnt*sizeof(double));
  1213. int *perm = (int *)exmalloc(numcnt*sizeof(int));
  1214. int *perm2 = (int *)exmalloc(numcnt*sizeof(int));
  1215. for(n = 0;n < numcnt;n++)
  1216. perm[n] = n;
  1217. for(k = 0,n = firstcnt; n < cnt-1; n++,k++) { /* SORT NUMBERS TO ASCending ORDER, AND NOTE PERMUTATION OF POSITIONS */
  1218. m = n+1;
  1219. j = k+1;
  1220. while(m < cnt) {
  1221. if(number[m] < number[n]) {
  1222. dtemp = number[m];
  1223. number[m] = number[n];
  1224. number[n] = dtemp;
  1225. itemp = perm[j];
  1226. perm[j] = perm[k];
  1227. perm[k] = itemp;
  1228. }
  1229. m++;
  1230. j++;
  1231. }
  1232. }
  1233. for(n=0;n<cnt;n++) { /* 'INVERT' THE POSITION PERM */
  1234. for(m=0;m<cnt;m++) {
  1235. if(perm[m] == n) {
  1236. perm2[n] = m;
  1237. break;
  1238. }
  1239. }
  1240. }
  1241. perm = perm2;
  1242. endtime = number[firstcnt-2];
  1243. endval = number[firstcnt-1];
  1244. thistime = 0.0;
  1245. sum = 0.0;
  1246. n = 0;
  1247. k = 0;
  1248. for(m=firstcnt;m<cnt;m++) {
  1249. while(thistime < number[m]) {
  1250. if(thistime >= endtime) {
  1251. val = endval;
  1252. } else if(thistime <= number[0]) {
  1253. val = number[1];
  1254. } else {
  1255. lastn = n;
  1256. while(thistime > number[n])
  1257. n += 2;
  1258. if(n != lastn) {
  1259. timediff = (number[n] - number[n-2]);
  1260. valdiff = (number[n+1] - number[n-1]);
  1261. }
  1262. frac = (thistime - number[n-2])/timediff;
  1263. val = (valdiff * frac) + number[n-1];
  1264. }
  1265. sum += val;
  1266. thistime += timestep;
  1267. }
  1268. val = sum * timestep;
  1269. if(isdiff)
  1270. vals[k++] = val - number[m];
  1271. else
  1272. vals[k++] = val;
  1273. }
  1274. for(n=0;n<numcnt;n++)
  1275. fprintf(stdout,"INFO: %lf\n",vals[perm[n]]);
  1276. fflush(stdout);
  1277. }
  1278. /**************************** CUMULADD *****************************/
  1279. void cumuladd(void)
  1280. {
  1281. int n;
  1282. double upstep = number[cnt];
  1283. fprintf(stdout,"INFO: %lf\n",number[0]);
  1284. for(n=1;n<cnt;n++) {
  1285. fprintf(stdout,"INFO: %lf\n",number[n] + upstep);
  1286. upstep += number[cnt];
  1287. }
  1288. fflush(stdout);
  1289. }
  1290. /**************************** TW_PSUEDOPAN *****************************/
  1291. void tw_psuedopan(void)
  1292. {
  1293. double inner_width = number[0], outer_width = number[1];
  1294. double startpos = number[2], time_propor = number[3];
  1295. double bakfrth_dur = number[4], duration = number[5];
  1296. int leftwards = round(number[6]);
  1297. double time = 0;
  1298. double *vals;
  1299. double large_tstep, small_tstep;
  1300. double left_pos, far_left_pos, right_pos, far_right_pos;
  1301. double dist_from_left, prop_dist;
  1302. double nexttimestep = -1.0;
  1303. int n, dostop = 0, cycle_point, valcnt = (int)floor(duration/bakfrth_dur) + 3;
  1304. valcnt *= 12;
  1305. if((vals = (double *)malloc(valcnt * sizeof(double)))==NULL) {
  1306. fprintf(stdout,"ERROR: Insufficient memory to store pan data.\n");
  1307. fflush(stdout);
  1308. exit(1);
  1309. }
  1310. small_tstep = bakfrth_dur * time_propor;
  1311. large_tstep = bakfrth_dur - small_tstep;
  1312. small_tstep /= 4.0;
  1313. large_tstep /= 2.0;
  1314. left_pos = -inner_width;
  1315. far_left_pos = -outer_width;
  1316. right_pos = inner_width;
  1317. far_right_pos = outer_width;
  1318. if(flteq(startpos,far_left_pos)) {
  1319. nexttimestep = small_tstep;
  1320. cycle_point = 0;
  1321. } else if(flteq(startpos,left_pos)) {
  1322. if(leftwards == 0) {
  1323. nexttimestep = large_tstep;
  1324. cycle_point = 1;
  1325. } else {
  1326. nexttimestep = small_tstep;
  1327. cycle_point = 5;
  1328. }
  1329. } else if(flteq(startpos,right_pos)) {
  1330. if(leftwards == 0) {
  1331. nexttimestep = small_tstep;
  1332. cycle_point = 2;
  1333. } else {
  1334. nexttimestep = large_tstep;
  1335. cycle_point = 4;
  1336. }
  1337. } else if(flteq(startpos,far_right_pos)) {
  1338. nexttimestep = small_tstep;
  1339. cycle_point = 3;
  1340. } else if(startpos < left_pos) {
  1341. dist_from_left = startpos - far_left_pos;
  1342. prop_dist = dist_from_left/(left_pos - far_left_pos);
  1343. if(leftwards == 0) {
  1344. cycle_point = 0;
  1345. nexttimestep = small_tstep * (1.0 - prop_dist);
  1346. } else {
  1347. cycle_point = 5;
  1348. nexttimestep = small_tstep * prop_dist;
  1349. }
  1350. } else if(startpos < right_pos) {
  1351. dist_from_left = startpos - left_pos;
  1352. prop_dist = dist_from_left/(right_pos - left_pos);
  1353. if(leftwards == 0) {
  1354. cycle_point = 1;
  1355. nexttimestep = large_tstep * (1.0 - prop_dist);
  1356. } else {
  1357. cycle_point = 4;
  1358. nexttimestep = large_tstep * prop_dist;
  1359. }
  1360. } else {
  1361. dist_from_left = startpos - right_pos;
  1362. prop_dist = dist_from_left/(far_right_pos - right_pos);
  1363. if(leftwards == 0) {
  1364. cycle_point = 2;
  1365. nexttimestep = small_tstep * (1.0 - prop_dist);
  1366. } else {
  1367. cycle_point = 3;
  1368. nexttimestep = small_tstep * prop_dist;
  1369. }
  1370. }
  1371. n = 0;
  1372. if(n + 12 >= valcnt) {
  1373. fprintf(stdout,"ERROR: Internal error calculating memory required.\n");
  1374. fflush(stdout);
  1375. exit(1);
  1376. }
  1377. switch(cycle_point) {
  1378. case(0):
  1379. vals[n++] = time;
  1380. vals[n++] = startpos;
  1381. time += nexttimestep;
  1382. nexttimestep = -1.0;
  1383. if(time >= duration)
  1384. dostop = 1;
  1385. /* fall thro */
  1386. case(1):
  1387. vals[n++] = time;
  1388. if(dostop) {
  1389. dostop++;
  1390. break;
  1391. }
  1392. if(nexttimestep > 0.0) {
  1393. vals[n++] = startpos;
  1394. time += nexttimestep;
  1395. nexttimestep = -1.0;
  1396. } else {
  1397. vals[n++] = left_pos;
  1398. time += large_tstep;
  1399. }
  1400. if(time >= duration)
  1401. dostop = 1;
  1402. /* fall thro */
  1403. case(2):
  1404. vals[n++] = time;
  1405. if(dostop) {
  1406. dostop++;
  1407. break;
  1408. }
  1409. if(nexttimestep > 0.0) {
  1410. vals[n++] = startpos;
  1411. time += nexttimestep;
  1412. nexttimestep = -1.0;
  1413. } else {
  1414. vals[n++] = right_pos;
  1415. time += small_tstep;
  1416. }
  1417. if(time >= duration)
  1418. dostop = 1;
  1419. /* fall thro */
  1420. case(3):
  1421. vals[n++] = time;
  1422. if(dostop) {
  1423. dostop++;
  1424. break;
  1425. }
  1426. if(nexttimestep > 0.0) {
  1427. vals[n++] = startpos;
  1428. time += nexttimestep;
  1429. nexttimestep = -1.0;
  1430. } else {
  1431. vals[n++] = far_right_pos;
  1432. time += small_tstep;
  1433. }
  1434. if(time >= duration)
  1435. dostop = 1;
  1436. /* fall thro */
  1437. case(4):
  1438. vals[n++] = time;
  1439. if(dostop) {
  1440. dostop++;
  1441. break;
  1442. }
  1443. if(nexttimestep > 0.0) {
  1444. vals[n++] = startpos;
  1445. time+= nexttimestep;
  1446. nexttimestep = -1.0;
  1447. } else {
  1448. vals[n++] = right_pos;
  1449. time += large_tstep;
  1450. }
  1451. if(time >= duration)
  1452. dostop = 1;
  1453. /* fall thro */
  1454. case(5):
  1455. vals[n++] = time;
  1456. if(dostop) {
  1457. dostop++;
  1458. break;
  1459. }
  1460. if(nexttimestep > 0.0) {
  1461. vals[n++] = startpos;
  1462. time+= nexttimestep;
  1463. nexttimestep = -1.0;
  1464. } else {
  1465. vals[n++] = left_pos;
  1466. time += small_tstep;
  1467. }
  1468. if(time >= duration)
  1469. dostop = 1;
  1470. break;
  1471. }
  1472. if(dostop < 2) {
  1473. for (;;) {
  1474. if(n + 12 >= valcnt) {
  1475. fprintf(stdout,"ERROR: Internal error calculating memory required.\n");
  1476. fflush(stdout);
  1477. exit(1);
  1478. }
  1479. vals[n++] = time;
  1480. vals[n++] = far_left_pos;
  1481. if(dostop)
  1482. break;
  1483. time += small_tstep;
  1484. if(time >= duration)
  1485. dostop = 1;
  1486. vals[n++] = time;
  1487. vals[n++] = left_pos;
  1488. if(dostop)
  1489. break;
  1490. time += large_tstep;
  1491. if(time >= duration)
  1492. dostop = 1;
  1493. vals[n++] = time;
  1494. vals[n++] = right_pos;
  1495. if(dostop)
  1496. break;
  1497. time += small_tstep;
  1498. if(time >= duration)
  1499. dostop = 1;
  1500. vals[n++] = time;
  1501. vals[n++] = far_right_pos;
  1502. if(dostop)
  1503. break;
  1504. time += small_tstep;
  1505. if(time >= duration)
  1506. dostop = 1;
  1507. vals[n++] = time;
  1508. vals[n++] = right_pos;
  1509. if(dostop)
  1510. break;
  1511. time += large_tstep;
  1512. if(time >= duration)
  1513. dostop = 1;
  1514. vals[n++] = time;
  1515. vals[n++] = left_pos;
  1516. if(dostop)
  1517. break;
  1518. time += small_tstep;
  1519. if(time >= duration)
  1520. dostop = 1;
  1521. }
  1522. }
  1523. valcnt = n;
  1524. for(n = 0;n < valcnt; n +=2) {
  1525. fprintf(stdout,"INFO: %lf %lf\n",vals[n],vals[n+1]);
  1526. }
  1527. fflush(stdout);
  1528. }
  1529. /**************************** SINJOIN *****************************/
  1530. void sinjoin(char c)
  1531. {
  1532. double startval = number[0], endval = number[1];
  1533. double starttime = number[2], endtime = number[3];
  1534. int n, pointcnt = (int)round(number[4]), inverse = 0;
  1535. double val = 0.0, valdiff = endval - startval;
  1536. double timediff = endtime - starttime;
  1537. double timestep = timediff/(double)pointcnt;
  1538. double startrad = 0.0;
  1539. double nstep_cosin = (PI/(double)pointcnt);
  1540. double nstep_sin = (PI/(2.0 * (double)pointcnt));
  1541. if((c == 'x' && valdiff < 0.0) || (c=='v' && valdiff > 0.0)) {
  1542. inverse = 1;
  1543. nstep_sin = -nstep_sin;
  1544. startrad = PI/2.0;
  1545. } else if(c=='c')
  1546. startrad = PI;
  1547. fprintf(stdout,"INFO: %lf %lf\n",starttime,startval);
  1548. for(n = 1; n< pointcnt;n++) {
  1549. switch(c) {
  1550. case('c'):
  1551. startrad += nstep_cosin;
  1552. val = (cos(startrad) + 1.0) / 2.0;
  1553. break;
  1554. case('v'):
  1555. case('x'):
  1556. startrad += nstep_sin;
  1557. val = sin(startrad);
  1558. if(inverse)
  1559. val = 1.0 - val;
  1560. break;
  1561. }
  1562. val *= valdiff;
  1563. val += startval;
  1564. starttime += timestep;
  1565. fprintf(stdout,"INFO: %lf %lf\n",starttime,val);
  1566. }
  1567. fprintf(stdout,"INFO: %lf %lf\n",endtime,endval);
  1568. fflush(stdout);
  1569. }
  1570. /************************************** BRKTIME_OWARP *****************************************/
  1571. void brktime_owarp(void)
  1572. {
  1573. int m, n;
  1574. double thistime, nexttime, thisval, nextval, step, frac, val, gap, sum;
  1575. for(m=firstcnt+1;m<cnt;m+=2) {
  1576. if(number[m] < FLTERR) {
  1577. fprintf(stdout,"ERROR: Invalid value %lf in warping file (must be > 0)\n",number[m]);
  1578. exit(1);
  1579. }
  1580. }
  1581. if(!flteq(number[0],0.0)) {
  1582. fprintf(stdout,"ERROR: Breakpoint file to BE warped must begin at time ZERO\n");
  1583. exit(1);
  1584. }
  1585. number[0] = 0.0;
  1586. fprintf(stdout,"INFO: %lf %lf\n",number[0], number[1]);
  1587. sum = 0.0;
  1588. n = 2;
  1589. m = firstcnt;
  1590. for(;;) {
  1591. while(number[m] <= sum) {
  1592. if((m += 2) >= cnt)
  1593. break;
  1594. }
  1595. if(m >= cnt)
  1596. val = number[cnt-1];
  1597. else {
  1598. nexttime = number[m];
  1599. nextval = number[m+1];
  1600. thistime = number[m-2];
  1601. thisval = number[m-1];
  1602. step = nexttime - thistime;
  1603. frac = (sum - thistime)/step;
  1604. val = ((nextval - thisval) * frac) + thisval;
  1605. }
  1606. gap = number[n] - number[n-2];
  1607. val *= gap;
  1608. sum += val;
  1609. fprintf(stdout,"INFO: %lf %lf\n",sum, number[n+1]);
  1610. if((n += 2) >= firstcnt)
  1611. break;
  1612. }
  1613. fflush(stdout);
  1614. }