hfperm.c 87 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247124812491250125112521253125412551256125712581259126012611262126312641265126612671268126912701271127212731274127512761277127812791280128112821283128412851286128712881289129012911292129312941295129612971298129913001301130213031304130513061307130813091310131113121313131413151316131713181319132013211322132313241325132613271328132913301331133213331334133513361337133813391340134113421343134413451346134713481349135013511352135313541355135613571358135913601361136213631364136513661367136813691370137113721373137413751376137713781379138013811382138313841385138613871388138913901391139213931394139513961397139813991400140114021403140414051406140714081409141014111412141314141415141614171418141914201421142214231424142514261427142814291430143114321433143414351436143714381439144014411442144314441445144614471448144914501451145214531454145514561457145814591460146114621463146414651466146714681469147014711472147314741475147614771478147914801481148214831484148514861487148814891490149114921493149414951496149714981499150015011502150315041505150615071508150915101511151215131514151515161517151815191520152115221523152415251526152715281529153015311532153315341535153615371538153915401541154215431544154515461547154815491550155115521553155415551556155715581559156015611562156315641565156615671568156915701571157215731574157515761577157815791580158115821583158415851586158715881589159015911592159315941595159615971598159916001601160216031604160516061607160816091610161116121613161416151616161716181619162016211622162316241625162616271628162916301631163216331634163516361637163816391640164116421643164416451646164716481649165016511652165316541655165616571658165916601661166216631664166516661667166816691670167116721673167416751676167716781679168016811682168316841685168616871688168916901691169216931694169516961697169816991700170117021703170417051706170717081709171017111712171317141715171617171718171917201721172217231724172517261727172817291730173117321733173417351736173717381739174017411742174317441745174617471748174917501751175217531754175517561757175817591760176117621763176417651766176717681769177017711772177317741775177617771778177917801781178217831784178517861787178817891790179117921793179417951796179717981799180018011802180318041805180618071808180918101811181218131814181518161817181818191820182118221823182418251826182718281829183018311832183318341835183618371838183918401841184218431844184518461847184818491850185118521853185418551856185718581859186018611862186318641865186618671868186918701871187218731874187518761877187818791880188118821883188418851886188718881889189018911892189318941895189618971898189919001901190219031904190519061907190819091910191119121913191419151916191719181919192019211922192319241925192619271928192919301931193219331934193519361937193819391940194119421943194419451946194719481949195019511952195319541955195619571958195919601961196219631964196519661967196819691970197119721973197419751976197719781979198019811982198319841985198619871988198919901991199219931994199519961997199819992000200120022003200420052006200720082009201020112012201320142015201620172018201920202021202220232024202520262027202820292030203120322033203420352036203720382039204020412042204320442045204620472048204920502051205220532054205520562057205820592060206120622063206420652066206720682069207020712072207320742075207620772078207920802081208220832084208520862087208820892090209120922093209420952096209720982099210021012102210321042105210621072108210921102111211221132114211521162117
  1. /*
  2. * Copyright (c) 1983-2023 Trevor Wishart and Composers Desktop Project Ltd
  3. * http://www.trevorwishart.co.uk
  4. * http://www.composersdesktop.com
  5. *
  6. This file is part of the CDP System.
  7. The CDP System is free software; you can redistribute it
  8. and/or modify it under the terms of the GNU Lesser General Public
  9. License as published by the Free Software Foundation; either
  10. version 2.1 of the License, or (at your option) any later version.
  11. The CDP System is distributed in the hope that it will be useful,
  12. but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. GNU Lesser General Public License for more details.
  15. You should have received a copy of the GNU Lesser General Public
  16. License along with the CDP System; if not, write to the Free Software
  17. Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
  18. 02111-1307 USA
  19. *
  20. */
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <string.h>
  24. #include <memory.h>
  25. #include <sfsys.h>
  26. #include <osbind.h>
  27. #include <ctype.h>
  28. #include <structures.h>
  29. #include <pnames.h>
  30. #include <processno.h>
  31. #include <flags.h>
  32. #include <modeno.h>
  33. #include <cdpmain.h>
  34. #include <globcon.h>
  35. #include <tkglobals.h>
  36. #include <logic.h>
  37. #include <math.h>
  38. #include <hfperm.h>
  39. #if defined unix || defined __GNUC__
  40. #define round(x) lround((x))
  41. #endif
  42. #define BY_STACKING (0)
  43. #define BY_DENSITY (1)
  44. #define SMALLEST_FIRST (0)
  45. #define LARGEST_FIRST (1)
  46. #define ROOT (0)
  47. #define TOPNOTE (1)
  48. #define KEEP_OCT_EQUIVS (0)
  49. #define ELIMINATE_OCT_EQUIVS (1)
  50. #define ROLLOFF (0.66)
  51. static int generate_perms(double ***combo,int **combolen,int *combocnt,dataptr dz);
  52. static int set_element(int element_no,int total_elements,int field_cnt,int *element,
  53. double ***combo,int **combolen,int *combocnt);
  54. static int store_combo(double ***combo,int *combocnt,int **combolen,int *element,int total_elements);
  55. static void substitute_midivals_in_perms(double **combo,int *combolen,int combocnt,dataptr dz);
  56. static int generate_hfsets(int combocnt,double **combo,int *combolen,
  57. double ***hfset,int **hfsetlen,int *hfsetcnt,dataptr dz);
  58. static int transpose_element(int element_no,double *thiscombo,int thiscombolen,double *origval,
  59. double ***hfset,int **hfsetlen,int *hfsetcnt,dataptr dz);
  60. static int store_transposition(double ***hfset,int **hfsetlen,int *hfsetcnt,double *thiscombo,int thiscombolen);
  61. static int sort_hfsets(double **hfset,int *hfsetlen,int *hfsetcnt,int *grping,dataptr dz);
  62. static int gen_output(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz);
  63. static int gen_outputs(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz);
  64. static int gen_text_output(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz);
  65. static int gen_midi_output(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz);
  66. static void print_grouping_structure(int n,int *grping,int *grping_cnt,int *in_grp,int hfsetcnt);
  67. static void printout_grouping_structure(int n,int *grping,int *grping_cnt,int *in_grp,int hfsetcnt,dataptr dz);
  68. static void set_pitch_to_print(int midi);
  69. static void set_midi_to_print(int midi);
  70. static void print_pitchset(void);
  71. static void printout_pitchset(dataptr dz);
  72. static int sort_by_chord(double **hfset,int *hfsetlen,double *intv,int *hfsetcnt,int *grping,dataptr dz);
  73. static int sort_by_pitchclass_equivalence
  74. (double **hfset,int *hfsetlen,double *pich,int hfsetcnt,int *grping,int *intcnt,
  75. double *intv,int *intvcnt,double *intv2,int *intvcnt2,dataptr dz);
  76. static int sort_by_reference_note_equivalence
  77. (double **hfset,int *hfsetlen,int hfsetcnt,int *grping,dataptr dz);
  78. static void sort_by_maxint(double **hfset,int n,int m,int setlen,dataptr dz);
  79. static void sort_by_density(double **hfset,int n,int m,int setlen,int lowest);
  80. static void sort_by_density_regardless_of_size
  81. (double **hfset,double *intv,int *intcnt,double *intv2,int *intcnt2,int n,int m,int setlen,int densest_first);
  82. static void sort_by_maxintsize_and_density(double **hfset,int n,int m,int setlen,int lowest);
  83. static void sort_by_octave_equivalence(double **hfset,int n,int m,int setlen);
  84. static void sort_by_interval_stacking(double **hfset,int n,int m,int setlen,int highest_first);
  85. static void eliminate_oct_duplicated_sets(double **hfset,int *hfsetcnt,int *hfsetlen,int *grping,int *grping_cnt,int type);
  86. static int setup_naming(char **thisfilename,dataptr dz);
  87. static int create_outfile_name(int ccnt,char *thisfilename,dataptr dz);
  88. static void gen_note(int maxjitter,double *tabstart,double *tabend,double **tabmin, double **tabmax,double **hfset,
  89. double tabscale,double sintabsize,int splicelen, double *sintab,int n, int j);
  90. int next_file(int *samps_written,char *thisfilename,int *ccnt,unsigned int *space_needed,
  91. int *samp_space_available, dataptr dz);
  92. static void gen_note2(double *tabstart,double *tabend,double midival,
  93. double tabscale,double sintabsize,int splicelen, double *sintab);
  94. //static void gen_note3(double *tabstart,double *tabend,double midival,int tabsize,int splicelen, short *intab);
  95. static void gen_note3(double *tabstart,double *tabend,double midival,int tabsize,int splicelen, float *intab);
  96. int gen_dp_output(dataptr dz);
  97. #define LEAVESPACE (10*1024)
  98. int sorting_type = 0;
  99. int do_hfperm(dataptr dz)
  100. {
  101. int exit_status;
  102. char temp[48];
  103. double **hfset = 0, **combo = 0, secs;
  104. int *combolen = 0, combocnt = 0;
  105. int hfsetcnt = 0, hrs = 0, mins = 0;
  106. int *hfsetlen = 0;
  107. int *grping = NULL;
  108. int grping_cnt;
  109. if((exit_status = generate_perms(&combo,&combolen,&combocnt,dz))<0)
  110. return(exit_status);
  111. substitute_midivals_in_perms(combo,combolen,combocnt,dz);
  112. switch(dz->process) {
  113. case(HF_PERM1) :
  114. if((exit_status = generate_hfsets(combocnt,combo,combolen,&hfset,&hfsetlen,&hfsetcnt,dz))<0)
  115. return(exit_status);
  116. break;
  117. case(HF_PERM2):
  118. hfset = combo;
  119. hfsetcnt = combocnt;
  120. hfsetlen = combolen;
  121. }
  122. if((grping = (int *)malloc(hfsetcnt * sizeof(int)))==NULL)
  123. print_outwarning_flush("Insufficient memory to store grouping information.\n");
  124. grping_cnt = sort_hfsets(hfset,hfsetlen,&hfsetcnt,grping,dz);
  125. grping_cnt /= 2;
  126. dz->tempsize = hfsetcnt * (dz->iparam[HP1_ELEMENT_SIZE] + dz->iparam[HP1_GAP_SIZE]);
  127. dz->tempsize += grping_cnt * dz->iparam[HP1_GGAP_SIZE];
  128. if(dz->true_outfile_stype == SAMP_FLOAT)
  129. dz->tempsize *= sizeof(float);
  130. else
  131. dz->tempsize *= sizeof(short);
  132. if(dz->mode == HFP_SNDOUT || dz->mode == HFP_SNDSOUT) {
  133. if(dz->mode == HFP_SNDOUT && ((unsigned int)dz->tempsize > (getdrivefreespace(dz->outfilename) - LEAVESPACE))) {
  134. sprintf(errstr,"dz->tempsize = %d dz->outfilesize = %d Insufficient space on the hard disk to store the output file.\n",
  135. dz->tempsize,dz->outfilesize);
  136. return(MEMORY_ERROR);
  137. } else {
  138. sprintf(errstr,"Generating %d chords\n",hfsetcnt);
  139. print_outmessage(errstr);
  140. if((secs = dz->tempsize/(double)dz->infile->srate) > 60.0) {
  141. mins = (int)floor(secs/60.0);
  142. secs -= (mins * 60.0);
  143. if(mins > 60) {
  144. hrs = mins/60;
  145. mins -= (hrs * 60);
  146. }
  147. }
  148. sprintf(errstr,"Duration of output file: ");
  149. if(hrs) {
  150. sprintf(temp,"%d hrs ",hrs);
  151. strcat(errstr,temp);
  152. }
  153. if(mins) {
  154. sprintf(temp,"%d mins ",mins);
  155. strcat(errstr,temp);
  156. }
  157. sprintf(temp,"%.2lf secs\n",secs);
  158. strcat(errstr,temp);
  159. print_outmessage_flush(errstr);
  160. }
  161. }
  162. switch(dz->mode) {
  163. case(HFP_SNDOUT):
  164. if((exit_status = gen_output(hfsetcnt,hfset,hfsetlen,grping,dz))<0)
  165. return(exit_status);
  166. break;
  167. case(HFP_SNDSOUT):
  168. if((exit_status = gen_outputs(hfsetcnt,hfset,hfsetlen,grping,dz))<0)
  169. return(exit_status);
  170. break;
  171. case(HFP_TEXTOUT):
  172. if((exit_status = gen_text_output(hfsetcnt,hfset,hfsetlen,grping,dz))<0)
  173. return(exit_status);
  174. break;
  175. case(HFP_MIDIOUT):
  176. if((exit_status = gen_midi_output(hfsetcnt,hfset,hfsetlen,grping,dz))<0)
  177. return(exit_status);
  178. break;
  179. }
  180. return(FINISHED);
  181. }
  182. /************************** GENERATE_PERMS **************************/
  183. int generate_perms(double ***combo,int **combolen,int *combocnt,dataptr dz)
  184. {
  185. int exit_status;
  186. int n, j, maxsize;
  187. int *element;
  188. if(dz->iparam[HP1_HFCNT] == dz->iparam[HP1_MINSET]) {
  189. if((*combo = (double **)malloc(sizeof(double *)))==NULL) {
  190. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  191. return(MEMORY_ERROR);
  192. }
  193. if((*combolen = (int *)malloc(sizeof(int)))==NULL) {
  194. sprintf(errstr,"Out of memory for harmonic combination counts.\n");
  195. return(MEMORY_ERROR);
  196. }
  197. if(((*combo)[0] = (double *)malloc(dz->iparam[HP1_HFCNT] * sizeof(double)))==NULL) {
  198. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  199. return(MEMORY_ERROR);
  200. }
  201. for(n=0;n<dz->iparam[HP1_HFCNT];n++)
  202. (*combo)[0][n] = n;
  203. (*combolen)[0] = dz->iparam[HP1_HFCNT];
  204. *combocnt = 1;
  205. return(FINISHED);
  206. } else {
  207. if((element = (int *)malloc(dz->iparam[HP1_HFCNT] * sizeof(int)))==NULL) {
  208. sprintf(errstr,"Out of memory for permutation elements.\n");
  209. return(MEMORY_ERROR);
  210. }
  211. if(dz->vflag[HP1_MINONLY])
  212. maxsize = dz->iparam[HP1_MINSET];
  213. else
  214. maxsize = dz->iparam[HP1_HFCNT];
  215. for(n=dz->iparam[HP1_MINSET];n<=maxsize;n++) {
  216. for(j=0;j<n;j++) /* initialise perm elements */
  217. element[j] = j-1;
  218. if((exit_status = set_element(0,n,dz->iparam[HP1_HFCNT],element,combo,combolen,combocnt))<0) {
  219. free(element);
  220. return(exit_status);
  221. }
  222. }
  223. }
  224. free(element);
  225. return(FINISHED);
  226. }
  227. /************************** SET_ELEMENT **************************
  228. *
  229. * Recursive function to set successive elements of a permutation.
  230. */
  231. int set_element(int element_no,int total_elements,int field_cnt,int *element,double ***combo,int **combolen,int *combocnt)
  232. {
  233. int exit_status, k;
  234. int limit = field_cnt - total_elements + element_no;
  235. for(;;) {
  236. element[element_no]++; /* incr the element number */
  237. if(element[element_no] > limit) { /* if it's now beyond max for this element */
  238. if(element_no > 0) { /* reset this, & all elements above it */
  239. k = element_no; /* to be in ascending sequence from element below */
  240. while(k < total_elements) { /* ready for incrementation of next lowest element */
  241. element[k] = element[k-1] + 1;
  242. k++;
  243. }
  244. }
  245. return(CONTINUE); /* then return to next lowest element */
  246. }
  247. if(element_no >= total_elements-1) { /* if all elements have been set, store the combination */
  248. if((exit_status = store_combo(combo,combocnt,combolen,element,total_elements))<0)
  249. return(exit_status);
  250. } else { /* but if not, go on to set the next element */
  251. if((exit_status = set_element(element_no+1,total_elements,field_cnt,element,combo,combolen,combocnt))<0)
  252. return(exit_status);
  253. }
  254. }
  255. return(CONTINUE); /* NOTREACHED */
  256. }
  257. /************************** STORE_COMBO **************************/
  258. int store_combo(double ***combo,int *combocnt,int **combolen,int *element,int total_elements)
  259. {
  260. int n, j;
  261. j = *combocnt;
  262. (*combocnt)++; /* incr count of combinations */
  263. if(*combocnt == 1) { /* create a new combo_store location */
  264. if((*combo = (double **)malloc(sizeof(double *)))==NULL) {
  265. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  266. return(MEMORY_ERROR);
  267. } /* create a new combo_store_cnt location */
  268. if((*combolen = (int *)malloc(sizeof(int)))==NULL) {
  269. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  270. return(MEMORY_ERROR);
  271. }
  272. } else {
  273. if((*combo = (double **)realloc((char *)(*combo),(*combocnt) * sizeof(double *)))==NULL) {
  274. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  275. return(MEMORY_ERROR);
  276. }
  277. if((*combolen = (int *)realloc((char *)(*combolen),(*combocnt) * sizeof(int)))==NULL) {
  278. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  279. return(MEMORY_ERROR);
  280. }
  281. } /* create the new combo_store */
  282. if(((*combo)[j] = (double *)malloc(total_elements * sizeof(double)))==NULL) {
  283. sprintf(errstr,"Out of memory for harmonic combinations.\n");
  284. return(MEMORY_ERROR);
  285. }
  286. for(n=0; n < total_elements; n++) /* store the new combo */
  287. (*combo)[j][n] = (double)element[n];
  288. (*combolen)[j] = total_elements; /* store the count of the new combo */
  289. return(FINISHED);
  290. }
  291. /************************** ELIMINATE_OCTAVE_DUPLICATIONS **************************/
  292. int eliminate_octave_duplications(dataptr dz)
  293. {
  294. double *hf = dz->parray[0];
  295. int n, m, k, octaves_eliminated = 0;
  296. for(n=0;n< dz->iparam[HP1_HFCNT]-1;n++) {
  297. for(m=n+1;m< dz->iparam[HP1_HFCNT];m++) {
  298. if(flteq(fmod(hf[n],12.0),fmod(hf[m],12.0))) {
  299. octaves_eliminated = 1;
  300. k = m;
  301. dz->iparam[HP1_HFCNT]--;
  302. while(k < dz->iparam[HP1_HFCNT]) {
  303. hf[k] = hf[k+1];
  304. k++;
  305. }
  306. m--;
  307. }
  308. }
  309. }
  310. return octaves_eliminated;
  311. }
  312. /**************************** SUBSTITUTE_MIDIVALS_IN_PERMS *******************************/
  313. void substitute_midivals_in_perms(double **combo,int *combolen,int combocnt,dataptr dz)
  314. {
  315. double *hf = dz->parray[0];
  316. int n, m, k;
  317. for(n=0;n<combocnt;n++) {
  318. for(m=0;m < combolen[n];m++) {
  319. k = (int)combo[n][m];
  320. combo[n][m] = hf[k];
  321. }
  322. }
  323. }
  324. /**************************** BUBLSORT_HF *******************************/
  325. void bublsort_hf(double *hf,dataptr dz)
  326. {
  327. int n, m;
  328. double temp;
  329. for(n=0;n<dz->iparam[HP1_HFCNT]-1;n++) {
  330. for(m = n+1; m<dz->iparam[HP1_HFCNT]; m++) {
  331. if(hf[m] < hf[n]) {
  332. temp = hf[n];
  333. hf[n] = hf[m];
  334. hf[m] = temp;
  335. }
  336. }
  337. }
  338. }
  339. /**************************** GENERATE_OCTS *******************************/
  340. int transpose_element(int element_no,double *thiscombo,int thiscombolen,double *origval,
  341. double ***hfset,int **hfsetlen,int *hfsetcnt,dataptr dz)
  342. {
  343. int exit_status;
  344. for(;;) {
  345. thiscombo[element_no] += 12.0;
  346. if(thiscombo[element_no] > (double)dz->iparam[HP1_TOPNOTE]) {
  347. thiscombo[element_no] = origval[element_no];
  348. return CONTINUE;
  349. }
  350. if(element_no >= thiscombolen-1) { /* if all elements have been set, store the hfset */
  351. if((exit_status = store_transposition(hfset,hfsetlen,hfsetcnt,thiscombo,thiscombolen))<0)
  352. return(exit_status);
  353. } else { /* but if not, go on to set the next element */
  354. if((exit_status =
  355. transpose_element(element_no+1,thiscombo,thiscombolen,origval,hfset,hfsetlen,hfsetcnt,dz))<0)
  356. return(exit_status);
  357. }
  358. }
  359. return(CONTINUE); /* NOTREACHED */
  360. }
  361. /**************************** STORE_TRANSPOSITION *******************************/
  362. int store_transposition(double ***hfset,int **hfsetlen,int *hfsetcnt,double *thiscombo,int thiscombolen)
  363. {
  364. int n, j;
  365. j = *hfsetcnt;
  366. (*hfsetcnt)++; /* incr count of hfset */
  367. if(*hfsetcnt == 1) { /* create a new hfset_store location */
  368. if((*hfset = (double **)malloc(sizeof(double *)))==NULL) {
  369. sprintf(errstr,"Out of memory for final sets.\n");
  370. return(MEMORY_ERROR);
  371. } /* create a new hfset_store_cnt location */
  372. if((*hfsetlen = (int *)malloc(sizeof(int)))==NULL) {
  373. sprintf(errstr,"Out of memory for final sets.\n");
  374. return(MEMORY_ERROR);
  375. }
  376. } else {
  377. if((*hfset = (double **)realloc((char *)(*hfset),(*hfsetcnt) * sizeof(double *)))==NULL) {
  378. sprintf(errstr,"Out of memory for final sets.\n");
  379. return(MEMORY_ERROR);
  380. }
  381. if((*hfsetlen = (int *)realloc((char *)(*hfsetlen),(*hfsetcnt) * sizeof(int)))==NULL) {
  382. sprintf(errstr,"Out of memory for final sets.\n");
  383. return(MEMORY_ERROR);
  384. }
  385. } /* create the new hfset store */
  386. if(((*hfset)[j] = (double *)malloc(thiscombolen * sizeof(double)))==NULL) {
  387. sprintf(errstr,"Out of memory for final sets.\n");
  388. return(MEMORY_ERROR);
  389. }
  390. for(n=0; n < thiscombolen; n++) /* store the new hfset */
  391. (*hfset)[j][n] = thiscombo[n];
  392. (*hfsetlen)[j] = thiscombolen; /* store the count of the new hfset */
  393. return(FINISHED);
  394. }
  395. /************************** GENERATE_HFSETS **************************/
  396. int generate_hfsets(int combocnt,double **combo,int *combolen,double ***hfset,int **hfsetlen,int *hfsetcnt,dataptr dz)
  397. {
  398. int exit_status;
  399. int n, j;
  400. double *origval;
  401. if((origval = (double *)malloc(dz->iparam[HP1_HFCNT] * sizeof(double)))==NULL) {
  402. sprintf(errstr,"Out of memory for storing original comobo vals.\n");
  403. return(MEMORY_ERROR);
  404. }
  405. for(n=0;n<combocnt;n++) {
  406. for(j=0;j<combolen[n];j++) {
  407. combo[n][j] -= 12.0;
  408. origval[j] = combo[n][j];
  409. }
  410. if((exit_status = transpose_element(0,combo[n],combolen[n],origval,hfset,hfsetlen,hfsetcnt,dz))<0)
  411. return(exit_status);
  412. }
  413. return(FINISHED);
  414. }
  415. /************************** SORT_HFSETS **************************/
  416. int sort_hfsets(double **hfset,int *hfsetlen,int *hfsetcnt,int *grping,dataptr dz)
  417. {
  418. int n, m, j;
  419. double temp;
  420. int itemp;
  421. double *intv, *intv2, *pich;
  422. int *intvcnt, *intvcnt2;
  423. // int grping_cnt = 0, in_grp = 0;
  424. int grping_cnt = 0;
  425. int *minint = NULL, *intcnt = NULL;
  426. int hfsetcount = *hfsetcnt;
  427. grping[0] = -1; /* flags output not to do grouping */
  428. for(j = 0;j<hfsetcount;j++) { /* Sort the individual sets themselves, so pitches are in ascending order */
  429. for(n=0;n<hfsetlen[j]-1;n++) {
  430. for(m = n+1; m<hfsetlen[j]; m++) {
  431. if(hfset[j][m] < hfset[j][n]) {
  432. temp = hfset[j][n];
  433. hfset[j][n] = hfset[j][m];
  434. hfset[j][m] = temp;
  435. }
  436. }
  437. }
  438. }
  439. print_outmessage_flush("Sorting chords by note-count.\n");
  440. for(n=0;n<hfsetcount-1;n++) { /* Sort the sets by size */
  441. for(m = n+1; m<hfsetcount; m++) {
  442. if(hfsetlen[m] < hfsetlen[n]) {
  443. itemp = hfsetlen[n];
  444. hfsetlen[n] = hfsetlen[m];
  445. hfsetlen[m] = itemp;
  446. }
  447. }
  448. }
  449. switch(dz->iparam[HP1_SORT1]) {
  450. case(ROOT):
  451. case(TOP):
  452. case(PCLASS):
  453. if ((intv = (double *)malloc(dz->iparam[HP1_HFCNT] * sizeof(double)))==NULL) {
  454. print_outwarning_flush("Insufficient memory to sort chords in terms of pitch equivalence.\n");
  455. return 0;
  456. }
  457. if ((intv2 = (double *)malloc(dz->iparam[HP1_HFCNT] * sizeof(double)))==NULL) {
  458. print_outwarning_flush("Insufficient memory to sort chords in terms of pitch equivalence.\n");
  459. return 0;
  460. }
  461. if ((intvcnt = (int *)malloc(dz->iparam[HP1_HFCNT] * sizeof(int)))==NULL) {
  462. print_outwarning_flush("Insufficient memory to sort chords in terms of pitch equivalence.\n");
  463. return 0;
  464. }
  465. if ((intvcnt2 = (int *)malloc(dz->iparam[HP1_HFCNT] * sizeof(int)))==NULL) {
  466. print_outwarning_flush("Insufficient memory to sort chords in terms of pitch equivalence.\n");
  467. return 0;
  468. }
  469. if ((pich = (double *)malloc(dz->iparam[HP1_HFCNT] * sizeof(double)))==NULL) {
  470. print_outwarning_flush("Insufficient memory to sort chords in terms of pitch equivalence.\n");
  471. return 0;
  472. }
  473. if(dz->vflag[HP1_DENS] == OTHER_SORT) {
  474. if ((minint = (int *)malloc(hfsetcount * sizeof(int)))==NULL)
  475. print_outwarning_flush("Insufficient memory to sort chord-groups.\n");
  476. else if ((intcnt = (int *)malloc(hfsetcount * sizeof(int)))==NULL)
  477. print_outwarning_flush("Insufficient memory to sort chord-groups.\n");
  478. }
  479. switch(dz->iparam[HP1_SORT1]) {
  480. case(PCLASS):
  481. print_outmessage_flush("Sorting chords by pitchclass-equivalence.\n");
  482. grping_cnt = sort_by_pitchclass_equivalence
  483. (hfset,hfsetlen,pich,hfsetcount,grping,intcnt,intv,intvcnt,intv2,intvcnt2,dz);
  484. break;
  485. default:
  486. print_outmessage_flush("Sorting chords by reference-note-equivalence.\n");
  487. grping_cnt = sort_by_reference_note_equivalence(hfset,hfsetlen,hfsetcount,grping,dz);
  488. break;
  489. }
  490. break;
  491. case(CHORDTYPE):
  492. case(CHORD_1):
  493. if ((intv = (double *)malloc(dz->iparam[HP1_HFCNT] * sizeof(double)))==NULL) {
  494. print_outwarning_flush("Insufficient memory to sort chords in terms of interval equivalence.\n");
  495. return 0;
  496. }
  497. print_outmessage_flush("Sorting chords by interval-equivalence.\n");
  498. grping_cnt = sort_by_chord(hfset,hfsetlen,intv,hfsetcnt,grping,dz);
  499. break;
  500. default:
  501. sprintf(errstr,"Unknown chord sort type.\n");
  502. return(PROGRAM_ERROR);
  503. }
  504. if(dz->vflag[HP1_ELIMOCTS] && (dz->iparam[HP1_SORT1] != CHORD_1))
  505. eliminate_oct_duplicated_sets(hfset,hfsetcnt,hfsetlen,grping,&grping_cnt,sorting_type);
  506. return grping_cnt;
  507. }
  508. /************************** GEN_OUTPUT **************************/
  509. int gen_output(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz)
  510. {
  511. int exit_status;
  512. // short *obuf = dz->sampbuf[0];
  513. float *obuf = dz->sampbuf[0];
  514. double *tab = (double *)dz->sampbuf[2];
  515. double *tabend = tab + dz->iparam[HP1_ELEMENT_SIZE];
  516. double tabscale = (double)HFP_TABSIZE/dz->infile->srate;
  517. double *sintab = (double *)dz->sampbuf[1];
  518. double sintabsize = (double)HFP_TABSIZE;
  519. double element_level;
  520. int samps_written = 0, samp_space_available, samps_to_write, gap_size;
  521. int n, i, j, grping_cnt = 0;
  522. int maxjitter = (int)round(drand48() * HFP_MAXJITTER * MS_TO_SECS * (double)dz->infile->srate);
  523. unsigned int element_byte_len = dz->iparam[HP1_ELEMENT_SIZE] * sizeof(double);
  524. unsigned int element_full_len = element_byte_len + (maxjitter * sizeof(double));
  525. double *tabmax = 0, *tabmin = tab + dz->iparam[HP1_ELEMENT_SIZE] + maxjitter;
  526. int splicelen = (int)round(HP1_SPLICELEN * MS_TO_SECS * (double)dz->infile->srate);
  527. int in_group = 0, in_grp = 0;
  528. print_outmessage_flush("Synthesis beginning.\n");
  529. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  530. for(n=0;n<hfsetcnt;n++) {
  531. memset((char *)dz->sampbuf[2],0,element_full_len);
  532. if(grping!=NULL && grping[0] != -1)
  533. print_grouping_structure(n,grping,&grping_cnt,&in_grp,hfsetcnt);
  534. errstr[0] = ENDOFSTR;
  535. for(j=0;j<hfsetlen[n];j++) {
  536. set_pitch_to_print((int)hfset[n][j]);
  537. gen_note(maxjitter,tab,tabend,&tabmin,&tabmax,hfset,tabscale,sintabsize,splicelen,sintab,n,j);
  538. }
  539. print_pitchset();
  540. element_level = HFP_OUTLEVEL/hfsetlen[n];
  541. tab = tabmin;
  542. while(tab < tabmax)
  543. *tab++ *= element_level;
  544. /* DO OUTPUT */
  545. samp_space_available = dz->buflen - samps_written;
  546. gap_size = dz->iparam[HP1_GAP_SIZE];
  547. if(grping!=NULL && grping[0] != -1) {
  548. if(grping[grping_cnt]==n) {
  549. in_group = 1;
  550. gap_size += dz->iparam[HP1_GGAP_SIZE]; /* make gap at start */
  551. grping_cnt++;
  552. } else if(grping[grping_cnt]==-n) {
  553. in_group = 0;
  554. gap_size += dz->iparam[HP1_GGAP_SIZE]; /* make gap at end */
  555. grping_cnt++; /* if grp end coincides with gp start */
  556. if(grping[grping_cnt]==n) { /* skip a grping value */
  557. in_group = 1;
  558. grping_cnt++;
  559. }
  560. } else if (!in_group)
  561. gap_size += dz->iparam[HP1_GGAP_SIZE]; /* make gap between non-grouped entries */
  562. }
  563. if(n!=0) { /* no gap at start */
  564. while(gap_size >= samp_space_available) {
  565. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  566. return(exit_status);
  567. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  568. gap_size -= samp_space_available;
  569. samp_space_available = dz->buflen;
  570. samps_written = 0;
  571. }
  572. samps_written += gap_size;
  573. samp_space_available = dz->buflen - samps_written;
  574. }
  575. i = 0;
  576. tab = tabmin;
  577. samp_space_available = dz->buflen - samps_written;
  578. samps_to_write = tabmax - tabmin;
  579. while(i < samps_to_write) {
  580. if(samp_space_available > samps_to_write) {
  581. while(i < samps_to_write)
  582. // obuf[samps_written++] = (short)round(tab[i++] * MAXSAMP);
  583. obuf[samps_written++] = (float)tab[i++];
  584. } else {
  585. while(samps_written < dz->buflen)
  586. // obuf[samps_written++] = (short)round(tab[i++] * MAXSAMP);
  587. obuf[samps_written++] = (float)tab[i++];
  588. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  589. return(exit_status);
  590. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  591. samps_written = 0;
  592. samp_space_available = dz->buflen;
  593. }
  594. }
  595. }
  596. if(grping!=NULL && grping[0] != -1)
  597. print_grouping_structure(n,grping,&grping_cnt,&in_grp,hfsetcnt);
  598. samps_written += dz->iparam[HP1_GAP_SIZE];
  599. while(samps_written >= dz->buflen) {
  600. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  601. return(exit_status);
  602. samps_written -= dz->buflen;
  603. }
  604. if(samps_written > 0) {
  605. if((exit_status = write_samps(dz->sampbuf[0],samps_written,dz))<0)
  606. return(exit_status);
  607. }
  608. return(FINISHED);
  609. }
  610. /************************** GEN_OUTPUTS **************************/
  611. int gen_outputs(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz)
  612. {
  613. int exit_status;
  614. float *obuf = dz->sampbuf[0];
  615. double *tab = (double *)dz->sampbuf[2];
  616. double *tabend = tab + dz->iparam[HP1_ELEMENT_SIZE];
  617. double tabscale = (double)HFP_TABSIZE/dz->infile->srate;
  618. double *sintab = (double *)dz->sampbuf[1];
  619. double sintabsize = (double)HFP_TABSIZE;
  620. double element_level;
  621. int samps_written = 0, samp_space_available, samps_to_write, gap_size;
  622. int n, i, j, grping_cnt = 0;
  623. int maxjitter = (int)round(drand48() * HFP_MAXJITTER * MS_TO_SECS * (double)dz->infile->srate);
  624. unsigned int element_byte_len = dz->iparam[HP1_ELEMENT_SIZE] * sizeof(double);
  625. unsigned int element_full_len = element_byte_len + (maxjitter * sizeof(double));
  626. double *tabmax = 0, *tabmin = tab + dz->iparam[HP1_ELEMENT_SIZE] + maxjitter;
  627. int splicelen = (int)round(HP1_SPLICELEN * MS_TO_SECS * (double)dz->infile->srate);
  628. int in_group = 0, in_grp = 0;
  629. char *thisfilename;
  630. int ccnt = 0;
  631. unsigned int space_needed = dz->tempsize;
  632. superzargo = 0;
  633. if((exit_status = setup_naming(&thisfilename,dz))<0)
  634. return(exit_status);
  635. if((exit_status = create_outfile_name(0,thisfilename,dz))<0)
  636. return(exit_status);
  637. dz->process_type = UNEQUAL_SNDFILE; /* allow sndfile to be created */
  638. if((exit_status = create_sized_outfile(thisfilename,dz))<0) {
  639. fprintf(stdout, "WARNING: Soundfile %s already exists.\n", thisfilename);
  640. fflush(stdout);
  641. dz->process_type = OTHER_PROCESS;
  642. dz->ofd = -1;
  643. return(PROGRAM_ERROR);
  644. }
  645. if((unsigned int)dz->outfilesize < space_needed) {
  646. sprintf(errstr,"Insufficient space on the hard disk to store the output files.\n");
  647. return(MEMORY_ERROR);
  648. }
  649. dz->total_samps_written = 0;
  650. print_outmessage_flush("Synthesis beginning.\n");
  651. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  652. for(n=0;n<hfsetcnt;n++) {
  653. memset((char *)dz->sampbuf[2],0,element_full_len);
  654. if(grping!=NULL && grping[0] != -1)
  655. print_grouping_structure(n,grping,&grping_cnt,&in_grp,hfsetcnt);
  656. errstr[0] = ENDOFSTR;
  657. for(j=0;j<hfsetlen[n];j++) {
  658. set_pitch_to_print((int)hfset[n][j]);
  659. gen_note(maxjitter,tab,tabend,&tabmin,&tabmax,hfset,tabscale,sintabsize,splicelen,sintab,n,j);
  660. }
  661. print_pitchset();
  662. element_level = HFP_OUTLEVEL/hfsetlen[n];
  663. tab = tabmin;
  664. while(tab < tabmax)
  665. *tab++ *= element_level;
  666. /* DO OUTPUT */
  667. samp_space_available = dz->buflen - samps_written;
  668. gap_size = dz->iparam[HP1_GAP_SIZE];
  669. if(grping!=NULL && grping[0] != -1) {
  670. if(grping[grping_cnt]==n) {
  671. if(in_group == 0 && n!=0) {
  672. if((exit_status = next_file(&samps_written,thisfilename,&ccnt,&space_needed,&samp_space_available,dz))<0)
  673. return(exit_status);
  674. }
  675. in_group = 1;
  676. grping_cnt++;
  677. } else if(grping[grping_cnt]==-n) { /* if at end of group */
  678. in_group = 0;
  679. if((exit_status = next_file(&samps_written,thisfilename,&ccnt,&space_needed,&samp_space_available,dz))<0)
  680. return(exit_status);
  681. grping_cnt++; /* if grp end coincides with gp start */
  682. if(grping[grping_cnt]==n) { /* skip a grping value */
  683. in_group = 1;
  684. grping_cnt++;
  685. }
  686. } else if(in_group == 0 && n!=0) { /* if not a grouped chord */
  687. if((exit_status = next_file(&samps_written,thisfilename,&ccnt,&space_needed,&samp_space_available,dz))<0)
  688. return(exit_status);
  689. }
  690. }
  691. if(n!=0) { /* no gap at start */
  692. while(gap_size >= samp_space_available) {
  693. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  694. return(exit_status);
  695. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  696. gap_size -= samp_space_available;
  697. samp_space_available = dz->buflen;
  698. samps_written = 0;
  699. }
  700. samps_written += gap_size;
  701. samp_space_available = dz->buflen - samps_written;
  702. }
  703. i = 0;
  704. tab = tabmin;
  705. samp_space_available = dz->buflen - samps_written;
  706. samps_to_write = tabmax - tabmin;
  707. while(i < samps_to_write) {
  708. if(samp_space_available > samps_to_write) {
  709. while(i < samps_to_write)
  710. obuf[samps_written++] = (float)tab[i++];
  711. } else {
  712. while(samps_written < dz->buflen)
  713. obuf[samps_written++] = (float)tab[i++];
  714. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  715. return(exit_status);
  716. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  717. samps_written = 0;
  718. samp_space_available = dz->buflen;
  719. }
  720. }
  721. }
  722. if(grping!=NULL && grping[0] != -1)
  723. print_grouping_structure(n,grping,&grping_cnt,&in_grp,hfsetcnt);
  724. samps_written += dz->iparam[HP1_GAP_SIZE];
  725. while(samps_written >= dz->buflen) {
  726. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  727. return(exit_status);
  728. samps_written -= dz->buflen;
  729. }
  730. if(samps_written > 0) {
  731. if((exit_status = write_samps(dz->sampbuf[0],samps_written,dz))<0)
  732. return(exit_status);
  733. }
  734. /* CLOSE FILE */
  735. dz->outfiletype = SNDFILE_OUT; /* allows header to be written */
  736. if((exit_status = headwrite(dz->ofd,dz))<0)
  737. return(exit_status);
  738. dz->process_type = OTHER_PROCESS;
  739. dz->outfiletype = NO_OUTPUTFILE;
  740. if((exit_status = reset_peak_finder(dz))<0)
  741. return(exit_status);
  742. if(sndcloseEx(dz->ofd) < 0) {
  743. fprintf(stdout,"WARNING: Can't close output soundfile %s\n",thisfilename);
  744. fflush(stdout);
  745. }
  746. dz->ofd = -1;
  747. return(FINISHED);
  748. }
  749. /************************** GEN_TEXT_OUTPUT **************************/
  750. int gen_text_output(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz)
  751. {
  752. int n, j, grping_cnt = 0;
  753. int in_grp = 0;
  754. for(n=0;n<hfsetcnt;n++) {
  755. if(grping!=NULL && grping[0] != -1) {
  756. printout_grouping_structure(n,grping,&grping_cnt,&in_grp,hfsetcnt,dz);
  757. }
  758. errstr[0] = ENDOFSTR;
  759. for(j=0;j<hfsetlen[n];j++) {
  760. set_pitch_to_print((int)hfset[n][j]);
  761. }
  762. printout_pitchset(dz);
  763. if(grping!=NULL && grping[0] != -1) {
  764. if(grping[grping_cnt]==n) {
  765. //in_group = 1;
  766. grping_cnt++;
  767. } else if(grping[grping_cnt]==-n) { /* if at end of group */
  768. //in_group = 0;
  769. grping_cnt++; /* if grp end coincides with gp start */
  770. if(grping[grping_cnt]==n) { /* skip a grping value */
  771. //in_group = 1;
  772. grping_cnt++;
  773. }
  774. }
  775. }
  776. }
  777. if(grping!=NULL && grping[0] != -1) {
  778. printout_grouping_structure(n,grping,&grping_cnt,&in_grp,hfsetcnt,dz);
  779. }
  780. display_virtual_time(dz->tempsize,dz);
  781. return(FINISHED);
  782. }
  783. /************************** GEN_MIDI_OUTPUT **************************/
  784. int gen_midi_output(int hfsetcnt,double **hfset,int *hfsetlen,int *grping,dataptr dz)
  785. {
  786. int n, j, grping_cnt = 0;
  787. // int in_group = 0, in_grp = 0;
  788. //int in_group = 0;
  789. for(n=0;n<hfsetcnt;n++) {
  790. errstr[0] = ENDOFSTR;
  791. for(j=0;j<hfsetlen[n];j++)
  792. set_midi_to_print((int)hfset[n][j]);
  793. printout_pitchset(dz);
  794. if(grping!=NULL && grping[0] != -1) {
  795. if(grping[grping_cnt]==n) {
  796. //in_group = 1;
  797. grping_cnt++;
  798. } else if(grping[grping_cnt]==-n) { /* if at end of group, or not a grouped chord */
  799. //in_group = 0;
  800. grping_cnt++; /* if grp end coincides with gp start */
  801. if(grping[grping_cnt]==n) { /* skip a grping value */
  802. //in_group = 1;
  803. grping_cnt++;
  804. }
  805. }
  806. }
  807. }
  808. display_virtual_time(dz->tempsize,dz);
  809. return(FINISHED);
  810. }
  811. /************************** PRINT_GROUPING_STRUCTURE **************************/
  812. void print_grouping_structure(int n,int *grping,int *grping_cnt,int *in_grp,int hfsetcnt)
  813. {
  814. if(grping[*grping_cnt]==-n && (n!=0)) { /* if end of group marked */
  815. *in_grp = 0;
  816. print_outmessage_flush("))- - - - - - -\n");
  817. if(grping[(*grping_cnt)+1]==n) { /* if start of group ALSO marked */
  818. *in_grp = 1;
  819. print_outmessage_flush("-------------((\n");
  820. }
  821. } else if(grping[*grping_cnt]==n) { /* if start of group marked */
  822. *in_grp = 1;
  823. print_outmessage_flush("-------------((\n");
  824. } else if(!(*in_grp)) { /* not inside a group */
  825. print_outmessage_flush("-----\n");
  826. } else if(n >= hfsetcnt) { /* inside a group at end of whole pass */
  827. print_outmessage_flush("))- - - - - - -\n");
  828. }
  829. }
  830. /************************** PRINTOUT_GROUPING_STRUCTURE **************************/
  831. void printout_grouping_structure(int n,int *grping,int *grping_cnt,int *in_grp,int hfsetcnt,dataptr dz)
  832. {
  833. if(grping[*grping_cnt]==-n && (n!=0)) { /* if end of group marked */
  834. *in_grp = 0;
  835. print_outmessage_flush("))- - - - - - -\n");
  836. fprintf(dz->fp,"))- - - - - - -\n");
  837. if(grping[(*grping_cnt)+1]==n) { /* if start of group ALSO marked */
  838. *in_grp = 1;
  839. print_outmessage_flush("-------------((\n");
  840. fprintf(dz->fp,"-------------((\n");
  841. }
  842. } else if(grping[*grping_cnt]==n) { /* if start of group marked */
  843. *in_grp = 1;
  844. print_outmessage_flush("-------------((\n");
  845. fprintf(dz->fp,"-------------((\n");
  846. } else if(!(*in_grp)) { /* not inside a group */
  847. print_outmessage_flush("-----\n");
  848. fprintf(dz->fp,"-----\n");
  849. } else if(n >= hfsetcnt) { /* inside a group at end of whole pass */
  850. print_outmessage_flush("))- - - - - - -\n");
  851. fprintf(dz->fp,"))- - - - - - -\n");
  852. }
  853. }
  854. /************************** SET_PITCH_TO_PRINT **************************/
  855. void set_pitch_to_print(int midi)
  856. {
  857. int oct = (midi/12)-5;
  858. char temp[12];
  859. midi = midi%12;
  860. switch(midi) {
  861. case(0): sprintf(temp,"C%d ",oct); break;
  862. case(1): sprintf(temp,"C#%d ",oct); break;
  863. case(2): sprintf(temp,"D%d ",oct); break;
  864. case(3): sprintf(temp,"Eb%d ",oct); break;
  865. case(4): sprintf(temp,"E%d ",oct); break;
  866. case(5): sprintf(temp,"F%d ",oct); break;
  867. case(6): sprintf(temp,"F#%d ",oct); break;
  868. case(7): sprintf(temp,"G%d ",oct); break;
  869. case(8): sprintf(temp,"Ab%d ",oct); break;
  870. case(9): sprintf(temp,"A%d ",oct); break;
  871. case(10): sprintf(temp,"Bb%d ",oct); break;
  872. case(11): sprintf(temp,"B%d ",oct); break;
  873. }
  874. if(oct>=0)
  875. strcat(temp," ");
  876. strcat(errstr,temp);
  877. }
  878. /************************** SET_MIDI_TO_PRINT **************************/
  879. void set_midi_to_print(int midi)
  880. {
  881. char temp[12];
  882. sprintf(temp,"%d ",midi);
  883. strcat(errstr,temp);
  884. }
  885. /************************** PRINT_PITCHSET **************************/
  886. void print_pitchset(void)
  887. {
  888. char temp[12];
  889. sprintf(temp,"\n");
  890. strcat(errstr,temp);
  891. print_outmessage_flush(errstr);
  892. }
  893. /************************** PRINTOUT_PITCHSET **************************/
  894. void printout_pitchset(dataptr dz)
  895. {
  896. char temp[12];
  897. sprintf(temp,"\n");
  898. strcat(errstr,temp);
  899. print_outmessage_flush(errstr);
  900. fprintf(dz->fp,"%s",errstr);
  901. }
  902. /************************** SORT_BY_CHORD ***************************
  903. *
  904. * Sort size-ordered then pitch-ordered sets, by equivalence of chords they make up.
  905. */
  906. int sort_by_chord(double **hfset,int *hfsetlen,double *intv,int *hfsetcnt,int *grping,dataptr dz)
  907. {
  908. int a, b, m, n, j, lastmatch, was_a_match;
  909. double *tempoint;
  910. int grping_cnt = 0, matching_intervals = 0;
  911. for(n=0;n<(*hfsetcnt)-1;n++) {
  912. for(j = 0; j<hfsetlen[n]-1; j++)
  913. intv[j] = hfset[n][j+1] - hfset[n][j]; /* set up intervals of first set as a comparison set */
  914. lastmatch = n;
  915. was_a_match = 0;
  916. for(m = n+1; m<=*hfsetcnt; m++) {
  917. if(m==*hfsetcnt || hfsetlen[m] != hfsetlen[n]){ /* if got to end of group-of-sets of same size */
  918. if(was_a_match) { /* if a matching-group has just been put together */
  919. for(a=n;a<lastmatch;a++) {
  920. for(b = a+1; b<=lastmatch; b++) { /* sort matching chords into pitch-ascending order */
  921. if(hfset[b][0] < hfset[a][0]) {
  922. tempoint = hfset[a];
  923. hfset[a] = hfset[b];
  924. hfset[b] = tempoint;
  925. }
  926. }
  927. }
  928. if(grping!=NULL && n!=0) {
  929. grping[grping_cnt++] = n; /* ....mark group start */
  930. grping[grping_cnt++] = -(lastmatch+1); /* mark group end */
  931. }
  932. if(lastmatch != m-1) { /* if match-group didn't end at end of last samesize-group */
  933. n = lastmatch+1; /* baktrak n to position AFTER END of matching set */
  934. for(j = 0; j<hfsetlen[n]-1; j++) /* set this set's intervals as comparison intervals */
  935. intv[j] = hfset[n][j+1] - hfset[n][j];
  936. m = n; /* reset m to run over sets after n */
  937. lastmatch = n;
  938. was_a_match = 0; /* search for further matching sets */
  939. continue;
  940. /* ELSE last match ended at end of group-of-sets */
  941. } else if(m < (*hfsetcnt)-1) { /* SO, if we're not at last set */
  942. for(j = 0; j<hfsetlen[m]-1; j++) /* establish interval comparison set for new setsize */
  943. intv[j] = hfset[m][j+1] - hfset[m][j];
  944. lastmatch = m; /* reset the base pointer of matching sets */
  945. was_a_match = 0;
  946. n = m; /* skip n-index to base of next group samesize sets */
  947. }
  948. } else { /* matching set not been made in this pass */
  949. m = *hfsetcnt; /* force n to advance */
  950. }
  951. } else {
  952. matching_intervals = 1; /* compare samesize (sorted) sets for matching intervals */
  953. for(j = 0; j<hfsetlen[m]-1; j++) {
  954. if (!flteq(intv[j],hfset[m][j+1] - hfset[m][j])) {
  955. matching_intervals = 0;
  956. break;
  957. }
  958. }
  959. if(matching_intervals) { /* if all intervals match */
  960. was_a_match = 1; /* note tha a match has been found in this pass */
  961. lastmatch++; /* incr pointer to last match position */
  962. if(m != lastmatch) { /* if the matching set is not AT this position */
  963. tempoint = hfset[lastmatch]; /* move it to that position */
  964. hfset[lastmatch] = hfset[m];
  965. hfset[m] = tempoint;
  966. }
  967. }
  968. }
  969. }
  970. }
  971. if(dz->iparam[HP1_SORT1] == CHORD_1) {
  972. for(b = 0; b < grping_cnt; b+=2) {
  973. m = grping[b] + 1;
  974. n = -(grping[b+1]);
  975. j = n - m;
  976. while(n < *hfsetcnt)
  977. hfset[m++] = hfset[n++];
  978. *hfsetcnt -= j;
  979. }
  980. grping_cnt = 0;
  981. grping[0] = -1;
  982. }
  983. return grping_cnt;
  984. }
  985. /************************** SORT_BY_PITCHCLASS_EQUIVALENCE ***************************
  986. *
  987. * Sort size-ordered THEN pitch-ordered sets, by pitch-class equivalence of root note in each size-group.
  988. */
  989. int sort_by_pitchclass_equivalence
  990. (double **hfset,int *hfsetlen,double *pich,int hfsetcnt,int *grping,int *intcnt,
  991. double *intv,int *intvcnt,double *intv2,int *intvcnt2,dataptr dz)
  992. {
  993. int j, k, m, n;
  994. int in_grp = 0, grping_cnt = 0, matching_pitches, setlen;
  995. n = 0;
  996. setlen = hfsetlen[n];
  997. for(j = 0; j<setlen; j++)
  998. pich[j] = fmod(hfset[n][j],12.0); /* set up pitches of first set, as a comparison set */
  999. for(m=1;m<hfsetcnt;m++) {
  1000. if(hfsetlen[m] != setlen) {
  1001. if(in_grp) {
  1002. grping[grping_cnt++] = -m; /* mark end of group */
  1003. in_grp = 0;
  1004. }
  1005. if(intcnt != NULL) {
  1006. if(dz->vflag[HP1_DENS] == DENSE_SORT)
  1007. sort_by_density_regardless_of_size(hfset,intv,intvcnt,intv2,intvcnt2,n,m,setlen,1);
  1008. else
  1009. sort_by_maxintsize_and_density(hfset,n,m,setlen,0);
  1010. }
  1011. n = m;
  1012. setlen = hfsetlen[n];
  1013. for(j = 0; j<setlen; j++)
  1014. pich[j] = fmod(hfset[n][j],12.0); /* set up pitches of new comparison set */
  1015. continue;
  1016. }
  1017. matching_pitches = 1; /* no pitch-class duplication in sets */
  1018. for(j=0;j<hfsetlen[m];j++) {
  1019. matching_pitches = 0;
  1020. for(k=0;k<hfsetlen[m];k++) {
  1021. if(flteq(fmod(hfset[m][j],12.0),pich[k])) {
  1022. matching_pitches = 1;
  1023. break;
  1024. }
  1025. }
  1026. if(!matching_pitches)
  1027. break;
  1028. }
  1029. if(matching_pitches) {
  1030. if(!in_grp) {
  1031. grping[grping_cnt++] = (m-1); /* mark start of group */
  1032. in_grp = 1;
  1033. }
  1034. } else {
  1035. if(in_grp) {
  1036. grping[grping_cnt++] = -m; /* mark end of group */
  1037. in_grp = 0;
  1038. }
  1039. if(intcnt != NULL) {
  1040. if(dz->vflag[HP1_DENS] == DENSE_SORT)
  1041. sort_by_density_regardless_of_size(hfset,intv,intvcnt,intv2,intvcnt2,n,m,setlen,1);
  1042. else
  1043. sort_by_maxintsize_and_density(hfset,n,m,setlen,0);
  1044. }
  1045. n = m;
  1046. setlen = hfsetlen[n];
  1047. for(j = 0; j<setlen; j++)
  1048. pich[j] = fmod(hfset[n][j],12.0); /* set up pitches of new comparison set */
  1049. continue;
  1050. }
  1051. }
  1052. if(intcnt != NULL) {
  1053. if(dz->vflag[HP1_DENS] == DENSE_SORT)
  1054. sort_by_density_regardless_of_size(hfset,intv,intvcnt,intv2,intvcnt2,n,m,setlen,1);
  1055. else
  1056. sort_by_maxintsize_and_density(hfset,n,m,setlen,0);
  1057. }
  1058. return(grping_cnt);
  1059. }
  1060. /************************** SORT_BY_REFERENCE_NOTE_EQUIVALENCE ***************************
  1061. *
  1062. * Sort pitch-ordered by pitch-class equivalence of root note.
  1063. */
  1064. int sort_by_reference_note_equivalence(double **hfset,int *hfsetlen,int hfsetcnt,int *grping,dataptr dz)
  1065. {
  1066. int j, k, m, n;
  1067. int in_grp = 0, grping_cnt = 0, setlen, end, note = 0;
  1068. double *tempoint, thispitch, thatpitch;
  1069. n = 0;
  1070. m = n+1;
  1071. while(m < hfsetcnt) {
  1072. setlen = hfsetlen[n];
  1073. end = setlen - 1;
  1074. switch(dz->iparam[HP1_SORT1]) {
  1075. case(ROOT): note = 0; break;
  1076. case(TOP): note = end; break;
  1077. }
  1078. while(hfsetlen[m] == setlen) { /* find sets of same size */
  1079. if(++m >= hfsetcnt)
  1080. break;
  1081. }
  1082. for(j=n;j<m-1;j++) { /* sort all these samesize sets into root pitchclass order */
  1083. if(dz->process == HF_PERM1)
  1084. thispitch = fmod(hfset[j][note],12.0);
  1085. else
  1086. thispitch = hfset[j][note];
  1087. for(k=j+1;k<m;k++) {
  1088. if(dz->process == HF_PERM1)
  1089. thatpitch = fmod(hfset[k][note],12.0);
  1090. else
  1091. thatpitch = hfset[k][note];
  1092. if(thatpitch < thispitch) {
  1093. tempoint = hfset[k];
  1094. hfset[k] = hfset[j];
  1095. hfset[j] = tempoint;
  1096. }
  1097. }
  1098. }
  1099. k = n; /* sort all these into same-root sets */
  1100. j = k+1;
  1101. if(j >= hfsetcnt)
  1102. break;
  1103. in_grp = 0;
  1104. while(j < m) {
  1105. if(dz->process == HF_PERM1) {
  1106. thispitch = fmod(hfset[k][note],12.0);
  1107. thatpitch = fmod(hfset[j][note],12.0);
  1108. } else {
  1109. thispitch = hfset[k][note];
  1110. thatpitch = hfset[j][note];
  1111. }
  1112. while(flteq(thatpitch,thispitch)) {
  1113. if(!in_grp) {
  1114. grping[grping_cnt++] = k; /* mark start of group */
  1115. in_grp = 1;
  1116. }
  1117. if(++j >= m)
  1118. break;
  1119. if(dz->process == HF_PERM1) {
  1120. thispitch = fmod(hfset[k][note],12.0);
  1121. thatpitch = fmod(hfset[j][note],12.0);
  1122. } else {
  1123. thispitch = hfset[k][note];
  1124. thatpitch = hfset[j][note];
  1125. }
  1126. }
  1127. if(in_grp) { /* sort all these into density:tessitura order */
  1128. grping[grping_cnt++] = -j; /* mark end of group */
  1129. sort_by_maxint(hfset,k,j,setlen,dz);
  1130. in_grp = 0; /* sort same-root sets into interval size and stack order */
  1131. }
  1132. k = j;
  1133. j = k+1;
  1134. }
  1135. n = m;
  1136. m = n+1;
  1137. }
  1138. return(grping_cnt);
  1139. }
  1140. /********************************* SORT_BY_MAXINT *********************************
  1141. *
  1142. * Sort pitch-ordered sets of FIXED SIZE by size of largest interval, then by interval density
  1143. */
  1144. void sort_by_maxint(double **hfset,int n,int m,int setlen,dataptr dz)
  1145. {
  1146. int j, k;
  1147. double j_maxint, k_maxint, *tempoint;
  1148. int end = setlen - 1;
  1149. int in_grp;
  1150. for(j=n;j<m-1;j++) { /* sort all by size of largest interval */
  1151. j_maxint = hfset[j][end] - hfset[j][0];
  1152. for(k=j+1;k<m;k++) {
  1153. k_maxint = hfset[k][end] - hfset[k][0];
  1154. switch(dz->vflag[HP1_SPAN]) {
  1155. case(MAXSPAN_FIRST):
  1156. if(k_maxint < j_maxint) {
  1157. tempoint = hfset[j];
  1158. hfset[j] = hfset[k];
  1159. hfset[k] = tempoint;
  1160. j_maxint = k_maxint;
  1161. }
  1162. break;
  1163. case(MAXSPAN_LAST):
  1164. if(k_maxint > j_maxint) {
  1165. tempoint = hfset[j];
  1166. hfset[j] = hfset[k];
  1167. hfset[k] = tempoint;
  1168. j_maxint = k_maxint;
  1169. }
  1170. break;
  1171. }
  1172. }
  1173. }
  1174. k = n;
  1175. j = k+1;
  1176. in_grp = 0;
  1177. while(j < m) { /* sort largest-interval sets by internal interval arrangement */
  1178. in_grp = 0;
  1179. k_maxint = hfset[k][end] - hfset[k][0];
  1180. j_maxint = hfset[j][end] - hfset[j][0];
  1181. while(flteq(j_maxint,k_maxint)) {
  1182. in_grp = 1;
  1183. if(++j >= m)
  1184. break;
  1185. j_maxint = hfset[j][end] - hfset[j][0];
  1186. }
  1187. if(in_grp) {
  1188. switch(dz->vflag[HP1_DENS]) {
  1189. case(DENSE_SORT): sort_by_density(hfset,k,j,setlen,0); break;
  1190. case(OTHER_SORT): sort_by_interval_stacking(hfset,k,j,setlen,0); break;
  1191. }
  1192. sort_by_octave_equivalence(hfset,n,m,setlen);
  1193. }
  1194. k = j;
  1195. j = k+1;
  1196. }
  1197. }
  1198. /********************************* SORT_BY_DENSITY *********************************
  1199. *
  1200. * Sort pitch-ordered sets of FIXED SIZE , WITH FIXED MAX INTERVAL by density...
  1201. * measure the deviation from the mean inteval size between adjacent notes.
  1202. * Minimum deviation = minimum density.
  1203. */
  1204. void sort_by_density(double **hfset,int n,int m,int setlen,int lowest)
  1205. {
  1206. int j, k, x;
  1207. double j_deviation, k_deviation, y, average_intsize;
  1208. double *tempoint;
  1209. average_intsize = (hfset[n][setlen-1] - hfset[n][0])/(setlen-1);
  1210. for(j=n;j<m-1;j++) {
  1211. j_deviation = 0;
  1212. for(x = 1; x < setlen; x++) {
  1213. y = hfset[j][x] - hfset[j][x-1];
  1214. y = fabs(y - average_intsize);
  1215. j_deviation += y; /* no advantage in taking rms */
  1216. }
  1217. for(k=j+1;k<m;k++) {
  1218. k_deviation = 0;
  1219. for(x = 1; x < setlen; x++) {
  1220. y = hfset[k][x] - hfset[k][x-1];
  1221. y = fabs(y - average_intsize);
  1222. k_deviation += y; /* no advantage in taking rms */
  1223. }
  1224. if(lowest) {
  1225. if(k_deviation < j_deviation) {
  1226. tempoint = hfset[k];
  1227. hfset[k] = hfset[j];
  1228. hfset[j] = tempoint;
  1229. j_deviation = k_deviation;
  1230. }
  1231. } else {
  1232. if(k_deviation > j_deviation) {
  1233. tempoint = hfset[k];
  1234. hfset[k] = hfset[j];
  1235. hfset[j] = tempoint;
  1236. j_deviation = k_deviation;
  1237. }
  1238. }
  1239. }
  1240. }
  1241. }
  1242. /********************************* SORT_BY_MAXINTSIZE_AND_DENSITY *********************************
  1243. *
  1244. * Sort pitch-ordered sets of FIXED SIZE , NOT of FIXED MAX INTERVAL by density...
  1245. * measure the deviation from the mean inteval size between adjacent notes.
  1246. * Minimum deviation = minimum density.
  1247. */
  1248. void sort_by_maxintsize_and_density(double **hfset,int n,int m,int setlen,int lowest)
  1249. {
  1250. int j, k, end = setlen - 1, in_grp;
  1251. double j_intsize, k_intsize;
  1252. double *tempoint;
  1253. for(j=n;j<m-1;j++) { /* sort by max-intsize */
  1254. j_intsize = hfset[j][end] - hfset[j][0];
  1255. for(k=j+1;k<m;k++) {
  1256. k_intsize = hfset[k][end] - hfset[k][0];
  1257. if(k_intsize < j_intsize) {
  1258. tempoint = hfset[k];
  1259. hfset[k] = hfset[j];
  1260. hfset[j] = tempoint;
  1261. j_intsize = k_intsize;
  1262. }
  1263. }
  1264. }
  1265. j = n;
  1266. k = j+1;
  1267. while(k < m) {
  1268. j_intsize = hfset[j][end] - hfset[j][0];
  1269. in_grp = 0;
  1270. while(flteq(hfset[k][end] - hfset[k][0],j_intsize)) {
  1271. in_grp = 1;
  1272. if(++k >= m)
  1273. break;
  1274. }
  1275. if(in_grp)
  1276. sort_by_density(hfset,j,k,setlen,lowest);
  1277. j = k;
  1278. k = j+1;
  1279. }
  1280. }
  1281. /********************************* SORT_BY_OCTAVE_EQUIVALENCE *********************************
  1282. *
  1283. * Sort pitch-ordered sets of FIXED SIZE by equivalence at octave transposition, putting lower tessitura item first.
  1284. */
  1285. void sort_by_octave_equivalence
  1286. (double **hfset,int n,int m,int setlen)
  1287. {
  1288. int i, j, j_base, j_adj, k, oct_equivalence;
  1289. double *tempoint, int_diff;
  1290. for(j=n;j<m-1;j++) {
  1291. j_base = j;
  1292. j_adj = j+1; /* if sets are separate by multiple of an octave */
  1293. for(k=j+1;k<m;k++) {
  1294. if(flteq(fmod((int_diff = hfset[k][0] - hfset[j][0]),12.0),0.0)) {
  1295. oct_equivalence = 1;
  1296. for(n=1;n<setlen;n++) {
  1297. if(!flteq(hfset[k][n] - hfset[j][n],int_diff)) {
  1298. oct_equivalence = 0;
  1299. break;
  1300. }
  1301. }
  1302. if(oct_equivalence) { /* if oct-equivalent */
  1303. if(k != j_adj) { /* if NOT adjacent */
  1304. tempoint = hfset[j_adj];
  1305. hfset[j_adj] = hfset[k]; /* move oct-equiv set to be adjacent to j */
  1306. hfset[k] = tempoint;
  1307. }
  1308. i = j;
  1309. while(hfset[j_adj][0] < hfset[i][0]) {
  1310. if(--i < j_base)
  1311. break;
  1312. }
  1313. i++;
  1314. if(i<=j) {
  1315. tempoint = hfset[i];
  1316. hfset[i] = hfset[j_adj]; /* move lower register item to correct place in group */
  1317. hfset[j_adj] = tempoint;
  1318. }
  1319. j++; /* advance to new oct-equiv position */
  1320. j_adj++;
  1321. }
  1322. }
  1323. }
  1324. }
  1325. }
  1326. /********************************* SORT_BY_INTERVAL_STACKING *********************************
  1327. *
  1328. * Sort pitch-ordered sets of FIXED SIZE , WITH FIXED MAX INTERVAL by sequnce of pitches within...
  1329. * NORMALLY - start with chord having the lowest pitches (on average)
  1330. * ... if 'highest-first' flag set, start with chord with highest pitches (on average)
  1331. */
  1332. void sort_by_interval_stacking(double **hfset,int n,int m,int setlen,int highest_first)
  1333. {
  1334. int j, k, x;
  1335. double j_height, k_height;
  1336. double *tempoint;
  1337. for(j=n;j<m-1;j++) {
  1338. j_height = 0;
  1339. for(x = 1; x < setlen; x++)
  1340. j_height += hfset[j][x] - hfset[j][0];
  1341. for(k=j+1;k<m;k++) {
  1342. k_height = 0;
  1343. for(x = 1; x < setlen; x++)
  1344. k_height += hfset[k][x] - hfset[k][0];
  1345. if(highest_first) {
  1346. if(k_height > j_height) {
  1347. tempoint = hfset[k];
  1348. hfset[k] = hfset[j];
  1349. hfset[j] = tempoint;
  1350. j_height = k_height;
  1351. }
  1352. } else {
  1353. if(k_height < j_height) {
  1354. tempoint = hfset[k];
  1355. hfset[k] = hfset[j];
  1356. hfset[j] = tempoint;
  1357. j_height = k_height;
  1358. }
  1359. }
  1360. }
  1361. }
  1362. }
  1363. /********************************* ELIMINATE_OCT_DUPLICATED_SETS *********************************
  1364. *
  1365. * Sort ordered-by-size, then pitch-ordered sets, eliniating stes dupliated at 8vas.
  1366. */
  1367. void eliminate_oct_duplicated_sets(double **hfset,int *hfsetcnt,int *hfsetlen,int *grping,int *grping_cnt,int type)
  1368. {
  1369. int a, b, n, m, j, k, oct_equivalence, setlen;
  1370. double *tempoint, int_diff;
  1371. n=0;
  1372. m = n+1;
  1373. setlen = hfsetlen[n];
  1374. while(n < *hfsetcnt) {
  1375. while(hfsetlen[m] == setlen) { /* find equal-size sets */
  1376. if(++m >= *hfsetcnt)
  1377. break;
  1378. }
  1379. if(m == n+1) {
  1380. n++;
  1381. if((m = n+1) >= *hfsetcnt)
  1382. break;
  1383. setlen = hfsetlen[n];
  1384. continue;
  1385. }
  1386. for(j=n;j<m-1;j++) {
  1387. for(k = j+1;k<m;k++) {
  1388. if(flteq(fmod((int_diff = hfset[k][0] - hfset[j][0]),12.0),0.0)) {
  1389. oct_equivalence = 1;
  1390. for(a=1;a<setlen;a++) {
  1391. if(!flteq(hfset[k][a] - hfset[j][a],int_diff)) {
  1392. oct_equivalence = 0;
  1393. break;
  1394. }
  1395. }
  1396. if(oct_equivalence) { /* if oct-equivalent */
  1397. if(type == TOPNOTE) {
  1398. if(hfset[k][0] > hfset[j][0]) {
  1399. tempoint = hfset[j];
  1400. hfset[j] = hfset[k]; /* keep the higher-register item */
  1401. hfset[k] = tempoint;
  1402. }
  1403. } else {
  1404. if(hfset[k][0] < hfset[j][0]) {
  1405. tempoint = hfset[j];
  1406. hfset[j] = hfset[k]; /* keep the lower-register item */
  1407. hfset[k] = tempoint;
  1408. }
  1409. }
  1410. for(a=k,b=k+1;b<*hfsetcnt;a++,b++) /* delete unwanted set */
  1411. hfset[a] = hfset[b];
  1412. if(grping != NULL) { /* reposition grouping marks */
  1413. for(a=0;a<*grping_cnt;a++) {
  1414. /* if start or end of short group */
  1415. if(((grping[a] == k) && (a+1 < *grping_cnt) && (grping[a+1] >= -(k+2)))
  1416. || ((grping[a] == k-1) && (a+1 < *grping_cnt) && (grping[a+1] >= -(k+1)))) {
  1417. if(a+2 < *grping_cnt) { /* eliminate both */
  1418. for(b = a+2; b < *grping_cnt;b++)
  1419. grping[b-2] = grping[b];
  1420. }
  1421. *grping_cnt -= 2;
  1422. a -= 1; /* step back to resume parse */
  1423. }
  1424. else if(grping[a] > k) /* decrement all markers beyond */
  1425. grping[a]--;
  1426. else if(grping[a] < -k)
  1427. grping[a]++;
  1428. }
  1429. }
  1430. (*hfsetcnt)--; /* decrement all counters */
  1431. m--;
  1432. k--;
  1433. }
  1434. }
  1435. }
  1436. }
  1437. n = m;
  1438. if((m = n+1) >= *hfsetcnt)
  1439. break;
  1440. setlen = hfsetlen[n];
  1441. }
  1442. }
  1443. /********************************* SORT_BY_DENSITY_REGARDLESS_OF_SIZE *********************************
  1444. *
  1445. * Sort pitch-ordered sets of FIXED LENGTH . by density, regardless of MAX INTERVAL...
  1446. * .... sort on basis of maximum number of minsize intervals.
  1447. */
  1448. void sort_by_density_regardless_of_size
  1449. (double **hfset,double *interv,int *intervcnt,double *interv2,int *intervcnt2,int n,int m,int setlen,int densest_first)
  1450. {
  1451. int a, j, k, x, q, do_swap, equivalent;
  1452. double tempdb, *tempoint;
  1453. int intsetlen1 = setlen - 1;
  1454. int intsetlen2 = setlen - 1;
  1455. int tempoi, end = setlen - 1;
  1456. double *intv = interv, *intv2 = interv2;
  1457. int *intvcnt = intervcnt, *intvcnt2 = intervcnt2, *tempii;
  1458. for(j=n;j<m-1;j++) {
  1459. intsetlen1 = setlen - 1;
  1460. for(x=1;x<setlen;x++) {
  1461. intv[x-1] = hfset[j][x] - hfset[j][x-1]; /* find each interval and count it */
  1462. intvcnt[x-1] = 1;
  1463. }
  1464. for(x=0;x<intsetlen1-1;x++) {
  1465. for(q=x+1;q<intsetlen1;q++) {
  1466. if(flteq(intv[q],intv[x])) { /* compare intervals */
  1467. intvcnt[x]++; /* if same, incr count of first */
  1468. a = q;
  1469. while(a< intsetlen1-1) { /* and eliminate other from set */
  1470. intv[a] = intv[a+1];
  1471. a++;
  1472. }
  1473. intsetlen1--;
  1474. q--;
  1475. }
  1476. }
  1477. }
  1478. for(x=0;x<intsetlen1-1;x++) { /* sort intervals by size */
  1479. for(q=x+1;q<intsetlen1;q++) {
  1480. if(intv[q] < intv[x]) {
  1481. tempdb = intv[q];
  1482. intv[q] = intv[x];
  1483. intv[x] = tempdb;
  1484. tempoi = intvcnt[q];
  1485. intvcnt[q] = intvcnt[x];
  1486. intvcnt[x] = tempoi;
  1487. }
  1488. }
  1489. }
  1490. for(k=j+1;k<m;k++) {
  1491. intsetlen2 = setlen - 1;
  1492. for(x=1;x<setlen;x++) {
  1493. intv2[x-1] = hfset[k][x] - hfset[k][x-1];
  1494. intvcnt2[x-1] = 1;
  1495. }
  1496. for(x=0;x<intsetlen2-1;x++) {
  1497. for(q=x+1;q<intsetlen2;q++) {
  1498. if(flteq(intv2[q],intv2[x])) {
  1499. intvcnt2[x]++;
  1500. a = q;
  1501. while(a < intsetlen2-1) {
  1502. intv2[a] = intv2[a+1];
  1503. a++;
  1504. }
  1505. intsetlen2--;
  1506. q--;
  1507. }
  1508. }
  1509. }
  1510. for(x=0;x<intsetlen2-1;x++) {
  1511. for(q=x+1;q<intsetlen2;q++) {
  1512. if(intv2[q] < intv2[x]) {
  1513. tempdb = intv2[q];
  1514. intv2[q] = intv2[x];
  1515. intv2[x] = tempdb;
  1516. tempoi = intvcnt2[q];
  1517. intvcnt2[q] = intvcnt2[x];
  1518. intvcnt2[x] = tempoi;
  1519. }
  1520. }
  1521. }
  1522. do_swap = 0;
  1523. equivalent = 1;
  1524. if(densest_first) {
  1525. for(a=0;a<min(intsetlen1,intsetlen2);a++) {
  1526. if(intv2[a] > intv[a]) {
  1527. equivalent = 0;
  1528. break;
  1529. } else if(intv2[a] < intv[a]) {
  1530. equivalent = 0;
  1531. do_swap = 1;
  1532. break;
  1533. } else {
  1534. if(intvcnt2[a] > intvcnt[a]) {
  1535. equivalent = 0;
  1536. do_swap = 1;
  1537. break;
  1538. } else if(intvcnt2[a] < intvcnt[a]) {
  1539. equivalent = 0;
  1540. break;
  1541. }
  1542. }
  1543. }
  1544. } else {
  1545. for(a=0;a<min(intsetlen1,intsetlen2);a++) {
  1546. if(intv2[a] < intv[a]) {
  1547. equivalent = 0;
  1548. break;
  1549. } else if(intv2[a] > intv[a]) {
  1550. equivalent = 0;
  1551. do_swap = 1;
  1552. break;
  1553. } else {
  1554. if(intvcnt2[a] < intvcnt[a]) {
  1555. equivalent = 0;
  1556. do_swap = 1;
  1557. break;
  1558. } else if(intvcnt2[a] > intvcnt[a]) {
  1559. equivalent = 0;
  1560. break;
  1561. }
  1562. }
  1563. }
  1564. }
  1565. if((!do_swap) && equivalent) { /* swap if total range is greater */
  1566. if(hfset[j][end] - hfset[j][0] > hfset[k][end] - hfset[k][0])
  1567. do_swap = 1;
  1568. else if(hfset[j][0] > hfset[k][0]) /* swap if root is lower */
  1569. do_swap = 1;
  1570. }
  1571. if(do_swap) {
  1572. tempoint = hfset[k];
  1573. hfset[k] = hfset[j];
  1574. hfset[j] = tempoint;
  1575. tempoint = intv;
  1576. intv = intv2;
  1577. intv2 = tempoint;
  1578. tempii = intvcnt ;
  1579. intvcnt = intvcnt2;
  1580. intvcnt2 = tempii;
  1581. }
  1582. }
  1583. }
  1584. }
  1585. /******************************* SETUP_NAMING ******************************/
  1586. int setup_naming(char **thisfilename,dataptr dz)
  1587. {
  1588. int innamelen = strlen(dz->wordstor[0]);
  1589. int numlen = 5;
  1590. // FEB 2010 TW
  1591. if((*thisfilename = (char *)malloc((innamelen + numlen + 10) * sizeof(char)))==NULL) {
  1592. sprintf(errstr,"INSUFFICIENT MEMORY for outfilename.\n");
  1593. return(MEMORY_ERROR);
  1594. }
  1595. return(FINISHED);
  1596. }
  1597. /********************************** CREATE_OUTFILE_NAME ********************************/
  1598. int create_outfile_name(int ccnt,char *thisfilename,dataptr dz)
  1599. {
  1600. strcpy(thisfilename,dz->wordstor[0]);
  1601. // FEB 2010 TW
  1602. if(!sloom)
  1603. insert_separator_on_sndfile_name(thisfilename,1);
  1604. insert_new_number_at_filename_end(thisfilename,ccnt,1);
  1605. return(FINISHED);
  1606. }
  1607. /********************************** GEN_NOTE ********************************/
  1608. void gen_note(int maxjitter,double *tabstart,double *tabend,double **tabmin, double **tabmax,double **hfset,
  1609. double tabscale,double sintabsize,int splicelen, double *sintab,int n, int j)
  1610. {
  1611. int jitter, initial_phase, i;
  1612. double *this_tabend, *startsplice_end, *endsplice_start, *tab;
  1613. double sintabpos, sintabincr;
  1614. int intpos, nxtpos;
  1615. double frac, vallo, valhi, valdif;
  1616. jitter = (int)round(drand48() * maxjitter);
  1617. tab = tabstart + jitter;
  1618. this_tabend = tabend + jitter;
  1619. *tabmin = min(tab,*tabmin);
  1620. *tabmax = max(this_tabend,*tabmax);
  1621. tab++; /* 1st val = 0 */
  1622. /* START POSITION IN TABLE TO READ TO GENERATE SOUND */
  1623. initial_phase = (int)round(drand48() * HFP_TABSIZE);
  1624. sintabincr = (miditohz(hfset[n][j]) * tabscale);
  1625. sintabpos = sintabincr + initial_phase;
  1626. sintabpos = fmod(sintabpos,sintabsize);
  1627. startsplice_end = tab + splicelen;
  1628. endsplice_start = this_tabend - splicelen;
  1629. /* START OF EACH CONSTITUENT MUST BE SPLICED */
  1630. i = 0;
  1631. while(tab < startsplice_end) {
  1632. intpos = (int)floor(sintabpos);
  1633. nxtpos = intpos+1;
  1634. frac = sintabpos - (double)intpos;
  1635. vallo = sintab[intpos];
  1636. valhi = sintab[nxtpos];
  1637. valdif= valhi - vallo;
  1638. *tab += (vallo + (valdif * frac)) * (i/(double)splicelen);
  1639. i++;
  1640. sintabpos += sintabincr;
  1641. sintabpos = fmod(sintabpos,sintabsize);
  1642. tab++;
  1643. }
  1644. while(tab < endsplice_start) {
  1645. intpos = (int)floor(sintabpos);
  1646. nxtpos = intpos+1;
  1647. frac = sintabpos - (double)intpos;
  1648. vallo = sintab[intpos];
  1649. valhi = sintab[nxtpos];
  1650. valdif= valhi - vallo;
  1651. *tab += vallo + (valdif * frac);
  1652. sintabpos += sintabincr;
  1653. sintabpos = fmod(sintabpos,sintabsize);
  1654. tab++;
  1655. }
  1656. /* END OF EACH CONSTITUENT MUST BE SPLICED */
  1657. i = splicelen - 1;
  1658. while(tab < this_tabend) {
  1659. intpos = (int)floor(sintabpos);
  1660. nxtpos = intpos+1;
  1661. frac = sintabpos - (double)intpos;
  1662. vallo = sintab[intpos];
  1663. valhi = sintab[nxtpos];
  1664. valdif= valhi - vallo;
  1665. *tab += (vallo + (valdif * frac)) * (i/(double)splicelen);
  1666. i--;
  1667. sintabpos += sintabincr;
  1668. sintabpos = fmod(sintabpos,sintabsize);
  1669. tab++;
  1670. }
  1671. }
  1672. /********************************** NEXT_FILE ********************************/
  1673. int next_file(int *samps_written,char *thisfilename,int *ccnt,unsigned int *space_needed,
  1674. int *samp_space_available,dataptr dz)
  1675. {
  1676. int exit_status;
  1677. /* FLUSH BUFS */
  1678. *samps_written += dz->iparam[HP1_GAP_SIZE];
  1679. while(*samps_written >= dz->buflen) {
  1680. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  1681. return(exit_status);
  1682. *samps_written -= dz->buflen;
  1683. }
  1684. if(*samps_written > 0) {
  1685. if((exit_status = write_samps(dz->sampbuf[0],*samps_written,dz))<0)
  1686. return(exit_status);
  1687. }
  1688. /* CLOSE FILE */
  1689. dz->outfiletype = SNDFILE_OUT; /* allows header to be written */
  1690. if((exit_status = headwrite(dz->ofd,dz))<0)
  1691. return(exit_status);
  1692. dz->process_type = OTHER_PROCESS; /* restore true status */
  1693. dz->outfiletype = NO_OUTPUTFILE; /* restore true status */
  1694. superzargo += dz->total_samps_written; /* accumulator of total samples written */
  1695. if((exit_status = reset_peak_finder(dz))<0)
  1696. return(exit_status);
  1697. if(sndcloseEx(dz->ofd) < 0) {
  1698. fprintf(stdout,"WARNING: Can't close output soundfile %s\n",thisfilename);
  1699. fflush(stdout);
  1700. }
  1701. dz->ofd = -1;
  1702. (*ccnt)++;
  1703. /* OPEN NEW FILE */
  1704. if((exit_status = create_outfile_name(*ccnt,thisfilename,dz))<0)
  1705. return(exit_status);
  1706. dz->process_type = UNEQUAL_SNDFILE; /* allow sndfile to be created */
  1707. if((exit_status = create_sized_outfile(thisfilename,dz))<0) {
  1708. fprintf(stdout, "WARNING: Soundfile %s already exists.\n",thisfilename);
  1709. fflush(stdout);
  1710. dz->process_type = OTHER_PROCESS;
  1711. dz->ofd = -1;
  1712. return(PROGRAM_ERROR);
  1713. }
  1714. *space_needed -= dz->total_samps_written;
  1715. if((unsigned int)dz->outfilesize < *space_needed) {
  1716. sprintf(errstr,"Insufficient space on the hard disk to store the next output file.\n");
  1717. return(MEMORY_ERROR);
  1718. }
  1719. /* RESET BUFFERS */
  1720. dz->total_samps_written = 0;
  1721. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  1722. *samp_space_available = dz->buflen;
  1723. *samps_written = 0;
  1724. //NEW TW
  1725. return(FINISHED);
  1726. }
  1727. /********************************** GEN_DP_OUTPUT ********************************/
  1728. int gen_dp_output(dataptr dz)
  1729. {
  1730. int exit_status;
  1731. float *obuf = dz->sampbuf[0];
  1732. double *tabend, *tab = (double *)dz->sampbuf[3];
  1733. double *accumtab = (double *)dz->sampbuf[2];
  1734. double *perm = dz->parray[1];
  1735. double tabscale = (double)HFP_TABSIZE/dz->infile->srate;
  1736. double *sintab = (double *)dz->sampbuf[1];
  1737. float *intab = dz->sampbuf[1];
  1738. double sintabsize; //, pad;
  1739. int intabsize;
  1740. int samps_written = 0, samp_space_available, samps_to_write;
  1741. int note_being_permed, noteno, index_in_new_perm, index_in_last_perm, i, j, no_of_perms, permcounter, transpos_cnt;
  1742. int maxjitter = (int)round(drand48() * HFP_MAXJITTER * MS_TO_SECS * (double)dz->infile->srate);
  1743. unsigned int element_byte_len = dz->iparam[DP_DUR] * sizeof(double);
  1744. unsigned int element_full_len = element_byte_len + (maxjitter * sizeof(double));
  1745. double *tabmin = accumtab, *tabmax = accumtab + dz->iparam[DP_DUR] + maxjitter;
  1746. int splicelen = (int)round(HP1_SPLICELEN * MS_TO_SECS * (double)dz->infile->srate);
  1747. double ampmult = 1.0/(double)(dz->iparam[DP_CYCCNT] + 1);
  1748. double *permset, thistranspos;
  1749. int accumtabstart, accumtabend, a, b;
  1750. int jitter, endindex_of_last_perm, endindex_of_last_perm_but_one, endindex_in_new_perm = 0, len, thislen;
  1751. /* JUNE 2004 */
  1752. sprintf(errstr,"ERROR: This program is currently malfunctioning.\n");
  1753. return(PROGRAM_ERROR);
  1754. /* JUNE 2004 */
  1755. switch(dz->process) {
  1756. case(DEL_PERM):
  1757. sintabsize = (double)HFP_TABSIZE;
  1758. ampmult *= MAXSAMP;
  1759. break;
  1760. case(DEL_PERM2):
  1761. intabsize = dz->iparam[DP_DUR];
  1762. break;
  1763. }
  1764. dz->tempsize = dz->iparam[DP_DUR] * (dz->iparam[DP_NOTECNT] + dz->iparam[DP_CYCCNT]);
  1765. if((permset =
  1766. (double *)malloc((unsigned int)round(pow(dz->iparam[DP_PERMCNT],dz->iparam[DP_CYCCNT])) * sizeof(double))) == NULL) {
  1767. sprintf(errstr,"No memory for permutations of notes\n");
  1768. return(MEMORY_ERROR);
  1769. }
  1770. for(noteno = 0; noteno < dz->iparam[DP_NOTECNT]/* + dz->iparam[DP_CYCCNT]*/; noteno++) {
  1771. sprintf(errstr,"Expanding note %d\n",noteno+1);
  1772. print_outmessage_flush(errstr);
  1773. memset(accumtab,0,element_full_len);
  1774. for(note_being_permed = noteno, no_of_perms = 0;
  1775. note_being_permed >= max(0,noteno - dz->iparam[DP_CYCCNT]);
  1776. note_being_permed--, no_of_perms++) {
  1777. if(note_being_permed >= dz->iparam[DP_NOTECNT])
  1778. continue;
  1779. jitter = (int)(drand48() * maxjitter);
  1780. accumtabstart = jitter;
  1781. permset[0] = dz->parray[1][note_being_permed];
  1782. endindex_of_last_perm = 0;
  1783. endindex_of_last_perm_but_one = 0;
  1784. for(permcounter = 0; permcounter < no_of_perms; permcounter++) {
  1785. index_in_last_perm = endindex_of_last_perm;
  1786. endindex_in_new_perm = ((index_in_last_perm+1) * dz->iparam[DP_PERMCNT]) - 1;
  1787. index_in_new_perm = endindex_in_new_perm;
  1788. while(index_in_last_perm >= 0) {
  1789. for(transpos_cnt = dz->iparam[DP_PERMCNT]-1; transpos_cnt >= 0; transpos_cnt--)
  1790. permset[index_in_new_perm--] = permset[index_in_last_perm] + perm[transpos_cnt];
  1791. index_in_last_perm--;
  1792. }
  1793. endindex_of_last_perm_but_one = endindex_of_last_perm;
  1794. endindex_of_last_perm = endindex_in_new_perm;
  1795. }
  1796. tab = (double *)dz->sampbuf[3];
  1797. if(no_of_perms > 0) {
  1798. if((len = (int)round((double)dz->iparam[DP_DUR]/(double)(endindex_of_last_perm_but_one+1))) <= splicelen * 2) {
  1799. sprintf(errstr,"Notes have become too short for splices to be made.\n");
  1800. return(GOAL_FAILED);
  1801. }
  1802. for(i = 0, j = 0; i <= endindex_of_last_perm; i++, j++) {
  1803. j %= dz->iparam[DP_PERMCNT];
  1804. switch(dz->process) {
  1805. case(DEL_PERM):
  1806. thislen = (int)round(len * dz->parray[2][j]);
  1807. if(thislen <= splicelen * 2) {
  1808. sprintf(errstr,"Notes have become too short for splices to be made.\n");
  1809. return(GOAL_FAILED);
  1810. }
  1811. tabend = tab + thislen;
  1812. memset((char *)tab,0,element_byte_len);
  1813. gen_note2(tab,tabend,permset[i],tabscale,sintabsize,splicelen,sintab); break;
  1814. case(DEL_PERM2):
  1815. thistranspos = pow(2.0,(permset[i]/12.0));
  1816. thislen = (int)round(len/thistranspos);
  1817. thislen = min(thislen,len);
  1818. if(thislen <= splicelen * 2) {
  1819. sprintf(errstr,"Notes have become too short for splices to be made.\n");
  1820. return(GOAL_FAILED);
  1821. }
  1822. tabend = tab + thislen;
  1823. memset((char *)tab,0,element_byte_len);
  1824. gen_note3(tab,tabend,thistranspos,intabsize,splicelen,intab); break;
  1825. }
  1826. accumtabstart = accumtabstart + thislen;
  1827. accumtabend = accumtabstart + thislen;
  1828. //pad = pow(ROLLOFF,no_of_perms);
  1829. accumtabstart += thislen;
  1830. }
  1831. } else {
  1832. len = dz->iparam[DP_DUR];
  1833. tabend = tab + len;
  1834. memset(tab,0,element_byte_len);
  1835. switch(dz->process) {
  1836. case(DEL_PERM): gen_note2(tab,tabend,permset[0],tabscale,sintabsize,splicelen,sintab); break;
  1837. case(DEL_PERM2): gen_note3(tab,tabend,permset[0],intabsize,splicelen,intab); break;
  1838. }
  1839. accumtabend = accumtabstart + len;
  1840. for(a=accumtabstart, b = 0; a < accumtabend;a++,b++)
  1841. accumtab[a] += tab[b];
  1842. accumtabstart += len;
  1843. }
  1844. }
  1845. /* DO OUTPUT */
  1846. samp_space_available = dz->buflen - samps_written;
  1847. i = 0;
  1848. samps_to_write = tabmax - tabmin;
  1849. while(i < samps_to_write) {
  1850. if(samp_space_available > samps_to_write) {
  1851. while(i < samps_to_write)
  1852. obuf[samps_written++] = (float)(accumtab[i++] * ampmult);
  1853. } else {
  1854. while(samps_written < dz->buflen)
  1855. obuf[samps_written++] = (float)(accumtab[i++] * ampmult);
  1856. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  1857. return(exit_status);
  1858. memset((char *)dz->sampbuf[0],0,(size_t)dz->buflen * sizeof(float));
  1859. samps_written = 0;
  1860. samp_space_available = dz->buflen;
  1861. }
  1862. }
  1863. }
  1864. while(samps_written >= dz->buflen) {
  1865. if((exit_status = write_samps(dz->sampbuf[0],dz->buflen,dz))<0)
  1866. return(exit_status);
  1867. samps_written -= dz->buflen;
  1868. }
  1869. if(samps_written > 0) {
  1870. if((exit_status = write_samps(dz->sampbuf[0],samps_written,dz))<0)
  1871. return(exit_status);
  1872. }
  1873. return(FINISHED);
  1874. }
  1875. /********************************** GEN_NOTE2 ********************************/
  1876. void gen_note2(double *tabstart,double *tabend,double midival,
  1877. double tabscale,double sintabsize,int splicelen, double *sintab)
  1878. {
  1879. int initial_phase, i;
  1880. double *startsplice_end, *endsplice_start, *tab;
  1881. double sintabpos, sintabincr;
  1882. int intpos, nxtpos;
  1883. double frac, vallo, valhi, valdif;
  1884. tab = tabstart;
  1885. *tab++ = 0; /* 1st val = 0 */
  1886. /* START POSITION IN TABLE TO READ TO GENERATE SOUND */
  1887. initial_phase = (int)round(drand48() * HFP_TABSIZE);
  1888. sintabincr = (miditohz(midival) * tabscale);
  1889. sintabpos = sintabincr + initial_phase;
  1890. sintabpos = fmod(sintabpos,sintabsize);
  1891. startsplice_end = tab + splicelen;
  1892. endsplice_start = tabend - splicelen;
  1893. /* START OF EACH CONSTITUENT MUST BE SPLICED */
  1894. i = 0;
  1895. while(tab < startsplice_end) {
  1896. intpos = (int)floor(sintabpos);
  1897. nxtpos = intpos+1;
  1898. frac = sintabpos - (double)intpos;
  1899. vallo = sintab[intpos];
  1900. valhi = sintab[nxtpos];
  1901. valdif= valhi - vallo;
  1902. *tab += (vallo + (valdif * frac)) * (i/(double)splicelen);
  1903. i++;
  1904. sintabpos += sintabincr;
  1905. sintabpos = fmod(sintabpos,sintabsize);
  1906. tab++;
  1907. }
  1908. while(tab < endsplice_start) {
  1909. intpos = (int)floor(sintabpos);
  1910. nxtpos = intpos+1;
  1911. frac = sintabpos - (double)intpos;
  1912. vallo = sintab[intpos];
  1913. valhi = sintab[nxtpos];
  1914. valdif= valhi - vallo;
  1915. *tab += vallo + (valdif * frac);
  1916. sintabpos += sintabincr;
  1917. sintabpos = fmod(sintabpos,sintabsize);
  1918. tab++;
  1919. }
  1920. /* END OF EACH CONSTITUENT MUST BE SPLICED */
  1921. i = splicelen - 1;
  1922. while(tab < tabend) {
  1923. intpos = (int)floor(sintabpos);
  1924. nxtpos = intpos+1;
  1925. frac = sintabpos - (double)intpos;
  1926. vallo = sintab[intpos];
  1927. valhi = sintab[nxtpos];
  1928. valdif= valhi - vallo;
  1929. *tab += (vallo + (valdif * frac)) * (i/(double)splicelen);
  1930. i--;
  1931. sintabpos += sintabincr;
  1932. sintabpos = fmod(sintabpos,sintabsize);
  1933. tab++;
  1934. }
  1935. }
  1936. /********************************** GEN_NOTE3 ********************************/
  1937. //void gen_note3(double *tabstart,double *tabend,double midival,int intabsize,int splicelen, short *intab)
  1938. void gen_note3(double *tabstart,double *tabend,double midival,int intabsize,int splicelen, float *intab)
  1939. {
  1940. int i;
  1941. double *startsplice_end, *endsplice_start, *tab;
  1942. double tabpos, tabincr, effective_len;
  1943. int intpos, nxtpos;
  1944. double frac, vallo, valhi, valdif;
  1945. tab = tabstart;
  1946. *tab++ = 0; /* 1st val = 0 */
  1947. tabincr = (miditohz(midival)/miditohz(60.0));
  1948. effective_len = (double)(tabend - tabstart);
  1949. if(effective_len * tabincr > (double)intabsize) {
  1950. effective_len /= tabincr;
  1951. tabend = tabstart + (int)effective_len;
  1952. }
  1953. tabpos = tabincr;
  1954. startsplice_end = tab + splicelen;
  1955. endsplice_start = tabend - splicelen;
  1956. /* START OF EACH CONSTITUENT MUST BE SPLICED */
  1957. i = 0;
  1958. while(tab < startsplice_end) {
  1959. intpos = (int)floor(tabpos);
  1960. nxtpos = intpos+1;
  1961. frac = tabpos - (double)intpos;
  1962. vallo = intab[intpos];
  1963. valhi = intab[nxtpos];
  1964. valdif= valhi - vallo;
  1965. *tab += (vallo + (valdif * frac)) * (i/(double)splicelen);
  1966. i++;
  1967. tabpos += tabincr;
  1968. tab++;
  1969. }
  1970. while(tab < endsplice_start) {
  1971. intpos = (int)floor(tabpos);
  1972. nxtpos = intpos+1;
  1973. frac = tabpos - (double)intpos;
  1974. vallo = intab[intpos];
  1975. valhi = intab[nxtpos];
  1976. valdif= valhi - vallo;
  1977. *tab += vallo + (valdif * frac);
  1978. tabpos += tabincr;
  1979. tab++;
  1980. }
  1981. /* END OF EACH CONSTITUENT MUST BE SPLICED */
  1982. i = splicelen - 1;
  1983. while(tab < tabend) {
  1984. intpos = (int)floor(tabpos);
  1985. nxtpos = intpos+1;
  1986. frac = tabpos - (double)intpos;
  1987. vallo = intab[intpos];
  1988. valhi = intab[nxtpos];
  1989. valdif= valhi - vallo;
  1990. *tab += (vallo + (valdif * frac)) * (i/(double)splicelen);
  1991. i--;
  1992. tabpos += tabincr;
  1993. tab++;
  1994. }
  1995. }