1
/***********************************************/
3
NeXT (.snd) and Sun (.au) Soundfile Output Class
5
Revised by Gary P. Scavone, 1999-2000
7
This one opens a NeXT .snd file, and
8
even knows how to byte-swap!
10
/***********************************************/
13
#ifdef __LITTLE_ENDIAN__
17
/******** NeXT Soundfile Header Struct *******/
28
FILE *openNeXTFile(int chans, char *fileName) {
29
struct headerform hdr = {".sn",40,0,3,(INT32) SRATE,1,"Created by STK"};
36
strcpy(tempName,fileName);
37
if (strstr(tempName,".snd") == NULL) strcat(tempName,".snd");
38
hdr.num_channels = chans;
39
fd = fopen(tempName,"wb");
41
sprintf(msg, "SndWvOut: Could not create soundfile: %s\n", tempName);
42
throw StkError(msg, StkError::FILE_ERROR);
45
#ifdef __LITTLE_ENDIAN__
46
swap32 ((unsigned char *)&hdr.hdr_length);
47
swap32 ((unsigned char *)&hdr.file_length);
48
swap32 ((unsigned char *)&hdr.mode);
49
swap32 ((unsigned char *)&hdr.samp_rate);
50
swap32 ((unsigned char *)&hdr.num_channels);
53
printf("\nCreating soundfile: %s\n", tempName);
58
SndWvOut :: SndWvOut(char *fileName, int chans)
62
sprintf(msg, "SndWvOut: number of channels = %d not supported!\n", chans);
63
throw StkError(msg, StkError::FUNCTION_SYNTAX);
66
fd = openNeXTFile(channels,fileName);
67
data_length = FILE_BUFFER_SIZE*channels;
68
data = (INT16 *) new INT16[data_length];
71
SndWvOut :: ~SndWvOut()
75
fwrite(data,2,counter,fd);
76
temp = (double) totalCount * ONE_OVER_SRATE;
77
printf("%f Seconds Computed\n\n", temp);
79
totalCount *= 2*channels;
80
#ifdef __LITTLE_ENDIAN__
81
swap32 ((unsigned char *)&totalCount);
83
fseek(fd,8,SEEK_SET); // jump to data size
84
fwrite(&totalCount,4,1,fd);
88
void SndWvOut :: tick(MY_FLOAT sample)
92
isample = (INT16) (sample * 32000.0);
93
#ifdef __LITTLE_ENDIAN__
94
swap16 ((unsigned char *)&isample);
96
for (int i=0;i<channels;i++)
97
data[counter++] = isample;
100
if (counter == data_length) {
101
fwrite(data,2,data_length,fd);
106
void SndWvOut :: mtick(MY_MULTI samples)
108
for (int i=0;i<channels;i++) {
109
data[counter] = (INT16) (*samples++ * 32000.0);
110
#ifdef __LITTLE_ENDIAN__
111
swap16 ((unsigned char *)&data[counter]);
117
if (counter == data_length) {
118
fwrite(data,2,data_length,fd);