/* * Copyright (c) 1983-2013 Trevor Wishart and Composers Desktop Project Ltd * http://www.trevorwishart.co.uk * http://www.composersdesktop.com * This file is part of the CDP System. The CDP System is free software; you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. The CDP System is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. You should have received a copy of the GNU Lesser General Public License along with the CDP System; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * */ #include void sort_numbers(int *); /***************************** PRINT_NUMBERS() ************************/ void print_numbers(void) { int n; for(n=0;n= cnt) break; interval = log(number[n]/number[n+m])/LOG_2_TO_BASE_E; interval = fmod(fabs(interval),1.0); if(intervalONEMIN) { if((move = f_repos(n+m))<0) { failed++; } else { n += move; /* list shuffled forward, or not */ m--; /* m+1th item now at m */ } } } } if(failed) fprintf(stdout,"WARNING: %d Items failed to be separated.\n",failed); print_numbers(); } /***************************** COUNT_ITEMS ****************************/ void count_items(char *filename) { char *p; char temp[10000]; cnt = 0; if((fp[0] = fopen(filename,"r"))==NULL) { fprintf(stdout,"ERROR: Cannot open infile %s\n",filename); fflush(stdout); exit(1); } while(fgets(temp,200,fp[0])!=NULL) { p = temp; if(ro=='l') { cnt++; } else { while(strgetfloat(&p,&factor)) { switch(condit) { case(0): cnt++; break; case('>'): if(factor>thresh) cnt++; break; case('<'): if(factor3) { fprintf(stdout,"ERROR: Input file must have either 2 or 3 vals.\n"); fflush(stdout); exit(1); } if(cnt==3) q = number[2]; /* q = starttime */ else q = 0.0; cnt = timevents(0.0,factor,number[0],number[1]); for(n=0;n cntr[0]/rowcnt) { fprintf(stdout,"ERROR: Only %d columns in the first file. Can't do insert after column %d\n",cntr[0]/colcnt,ifactor); fflush(stdout); exit(1); } for(n=0;n0.0) ifactor = round(number[n]/factor); else /* IS TRUNCATION OK */ ifactor = (int)((number[n]/factor) - 0.5 + VERY_TINY); /* TRUNCATION */ number[n] = (double)ifactor * factor; if(!sloom && !sloombatch) fprintf(fp[1],"%lf\n",number[n]); else fprintf(stdout,"INFO: %lf\n",number[n]); } fflush(stdout); } /************************* ELIMINATE_EQUIVALENTS **********************/ void eliminate_equivalents(void) { int n; for(n=0;n factor) { eliminate(n); n--; } } } /************************** ELIMINATE_LESS_THAN ***********************/ void eliminate_less_than(void) { int n; for(n=0;n= (number[n] - factor) && number[m] <= (number[n] + factor)) { eliminate(m); m--; } } } } /**************************** REDUCE_TO_BOUND ***************************/ void reduce_to_bound(void) { int n; for(n=0;n factor) number[n] = factor; } } /************************* INCREASE_TO_BOUND *******************************/ void increase_to_bound(void) { int n; for(n=0;n factor) factor = number[n]; } if(!sloom && !sloombatch) fprintf(fp[1],"%lf\n",factor); else fprintf(stdout,"ERROR: %lf\n",factor); fflush(stdout); } /****************************** LEAST *****************************/ void least(void) { int n; factor = number[0]; for(n=1;n'): if(number[n]>thresh) number[n] *= factor; break; case('<'): if(number[n] factor) { if(!sloom && !sloombatch) fprintf(fp[1],"*%lf\n",number[n]); else fprintf(stdout,"INFO: *%lf\n",number[n]); } else { if(!sloom && !sloombatch) fprintf(fp[1],"%lf\n",number[n]); else fprintf(stdout,"INFO: %lf\n",number[n]); } } fflush(stdout); } /**************************** MARK_LESS_THAN ************************/ void mark_less_than(void) { int n; for(n=0;n= (number[n] - thresh))) fprintf(stdout,"INFO: *%lf\n",number[n]); else fprintf(stdout,"INFO: %lf\n",number[n]); } fflush(stdout); } /****************************** MINOR_TO_MAJOR **************************/ void minor_to_major(void) { int n; int m3 = (3 + ifactor)%12; /* MIDI location of minor 3rd */ int m6 = (8 + ifactor)%12; /* MIDI location of minor 6th */ int m7 = (10 + ifactor)%12; /* MIDI location of minor 7th */ for(n=0;n'): if(number[n]>thresh) number[n] += factor; break; case('<'): if(number[n]'): if(number[n]>thresh) { if(fabs(number[n]) < FLTERR) number[n] = 0; else { if (number[n] < 0) { is_neg = 1; number[n] = -number[n]; } number[n] = pow(number[n],factor); } } break; case('<'): if(number[n] 0.5) offset = 1.0 - offset; } if(flteq(factor,TWELVE) && offset == 0.0) { for(n=0;n maxm) maxm = number[n]; } for(n=0;n minf) reffrq /= 2.0; } else reffrq = C_HZ; for(n=0;n minf) reffrq /= 2.0; refset[0] = reffrq; refset[1] = reffrq * 135.0 / 128.0; refset[2] = reffrq * 9.0 / 8.0; refset[3] = reffrq * 6.0 / 5.0; refset[4] = reffrq * 5.0 / 4.0; refset[5] = reffrq * 4.0 / 3.0; refset[6] = reffrq * 45.0 / 32.0; refset[7] = reffrq * 3.0 / 2.0; refset[8] = reffrq * 5.0 / 3.0; refset[9] = reffrq * 27.0 / 16.0; refset[10] = reffrq * 9.0 / 5.0; refset[11] = reffrq * 15.0 / 8.0; for(n=0;n minf) reffrq /= 2.0; refset[0] = reffrq; refset[1] = reffrq * 135.0 / 128.0; refset[2] = reffrq * 9.0 / 8.0; refset[3] = reffrq * 6.0 / 5.0; refset[4] = reffrq * 5.0 / 4.0; refset[5] = reffrq * 4.0 / 3.0; refset[6] = reffrq * 45.0 / 32.0; refset[7] = reffrq * 3.0 / 2.0; refset[8] = reffrq * 5.0 / 3.0; refset[9] = reffrq * 27.0 / 16.0; refset[10] = reffrq * 9.0 / 5.0; refset[11] = reffrq * 15.0 / 8.0; OK = 1; oct = 1.0; while(OK) { for(m = 0; m < 12; m ++) { outval = refset[m] * oct; if(outval >= minf) { if(outval <= maxf) do_valout(outval); else OK = 0; } } if(!OK) break; oct *= 2.0; } } /*************************** CREATE_JUST_INTONATION_MIDI ******************************/ void create_just_intonation_midi(void) { double *refset, refmidi, reffrq, minf, maxf, oct, outval; int m, OK; refset = (double *)exmalloc(12 * sizeof(double)); minf = number[0]; maxf = number[0]; minf = min(number[1],number[2]); maxf = max(number[1],number[2]); refmidi = number[0]; reffrq = miditohz(refmidi); while(refmidi > minf) { refmidi -= 12.0; reffrq /= 2.0; } refset[0] = refmidi; refset[1] = hztomidi(reffrq * 135.0 / 128.0); refset[2] = hztomidi(reffrq * 9.0 / 8.0); refset[3] = hztomidi(reffrq * 6.0 / 5.0); refset[4] = hztomidi(reffrq * 5.0 / 4.0); refset[5] = hztomidi(reffrq * 4.0 / 3.0); refset[6] = hztomidi(reffrq * 45.0 / 32.0); refset[7] = hztomidi(reffrq * 3.0 / 2.0); refset[8] = hztomidi(reffrq * 5.0 / 3.0); refset[9] = hztomidi(reffrq * 27.0 / 16.0); refset[10] = hztomidi(reffrq * 9.0 / 5.0); refset[11] = hztomidi(reffrq * 15.0 / 8.0); OK = 1; oct = 0.0; while(OK) { for(m = 0; m < 12; m ++) { outval = refset[m] + oct; if(outval >= minf) { if(outval <= maxf) do_valout(outval); else OK = 0; } } if(!OK) break; oct += 12.0; } } /*************************** just_intonation_midi ******************************/ void just_intonation_midi(void) { double *refset, refmidi, reffrq, minmidi, maxmidi, minstep, oct, refval, outval = 0.0, q; int n, m; refset = (double *)exmalloc(12 * sizeof(double)); minmidi = number[0]; maxmidi = number[0]; for(n=1;n minmidi) refmidi -= 12.0; reffrq = miditohz(refmidi); refset[0] = refmidi; refset[1] = hztomidi(reffrq * 135.0 / 128.0); refset[2] = hztomidi(reffrq * 9.0 / 8.0); refset[3] = hztomidi(reffrq * 6.0 / 5.0); refset[4] = hztomidi(reffrq * 5.0 / 4.0); refset[5] = hztomidi(reffrq * 4.0 / 3.0); refset[6] = hztomidi(reffrq * 45.0 / 32.0); refset[7] = hztomidi(reffrq * 3.0 / 2.0); refset[8] = hztomidi(reffrq * 5.0 / 3.0); refset[9] = hztomidi(reffrq * 27.0 / 16.0); refset[10] = hztomidi(reffrq * 9.0 / 5.0); refset[11] = hztomidi(reffrq * 15.0 / 8.0); for(n=0;n= 0 && number[m] > thisnum) { number[m+1] = number[m]; m--; } number[m+1] = thisnum; } for(n=0;n semit_dn) { hgrpcnt[n]++; hgrp[n] = (double *)exrealloc((char *)hgrp[n],hgrpcnt[n] * sizeof(double)); hgrp[n][hgrpcnt[n]-1] = number[m]; } } } for(n=0;n= hgrpcnt[m]) { bigg = n; smal = m; } else { bigg = m; smal = n; } for(k=0;k=hgrpcnt[bigg]) break; } } } if(samecnt==hgrpcnt[smal]) { if(bigg==n) { free(hgrp[m]); for(j = m+1;j 0) { hibnd = number[n] + factor; lobnd = number[n] - factor; for(m=n+1;m 0) { if(number[m] <= hibnd && number[m] >= lobnd) { poll[n]++; poll[m] = -1; } } } } } for(n=0;n 0) { hibnd = number[n] * factor; lobnd = number[n] * one_over_factor; for(m=n+1;m 0) { if(number[m] <= hibnd && number[m] >= lobnd) { poll[n]++; poll[m] = -1; } } } } } for(n=0;n= 0 && poll[m] < thispoll) { number[m+1] = number[m]; poll[m+1] = poll[m]; m--; } number[m+1] = thisnum; poll[m+1] = thispoll; } } /*********************** APPROX_VALS ********************/ void approx_vals(void) { int z; int n; for(n=0;nfactor) number[n] = factor; do_valout(number[n]); } fflush(stdout); } /****************************** NOTE_TO_MIDI ******************************/ void note_to_midi(int is_transpos) { int n, oct, midi; char *p, *q; double qtone = 0.0, midiflt; for(n=0;n< stringscnt;n++) { p = strings[n]; switch(*p) { case('c'): case('C'): midi = 0; break; case('d'): case('D'): midi = 2; break; case('e'): case('E'): midi = 4; break; case('f'): case('F'): midi = 5; break; case('g'): case('G'): midi = 7; break; case('a'): case('A'): midi = 9; break; case('b'): case('B'): midi = 11; break; default: fprintf(stdout,"ERROR: Unknown pitch value '%c' at note %d\n",*p,n+1); fflush(stdout); exit(1); } p++; switch(*p) { case('#'): midi = (midi+1)%12; p++; break; case('b'): midi = (midi-1)%12; p++; break; } q = p + strlen(p) - 1; qtone = 0.0; if(*q == '-') { qtone = -.5; *q = ENDOFSTR; } else if(*q == '+') { qtone = .5; *q = ENDOFSTR; } if(sscanf(p,"%d",&oct)!=1) { fprintf(stdout,"ERROR: No octave value given at note %d\n",n+1); fflush(stdout); exit(1); } if(oct > 5 || oct < -5) { fprintf(stdout,"ERROR: octave value out of range (-5 to +5) at note %d\n",n+1); fflush(stdout); exit(1); } oct += 5; midi += (oct * 12); midiflt = (double)midi + qtone; if(is_transpos == 1) midiflt -= factor; else if(is_transpos == 2) /* to frq */ midiflt = miditohz(midiflt); fprintf(stdout,"INFO: %lf\n",midiflt); } fflush(stdout); } /****************************** APPEND_TEXT ******************************/ void append_text(int after) { int n, k = strlen(temp); char temp2[64], *p; if(after) { for(n=0;n 0.0) neg = -1; for(n = 2; n < cnt; n+=2) { number[n+1] *= neg; pan_subedj = number[n+1] * (7.5/9.0); fprintf(stdout,"INFO: %lf %lf\n",number[n] - time_shoulder,pan_subedj); fprintf(stdout,"INFO: %lf %lf\n",number[n],number[n+1]); fprintf(stdout,"INFO: %lf %lf\n",number[n] + time_shoulder,pan_subedj); neg = -neg; } fprintf(stdout,"INFO: %lf %lf\n",end_pantime,end_panpos); fflush(stdout); } /****************************** KILL_PATH ******************************/ void kill_path(void) { int n; char *p; for(n=0;nstrings[n]) *p = ENDOFSTR; fprintf(stdout,"INFO: %s\n",strings[n]); } fflush(stdout); } /****************************** KILL_PATH ******************************/ void kill_path_and_extension(void) { int n, gotext; char *p; for(n=0;n= strings[n]) { if(!gotext && (*p == '.')) { *p = ENDOFSTR; gotext = 1; } if(*p == '\\' || *p == '/') { p++; break; } p--; } if(strlen(p) <=0) { sprintf(errstr,"Invalid filename (%s) encountered: cannot complete this process\n",strings[n]); do_error(); } fprintf(stdout,"INFO: %s\n",p); } fflush(stdout); }