Class: PicoTune::Tune

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name, sequence, phrases) ⇒ Tune

Returns a new instance of Tune.



148
149
150
151
152
153
154
155
156
# File 'lib/picotune.rb', line 148

def initialize name, sequence, phrases
  @name = name
  @sequence = sequence
  @phrases = phrases

  @phrases.each do |p|
    p.tune = self
  end
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



146
147
148
# File 'lib/picotune.rb', line 146

def name
  @name
end

#phrasesObject (readonly)

Returns the value of attribute phrases.



146
147
148
# File 'lib/picotune.rb', line 146

def phrases
  @phrases
end

#sequenceObject (readonly)

Returns the value of attribute sequence.



146
147
148
# File 'lib/picotune.rb', line 146

def sequence
  @sequence
end

Instance Method Details

#bufferObject



170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
# File 'lib/picotune.rb', line 170

def buffer
  @buffer ||= begin
    tune_buffer_length = @sequence.reduce(0) do |acc, phrase_name|
      acc + @phrases.find { |p| p.name == phrase_name }.buffer_size
    end

    offset = 0
    samples = Array.new(tune_buffer_length) { PicoTune::Sample.new }

    @sequence.each do |phrase_name|
      phrase = @phrases.find { |p| p.name == phrase_name }

      phrase.buffer.each_with_index do |phrase_sample, index|
        tune_sample = samples[offset + index] || PicoTune::Sample.new
        tune_sample.add phrase_sample
        samples[offset + index] = tune_sample
      end

      offset += phrase.buffer_size
    end

    samples
  end
end

#volume_factor_for_simultaneous_melodiesObject



158
159
160
161
162
163
164
165
166
167
168
# File 'lib/picotune.rb', line 158

def volume_factor_for_simultaneous_melodies
  max_melodies_in_phrases = 0

  @phrases.each do |phrase|
    if phrase.simultaneous_melodies > max_melodies_in_phrases
      max_melodies_in_phrases = phrase.simultaneous_melodies
    end
  end

  1.0 / max_melodies_in_phrases if max_melodies_in_phrases > 0
end

#wavObject



195
196
197
198
199
200
201
202
203
204
205
206
207
# File 'lib/picotune.rb', line 195

def wav
  @wav ||= begin
    wav_format = WaveFile::Format.new :stereo, :float, PicoTune::SAMPLE_RATE
    wav_buffer = WaveFile::Buffer.new buffer.map(&:to_a), wav_format
    name = "#{@name}.wav"

    WaveFile::Writer.new(name, WaveFile::Format.new(:stereo, :pcm_8, PicoTune::SAMPLE_RATE)) do |writer|
      writer.write(wav_buffer)
    end

    name
  end
end