Class: PicoTune::Assembler

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(file) ⇒ Assembler

Returns a new instance of Assembler.



458
459
460
461
# File 'lib/picotune.rb', line 458

def initialize file
  @file = file
  @parser = PicoTune::Parser.new file
end

Instance Attribute Details

#instrumentsObject (readonly)

Returns the value of attribute instruments.



456
457
458
# File 'lib/picotune.rb', line 456

def instruments
  @instruments
end

#patternsObject (readonly)

Returns the value of attribute patterns.



456
457
458
# File 'lib/picotune.rb', line 456

def patterns
  @patterns
end

#phrasesObject (readonly)

Returns the value of attribute phrases.



456
457
458
# File 'lib/picotune.rb', line 456

def phrases
  @phrases
end

Instance Method Details

#assembleObject



463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
# 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