class PicoTune::Assembler

Attributes

instruments[R]
patterns[R]
phrases[R]

Public Class Methods

new(file) click to toggle source
# File lib/picotune.rb, line 458
def initialize file
  @file = file
  @parser = PicoTune::Parser.new file
end

Public Instance Methods

assemble() click to toggle source
# File lib/picotune.rb, line 463
def assemble
  patterns = []
  phrases = []

  list = @parser.parse

  instruments = list.select { |item| item['type'] == 'instrument' }.map do |item|
    PicoTune::Instrument.new(
      item['name'],
      item['tone'] || 'sine',
      item['length'] || 'full',
      item['volume'] || 'full',
      item['pan'] || 'center',
      item['reverb'] || 'none'
    )
  end

  patterns = list.select { |item| item['type'] == 'pattern' }.map do |item|
    PicoTune::Pattern.new item['name'], item['list']
  end

  phrases = list.select { |item| item['type'] == 'phrase' }.map do |item|
    melodies = item['melodies'].map do |m|
      instrument = instruments.find { |i| i.name == m[0] }

      raise "Instrument named \"#{m[0]}\" doesn't exist!" unless instrument

      pattern = patterns.find { |p| p.name == m[1] }

      raise "Pattern named \"#{m[1]}\" doesn't exist!" unless pattern

      PicoTune::Melody.new instrument, pattern
    end

    PicoTune::Phrase.new(
      item['name'],
      item['tempo'],
      item['beats'],
      item['subbeats'],
      melodies
    )
  end

  sequence = list.find { |item| item['type'] == 'sequence' }

  raise "Please define a sequence in your txt file with \"sequence s1 s2 s3...\" where s1/s2/s3/etc are names of phrases" unless sequence

  sequence['list'].each do |phrase_name|
    raise "undefined phrase \"#{phrase_name}\" in sequence" unless phrases.find { |p| p.name == phrase_name }
  end

  tune = list.find { |item| item['type'] == 'tune' }

  raise "Please define your tune's name in your txt file  with \"tune <tune name>\"" unless tune && tune['name']

  PicoTune::Tune.new tune['name'], sequence['list'], phrases
end