2.4 KiB
2.4 KiB
Some possible API concepts for dealing with files
Notes
- requires libflac for flac decoding
Use Cases
- Play a file through the speakers
- Use a file as input to an AudioNode for processing
- Read a file into an array
- Write an array into a file
- Write the output of an AudioNode to a file
IOStream API
- users use standard julia "open" function to create an IOStream object
- FilePlayer <: AudioNode takes an IOStream and uses
sf_open_fd
to open and play - play(io::IOStream) creates a FilePlayer and plays it (just like ArrayPlayer)
- FileStream
Play a file through the speakers
sndfile = open("myfile.wav")
play(sndfile)
close(sndfile)
Use a file as input to an AudioNode for processing
sndfile = open("myfile.wav")
# maybe FilePlayer also takes a string input for convenience
node = FilePlayer(sndfile)
mixer = AudioMixer([node])
# etc.
Read a file into an array
# TODO
Write an array into a file
# TODO
Write the output of an AudioNode to a file
node = SinOsc(440)
# ???
Separate Open Function API
- users use an explicit
af_open
function to open sound files af_open
takes mode arguments just like the regular juliaopen
functionaf_open
returns a AudioFile instance.
Play a file through the speakers
sndfile = af_open("myfile.wav")
play(sndfile)
close(sndfile)
or
play("myfile.wav")
Use a file as input to an AudioNode for processing
sndfile = af_open("myfile.wav")
# FilePlayer also can take a string filename for convenience
node = FilePlayer(sndfile)
mixer = AudioMixer([node])
# etc.
Read a file into an array
sndfile = af_open("myfile.wav")
vec = read(sndfile) # takes an optional arg for number of frames to read
close(sndfile)
Write an array into a file
sndfile = af_open("myfile.wav", "w") #TODO: need to specify format
vec = rand(Float32, 441000) # 10 seconds of noise
write(sndfile, vec)
close(sndfile)
Write the output of an AudioNode to a file
sndfile = af_open("myfile.wav", "w") #TODO: need to specify format
node = SinOsc(440)
write(sndfile, node, 44100) # record 1 second, optional block_size
# note that write() can handle sample depth conversions, and render() is
# called with the sampling rate of the file
close(sndfile)