Class: WaveFile::Format

Inherits:
Object
  • Object
show all
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

UnvalidatedFormat

Instance Attribute Summary collapse

Instance Method Summary collapse

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_sampleObject (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_alignObject (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_rateObject (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

#channelsObject (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_formatObject (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_rateObject (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.

Returns:

  • (Boolean)


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.

Returns:

  • (Boolean)


50
51
52
# File 'lib/wavefile/format.rb', line 50

def stereo?
  @channels == 2
end