Class: WaveFile::SamplerInfo

Inherits:
Object
  • Object
show all
Defined in:
lib/wavefile/sampler_info.rb

Overview

Public: Provides a way to indicate the data contained in a “smpl” chunk.

That is, information about how the *.wav file could be used by a
sampler, such as the file's MIDI note or loop points. If a *.wav
file contains a "smpl" chunk, then Reader.sampler_info will
return an instance of this object with the relevant info.

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(manufacturer_id: required("manufacturer_id"), product_id: required("product_id"), sample_nanoseconds: required("sample_nanoseconds"), midi_note: required("midi_note"), fine_tuning_cents: required("fine_tuning_cents"), smpte_format: required("smpte_format"), smpte_offset: required("smpte_offset"), loops: required("loops"), sampler_specific_data: required("sampler_specific_data")) ⇒ SamplerInfo

Public: Constructs a new SamplerInfo instance.

manufacturer_id - the ID of the manufacturer that this sample is intended for. If it’s not

intended for a sampler from a particular manufacturer, this should be 0.
See the list at https://www.midi.org/specifications-old/item/manufacturer-id-numbers

product_id - the ID of the product made by the manufacturer this sample is intended for.

If not intended for a particular product, this should be 0.

sample_nanoseconds - the length of each sample in nanoseconds, which is typically determined by

converting <code>1 / sample rate</code> (in seconds) into nanoseconds.
For example, with a sample rate of 44100 this would be 22675 nanoseconds. However,
this can be set to an arbitrary value to allow for fine tuning.

midi_note - the MIDI note number of the sample. Should be between 0 and 127. fine_tuning_cents - the number of cents >= 0.0 and < 100.0 the note should be tuned up from the midi_note

field. 100 cents is equal to one semitone. For example, if this value is 50.0, and
midi_note is 60, then the sample is tuned half-way between MIDI note 60 and 61. If the
value is 0, then the sample has no fine tuning.

smpte_format - the SMPTE format. Should be 0, 24, 25, 29 or 30. smpte_offset - a SMPTETimecode representing the SMPTE time offset. loops - an Array of 0 or more SamplerLoop objects containing loop point info. Loop point info

can indicate that (for example) the sampler should loop between a given sample range as long
as the sample is played.

sampler_specific_data - a String of data specific to the intended target sampler, or nil if there is no sampler

specific data.

Raises InvalidSamplerInfoError if the given arguments are can’t be written to a *.wav file.



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
# File 'lib/wavefile/sampler_info.rb', line 46

def initialize(manufacturer_id: required("manufacturer_id"),
               product_id: required("product_id"),
               sample_nanoseconds: required("sample_nanoseconds"),
               midi_note: required("midi_note"),
               fine_tuning_cents: required("fine_tuning_cents"),
               smpte_format: required("smpte_format"),
               smpte_offset: required("smpte_offset"),
               loops: required("loops"),
               sampler_specific_data: required("sampler_specific_data"))
  validate_32_bit_integer_field(manufacturer_id, "manufacturer_id")
  validate_32_bit_integer_field(product_id, "product_id")
  validate_32_bit_integer_field(sample_nanoseconds, "sample_nanoseconds")
  validate_32_bit_integer_field(midi_note, "midi_note")
  validate_fine_tuning_cents(fine_tuning_cents)
  validate_32_bit_integer_field(smpte_format, "smpte_format")
  validate_smpte_offset(smpte_offset)
  validate_loops(loops)
  validate_sampler_specific_data(sampler_specific_data)

  @manufacturer_id = manufacturer_id
  @product_id = product_id
  @sample_nanoseconds = sample_nanoseconds
  @midi_note = midi_note
  @fine_tuning_cents = fine_tuning_cents
  @smpte_format = smpte_format
  @smpte_offset = smpte_offset
  @loops = loops
  @sampler_specific_data = sampler_specific_data
end

Instance Attribute Details

#fine_tuning_centsObject (readonly)

Public: Returns the number of cents >= 0.0 and < 100.0 the note should be tuned up from the midi_note

field. 100 cents is equal to one semitone. For example, if this value is 50, and midi_note is
60, then the sample is tuned half-way between MIDI note 60 and 61. If the value is 0, then the
sample has no fine tuning.


98
99
100
# File 'lib/wavefile/sampler_info.rb', line 98

def fine_tuning_cents
  @fine_tuning_cents
end

#loopsObject (readonly)

Public: Returns an Array of 0 or more SamplerLoop objects containing loop point info. Loop point info

can indicate that (for example) the sampler should loop between a given sample range as long
as the sample is played.


109
110
111
# File 'lib/wavefile/sampler_info.rb', line 109

def loops
  @loops
end

#manufacturer_idObject (readonly)

Public: Returns the ID of the manufacturer that this sample is intended for. If it’s not

intended for a sampler from a particular manufacturer, this should be 0.
See the list at https://www.midi.org/specifications-old/item/manufacturer-id-numbers


79
80
81
# File 'lib/wavefile/sampler_info.rb', line 79

def manufacturer_id
  @manufacturer_id
end

#midi_noteObject (readonly)

Public: Returns the MIDI note number of the sample, which normally should be between 0 and 127.



92
93
94
# File 'lib/wavefile/sampler_info.rb', line 92

def midi_note
  @midi_note
end

#product_idObject (readonly)

Public: Returns the ID of the product made by the manufacturer this sample is intended for.

If not intended for a particular product, this should be 0.


83
84
85
# File 'lib/wavefile/sampler_info.rb', line 83

def product_id
  @product_id
end

#sample_nanosecondsObject (readonly)

Public: Returns the length of each sample in nanoseconds, which is typically determined by

converting <code>1 / sample rate</code> (in seconds) into nanoseconds. For example,
with a sample rate of 44100 this would be 22675 nanoseconds. However, this can be set
to an arbitrary value to allow for fine tuning.


89
90
91
# File 'lib/wavefile/sampler_info.rb', line 89

def sample_nanoseconds
  @sample_nanoseconds
end

#sampler_specific_dataObject (readonly)

Public: Returns a String of data specific to the intended target sampler, or nil if there is no sampler

specific data. This is returned as a raw String because the structure of this data depends on
the specific sampler. If you want to use it, you'll need to unpack the String yourself.


114
115
116
# File 'lib/wavefile/sampler_info.rb', line 114

def sampler_specific_data
  @sampler_specific_data
end

#smpte_formatObject (readonly)

Public: Returns the SMPTE format (0, 24, 25, 29 or 30)



101
102
103
# File 'lib/wavefile/sampler_info.rb', line 101

def smpte_format
  @smpte_format
end

#smpte_offsetObject (readonly)

Public: Returns a SMPTETimecode representing the SMPTE time offset.



104
105
106
# File 'lib/wavefile/sampler_info.rb', line 104

def smpte_offset
  @smpte_offset
end