This file is indexed.

/usr/share/SuperCollider/HelpSource/Classes/SoundFile.schelp is in supercollider-common 1:3.8.0~repack-2.

This file is owned by root:root, with mode 0o644.

The actual contents of the file can be viewed below.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
class:: SoundFile
summary:: sclang soundfile data
related:: Classes/File, Classes/Buffer
categories:: Files

description::
The SoundFile class is used to check the size, format, channels etc. when the sclang client needs this information about a SoundFile. Soundfile data can be read and modified. Soundfile data can also be read and written incrementally, so with properly designed code, there is no restriction on the file size.

In most cases you will wish to send commands to the server to get it to load SoundFiles directly into Buffers. You will not need to use this class for this. See the link::Classes/Buffer:: helpfile.

code::
(
f = SoundFile.new;
f.openRead(Platform.resourceDir +/+ "sounds/a11wlk01.wav");
f.inspect;
f.close;
)
::

ClassMethods::

method::new
Creates a new SoundFile instance.

method::collect
Returns an link::Classes/Array:: of SoundFile objects whose paths match the pattern. (The associated files are closed. These objects can be used to cue playback buffers)
code::
SoundFile.collect("sounds/*").do { |f| f.path.postln };
::

method::use
Reads the data of a SoundFile, evaluates the function (passing the file as argument) and closes it again.
code::
SoundFile.use(Platform.resourceDir +/+ "sounds/a11wlk01.wav", { |f| f.inspect });
::

method::normalize
Normalizes a soundfile to a level set by the user. The normalized audio will be written into a second file.

Using this class method (SoundFile.normalize) will automatically open the source file for you. You may also link::#-openRead:: the SoundFile yourself and call link::#-normalize:: on it. In that case, the source path is omitted because the file is already open.

See instance method link::#-normalize:: for more information.

InstanceMethods::

private::prOpenRead, prOpenWrite

subsection::Playback

method::cue
Allocates a buffer and cues the SoundFile for playback. Returns an event parameterized to play that buffer. (See link::Reference/NodeEvent:: for a description of how events can be used to control running synths.) The event responds to strong::play::, strong::stop::, strong::pause::, strong::resume::, keeping both the file and buffer open. The file is closed and the buffer is freed when the event is sent a strong::close:: message.

argument::ev
An link::Classes/Event:: can passed as an argument allowing playback to be customized using the following keys:
table::
## strong::key:: || strong::default value:: || strong::what it does::
## bufferSize || 65536 ||
## firstFrame || 0 || first frame to play
## lastFrame || nil || last frame to play (nil plays to end of file)
## out: || 0 || sets output bus
## server: || Server.default || which server
## group: || 1 || what target
## addAction: || 0 || head/tail/before/after
## amp: || 1 || amplitude
## instrument: || nil || if nil SoundFile:cue determines the SynthDef (one of diskIn1, diskIn2, ...diskIn16)
::
Where strong::bufferSize::, strong::firstFrame::, strong::lastFrame:: are for buffer and playback position, and strong::out::, strong::server::, strong::group::, strong::addAction::, strong::amp:: are synth parameters. Here is the default SynthDef used for stereo files:
code::
SynthDef(\diskIn2, { | bufnum, out, gate = 1, sustain, amp = 1, ar = 0, dr = 0.01 |
	Out.ar(out, DiskIn.ar(2, bufnum)
	* Linen.kr(gate, ar, 1, dr, 2)
	* EnvGen.kr(Env.linen(0, sustain - ar - dr max: 0 ,dr),1, doneAction: 2) * amp)
});
::
The control strong::sustain:: determines playback duration based on the firstFrame and lastFrame. The control strong::gate:: allows early termination of the playback

argument::playNow
This is a link::Classes/Boolean:: that determines whether the file is to be played immediately after cueing.
code::
f = SoundFile.collect("sounds/*");
e = f[1].cue;

e = f[1].cue( (addAction: 2, group: 1) );	// synth will play ahead of the default group
::

argument:: closeWhenDone

A flag to indicate wether the code::SoundFile:: will be closed after it's done playing. Default is False.

subsection::Read/Write

method::openRead
Read the header of a file. Answers a link::Classes/Boolean:: whether the read was successful. Sets the link::#-numFrames::, link::#-numChannels:: and link::#-sampleRate::. Does strong::not:: set the link::#-headerFormat:: and link::#-sampleFormat::.

argument::pathName
a link::Classes/String:: specifying the path name of the file to read.

method::readData
Reads the sample data of the file into the raw array you supply. You must have already called link::#-openRead::.

When you reach EOF, the array's size will be 0. Checking the array size is an effective termination condition when looping through a sound file. See the method link::#-channelPeaks:: for example.

argument::rawArray
The raw array must be a link::Classes/FloatArray::. Regardless of the sample format of the file, the array will be populated with floating point values. For integer formats, the floats will all be in the range -1..1.

The size of the FloatArray determines the maximum number of single samples (not sample frames) that will be read. If there are not enough samples left in the file, the size of the array after the readData call will be less than the original size.

method::openWrite
Write the header of a file. Answers a link::Classes/Boolean:: whether the write was successful.

argument::pathName
a link::Classes/String:: specifying the path name of the file to write.

method::writeData
Writes the rawArray to the sample data of the file. You must have already called link::#-openWrite::.

argument::rawArray
The raw array must be a link::Classes/FloatArray:: or link::Classes/Signal::, with all values between -1 and 1 to avoid clipping during playback.
code::
(
f = SoundFile.new.headerFormat_("AIFF").sampleFormat_("int16").numChannels_(1);
f.openWrite("sounds/sfwrite.aiff");
	// sawtooth
b = Signal.sineFill(100, (1..20).reciprocal);
	// write multiple cycles (441 * 100 = 1 sec worth)
441.do({ f.writeData(b) });
f.close;
)
::

method::isOpen
answers if the file is open.

method::close
closes the file.

method::duration
the duration in seconds of the file.

subsection::Normalizing

method::normalize
Normalizes a soundfile to a level set by the user. The normalized audio will be written into a second file.

The normalizer may be used to convert a soundfile from one sample format to another (e.g., to take a floating point soundfile produced by SuperCollider and produce an int16 or int24 soundfile suitable for use in other applications).

note::
While the normalizer is working, there is no feedback to the user. It will look like SuperCollider is hung, but it will eventually complete the operation. You can set code::threaded:true:: to get feedback but it will take slightly longer to complete.
::

argument::outPath
a path to the destination file.

argument::newHeaderFormat
the desired header format of the new file; if not specified, the header format of the source file will be used.

argument::newSampleFormat
the desired sample format of the new file; if not specified, the sample format of the source file will be used.

argument::startFrame
an index to the sample frame to start normalizing.

argument::numFrames
the number of sample frames to copy into the destination file (default nil, or entire soundfile).

argument::maxAmp
the desired maximum amplitude. Provide a floating point number or, if desired, an array to specify a different level for each channel.

argument::linkChannels
a link::Classes/Boolean:: specifying whether all channels should be scaled by the same amount. The default is strong::true::, meaning that the peak calculation will be based on the largest sample in any channel. If false, each channel's peak will be calculated independently and all channels will be scaled to maxAmp (this would alter the relative loudness of each channel).

argument::chunkSize
how many samples to read at once (default is 4194304, or 16 MB).

argument::threaded
if true, the normalization runs in a routine so that SC can respond (intermittently) while processing. Prevents OSX beachballing.

subsection::Instance Variables

method::path
Get the pathname of the file. This variable is set via the link::#-openRead:: or link::#-openWrite:: calls.

method::headerFormat
This is a link::Classes/String:: indicating the header format which was read by openRead and will be written by openWrite. In order to write a file with a certain header format you set this variable.

definitionList::
## read/write header formats: ||
table::
## "AIFF" || Apple/SGI AIFF format
## "WAV","WAVE", "RIFF" || Microsoft WAV format
## "Sun", "NeXT" || Sun/NeXT AU format
## "SD2" || Sound Designer 2
## "IRCAM" || Berkeley/IRCAM/CARL
## "raw" || no header = raw data
## "MAT4" || Matlab (tm) V4.2 / GNU Octave 2.0
## "MAT5" || Matlab (tm) V5.0 / GNU Octave 2.1
## "PAF" || Ensoniq PARIS file format
## "SVX" || Amiga IFF / SVX8 / SV16 format
## "NIST" || Sphere NIST format
## "VOC" || VOC files
## "W64" || Sonic Foundry's 64 bit RIFF/WAV
## "PVF" || Portable Voice Format
## "XI" || Fasttracker 2 Extended Instrument
## "HTK" || HMM Tool Kit format
## "SDS" || Midi Sample Dump Standard
## "AVR" || Audio Visual Research
## "FLAC" || FLAC lossless file format
## "CAF" || Core Audio File format
::
::
Additionally, a huge number of other formats are supported read only. Please note that WAV file support is limited to 4GB. For output of multiple channels or very long recordings we suggest to use W64 (or CAF on OSX).

method::sampleFormat
A link::Classes/String:: indicating the format of the sample data which was read by link::#-openRead:: and will be written by link::#-openWrite::. libsndfile determines which header formats support which sample formats. This information is detailed at http://www.mega-nerd.com/libsndfile . The possible header formats are:
definitionList::
## sample formats: ||
table::
## "int8", "int16", "int24", "int32"
## "mulaw", "alaw",
## "float"
::
::
Not all header formats support all sample formats.

method::numFrames
The number of sample frames in the file.

method::numChannels
The number of channels in the file.

method::sampleRate
The sample rate of the file.