class PicoTune::Tune

Attributes

name[R]
phrases[R]
sequence[R]

Public Class Methods

new(name, sequence, phrases) click to toggle source
# 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

Public Instance Methods

buffer() click to toggle source
# 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_melodies() click to toggle source
# 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
wav() click to toggle source
# 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