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