columns4.c 53 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838
  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. void sort_numbers(int *);
  23. /***************************** PRINT_NUMBERS() ************************/
  24. void print_numbers(void)
  25. {
  26. int n;
  27. for(n=0;n<cnt;n++)
  28. do_valout_flush(number[n]);
  29. }
  30. /********************** REMOVE_FRQ_PITCHCLASS_DUPLICATES ******************/
  31. void remove_frq_pitchclass_duplicates(void)
  32. {
  33. int n, m, k, failed = 0, move;
  34. double interval;
  35. k = cnt-ifactor;
  36. for(n=0;n<k;n++) {
  37. for(m=1;m<=ifactor;m++) {
  38. if(n+m >= cnt)
  39. break;
  40. interval = log(number[n]/number[n+m])/LOG_2_TO_BASE_E;
  41. interval = fmod(fabs(interval),1.0);
  42. if(interval<ONEMAX || interval>ONEMIN) {
  43. if((move = f_repos(n+m))<0) {
  44. failed++;
  45. } else {
  46. n += move; /* list shuffled forward, or not */
  47. m--; /* m+1th item now at m */
  48. }
  49. }
  50. }
  51. }
  52. if(failed)
  53. fprintf(stdout,"WARNING: %d Items failed to be separated.\n",failed);
  54. print_numbers();
  55. }
  56. /***************************** COUNT_ITEMS ****************************/
  57. void count_items(char *filename)
  58. {
  59. char *p;
  60. char temp[10000];
  61. cnt = 0;
  62. if((fp[0] = fopen(filename,"r"))==NULL) {
  63. fprintf(stdout,"ERROR: Cannot open infile %s\n",filename);
  64. fflush(stdout);
  65. exit(1);
  66. }
  67. while(fgets(temp,200,fp[0])!=NULL) {
  68. p = temp;
  69. if(ro=='l') {
  70. cnt++;
  71. } else {
  72. while(strgetfloat(&p,&factor)) {
  73. switch(condit) {
  74. case(0): cnt++; break;
  75. case('>'): if(factor>thresh) cnt++; break;
  76. case('<'): if(factor<thresh) cnt++; break;
  77. }
  78. }
  79. }
  80. }
  81. fclose(fp[0]);
  82. sprintf(errstr,"%d items",cnt);
  83. if(condit) {
  84. sprintf(temp," %c %lf",condit,thresh);
  85. strcat(errstr,temp);
  86. }
  87. strcat(errstr,"\n");
  88. if(!sloom && !sloombatch)
  89. fprintf(stdout,"%s\n",errstr);
  90. else
  91. fprintf(stdout,"WARNING: %s\n",errstr);
  92. fflush(stdout);
  93. }
  94. /**************************** ACCEL_TIME_SEQ ******************/
  95. void accel_time_seq(void)
  96. {
  97. int n;
  98. double q;
  99. if(cnt<2 || cnt>3) {
  100. fprintf(stdout,"ERROR: Input file must have either 2 or 3 vals.\n");
  101. fflush(stdout);
  102. exit(1);
  103. }
  104. if(cnt==3) q = number[2]; /* q = starttime */
  105. else q = 0.0;
  106. cnt = timevents(0.0,factor,number[0],number[1]);
  107. for(n=0;n<cnt;n++)
  108. do_valout(pos[n] + q);
  109. fflush(stdout);
  110. }
  111. /**************************** ACCEL_DURATIONS *****************************/
  112. void accel_durations(void)
  113. {
  114. int n;
  115. if(cnt!=2) {
  116. fprintf(stdout,"ERROR: Input file must have 2 vals.\n");
  117. fflush(stdout);
  118. exit(1);
  119. }
  120. cnt = timevents(0.0,factor,number[0],number[1]);
  121. do_valout(number[0]);
  122. for(n=1;n<cnt;n++)
  123. do_valout(pos[n]-pos[n-1]);
  124. fflush(stdout);
  125. }
  126. /************************ SEPARATE_COLUMNS_TO_FILES *********************/
  127. void separate_columns_to_files(void)
  128. {
  129. int n, m, k;
  130. if((firstcnt = cnt/outfilecnt)*outfilecnt!=cnt) {
  131. fprintf(stdout,
  132. "ERROR: Number of vals in input file does not divide exactly %d outfiles\n",outfilecnt);
  133. fflush(stdout);
  134. exit(1);
  135. }
  136. for(n=0;n<outfilecnt;n++) {
  137. sprintf(temp,"%d",n);
  138. strcpy(thisfilename,filename);
  139. strcat(thisfilename,"_");
  140. strcat(thisfilename,temp);
  141. strcat(thisfilename,".txt");
  142. if(!sloom) {
  143. if((fp[1] = fopen(thisfilename,"w"))==NULL) {
  144. fprintf(stdout,"ERROR: Cannot open file %s to write.\n",thisfilename);
  145. fflush(stdout);
  146. exit(1);
  147. } else {
  148. fprintf(stdout,"Writing to file %s\n",thisfilename);
  149. }
  150. }
  151. k = n;
  152. for(m=0;m<firstcnt;m++) {
  153. do_valout(number[k]);
  154. k += outfilecnt;
  155. }
  156. if(!sloom)
  157. fclose(fp[1]);
  158. }
  159. fflush(stdout);
  160. }
  161. /************************* PARTITION_VALUES_TO_FILES ********************/
  162. void partition_values_to_files(void)
  163. {
  164. int n,m,k;
  165. firstcnt = cnt/outfilecnt;
  166. if(firstcnt * outfilecnt!= cnt)
  167. firstcnt++;
  168. k = 0;
  169. for(n=0;n<outfilecnt;n++) {
  170. sprintf(temp,"%d",n);
  171. strcpy(thisfilename,filename);
  172. strcat(thisfilename,".");
  173. strcat(thisfilename,temp);
  174. if(!sloom) {
  175. if((fp[1] = fopen(thisfilename,"w"))==NULL) {
  176. fprintf(stdout,"ERROR: Cannot open file %s to write.\n",thisfilename);
  177. fflush(stdout);
  178. exit(1);
  179. } else {
  180. fprintf(stdout,"Writing to file %s\n",thisfilename);
  181. }
  182. }
  183. if(n==outfilecnt-1)
  184. firstcnt = cnt - k;
  185. for(m=0;m<firstcnt;m++,k++)
  186. do_valout(number[k]);
  187. fflush(stdout);
  188. if(!sloom)
  189. fclose(fp[1]);
  190. }
  191. }
  192. /***************** ROTATE_PARTITION_VALUES_TO_FILES ********************/
  193. void rotate_partition_values_to_files(void)
  194. {
  195. int n,m,k;
  196. firstcnt = cnt/outfilecnt;
  197. if(firstcnt * outfilecnt!= cnt)
  198. firstcnt++;
  199. k = 0;
  200. for(n=0;n<outfilecnt;n++) {
  201. sprintf(temp,"%d",n);
  202. strcpy(thisfilename,filename);
  203. strcat(thisfilename,".");
  204. strcat(thisfilename,temp);
  205. if(!sloom) {
  206. if((fp[1] = fopen(thisfilename,"w"))==NULL) {
  207. fprintf(stdout,"ERROR: Cannot open file %s to write.\n",thisfilename);
  208. fflush(stdout);
  209. exit(1);
  210. } else {
  211. fprintf(stdout,"Writing to file %s\n",thisfilename);
  212. }
  213. }
  214. if(n==outfilecnt-1)
  215. firstcnt = cnt - k;
  216. for(m=n;m<cnt;m+=outfilecnt)
  217. do_valout(number[m]);
  218. fflush(stdout);
  219. if(!sloom)
  220. fclose(fp[1]);
  221. }
  222. }
  223. /************************* JOIN_FILES_AS_COLUMNS ************************/
  224. void join_files_as_columns(char *filename)
  225. {
  226. int n, m;
  227. char temp[64];
  228. if(!sloom) {
  229. if((fp[0] = fopen(filename,"w"))==NULL) {
  230. fprintf(stdout,"Cannot reopen infile1 to write data.\n");
  231. fflush(stdout);
  232. exit(1);
  233. }
  234. }
  235. errstr[0] = ENDOFSTR;
  236. for(n=0;n<firstcnt;n++) {
  237. for(m=0;m<infilecnt-1;m++) {
  238. sprintf(temp,"%.5lf ",number[n + (firstcnt * m)]);
  239. strcat(errstr,temp);
  240. }
  241. sprintf(temp,"%.5lf ",number[n + (firstcnt * m)]);
  242. strcat(errstr,temp);
  243. if(!sloom)
  244. fprintf(fp[0],"%s\n",errstr);
  245. else
  246. fprintf(stdout,"INFO: %s\n",errstr);
  247. errstr[0] = ENDOFSTR;
  248. }
  249. fflush(stdout);
  250. }
  251. /************************* JOIN_FILES_AS_ROWS ************************/
  252. void join_files_as_rows(void)
  253. {
  254. int n, m, locnt = cnt/colcnt, totcnt = (cnt + stringscnt)/colcnt;
  255. char temp[64];
  256. errstr[0] = ENDOFSTR;
  257. for(n=0;n<ifactor;n++) {
  258. sprintf(errstr,"INFO: ");
  259. for(m = 0; m < colcnt-1; m++) {
  260. sprintf(temp,"%s ",strings[(n * colcnt) + m]);
  261. strcat(errstr,temp);
  262. }
  263. sprintf(temp,"%s",strings[(n * colcnt) + m]);
  264. strcat(errstr,temp);
  265. fprintf(stdout,"%s\n",errstr);
  266. }
  267. for(n=locnt;n<totcnt;n++) {
  268. sprintf(errstr,"INFO: ");
  269. for(m = 0; m < colcnt-1; m++) {
  270. sprintf(temp,"%s ",strings[(n * colcnt) + m]);
  271. strcat(errstr,temp);
  272. }
  273. sprintf(temp,"%s",strings[(n * colcnt) + m]);
  274. strcat(errstr,temp);
  275. fprintf(stdout,"%s\n",errstr);
  276. }
  277. for(n=ifactor;n<locnt;n++) {
  278. sprintf(errstr,"INFO: ");
  279. for(m = 0; m < colcnt-1; m++) {
  280. sprintf(temp,"%s ",strings[(n * colcnt) + m]);
  281. strcat(errstr,temp);
  282. }
  283. sprintf(temp,"%s",strings[(n * colcnt) + m]);
  284. strcat(errstr,temp);
  285. fprintf(stdout,"%s\n",errstr);
  286. }
  287. fflush(stdout);
  288. }
  289. /************************* JOIN_MANY_FILES_AS_ROWS ************************/
  290. void join_many_files_as_rows(void)
  291. {
  292. int i, n, m, rowcnt, bas;
  293. char temp[200];
  294. bas = 0;
  295. for(i = 0;i < infilecnt; i++) { /* for each file */
  296. rowcnt = cntr[i]/colcnt; /* Number of rows in file */
  297. for(n=0;n<rowcnt;n++) { /* for each row in file */
  298. sprintf(errstr,"INFO: ");
  299. for(m=0;m<colcnt;m++) { /* foreach column in row */
  300. sprintf(temp,"%s ",strings[bas + (n * colcnt) + m]);
  301. strcat(errstr,temp);
  302. }
  303. fprintf(stdout,"%s\n",errstr);
  304. }
  305. bas += cntr[i]; /* set bas to start of next file's numbers */
  306. }
  307. fflush(stdout);
  308. }
  309. /************************* JOIN_MANY_FILES_AS_COLUMNS ************************/
  310. void join_many_files_as_columns(char *filename,int insert)
  311. {
  312. int i, n, m, rowcnt, bas;
  313. char temp[200], *p;
  314. if(!sloom) {
  315. if((fp[0] = fopen(filename,"w"))==NULL) {
  316. fprintf(stdout,"Cannot reopen infile1 to write data.\n");
  317. fflush(stdout);
  318. exit(1);
  319. }
  320. }
  321. rowcnt = colcnt; /* i.e. 'colcnt' has been used to store count-of-rows, not of columns, in this case */
  322. if(insert) {
  323. if(ifactor > cntr[0]/rowcnt) {
  324. fprintf(stdout,"ERROR: Only %d columns in the first file. Can't do insert after column %d\n",cntr[0]/colcnt,ifactor);
  325. fflush(stdout);
  326. exit(1);
  327. }
  328. for(n=0;n<rowcnt;n++) { /* for each row in files */
  329. p = errstr;
  330. if(sloom)
  331. sprintf(errstr,"INFO: ");
  332. else
  333. sprintf(errstr,"");
  334. colcnt = cntr[0]/rowcnt; /* Number of columns in file */
  335. for(m=0;m<ifactor;m++) { /* foreach column in row */
  336. sprintf(temp,"%s ",strings[(n * colcnt) + m]);
  337. strcat(errstr,temp);
  338. }
  339. colcnt = cntr[1]/rowcnt; /* Number of columns in file1 */
  340. for(m=0;m<colcnt;m++) { /* foreach column in row */
  341. sprintf(temp,"%s ",strings[cntr[0] + (n * colcnt) + m]);
  342. strcat(errstr,temp);
  343. }
  344. colcnt = cntr[0]/rowcnt; /* Number of columns in file */
  345. for(m=ifactor;m<colcnt;m++) { /* foreach column in row */
  346. sprintf(temp,"%s ",strings[(n * colcnt) + m]);
  347. strcat(errstr,temp);
  348. }
  349. fprintf(stdout,"%s\n",p);
  350. if(!sloom)
  351. fprintf(fp[0],"%s\n",p);
  352. }
  353. } else {
  354. for(n=0;n<rowcnt;n++) { /* for each row in files */
  355. bas = 0;
  356. p = errstr;
  357. if(sloom)
  358. sprintf(errstr,"INFO: ");
  359. else
  360. sprintf(errstr,"");
  361. for(i = 0;i < infilecnt; i++) { /* for each file */
  362. colcnt = cntr[i]/rowcnt; /* Number of columns in file */
  363. for(m=0;m<colcnt;m++) { /* foreach column in row */
  364. sprintf(temp,"%s ",strings[bas + (n * colcnt) + m]);
  365. strcat(errstr,temp);
  366. }
  367. bas += cntr[i]; /* set bas to start of next file's numbers */
  368. }
  369. fprintf(stdout,"%s\n",p);
  370. if(!sloom)
  371. fprintf(fp[0],"%s\n",p);
  372. }
  373. }
  374. fflush(stdout);
  375. }
  376. /************************ CONCATENATE_FILES ****************************/
  377. void concatenate_files(char *filename)
  378. {
  379. int n;
  380. if(!sloom) {
  381. if((fp[0] = fopen(filename,"w"))==NULL) {
  382. fprintf(stdout,"Cannot reopen infile1 to write data.\n");
  383. fflush(stdout);
  384. exit(1);
  385. }
  386. }
  387. for(n=0;n<cnt;n++) {
  388. if(!sloom)
  389. fprintf(fp[0],"%lf\n",number[n]);
  390. else
  391. fprintf(stdout,"INFO: %lf\n",number[n]);
  392. }
  393. fflush(stdout);
  394. }
  395. /************************ CONCATENATE_FILES_CYCLICALLY ****************************/
  396. void concatenate_files_cyclically(char *filename)
  397. {
  398. int n, m;
  399. if(!sloom) {
  400. if((fp[0] = fopen(filename,"w"))==NULL) {
  401. fprintf(stdout,"Cannot reopen infile1 to write data.\n");
  402. fflush(stdout);
  403. exit(1);
  404. }
  405. }
  406. for(n=0;n<firstcnt;n++) {
  407. for(m=n;m<cnt;m+=firstcnt) {
  408. if(!sloom)
  409. fprintf(fp[0],"%lf\n",number[m]);
  410. else
  411. fprintf(stdout,"INFO: %lf\n",number[m]);
  412. }
  413. }
  414. fflush(stdout);
  415. }
  416. /*********************** VALS_END_TO_END_IN_2_COLS *******************/
  417. void vals_end_to_end_in_2_cols(void)
  418. {
  419. int n;
  420. for(n=1;n<cnt;n++) {
  421. if(n==cnt-1)
  422. factor = 0.0;
  423. if(!sloom && !sloombatch)
  424. fprintf(fp[1],"%lf %lf\n",number[n-1],number[n] + factor);
  425. else
  426. fprintf(stdout,"INFO: %lf %lf\n",number[n-1],number[n] + factor);
  427. }
  428. fflush(stdout);
  429. }
  430. /****************************** QUANTISE ****************************/
  431. void quantise(void)
  432. {
  433. int n;
  434. for(n=0;n<cnt;n++) {
  435. if(number[n]>0.0)
  436. ifactor = round(number[n]/factor);
  437. else
  438. /* IS TRUNCATION OK */
  439. ifactor = (int)((number[n]/factor) - 0.5 + VERY_TINY); /* TRUNCATION */
  440. number[n] = (double)ifactor * factor;
  441. if(!sloom && !sloombatch)
  442. fprintf(fp[1],"%lf\n",number[n]);
  443. else
  444. fprintf(stdout,"INFO: %lf\n",number[n]);
  445. }
  446. fflush(stdout);
  447. }
  448. /************************* ELIMINATE_EQUIVALENTS **********************/
  449. void eliminate_equivalents(void)
  450. {
  451. int n;
  452. for(n=0;n<cnt;n++) {
  453. if(flteq(number[n],factor)) {
  454. eliminate(n);
  455. n--;
  456. }
  457. }
  458. }
  459. /************************** ELIMINATE_EVEN_ITEMS *********************/
  460. void eliminate_even_items(void)
  461. {
  462. int n,m;
  463. if(cnt==2) {
  464. cnt--;
  465. return;
  466. }
  467. for(n=2,m=1;n<cnt;n+=2,m++)
  468. number[m] = number[n];
  469. cnt = m;
  470. }
  471. /************************** ELIMINATE_GREATER_THAN ********************/
  472. void eliminate_greater_than(void)
  473. {
  474. int n;
  475. for(n=0;n<cnt;n++) {
  476. if(number[n] > factor) {
  477. eliminate(n);
  478. n--;
  479. }
  480. }
  481. }
  482. /************************** ELIMINATE_LESS_THAN ***********************/
  483. void eliminate_less_than(void)
  484. {
  485. int n;
  486. for(n=0;n<cnt;n++) {
  487. if(number[n] < factor) {
  488. eliminate(n);
  489. n--;
  490. }
  491. }
  492. }
  493. /*************************** ELIMINATE_DUPLICATES *************************/
  494. void eliminate_duplicates(void)
  495. {
  496. int m,n;
  497. for(n=0;n<cnt-1;n++) {
  498. for(m=n+1;m<cnt;m++) {
  499. if(number[m] >= (number[n] - factor) && number[m] <= (number[n] + factor)) {
  500. eliminate(m);
  501. m--;
  502. }
  503. }
  504. }
  505. }
  506. /**************************** REDUCE_TO_BOUND ***************************/
  507. void reduce_to_bound(void)
  508. {
  509. int n;
  510. for(n=0;n<cnt;n++) {
  511. if(number[n] > factor)
  512. number[n] = factor;
  513. }
  514. }
  515. /************************* INCREASE_TO_BOUND *******************************/
  516. void increase_to_bound(void)
  517. {
  518. int n;
  519. for(n=0;n<cnt;n++) {
  520. if(number[n] < factor)
  521. number[n] = factor;
  522. }
  523. }
  524. /***************************** GREATEST *******************************/
  525. void greatest(void)
  526. {
  527. int n;
  528. factor = number[0];
  529. for(n=1;n<cnt;n++) {
  530. if(number[n] > factor)
  531. factor = number[n];
  532. }
  533. if(!sloom && !sloombatch)
  534. fprintf(fp[1],"%lf\n",factor);
  535. else
  536. fprintf(stdout,"ERROR: %lf\n",factor);
  537. fflush(stdout);
  538. }
  539. /****************************** LEAST *****************************/
  540. void least(void)
  541. {
  542. int n;
  543. factor = number[0];
  544. for(n=1;n<cnt;n++) {
  545. if(number[n] < factor)
  546. factor = number[n];
  547. }
  548. if(!sloom && !sloombatch)
  549. fprintf(fp[1],"%lf\n",factor);
  550. else
  551. fprintf(stdout,"WARNING: %lf\n",factor);
  552. fflush(stdout);
  553. }
  554. /***************************** MULTIPLY ************************/
  555. void multiply(int rounded)
  556. {
  557. int n;
  558. for(n=0;n<cnt;n++) {
  559. switch(condit) {
  560. case(0):
  561. number[n] *= factor;
  562. break;
  563. case('>'):
  564. if(number[n]>thresh)
  565. number[n] *= factor;
  566. break;
  567. case('<'):
  568. if(number[n]<thresh)
  569. number[n] *= factor;
  570. break;
  571. }
  572. if(rounded)
  573. number[n] = (double)round(number[n]);
  574. if(!sloom && !sloombatch)
  575. fprintf(fp[1],"%lf\n",number[n]);
  576. else
  577. fprintf(stdout,"INFO: %lf\n",number[n]);
  578. }
  579. fflush(stdout);
  580. }
  581. /**************************** MARK_GREATER_THAN ************************/
  582. void mark_greater_than(void)
  583. {
  584. int n;
  585. for(n=0;n<cnt;n++) {
  586. if(number[n] > factor) {
  587. if(!sloom && !sloombatch)
  588. fprintf(fp[1],"*%lf\n",number[n]);
  589. else
  590. fprintf(stdout,"INFO: *%lf\n",number[n]);
  591. } else {
  592. if(!sloom && !sloombatch)
  593. fprintf(fp[1],"%lf\n",number[n]);
  594. else
  595. fprintf(stdout,"INFO: %lf\n",number[n]);
  596. }
  597. }
  598. fflush(stdout);
  599. }
  600. /**************************** MARK_LESS_THAN ************************/
  601. void mark_less_than(void)
  602. {
  603. int n;
  604. for(n=0;n<cnt;n++) {
  605. if(number[n] < factor) {
  606. if(!sloom && !sloombatch)
  607. fprintf(fp[1],"*%lf\n",number[n]);
  608. else
  609. fprintf(stdout,"INFO: *%lf\n",number[n]);
  610. } else {
  611. if(!sloom && !sloombatch)
  612. fprintf(fp[1],"%lf\n",number[n]);
  613. else
  614. fprintf(stdout,"INFO: %lf\n",number[n]);
  615. }
  616. }
  617. fflush(stdout);
  618. }
  619. /**************************** MARK_MULTIPLES ************************/
  620. void mark_multiples(void)
  621. {
  622. int n;
  623. int k;
  624. double z;
  625. if(!condit)
  626. thresh = 0.0;
  627. if(thresh < 0.0)
  628. thresh = -thresh;
  629. for(n=0;n<cnt;n++) {
  630. k = (int)round(number[n]/factor);
  631. z = (double)k * factor;
  632. if((z <= (number[n] + thresh)) && (z >= (number[n] - thresh)))
  633. fprintf(stdout,"INFO: *%lf\n",number[n]);
  634. else
  635. fprintf(stdout,"INFO: %lf\n",number[n]);
  636. }
  637. fflush(stdout);
  638. }
  639. /****************************** MINOR_TO_MAJOR **************************/
  640. void minor_to_major(void)
  641. {
  642. int n;
  643. int m3 = (3 + ifactor)%12; /* MIDI location of minor 3rd */
  644. int m6 = (8 + ifactor)%12; /* MIDI location of minor 6th */
  645. int m7 = (10 + ifactor)%12; /* MIDI location of minor 7th */
  646. for(n=0;n<cnt;n++) {
  647. factor = fmod(number[n],TWELVE);
  648. if(flteq(factor,(double)m3)
  649. || flteq(factor,(double)m6)
  650. || flteq(factor,(double)m7))
  651. number[n] += 1.0;
  652. do_valout(number[n]);
  653. }
  654. fflush(stdout);
  655. }
  656. /****************************** ADD ******************************/
  657. void add(void)
  658. {
  659. int n;
  660. for(n=0;n<cnt;n++) {
  661. switch(condit) {
  662. case(0):
  663. number[n] += factor;
  664. break;
  665. case('>'):
  666. if(number[n]>thresh)
  667. number[n] += factor;
  668. break;
  669. case('<'):
  670. if(number[n]<thresh)
  671. number[n] += factor;
  672. break;
  673. }
  674. do_valout(number[n]);
  675. }
  676. fflush(stdout);
  677. }
  678. /**************************** TAKE_POWER *************************/
  679. void take_power(void)
  680. {
  681. int n, is_neg;
  682. for(n=0;n<cnt;n++) {
  683. is_neg = 0;
  684. switch(condit) {
  685. case(0):
  686. if(fabs(number[n]) < FLTERR)
  687. number[n] = 0;
  688. else {
  689. if (number[n] < 0) {
  690. is_neg = 1;
  691. number[n] = -number[n];
  692. }
  693. number[n] = pow(number[n],factor);
  694. }
  695. break;
  696. case('>'):
  697. if(number[n]>thresh) {
  698. if(fabs(number[n]) < FLTERR)
  699. number[n] = 0;
  700. else {
  701. if (number[n] < 0) {
  702. is_neg = 1;
  703. number[n] = -number[n];
  704. }
  705. number[n] = pow(number[n],factor);
  706. }
  707. }
  708. break;
  709. case('<'):
  710. if(number[n]<thresh) {
  711. if(fabs(number[n]) < FLTERR)
  712. number[n] = 0;
  713. else {
  714. if (number[n] < 0) {
  715. is_neg = 1;
  716. number[n] = -number[n];
  717. }
  718. number[n] = pow(number[n],factor);
  719. }
  720. }
  721. break;
  722. }
  723. if(is_neg)
  724. number[n] = -number[n];
  725. do_valout(number[n]);
  726. }
  727. fflush(stdout);
  728. }
  729. /*********************** TEMPER_MIDI_DATA *********************/
  730. void temper_midi_data(void)
  731. {
  732. int n, octaves;
  733. double step, q, offset = 0.0, maxm, thisval, outval=0.0, diff, thisdiff;
  734. if(condit) {
  735. offset = thresh - floor(thresh);
  736. if(offset > 0.5)
  737. offset = 1.0 - offset;
  738. }
  739. if(flteq(factor,TWELVE) && offset == 0.0) {
  740. for(n=0;n<cnt;n++) {
  741. ifactor = round(number[n]);
  742. number[n] = ifactor;
  743. do_valout(number[n]);
  744. }
  745. } else {
  746. if(offset == 0.0) {
  747. step = TWELVE/factor;
  748. for(n=0;n<cnt;n++) {
  749. q = fmod(number[n],TWELVE); /* which semitone in 8va */
  750. q /= step; /* which newtempered step */
  751. ifactor = round(q); /* round */
  752. q = ifactor * step; /* which semitone is this */
  753. octaves = (int)(number[n]/12.0); /* TRUNCATE */ /* which octave */
  754. number[n] = (octaves * TWELVE) + q;
  755. do_valout(number[n]);
  756. }
  757. } else {
  758. step = TWELVE/factor;
  759. maxm = -1.0;
  760. for(n=0;n<cnt;n++) {
  761. if(number[n] > maxm)
  762. maxm = number[n];
  763. }
  764. for(n=0;n<cnt;n++) {
  765. thisval = offset;
  766. diff = HUGE;
  767. while(thisval <= maxm) {
  768. thisdiff = fabs(number[n] - thisval);
  769. if(thisdiff < diff) {
  770. diff = thisdiff;
  771. outval = thisval;
  772. }
  773. thisval += step;
  774. }
  775. do_valout(outval);
  776. }
  777. }
  778. }
  779. fflush(stdout);
  780. }
  781. /*************************** TEMPER_HZ_DATA ******************************/
  782. void temper_hz_data(void)
  783. {
  784. int n, octaves;
  785. double q, this_reffrq, minf = HUGE, reffrq;
  786. if(condit) {
  787. reffrq = thresh;
  788. for(n=0;n<cnt;n++) {
  789. if(number[n] < minf)
  790. minf = number[n];
  791. }
  792. while(reffrq > minf)
  793. reffrq /= 2.0;
  794. } else
  795. reffrq = C_HZ;
  796. for(n=0;n<cnt;n++) { /* factor is tempering number */
  797. if(number[n] < 0.0) {
  798. do_valout(number[n]); /* Retain any (subzero) flags that arrive */
  799. continue;
  800. }
  801. q = number[n]/reffrq; /* frq ratio withref frq */
  802. octaves = (int)floor(log(q)/LOG_2_TO_BASE_E); /* Number of 8vas (trunc) */
  803. this_reffrq = reffrq*pow(2.0,(double)octaves); /* C blw actualpch */
  804. ifactor = round(factor*((log(number[n])-log(this_reffrq))/LOG_2_TO_BASE_E));
  805. /* No. tempered steps, rounded */
  806. number[n]= this_reffrq * pow(2.0,(double)ifactor/factor);
  807. do_valout(number[n]);
  808. }
  809. fflush(stdout);
  810. }
  811. /*************************** JUST_INTONATION_HZ ******************************/
  812. void just_intonation_Hz(void)
  813. {
  814. double *refset, reffrq, minf, maxf, minratio, oct, refval, outval = 0.0, q;
  815. int n, m;
  816. refset = (double *)exmalloc(12 * sizeof(double));
  817. minf = number[0];
  818. maxf = number[0];
  819. for(n=1;n<cnt;n++) {
  820. minf = min(minf,number[n]);
  821. maxf = max(maxf,number[n]);
  822. }
  823. reffrq = factor;
  824. while(reffrq > minf)
  825. reffrq /= 2.0;
  826. refset[0] = reffrq;
  827. refset[1] = reffrq * 135.0 / 128.0;
  828. refset[2] = reffrq * 9.0 / 8.0;
  829. refset[3] = reffrq * 6.0 / 5.0;
  830. refset[4] = reffrq * 5.0 / 4.0;
  831. refset[5] = reffrq * 4.0 / 3.0;
  832. refset[6] = reffrq * 45.0 / 32.0;
  833. refset[7] = reffrq * 3.0 / 2.0;
  834. refset[8] = reffrq * 5.0 / 3.0;
  835. refset[9] = reffrq * 27.0 / 16.0;
  836. refset[10] = reffrq * 9.0 / 5.0;
  837. refset[11] = reffrq * 15.0 / 8.0;
  838. for(n=0;n<cnt;n++) {
  839. minratio = HUGE;
  840. oct = 1.0;
  841. while(refset[0] * oct < maxf * 2.0) {
  842. for(m = 0; m < 12; m ++) {
  843. refval = refset[m] * oct;
  844. q = number[n]/refval;
  845. if(q < 1.0)
  846. q = 1.0/q;
  847. if(q < minratio) {
  848. minratio = q;
  849. outval = refval;
  850. }
  851. }
  852. oct *= 2.0;
  853. }
  854. do_valout(outval);
  855. }
  856. }
  857. /*************************** CREATE_JUST_INTONATION_HZ ******************************/
  858. void create_just_intonation_Hz(void)
  859. {
  860. double *refset, reffrq, minf, maxf, oct, outval;
  861. int m, OK;
  862. refset = (double *)exmalloc(12 * sizeof(double));
  863. minf = number[0];
  864. maxf = number[0];
  865. minf = min(number[1],number[2]);
  866. maxf = max(number[1],number[2]);
  867. reffrq = number[0];
  868. while(reffrq > minf)
  869. reffrq /= 2.0;
  870. refset[0] = reffrq;
  871. refset[1] = reffrq * 135.0 / 128.0;
  872. refset[2] = reffrq * 9.0 / 8.0;
  873. refset[3] = reffrq * 6.0 / 5.0;
  874. refset[4] = reffrq * 5.0 / 4.0;
  875. refset[5] = reffrq * 4.0 / 3.0;
  876. refset[6] = reffrq * 45.0 / 32.0;
  877. refset[7] = reffrq * 3.0 / 2.0;
  878. refset[8] = reffrq * 5.0 / 3.0;
  879. refset[9] = reffrq * 27.0 / 16.0;
  880. refset[10] = reffrq * 9.0 / 5.0;
  881. refset[11] = reffrq * 15.0 / 8.0;
  882. OK = 1;
  883. oct = 1.0;
  884. while(OK) {
  885. for(m = 0; m < 12; m ++) {
  886. outval = refset[m] * oct;
  887. if(outval >= minf) {
  888. if(outval <= maxf)
  889. do_valout(outval);
  890. else
  891. OK = 0;
  892. }
  893. }
  894. if(!OK)
  895. break;
  896. oct *= 2.0;
  897. }
  898. }
  899. /*************************** CREATE_JUST_INTONATION_MIDI ******************************/
  900. void create_just_intonation_midi(void)
  901. {
  902. double *refset, refmidi, reffrq, minf, maxf, oct, outval;
  903. int m, OK;
  904. refset = (double *)exmalloc(12 * sizeof(double));
  905. minf = number[0];
  906. maxf = number[0];
  907. minf = min(number[1],number[2]);
  908. maxf = max(number[1],number[2]);
  909. refmidi = number[0];
  910. reffrq = miditohz(refmidi);
  911. while(refmidi > minf) {
  912. refmidi -= 12.0;
  913. reffrq /= 2.0;
  914. }
  915. refset[0] = refmidi;
  916. refset[1] = hztomidi(reffrq * 135.0 / 128.0);
  917. refset[2] = hztomidi(reffrq * 9.0 / 8.0);
  918. refset[3] = hztomidi(reffrq * 6.0 / 5.0);
  919. refset[4] = hztomidi(reffrq * 5.0 / 4.0);
  920. refset[5] = hztomidi(reffrq * 4.0 / 3.0);
  921. refset[6] = hztomidi(reffrq * 45.0 / 32.0);
  922. refset[7] = hztomidi(reffrq * 3.0 / 2.0);
  923. refset[8] = hztomidi(reffrq * 5.0 / 3.0);
  924. refset[9] = hztomidi(reffrq * 27.0 / 16.0);
  925. refset[10] = hztomidi(reffrq * 9.0 / 5.0);
  926. refset[11] = hztomidi(reffrq * 15.0 / 8.0);
  927. OK = 1;
  928. oct = 0.0;
  929. while(OK) {
  930. for(m = 0; m < 12; m ++) {
  931. outval = refset[m] + oct;
  932. if(outval >= minf) {
  933. if(outval <= maxf)
  934. do_valout(outval);
  935. else
  936. OK = 0;
  937. }
  938. }
  939. if(!OK)
  940. break;
  941. oct += 12.0;
  942. }
  943. }
  944. /*************************** just_intonation_midi ******************************/
  945. void just_intonation_midi(void)
  946. {
  947. double *refset, refmidi, reffrq, minmidi, maxmidi, minstep, oct, refval, outval = 0.0, q;
  948. int n, m;
  949. refset = (double *)exmalloc(12 * sizeof(double));
  950. minmidi = number[0];
  951. maxmidi = number[0];
  952. for(n=1;n<cnt;n++) {
  953. minmidi = min(minmidi,number[n]);
  954. maxmidi = max(maxmidi,number[n]);
  955. }
  956. refmidi = factor;
  957. while(refmidi > minmidi)
  958. refmidi -= 12.0;
  959. reffrq = miditohz(refmidi);
  960. refset[0] = refmidi;
  961. refset[1] = hztomidi(reffrq * 135.0 / 128.0);
  962. refset[2] = hztomidi(reffrq * 9.0 / 8.0);
  963. refset[3] = hztomidi(reffrq * 6.0 / 5.0);
  964. refset[4] = hztomidi(reffrq * 5.0 / 4.0);
  965. refset[5] = hztomidi(reffrq * 4.0 / 3.0);
  966. refset[6] = hztomidi(reffrq * 45.0 / 32.0);
  967. refset[7] = hztomidi(reffrq * 3.0 / 2.0);
  968. refset[8] = hztomidi(reffrq * 5.0 / 3.0);
  969. refset[9] = hztomidi(reffrq * 27.0 / 16.0);
  970. refset[10] = hztomidi(reffrq * 9.0 / 5.0);
  971. refset[11] = hztomidi(reffrq * 15.0 / 8.0);
  972. for(n=0;n<cnt;n++) {
  973. minstep = HUGE;
  974. oct = 0.0;
  975. while(refset[0] + oct < maxmidi + 12.0) {
  976. for(m = 0; m < 12; m ++) {
  977. refval = refset[m] + oct;
  978. q = fabs(number[n] - refval);
  979. if(q < minstep) {
  980. minstep = q;
  981. outval = refval;
  982. }
  983. }
  984. oct += 12.0;
  985. }
  986. do_valout(outval);
  987. }
  988. }
  989. /************************* TIME_FROM_CROTCHET_COUNT *********************/
  990. void time_from_crotchet_count(void)
  991. {
  992. int n;
  993. factor = 60.0/factor; /* factor becomes duration of crotchet */
  994. for(n=0;n<cnt;n++)
  995. do_valout(number[n]*factor);
  996. fflush(stdout);
  997. }
  998. /********************* TIME_FROM_BEAT_LENGTHS ***********************/
  999. void time_from_beat_lengths(void)
  1000. {
  1001. int n;
  1002. double sum;
  1003. factor = 60.0/factor; /* factor becomes duration of crotchet */
  1004. sum = 0.0;
  1005. for(n=0;n<cnt;n++) {
  1006. do_valout(sum);
  1007. sum += number[n] * factor;
  1008. }
  1009. fflush(stdout);
  1010. }
  1011. /****************************** TOTAL ******************************/
  1012. void total(void)
  1013. {
  1014. int n;
  1015. double sum = 0.0;
  1016. for(n=0;n<cnt;n++)
  1017. sum += number[n];
  1018. do_valout_as_message(sum);
  1019. fflush(stdout);
  1020. }
  1021. /***************************** TEXT_TO_HZ **************************/
  1022. void text_to_hz(void)
  1023. {
  1024. int n;
  1025. for(n=0;n<cnt;n++)
  1026. do_valout(miditohz(number[n]));
  1027. fflush(stdout);
  1028. }
  1029. /***************************** GENERATE_HARMONICS **************************/
  1030. void generate_harmonics(void)
  1031. {
  1032. int n;
  1033. for(n=1;n<=ifactor;n++)
  1034. do_valout(number[n] * (double)n);
  1035. fflush(stdout);
  1036. }
  1037. /***************************** GROUP_HARMONICS **************************/
  1038. #define SEMIT_UP (1.05946309436)
  1039. #define LOG2(x) (log(x)/log(2))
  1040. void group_harmonics(void)
  1041. {
  1042. int n, m, samecnt;
  1043. int j, hno, bigg, smal, k;
  1044. double thisintv, thisnum;
  1045. double **hgrp, semit_up, semit_dn;
  1046. int *hgrpcnt;
  1047. if(factor<0.0)
  1048. factor = -factor;
  1049. semit_up = pow(SEMIT_UP,factor);
  1050. semit_dn = 1.0/semit_up;
  1051. for(n=0;n<cnt-1;n++) { /* eliminate zeros */
  1052. if(number[n]<=0.0) {
  1053. fprintf(stdout,"ERROR: zero or subzero frquency in list: cannot proceed.\n");
  1054. fflush(stdout);
  1055. exit(1);
  1056. }
  1057. }
  1058. for(n=1;n<cnt;n++) { /* Sort list into ascending order */
  1059. thisnum = number[n];
  1060. m = n-1;
  1061. while(m >= 0 && number[m] > thisnum) {
  1062. number[m+1] = number[m];
  1063. m--;
  1064. }
  1065. number[m+1] = thisnum;
  1066. }
  1067. for(n=0;n<cnt-1;n++) { /* Eliminate duplicate frequencies */
  1068. for(m=n+1;m<cnt;m++) {
  1069. if(flteq(number[n],number[m])) {
  1070. for(j=m+1;j<cnt;j++)
  1071. number[j-1] = number[j];
  1072. cnt--;
  1073. m--;
  1074. }
  1075. }
  1076. }
  1077. hgrp = (double **)exmalloc(cnt * sizeof(double *));
  1078. hgrpcnt = (int *)exmalloc(cnt * sizeof(int));
  1079. for(n=0;n<cnt;n++) { /* For all remaining numbers */
  1080. hgrp[n] = (double *)exmalloc(sizeof(double));
  1081. hgrp[n][0] = number[n]; /* Establish space to store, and to count, harmonic group */
  1082. hgrpcnt[n] = 1;
  1083. for(m=n+1;m<cnt;m++) { /* Take each higher frq in list */
  1084. //got_it = 0;
  1085. thisintv = number[m]/number[n];
  1086. hno = round(thisintv);
  1087. thisintv = number[n]/(number[m]/(double)hno);
  1088. if(thisintv < semit_up && thisintv > semit_dn) {
  1089. hgrpcnt[n]++;
  1090. hgrp[n] = (double *)exrealloc((char *)hgrp[n],hgrpcnt[n] * sizeof(double));
  1091. hgrp[n][hgrpcnt[n]-1] = number[m];
  1092. }
  1093. }
  1094. }
  1095. for(n=0;n<cnt-1;n++) {
  1096. for(m=n+1;m<cnt;m++) {
  1097. samecnt = 0;
  1098. if(hgrpcnt[n] >= hgrpcnt[m]) {
  1099. bigg = n;
  1100. smal = m;
  1101. } else {
  1102. bigg = m;
  1103. smal = n;
  1104. }
  1105. for(k=0;k<hgrpcnt[smal];k++) {
  1106. j = 0;
  1107. for(;;) {
  1108. if(hgrp[smal][k] == hgrp[bigg][j]) {
  1109. samecnt++;
  1110. break;
  1111. } else {
  1112. if(++j >=hgrpcnt[bigg])
  1113. break;
  1114. }
  1115. }
  1116. }
  1117. if(samecnt==hgrpcnt[smal]) {
  1118. if(bigg==n) {
  1119. free(hgrp[m]);
  1120. for(j = m+1;j<cnt;j++) {
  1121. hgrp[j-1] = hgrp[j];
  1122. hgrpcnt[j-1] = hgrpcnt[j];
  1123. }
  1124. cnt--;
  1125. m--;
  1126. } else {
  1127. free(hgrp[n]);
  1128. for(j = n+1;j<cnt;j++) {
  1129. hgrp[j-1] = hgrp[j];
  1130. hgrpcnt[j-1] = hgrpcnt[j];
  1131. }
  1132. cnt--;
  1133. n--;
  1134. break;
  1135. }
  1136. }
  1137. }
  1138. }
  1139. for(n=0;n<cnt;n++) {
  1140. for(m=0;m<hgrpcnt[n];m++)
  1141. do_valout(hgrp[n][m]);
  1142. if(!sloom && !sloombatch)
  1143. fprintf(fp[1],"\n");
  1144. else
  1145. fprintf(stdout,"INFO: \n");
  1146. free(hgrp[n]);
  1147. }
  1148. fflush(stdout);
  1149. free(hgrp);
  1150. free(hgrpcnt);
  1151. }
  1152. /***************************** GET_HARMONIC_ROOTS **************************/
  1153. void get_harmonic_roots(void)
  1154. {
  1155. int n;
  1156. for(n=1;n<=ifactor;n++)
  1157. do_valout(number[n]/(double)n);
  1158. fflush(stdout);
  1159. }
  1160. /************************* RANK_VALS *****************************/
  1161. void rank_vals(void)
  1162. {
  1163. int m, n;
  1164. double hibnd, lobnd;
  1165. int *poll = (int *)exmalloc(cnt * sizeof(int));
  1166. for(n=0;n<cnt;n++)
  1167. poll[n] = 1;
  1168. for(n=0;n<cnt-1;n++) {
  1169. if(poll[n] > 0) {
  1170. hibnd = number[n] + factor;
  1171. lobnd = number[n] - factor;
  1172. for(m=n+1;m<cnt;m++) {
  1173. if(poll[m] > 0) {
  1174. if(number[m] <= hibnd && number[m] >= lobnd) {
  1175. poll[n]++;
  1176. poll[m] = -1;
  1177. }
  1178. }
  1179. }
  1180. }
  1181. }
  1182. for(n=0;n<cnt;n++) {
  1183. if(poll[n]<=0) {
  1184. for(m=n;m<cnt-1;m++) {
  1185. number[m] = number[m+1];
  1186. poll[m] = poll[m+1];
  1187. }
  1188. n--;
  1189. cnt--;
  1190. }
  1191. }
  1192. sort_numbers(poll);
  1193. for(n=0;n<cnt;n++)
  1194. do_valout(number[n]);
  1195. fflush(stdout);
  1196. }
  1197. /************************* RANK_FRQS *****************************/
  1198. #define TWELFTH_ROOT_OF_2 (1.059463094)
  1199. void rank_frqs(void)
  1200. {
  1201. int m, n;
  1202. double hibnd, lobnd, one_over_factor;
  1203. int *poll = (int *)exmalloc(cnt * sizeof(int));
  1204. for(n=0;n<cnt;n++)
  1205. poll[n] = 1;
  1206. factor = pow(TWELFTH_ROOT_OF_2,factor);
  1207. one_over_factor = 1.0/factor;
  1208. for(n=0;n<cnt-1;n++) {
  1209. if(poll[n] > 0) {
  1210. hibnd = number[n] * factor;
  1211. lobnd = number[n] * one_over_factor;
  1212. for(m=n+1;m<cnt;m++) {
  1213. if(poll[m] > 0) {
  1214. if(number[m] <= hibnd && number[m] >= lobnd) {
  1215. poll[n]++;
  1216. poll[m] = -1;
  1217. }
  1218. }
  1219. }
  1220. }
  1221. }
  1222. for(n=0;n<cnt;n++) {
  1223. if(poll[n]<=0) {
  1224. for(m=n;m<cnt-1;m++) {
  1225. number[m] = number[m+1];
  1226. poll[m] = poll[m+1];
  1227. }
  1228. n--;
  1229. cnt--;
  1230. }
  1231. }
  1232. sort_numbers(poll);
  1233. for(n=0;n<cnt;n++)
  1234. do_valout(number[n]);
  1235. fflush(stdout);
  1236. }
  1237. /************************* SORT_NUMBERS *****************************/
  1238. void sort_numbers(int *poll)
  1239. {
  1240. int n, m, thispoll;
  1241. double thisnum;
  1242. for(n=1;n<cnt;n++) {
  1243. thispoll = poll[n];
  1244. thisnum = number[n];
  1245. m = n-1;
  1246. while(m >= 0 && poll[m] < thispoll) {
  1247. number[m+1] = number[m];
  1248. poll[m+1] = poll[m];
  1249. m--;
  1250. }
  1251. number[m+1] = thisnum;
  1252. poll[m+1] = thispoll;
  1253. }
  1254. }
  1255. /*********************** APPROX_VALS ********************/
  1256. void approx_vals(void)
  1257. {
  1258. int z;
  1259. int n;
  1260. for(n=0;n<cnt;n++) {
  1261. z = round(number[n]/factor);
  1262. number[n] = (double)z * factor;
  1263. do_valout(number[n]);
  1264. }
  1265. fflush(stdout);
  1266. }
  1267. /*********************** FLOOR_VALS ********************/
  1268. void floor_vals(void)
  1269. {
  1270. int n;
  1271. for(n=0;n<cnt;n++) {
  1272. if(number[n]<factor)
  1273. number[n] = factor;
  1274. do_valout(number[n]);
  1275. }
  1276. fflush(stdout);
  1277. }
  1278. /*********************** LIMIT_VALS ********************/
  1279. void limit_vals(void)
  1280. {
  1281. int n;
  1282. for(n=0;n<cnt;n++) {
  1283. if(number[n]>factor)
  1284. number[n] = factor;
  1285. do_valout(number[n]);
  1286. }
  1287. fflush(stdout);
  1288. }
  1289. /****************************** NOTE_TO_MIDI ******************************/
  1290. void note_to_midi(int is_transpos)
  1291. {
  1292. int n, oct, midi;
  1293. char *p, *q;
  1294. double qtone = 0.0, midiflt;
  1295. for(n=0;n< stringscnt;n++) {
  1296. p = strings[n];
  1297. switch(*p) {
  1298. case('c'): case('C'): midi = 0; break;
  1299. case('d'): case('D'): midi = 2; break;
  1300. case('e'): case('E'): midi = 4; break;
  1301. case('f'): case('F'): midi = 5; break;
  1302. case('g'): case('G'): midi = 7; break;
  1303. case('a'): case('A'): midi = 9; break;
  1304. case('b'): case('B'): midi = 11; break;
  1305. default:
  1306. fprintf(stdout,"ERROR: Unknown pitch value '%c' at note %d\n",*p,n+1);
  1307. fflush(stdout);
  1308. exit(1);
  1309. }
  1310. p++;
  1311. switch(*p) {
  1312. case('#'): midi = (midi+1)%12; p++; break;
  1313. case('b'): midi = (midi-1)%12; p++; break;
  1314. }
  1315. q = p + strlen(p) - 1;
  1316. qtone = 0.0;
  1317. if(*q == '-') {
  1318. qtone = -.5;
  1319. *q = ENDOFSTR;
  1320. } else if(*q == '+') {
  1321. qtone = .5;
  1322. *q = ENDOFSTR;
  1323. }
  1324. if(sscanf(p,"%d",&oct)!=1) {
  1325. fprintf(stdout,"ERROR: No octave value given at note %d\n",n+1);
  1326. fflush(stdout);
  1327. exit(1);
  1328. }
  1329. if(oct > 5 || oct < -5) {
  1330. fprintf(stdout,"ERROR: octave value out of range (-5 to +5) at note %d\n",n+1);
  1331. fflush(stdout);
  1332. exit(1);
  1333. }
  1334. oct += 5;
  1335. midi += (oct * 12);
  1336. midiflt = (double)midi + qtone;
  1337. if(is_transpos == 1)
  1338. midiflt -= factor;
  1339. else if(is_transpos == 2) /* to frq */
  1340. midiflt = miditohz(midiflt);
  1341. fprintf(stdout,"INFO: %lf\n",midiflt);
  1342. }
  1343. fflush(stdout);
  1344. }
  1345. /****************************** APPEND_TEXT ******************************/
  1346. void append_text(int after)
  1347. {
  1348. int n, k = strlen(temp);
  1349. char temp2[64], *p;
  1350. if(after) {
  1351. for(n=0;n<stringscnt;n++) {
  1352. sprintf(temp2,"%s",strings[n]);
  1353. p = temp2 + strlen(temp2);
  1354. sprintf(p,"%s",temp);
  1355. fprintf(stdout,"INFO: %s\n",temp2);
  1356. }
  1357. } else {
  1358. sprintf(temp2,"%s",temp);
  1359. p = temp2 + k;
  1360. for(n=0;n<stringscnt;n++) {
  1361. sprintf(p,"%s",strings[n]);
  1362. fprintf(stdout,"INFO: %s\n",temp2);
  1363. }
  1364. }
  1365. fflush(stdout);
  1366. }
  1367. /****************************** KILL_TEXT ******************************/
  1368. void kill_text(int where)
  1369. {
  1370. int n;
  1371. char *p;
  1372. switch(where) {
  1373. case(0): /* Before */
  1374. for(n=0;n<stringscnt;n++) {
  1375. p = strings[n];
  1376. p += strlen(strings[n]);
  1377. p--;
  1378. while(isdigit(*p) || (*p == '.') || (*p == '-')) {
  1379. p--;
  1380. if(p < strings[n])
  1381. break;
  1382. }
  1383. p++;
  1384. if(p == strings[n] + strlen(strings[n])) {
  1385. fprintf(stdout,"ERROR: Cannot find numeric ending of value.\n");
  1386. fflush(stdout);
  1387. exit(1);
  1388. }
  1389. fprintf(stdout,"INFO: %s\n",p);
  1390. }
  1391. break;
  1392. case(1): /* After */
  1393. for(n=0;n<stringscnt;n++) {
  1394. p = strings[n];
  1395. p += strlen(strings[n]);
  1396. p--;
  1397. while(!isdigit(*p)) {
  1398. p--;
  1399. if(p < strings[n]) {
  1400. fprintf(stdout,"ERROR: Cannot find numeric part of value.\n");
  1401. fflush(stdout);
  1402. exit(1);
  1403. }
  1404. }
  1405. if(*(p+1) =='.')
  1406. p++;
  1407. p++;
  1408. *p = ENDOFSTR;
  1409. fprintf(stdout,"INFO: %s\n",strings[n]);
  1410. }
  1411. break;
  1412. case(2): /* Before & After */
  1413. for(n=0;n<stringscnt;n++) {
  1414. p = strings[n];
  1415. p += strlen(strings[n]);
  1416. p--;
  1417. while(!isdigit(*p)) {
  1418. p--;
  1419. if(p < strings[n]) {
  1420. fprintf(stdout,"ERROR: Cannot find numeric part of value.\n");
  1421. fflush(stdout);
  1422. exit(1);
  1423. }
  1424. }
  1425. if(*(p+1) =='.')
  1426. p++;
  1427. p++;
  1428. *p = ENDOFSTR;
  1429. p--;
  1430. while(isdigit(*p) || (*p == '.') || (*p == '-')) {
  1431. p--;
  1432. if(p < strings[n])
  1433. break;
  1434. }
  1435. p++;
  1436. fprintf(stdout,"INFO: %s\n",p);
  1437. }
  1438. break;
  1439. }
  1440. fflush(stdout);
  1441. }
  1442. /****************************** TARGETED_STRETCH ******************************/
  1443. void targeted_stretch(void)
  1444. {
  1445. int n;
  1446. double time_shoulder = number[cnt];
  1447. double stretch = number[cnt+1], lastime;
  1448. if(time_shoulder < 0.0) {
  1449. fprintf(stdout,"ERROR: timestep (%lf) cannot be less than zero.\n",time_shoulder);
  1450. fflush(stdout);
  1451. exit(1);
  1452. }
  1453. if(number[0] < 0.0) {
  1454. fprintf(stdout,"ERROR: First time value less than zero encountered.\n");
  1455. fflush(stdout);
  1456. exit(1);
  1457. } else if(number[0] <= time_shoulder) {
  1458. fprintf(stdout,"ERROR: First time is too close to zero\n");
  1459. fflush(stdout);
  1460. exit(1);
  1461. }
  1462. lastime = number[0];
  1463. for(n = 1; n < cnt; n++) {
  1464. if(ODD(n)) {
  1465. if(number[n] <= lastime) {
  1466. fprintf(stdout,"ERROR: Times out of sequence (between %lf and %lf).\n",number[n],lastime);
  1467. fflush(stdout);
  1468. exit(1);
  1469. }
  1470. } else {
  1471. if(number[n] <= lastime + (2 * time_shoulder)) {
  1472. fprintf(stdout,"ERROR: Too small time step encountered (between %lf and %lf).\n",number[n],lastime);
  1473. fflush(stdout);
  1474. exit(1);
  1475. }
  1476. }
  1477. lastime = number[n];
  1478. }
  1479. if(flteq(number[n],0.0)) {
  1480. fprintf(stdout,"INFO: 0.0 %lf\n",stretch);
  1481. } else {
  1482. fprintf(stdout,"INFO: 0.0 1.0\n");
  1483. fprintf(stdout,"INFO: %lf 1.0\n",number[0] - time_shoulder);
  1484. fprintf(stdout,"INFO: %lf %lf\n",number[0],stretch);
  1485. }
  1486. for(n = 1; n < cnt; n++) {
  1487. if(ODD(n)) { /* already stretched */
  1488. fprintf(stdout,"INFO: %lf %lf\n",number[n],stretch);
  1489. fprintf(stdout,"INFO: %lf 1.0\n",number[n] + time_shoulder);
  1490. } else { /* not stretched at the moment */
  1491. fprintf(stdout,"INFO: %lf 1.0\n",number[n] - time_shoulder);
  1492. fprintf(stdout,"INFO: %lf %lf\n",number[n],stretch);
  1493. }
  1494. }
  1495. lastime = max(100.0,2.0 * number[cnt-1]);
  1496. if(ODD(cnt))
  1497. fprintf(stdout,"INFO: %lf %lf\n",lastime,stretch);
  1498. else
  1499. fprintf(stdout,"INFO: %lf 1.0\n",lastime);
  1500. fflush(stdout);
  1501. }
  1502. /****************************** TARGETED_PAN ******************************/
  1503. void targeted_pan(void)
  1504. {
  1505. int n;
  1506. double time_shoulder = number[cnt];
  1507. double panedj = number[cnt+1];
  1508. double start_panpos = number[cnt+2];
  1509. double end_panpos = number[cnt+3];
  1510. double end_pantime = number[cnt+4];
  1511. double lastime;
  1512. double pan_subedj = panedj * (7.5/9.0);
  1513. if(time_shoulder < 0.0) {
  1514. fprintf(stdout,"ERROR: half lingertime (%lf) cannot be less than zero.\n",time_shoulder);
  1515. fflush(stdout);
  1516. exit(1);
  1517. }
  1518. if(number[0] < 0.0) {
  1519. fprintf(stdout,"ERROR: First time value less than zero encountered.\n");
  1520. fflush(stdout);
  1521. exit(1);
  1522. } else if(number[0] <= time_shoulder) {
  1523. fprintf(stdout,"ERROR: First time is too close to zero\n");
  1524. fflush(stdout);
  1525. exit(1);
  1526. }
  1527. lastime = number[0];
  1528. for(n = 1; n < cnt; n++) {
  1529. if(number[n] <= lastime + (2 * time_shoulder)) {
  1530. fprintf(stdout,"ERROR: Too small time step encountered (between %lf and %lf).\n",number[n],lastime);
  1531. fflush(stdout);
  1532. exit(1);
  1533. }
  1534. }
  1535. if(end_pantime - time_shoulder <= number[cnt-1]) {
  1536. fprintf(stdout,"ERROR: Too small time step encountered before end pantime (%lf to %lf).\n",number[cnt -1],end_pantime);
  1537. fflush(stdout);
  1538. exit(1);
  1539. }
  1540. if(flteq(number[0],0.0))
  1541. fprintf(stdout,"INFO: 0.0 %lf\n",panedj);
  1542. else {
  1543. fprintf(stdout,"INFO: 0.0 %lf\n",start_panpos);
  1544. fprintf(stdout,"INFO: %lf %lf\n",number[0] - time_shoulder,pan_subedj);
  1545. fprintf(stdout,"INFO: %lf %lf\n",number[0],panedj);
  1546. fprintf(stdout,"INFO: %lf %lf\n",number[0] + time_shoulder,pan_subedj);
  1547. }
  1548. panedj = -panedj;
  1549. pan_subedj = -pan_subedj;
  1550. for(n = 1; n < cnt; n++) {
  1551. fprintf(stdout,"INFO: %lf %lf\n",number[n] - time_shoulder,pan_subedj);
  1552. fprintf(stdout,"INFO: %lf %lf\n",number[n],panedj);
  1553. fprintf(stdout,"INFO: %lf %lf\n",number[n] + time_shoulder,pan_subedj);
  1554. lastime = number[n];
  1555. panedj = -panedj;
  1556. pan_subedj = -pan_subedj;
  1557. }
  1558. fprintf(stdout,"INFO: %lf %lf\n",end_pantime,end_panpos);
  1559. fflush(stdout);
  1560. }
  1561. /******************************** DO_SQUEEZED_PAN ****************************/
  1562. void do_squeezed_pan(void) {
  1563. int n, neg = 1;
  1564. double time_shoulder = number[cnt];
  1565. double start_panpos = number[cnt+1];
  1566. double end_panpos = number[cnt+2];
  1567. double end_pantime = number[cnt+3];
  1568. double lastime;
  1569. double pan_subedj;
  1570. if(time_shoulder < 0.0) {
  1571. fprintf(stdout,"ERROR: half lingertime (%lf) cannot be less than zero.\n",time_shoulder);
  1572. fflush(stdout);
  1573. exit(1);
  1574. }
  1575. if(number[0] < 0.0) {
  1576. fprintf(stdout,"ERROR: First time value less than zero encountered.\n");
  1577. fflush(stdout);
  1578. exit(1);
  1579. } else if(number[0] <= time_shoulder) {
  1580. fprintf(stdout,"ERROR: First time (%lf) is too close to zero for half-lingertime %lf\n",number[0],time_shoulder);
  1581. fflush(stdout);
  1582. exit(1);
  1583. }
  1584. lastime = number[0];
  1585. for(n = 2; n < cnt; n+=2) {
  1586. if(number[n] <= lastime + (2 * time_shoulder)) {
  1587. fprintf(stdout,"ERROR: Too small time step encountered (between %lf and %lf).\n",number[n],lastime);
  1588. fflush(stdout);
  1589. exit(1);
  1590. }
  1591. }
  1592. if(end_pantime - time_shoulder <= number[cnt-2]){
  1593. fprintf(stdout,"ERROR: Too small time step encountered before end pantime (%lf to %lf).\n",number[cnt-2],end_pantime);
  1594. fflush(stdout);
  1595. exit(1);
  1596. }
  1597. if(flteq(number[0],0.0))
  1598. fprintf(stdout,"INFO: 0.0 %lf\n",number[1]);
  1599. else {
  1600. pan_subedj = number[1] * (7.5/9.0);
  1601. fprintf(stdout,"INFO: 0.0 %lf\n",start_panpos);
  1602. fprintf(stdout,"INFO: %lf %lf\n",number[0] - time_shoulder,pan_subedj);
  1603. fprintf(stdout,"INFO: %lf %lf\n",number[0],number[1]);
  1604. fprintf(stdout,"INFO: %lf %lf\n",number[0] + time_shoulder,pan_subedj);
  1605. }
  1606. if(number[1] > 0.0)
  1607. neg = -1;
  1608. for(n = 2; n < cnt; n+=2) {
  1609. number[n+1] *= neg;
  1610. pan_subedj = number[n+1] * (7.5/9.0);
  1611. fprintf(stdout,"INFO: %lf %lf\n",number[n] - time_shoulder,pan_subedj);
  1612. fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]);
  1613. fprintf(stdout,"INFO: %lf %lf\n",number[n] + time_shoulder,pan_subedj);
  1614. neg = -neg;
  1615. }
  1616. fprintf(stdout,"INFO: %lf %lf\n",end_pantime,end_panpos);
  1617. fflush(stdout);
  1618. }
  1619. /****************************** KILL_PATH ******************************/
  1620. void kill_path(void)
  1621. {
  1622. int n;
  1623. char *p;
  1624. for(n=0;n<stringscnt;n++) {
  1625. p = strings[n];
  1626. p += strlen(strings[n]);
  1627. p--;
  1628. while((*p != '\\') && (*p != '/')) {
  1629. p--;
  1630. if(p < strings[n])
  1631. break;
  1632. }
  1633. p++;
  1634. fprintf(stdout,"INFO: %s\n",p);
  1635. }
  1636. fflush(stdout);
  1637. }
  1638. /****************************** KILL_EXTENSION ******************************/
  1639. void kill_extension(void)
  1640. {
  1641. int n;
  1642. char *p;
  1643. for(n=0;n<stringscnt;n++) {
  1644. p = strings[n];
  1645. p += strlen(strings[n]);
  1646. p--;
  1647. while(*p != '.') {
  1648. p--;
  1649. if(p < strings[n]) {
  1650. p++;
  1651. break;
  1652. }
  1653. }
  1654. if(p >strings[n])
  1655. *p = ENDOFSTR;
  1656. fprintf(stdout,"INFO: %s\n",strings[n]);
  1657. }
  1658. fflush(stdout);
  1659. }
  1660. /****************************** KILL_PATH ******************************/
  1661. void kill_path_and_extension(void)
  1662. {
  1663. int n, gotext;
  1664. char *p;
  1665. for(n=0;n<stringscnt;n++) {
  1666. p = strings[n];
  1667. p += strlen(strings[n]);
  1668. p--;
  1669. gotext = 0;
  1670. while(p >= strings[n]) {
  1671. if(!gotext && (*p == '.')) {
  1672. *p = ENDOFSTR;
  1673. gotext = 1;
  1674. }
  1675. if(*p == '\\' || *p == '/') {
  1676. p++;
  1677. break;
  1678. }
  1679. p--;
  1680. }
  1681. if(strlen(p) <=0) {
  1682. sprintf(errstr,"Invalid filename (%s) encountered: cannot complete this process\n",strings[n]);
  1683. do_error();
  1684. }
  1685. fprintf(stdout,"INFO: %s\n",p);
  1686. }
  1687. fflush(stdout);
  1688. }