Here is a simple sine wave generator in awk.
It produces 1 second of a 1000 Hz sine wave
scaled to an amplitude of 24 bits, at 44100Hz.
The individual 24bit samples are printed out
as three bytes, from lowest to highest.
$ cat sin.awk
BEGIN {
tone = 1000;
duration = 1;
amplitude = 1;
samplerate = 44100;
numsamples = duration * samplerate;
bitspersample = 24;
pi = 4 * atan2(1,1);
for (b = 0 ; b < bitspersample ; b++)
amplitude *= 2;
amplitude -= 1;
for (s = 0; s < numsamples; s++) {
sample = sin(2 * pi * tone * s / samplerate);
sample = int(amplitude * sample);
#printf("%d\n", sample);
for (b = 0; b < bitspersample/8; b++) {
printf("%c", sample % 256); # zero?
sample /= 256;
}
}
}
The result is different with system awk (version 20110810)
and mawk-1.3.4.20140914; this is on current/amd64.
If I print out just the samples (24bit integers, as %d),
the results are indentical. If I print out the individual
bytes of those 24 bit samples (the innermost for loop),
the results differ; the difference is that that the system awk
does NOT print out some of the zeros.
$ awk -f sin.awk | hexdump -C | head > awk
$ mawk -f sin.awk | hexdump -C | head > mawk
$ diff awk mawk | head
7,10c7,10
< 00000060 31 03 bf 04 01 52 39 03 77 92 0a 0f ea 16 14 27 |1....R9.w......'|
< 00000070 e2 7b 3d 04 ee 56 77 d2 73 59 93 93 ee 8b b5 f8 |.{=..Vw.sY......|
< 00000080 0b d9 4e 5b fd 8e bc 20 fa 74 44 42 ca 66 46 0a |..N[... .tDB.fF.|
< 00000090 87 b9 8d a4 7e bb be c6 0b d5 cc 0a e7 36 5b f4 |....~........6[.|
---
> 00000060 31 00 03 bf 04 01 52 39 03 77 92 0a 0f ea 16 14 |1.....R9.w......|
> 00000070 00 27 e2 7b 3d 04 ee 56 77 d2 73 59 93 93 ee 8b |.'.{=..Vw.sY....|
> 00000080 b5 f8 0b d9 4e 5b fd 8e bc 20 fa 74 44 42 ca 66 |....N[... .tDB.f|
> 00000090 46 0a 87 b9 8d a4 7e bb be c6 0b d5 cc 0a e7 36 |F.....~........6|
mawk's printf("%c", ...) of a zero byte always prints a zero byte (^@)
while system awk's printf("%c", ...) of a zero bytes sometimes prints
a zero byte, and sometimes prints nothing.
awk variables are not typed; can it be that the zero byte
is sometimes considered a delimiter of an empty string?
Is there a better way in awk to print a 'raw' byte than printf("%c")?
Jan