Class: WaveFile::Format
- Inherits:
-
Object
- Object
- WaveFile::Format
- Defined in:
- lib/wavefile/format.rb
Overview
Represents information about the data format for a Wave file, such as number of channels, bits per sample, sample rate, and so forth. A Format instance is used by Reader to indicate what format to read samples out as, and by Writer to indicate what format to write samples as.
This class is immutable - once a new Format is constructed, it can’t be modified.
Direct Known Subclasses
Instance Attribute Summary collapse
-
#bits_per_sample ⇒ Object
readonly
Returns the number of bits per sample, such as 8, 16, 24, 32, or 64.
-
#block_align ⇒ Object
readonly
Returns the number of bytes in each sample frame.
-
#byte_rate ⇒ Object
readonly
Returns the number of bytes contained in 1 second of sample data.
-
#channels ⇒ Object
readonly
Returns the number of channels, such as 1 or 2.
-
#sample_format ⇒ Object
readonly
Returns a symbol indicating the sample format, such as :pcm or :float.
-
#sample_rate ⇒ Object
readonly
Returns the number of samples per second, such as 44100.
Instance Method Summary collapse
-
#initialize(channels, format_code, sample_rate) ⇒ Format
constructor
Constructs a new immutable Format.
-
#mono? ⇒ Boolean
Returns true if the format has 1 channel, false otherwise.
-
#stereo? ⇒ Boolean
Returns true if the format has 2 channels, false otherwise.
Constructor Details
#initialize(channels, format_code, sample_rate) ⇒ Format
Constructs a new immutable Format.
channels - The number of channels in the format. Can either be a Fixnum
(e.g. 1, 2, 3) or the symbols :mono (equivalent to 1) or
:stereo (equivalent to 2).
format_code - A symbol indicating the format of each sample. Consists of
two parts: a format code, and the bits per sample. The valid
values are :pcm_8, :pcm_16, :pcm_32, :float_32, :float_64,
and :float (equivalent to :float_32)
sample_rate - The number of samples per second, such as 44100
Examples
format = Format.new(1, :pcm_16, 44100)
format = Format.new(:mono, :pcm_16, 44100) # Equivalent to above
format = Format.new(:stereo, :float_32, 44100)
format = Format.new(:stereo, :float, 44100)
28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'lib/wavefile/format.rb', line 28 def initialize(channels, format_code, sample_rate) channels = normalize_channels(channels) sample_format, bits_per_sample = normalize_format_code(format_code) validate_channels(channels) validate_sample_format(sample_format) validate_bits_per_sample(sample_format, bits_per_sample) validate_sample_rate(sample_rate) @channels = channels @sample_format = sample_format @bits_per_sample = bits_per_sample @sample_rate = sample_rate @block_align = (@bits_per_sample / 8) * @channels @byte_rate = @block_align * @sample_rate end |
Instance Attribute Details
#bits_per_sample ⇒ Object (readonly)
Returns the number of bits per sample, such as 8, 16, 24, 32, or 64.
63 64 65 |
# File 'lib/wavefile/format.rb', line 63 def bits_per_sample @bits_per_sample end |
#block_align ⇒ Object (readonly)
Returns the number of bytes in each sample frame. For example, in a 16-bit stereo file, this will be 4 (2 bytes for each 16-bit sample, times 2 channels).
70 71 72 |
# File 'lib/wavefile/format.rb', line 70 def block_align @block_align end |
#byte_rate ⇒ Object (readonly)
Returns the number of bytes contained in 1 second of sample data. Is equivalent to block_align * sample_rate.
74 75 76 |
# File 'lib/wavefile/format.rb', line 74 def byte_rate @byte_rate end |
#channels ⇒ Object (readonly)
Returns the number of channels, such as 1 or 2. This will always return a Fixnum, even if the number of channels is specified with a symbol (e.g. :mono) in the constructor.
57 58 59 |
# File 'lib/wavefile/format.rb', line 57 def channels @channels end |
#sample_format ⇒ Object (readonly)
Returns a symbol indicating the sample format, such as :pcm or :float
60 61 62 |
# File 'lib/wavefile/format.rb', line 60 def sample_format @sample_format end |
#sample_rate ⇒ Object (readonly)
Returns the number of samples per second, such as 44100.
66 67 68 |
# File 'lib/wavefile/format.rb', line 66 def sample_rate @sample_rate end |
Instance Method Details
#mono? ⇒ Boolean
Returns true if the format has 1 channel, false otherwise.
45 46 47 |
# File 'lib/wavefile/format.rb', line 45 def mono? @channels == 1 end |
#stereo? ⇒ Boolean
Returns true if the format has 2 channels, false otherwise.
50 51 52 |
# File 'lib/wavefile/format.rb', line 50 def stereo? @channels == 2 end |