This is wave.c in view mode; [Download] [Up]
/* %M% %I% (CARL) %G% %U% */
#include <stdio.h>
#include <sys/types.h>
#include <carl/sndio.h>
#include <math.h>
#include <carl/carl.h>
#include <carl/defaults.h>
int otty, header = 1;
main(argc, argv)
int argc; char **argv;
{
float sfexpr(), sr = FDLOSR, fc = 440.0, amp = 1.0, dur = 1.0;
char ch, waveform = 's';
long nsamps, silence = 0;
float fsilence;
float fcsr;
otty = isatty(1);
if (argc == 1 && otty)
help();
while ((ch = crack(argc, argv, "hHR|r|f|w|a|d|T|S|", 0)) != NULL)
{
switch(ch)
{
case 'H':
header = 0;
break;
case 'h':
default:
help();
case 'R':
case 'r':
sr = sfexpr(arg_option, 1.0);
break;
case 'f':
fc = sfexpr(arg_option, 1.0);
break;
case 'w':
waveform = *arg_option;
break;
case 'a':
amp = sfexpr(arg_option, 1.0);
break;
case 'd':
case 'T':
dur = sfexpr(arg_option, sr)/sr;
break;
case 'S':
fsilence = sfexpr(arg_option, sr)/sr;
}
}
if (otty)
header = 0;
nsamps = sr * dur;
fcsr = fc / sr;
silence = fsilence * sr;
if (header)
if (whead(sr, fc, amp, dur*sr)) {
fprintf(stderr, "can't write header\n");
exit(1);
}
switch (waveform)
{
case 's':
sinewave(nsamps, amp, fcsr);
break;
case 'd':
dc(nsamps, amp);
break;
case 'S':
dc(nsamps, 0.0);
break;
case 'q':
squarewave(nsamps, amp, fcsr);
break;
case 't':
trianglewave(nsamps, amp, fcsr);
break;
case 'r':
rampwave(nsamps, amp, fcsr);
break;
case 'i':
impulse(nsamps, amp, fcsr);
break;
case 'p':
pulsetrain(nsamps, amp, fcsr);
break;
case 'u':
whitenoise(nsamps, amp, fcsr);
break;
default:
fprintf(stderr, "wave: waveform %c not implemented.\n",
waveform);
exit(1);
}
while (silence--)
{
float output = 0.0;
if (otty)
printf("%d\t%f\n", ++nsamps, 0.0);
else
putfloat(&output);
}
if (!otty)
flushfloat();
exit(0);
}
sinewave(ns, a, fcsr)
long ns; float a, fcsr;
{
float output;
register float twopi = 8.0 * atan(1.0);
register long i;
for (i = 0; i < ns; i++)
{
output = a * sin(twopi * fcsr * i);
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
}
}
dc(ns, a)
long ns; float a;
{
float output;
register long i;
output = a;
for (i = 0; i < ns; i++)
{
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
}
}
squarewave(ns, a, fcsr)
register long ns; register float a, fcsr;
{
float output;
register long i;
register float inc = 0.0;
for (i = 0; i < ns; i++)
{
output = a * ((inc >= .5) ? -1.0 : 1.0);
inc += fcsr;
if (inc >= 1.0) inc = 0.0;
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
}
}
trianglewave(ns, a, fcsr)
register long ns; register float a, fcsr;
{
register float inc = 0.0;
float output = 0.0;
register long i, up = 1;
fcsr *= 4.0;
for (i = 0; i < ns; i++)
{
output = a * inc;
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
if (up)
{
inc += fcsr;
if (inc >= 1.0) { up--; inc = 1.0; }
}
else
{
inc -= fcsr;
if (inc <= -1.0) { up++; inc = -1.0; }
}
}
}
rampwave(ns, a, fcsr)
register long ns; register float a, fcsr;
{
float output = 0.0;
register float inc = 0.0;
register long i;
fcsr *= 2.0;
for (i = 0; i < ns; i++)
{
output = inc * a;
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
inc += fcsr;
if (inc >= 1.0) inc = -1.0;
}
}
impulse(ns, a, fcsr)
register long ns; register float a;
{
float output = a;
register long i;
for (i = 0; i < ns; i++)
{
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
output = 0.0;
}
}
pulsetrain(ns, a, fcsr)
register long ns; register float a, fcsr;
{
float output;
register long i;
register float inc = 0.0;
for (i = 0; i < ns; i++)
{
output = a * ((inc == 0.0) ? 1.0 : 0.0);
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
inc += fcsr;
if (inc >= 1.0) inc = 0.0;
}
}
whitenoise(ns, a, fcsr)
register long ns; register float a;
{
register long i;
register long ran;
float output, divisor = pow((double)2.0,(double)30.0)-1.0;
for (i = 0; i < ns; i++)
{
ran = rand();
output = a * (ran / divisor) - 1.0;
if (otty)
printf("%d:\t%f\n", i, output);
else
putfloat(&output);
}
}
help()
{
printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s",
"flags:\n",
"-RN = set sampling rate to N (",
DEFSR,
")\n",
"-fN = set frequency to N (440)\n",
"-wC = select waveform C (s) from the following\n",
" s = sine\n",
" r = ramp\n",
" q = square\n",
" t = triangle\n",
" p = pulse train\n",
" i = impulse\n",
" d = dc, where -aN sets the value of the offset\n",
" S = silence\n",
" u = uniform noise\n",
"-aN = set amplitude to N (1.0) (0 to 1.0, or -96dB to -0dB)\n",
"-TN = set time in secs. to N (1.0)\n",
"-SN = duration of silence at end of tone, in secs. (0),\n",
"-H = suppress the header when writing floatsams\n",
"flag options may be expressions\n",
"postoperators: S=time in samples, k=\"times 1000\"\n"
);
exit(1);
}
whead(sr, fc, amp, dur)
float sr, fc, amp, dur;
{
char buf[128];
(void) sprintf(buf, "%f", sr);
if (addprop(stdout, H_SRATE, buf) != 0)
return(-1);
(void) sprintf(buf, "%f", fc);
if (addprop(stdout, H_FREQUENCY, buf) != 0)
return(-1);
(void) sprintf(buf, "%f", amp);
if (addprop(stdout, H_AMPLITUDE, buf) != 0)
return(-1);
(void) sprintf(buf, "%f", dur);
if (addprop(stdout, H_NSAMPLES, buf) != 0)
return(-1);
if (addprop(stdout, H_NCHANS, "1") != 0)
return(-1);
if (addprop(stdout, H_FORMAT, H_FLOATSAM) != 0)
return(-1);
return(0);
}
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.