|
|
1.1 ! root 1: /* TONE.C */ ! 2: ! 3: /* Developed 1990-1997 by Rob Swindell; PO Box 501, Yorba Linda, CA 92885 */ ! 4: ! 5: /* Test sound freqs and durations from command line */ ! 6: ! 7: #ifdef __OS2__ ! 8: #define INCL_DOS ! 9: #include <os2.h> ! 10: #endif ! 11: #include <io.h> ! 12: #include <dos.h> ! 13: #include <math.h> ! 14: #include <stdio.h> ! 15: #include <string.h> ! 16: #include <stdlib.h> ! 17: #include <fcntl.h> ! 18: ! 19: #ifdef __OS2__ ! 20: #define mswait(x) DosSleep(x) ! 21: #define delay(x) DosSleep(x) ! 22: #define sound(x) DosBeep(x,0) ! 23: #define nosound() DosBeep(0,0) ! 24: #endif ! 25: ! 26: #define NOT_ABORTABLE (1<<0) ! 27: #define SHOW_DOT (1<<1) ! 28: #define SHOW_FREQ (1<<2) ! 29: #define NO_VISUAL (1<<3) ! 30: #define USE_MSWAIT (1<<4) ! 31: ! 32: #ifdef __OS2__ ! 33: int mswtyp; ! 34: #else ! 35: extern mswtyp; ! 36: #endif ! 37: ! 38: int aborted=0; /* Ctrl-C hit? */ ! 39: int mode=0; /* Optional modes */ ! 40: int t=1; /* Timing */ ! 41: int s=0; /* Stacato */ ! 42: int octave=4; /* Default octave */ ! 43: ! 44: double pitch=523.50/32.0; /* low 'C' */ ! 45: ! 46: void play(char *freq, char *dur) ! 47: { ! 48: char *notes="c d ef g a b"; ! 49: char *sharp="BC D EF G A "; ! 50: int i,n,d,o=octave; ! 51: double f; ! 52: ! 53: d=atoi(dur); ! 54: if(isdigit(freq[0])) ! 55: f=atoi(freq); ! 56: else ! 57: switch(toupper(freq[0])) { ! 58: case 'O': /* default octave */ ! 59: if(isdigit(dur[0])) ! 60: octave=d; ! 61: else ! 62: octave+=d; ! 63: return; ! 64: case 'P': /* pitch variation */ ! 65: if(isdigit(dur[0])) ! 66: pitch=atof(dur)/32.0; ! 67: else ! 68: pitch+=atof(dur); ! 69: return; ! 70: case 'Q': /* quit */ ! 71: nosound(); ! 72: exit(0); ! 73: case 'R': /* rest */ ! 74: f=0; ! 75: break; ! 76: case 'S': /* stacato */ ! 77: if(isdigit(dur[0])) ! 78: s=d; ! 79: else ! 80: s+=d; ! 81: return; ! 82: case 'T': /* time adjust */ ! 83: t=d; ! 84: return; ! 85: case 'V': ! 86: if(mode&NO_VISUAL) ! 87: return; ! 88: n=strlen(dur); ! 89: while(n && dur[n]<=' ') ! 90: n--; ! 91: dur[n+1]=0; ! 92: if(dur[n]=='\\') { ! 93: dur[n]=0; ! 94: printf("%s",dur); } ! 95: else ! 96: printf("%s\r\n",dur); ! 97: return; ! 98: case 'X': /* exit */ ! 99: exit(1); ! 100: default: ! 101: for(n=0;notes[n];n++) ! 102: if(freq[0]==notes[n] || freq[0]==sharp[n]) ! 103: break; ! 104: if(isdigit(freq[1])) ! 105: o=(freq[1]&0xf); ! 106: else ! 107: o=octave; ! 108: f=pitch*pow(2,o+(double)n/12); ! 109: break; } ! 110: if(!f) ! 111: nosound(); ! 112: else ! 113: sound(f); ! 114: if(f && mode&SHOW_FREQ) { ! 115: for(i=0;freq[i]>' ';i++) ! 116: ; ! 117: freq[i]=0; ! 118: printf("%-4.4s",freq); } ! 119: if(mode&SHOW_DOT) ! 120: printf("."); ! 121: if(t>10) { ! 122: if(mode&USE_MSWAIT) ! 123: mswait((d*t)-(d*s)); ! 124: else ! 125: delay((d*t)-(d*s)); } ! 126: else { ! 127: if(mode&USE_MSWAIT) ! 128: mswait(d*t); ! 129: else ! 130: delay(d*t); } ! 131: if(s) { ! 132: nosound(); ! 133: if(t>10) { ! 134: if(mode&USE_MSWAIT) ! 135: mswait(d*s); ! 136: else ! 137: delay(d*s); } ! 138: else { ! 139: if(mode&USE_MSWAIT) ! 140: mswait(s); ! 141: else ! 142: delay(s); } } ! 143: } ! 144: ! 145: void usage(void) ! 146: { ! 147: printf("usage: tone [/opts] [(note[oct]|freq) dur | (cmd val) [...]] " ! 148: "[+filename]\n\n"); ! 149: printf("where: note = a,b,c,d,e,f, or g (naturals) or A,B,C,D,E,F, or " ! 150: "G (sharps)\n"); ! 151: printf(" oct = octave 1 through 9 (default=%d)\n",octave); ! 152: printf(" freq = frequency (in Hz) or 0 for silence\n"); ! 153: printf(" dur = duration (in timer counts)\n"); ! 154: printf(" cmd = o set default octave (+/- to adjust) " ! 155: "(default=%d)\n",octave); ! 156: printf(" p set middle c pitch (+/- to adjust) " ! 157: "(default=%.2f)\n",pitch*32.0); ! 158: printf(" q quit program immediately\n"); ! 159: printf(" r rest (silence) for val timer counts\n"); ! 160: printf(" s set stacato duration (in ms) (+/- to adjust) " ! 161: "(default=%d)\n",s); ! 162: printf(" t set timer count value (in ms) " ! 163: "(default=%d)\n",t); ! 164: printf(" v visual text diplay of val (no val=cr/lf)\n"); ! 165: printf(" x quit program immediately (leave tone on)\n"); ! 166: printf(" opts = d display dot for each note\n"); ! 167: printf(" f display frequency or note value\n"); ! 168: printf(" n not abortable with key-stroke\n"); ! 169: printf(" v disable visual text commands\n"); ! 170: printf(" t use time-slice aware delays\n"); ! 171: exit(0); ! 172: } ! 173: ! 174: int cbreakh() /* ctrl-break handler */ ! 175: { ! 176: aborted=1; ! 177: return(1); /* 1 to continue, 0 to abort */ ! 178: } ! 179: ! 180: void main(int argc, char **argv) ! 181: { ! 182: char *p,str[128]; ! 183: int i,j,file; ! 184: FILE *stream; ! 185: ! 186: #ifndef __OS2__ ! 187: ctrlbrk(cbreakh); ! 188: #endif ! 189: ! 190: printf("\nTone Generation Utility v1.01 Developed 1993 Rob Swindell\n\n"); ! 191: ! 192: if(argc<2) ! 193: usage(); ! 194: ! 195: mswtyp=0; ! 196: delay(0); ! 197: for(i=1;i<argc;i++) { ! 198: if(argv[i][0]=='/') { ! 199: for(j=1;argv[i][j];j++) ! 200: switch(toupper(argv[i][j])) { ! 201: case 'D': ! 202: mode^=SHOW_DOT; ! 203: break; ! 204: case 'F': ! 205: mode^=SHOW_FREQ; ! 206: break; ! 207: case 'N': ! 208: mode^=NOT_ABORTABLE; ! 209: break; ! 210: case 'V': ! 211: mode^=NO_VISUAL; ! 212: break; ! 213: case 'T': ! 214: mode^=USE_MSWAIT; ! 215: mswtyp=atoi(argv[i]+j+1); ! 216: while(isdigit(argv[i][j+1])) ! 217: j++; ! 218: break; ! 219: default: ! 220: usage(); } ! 221: continue; } ! 222: if(argv[i][0]=='+') { ! 223: if((file=open(argv[i]+1,O_RDONLY|O_DENYNONE|O_BINARY))==-1 ! 224: || (stream=fdopen(file,"rb"))==NULL) { ! 225: strcpy(str,argv[0]); ! 226: p=strrchr(str,'\\'); ! 227: if(p) ! 228: *(p+1)=0; ! 229: strcat(str,argv[i]+1); ! 230: if((file=open(str,O_RDONLY|O_DENYNONE|O_BINARY))==-1 ! 231: || (stream=fdopen(file,"rb"))==NULL) { ! 232: printf("\7Error opening %s\n",argv[i]+1); ! 233: exit(1); } } ! 234: while(mode&NOT_ABORTABLE || !kbhit()) { ! 235: if(!fgets(str,81,stream)) ! 236: break; ! 237: if(!isalnum(str[0])) ! 238: continue; ! 239: p=str; ! 240: while(*p>' ') ! 241: p++; ! 242: while(*p && *p<=' ') ! 243: p++; ! 244: play(str,p); } ! 245: fclose(stream); ! 246: continue; } ! 247: play(argv[i],argv[i+1]); ! 248: i++; ! 249: if(aborted) ! 250: break; } ! 251: nosound(); ! 252: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.