class Musicality::Project

Constants

CONFIG_FILE_NAME
DEFAULT_CONFIG
GEM_MUSICALITY
OUT_DIR
SAMPLE_FORMATS
SCORES_DIR
SCORE_EXT
USEFUL_MODULES

Public Class Methods

check_config(config) click to toggle source

config.yml

# File lib/musicality/project/project.rb, line 182
def self.check_config config
  config.each do |k,v|
    case k
    when :audio_sample_format
      raise ConfigError, "#{k} => #{v} is not allowed" unless SAMPLE_FORMATS.include?(v)
    when :tempo_sample_rate, :audio_sample_rate
      raise ConfigError, "#{k} => #{v} is not positive" unless v > 0
    end
  end
end
config_path(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 52
def self.config_path(dest_dir)
  File.join(dest_dir,"config.yml")
end
create_config(dest_dir, config = Project::DEFAULT_CONFIG) click to toggle source
# File lib/musicality/project/project.rb, line 220
def self.create_config(dest_dir, config = Project::DEFAULT_CONFIG)
  File.open(config_path(dest_dir),"w") do |f|
    f.write(config.to_yaml)
  end
end
create_gemfile(dest_dir) click to toggle source

Gemfile

# File lib/musicality/project/project.rb, line 93
def self.create_gemfile(dest_dir)
  gemfile_path = File.join(dest_dir,"Gemfile")
  File.new(gemfile_path(dest_dir),"w")
  update_gemfile(dest_dir)
end
create_project_dir_if_needed(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 64
def self.create_project_dir_if_needed(dest_dir)
  if Dir.exists?(dest_dir)
    puts "Project directory already exists"
  else
    puts "Creating project directory #{dest_dir}"
    Dir.mkdir(dest_dir)
    unless Dir.exists?(dest_dir)
      raise "directory #{dest_dir} could not be created"
    end
  end
end
create_rakefile(dest_dir) click to toggle source

Rakefile

# File lib/musicality/project/project.rb, line 128
def self.create_rakefile(dest_dir)
  rakefile_path = File.join(dest_dir,"Rakefile")
  File.new(rakefile_path(dest_dir),"w")
  update_rakefile(dest_dir)
end
create_scores_dir_if_needed(dest_dir, scores_dir = Project::SCORES_DIR) click to toggle source
# File lib/musicality/project/project.rb, line 76
def self.create_scores_dir_if_needed(dest_dir, scores_dir = Project::SCORES_DIR)
  scores_dir = File.join(dest_dir, scores_dir)
  if Dir.exists? scores_dir
    puts "Scores directory already exists"
  else
    puts "Creating scores directory #{scores_dir}"
    Dir.mkdir(scores_dir)
    unless Dir.exists?(scores_dir)
      raise "directory #{scores_dir} could not be created"
    end
  end
end
create_tasks(config) click to toggle source
# File lib/musicality/project/create_tasks.rb, line 4
def self.create_tasks config
  score_files = Rake::FileList[File.join(SCORES_DIR,"*"+SCORE_EXT)]

  yaml_task = Tasks::FileRaker::YAML.new(score_files)

  tempo_sample_rate = config[:tempo_sample_rate]
  lilypond_task = Tasks::FileRaker::LilyPond.new(yaml_task.files)
  midi_task = Tasks::FileRaker::MIDI.new(yaml_task.files, tempo_sample_rate)
  supercollider_task = Tasks::FileRaker::SuperCollider.new(yaml_task.files, tempo_sample_rate)

  sample_rate, sample_format = config[:audio_sample_rate], config[:audio_sample_format]
  wav_task = Tasks::FileRaker::Audio.new(supercollider_task.files, :wav, sample_rate, sample_format)
  aiff_task = Tasks::FileRaker::Audio.new(supercollider_task.files, :aiff, sample_rate, sample_format)
  flac_task = Tasks::FileRaker::Audio.new(supercollider_task.files, :flac, sample_rate, sample_format)

  pdf_task = Tasks::FileRaker::Visual.new(lilypond_task.files, :pdf)
  png_task = Tasks::FileRaker::Visual.new(lilypond_task.files, :png)
  ps_task = Tasks::FileRaker::Visual.new(lilypond_task.files, :ps)

  auditions_default_task = Tasks::Auditions.new yaml_task.files
  auditions_flac_task = Tasks::Auditions.new yaml_task.files, "flac"
  auditions_wav_task = Tasks::Auditions.new yaml_task.files, "wav"
  auditions_aiff_task = Tasks::Auditions.new yaml_task.files, "aiff"

  outfiles = (
      yaml_task.files + lilypond_task.files + midi_task.files + supercollider_task.files +
      pdf_task.files + png_task.files + ps_task.files +
      wav_task.files + aiff_task.files + flac_task.files
  ).select {|fname| File.exists? fname }
  outdirs = auditions_default_task.auditions_dirs + yaml_task.subdirs + [Project::OUT_DIR]
  clean_task = Tasks::FileCleaner.new(outfiles, outdirs)
end
gemfile_path(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 56
def self.gemfile_path(dest_dir)
  File.join(dest_dir,"Gemfile")
end
load_config(project_root_dir) click to toggle source
# File lib/musicality/project/project.rb, line 193
def self.load_config project_root_dir
  globabl_config_path = File.join(project_root_dir,CONFIG_FILE_NAME)

  config = if File.exists? globabl_config_path
    global_config = YAML.load(File.read(globabl_config_path))
    DEFAULT_CONFIG.merge global_config
  else
    DEFAULT_CONFIG
  end

  # overrides from ENV
  config.keys.each do |k|
    k_str = k.to_s
    if ENV.has_key? k_str
      case k
      when :tempo_sample_rate, :audio_sample_rate
        config[k] = ENV[k_str].to_i
      else
        config[k] = ENV[k_str]
      end
    end
  end

  check_config config
  return config
end
new(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 20
def initialize dest_dir
  Project.create_project_dir_if_needed(dest_dir)
  Project.create_scores_dir_if_needed(dest_dir)
  Project.update(dest_dir)
end
rakefile_path(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 60
def self.rakefile_path(dest_dir)
  File.join(dest_dir,"Rakefile")
end
update(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 26
def self.update dest_dir
  if File.exists?(gemfile_path(dest_dir))
    puts "Updating Gemfile"
    update_gemfile(dest_dir)
  else
    puts "Creating Gemfile"
    create_gemfile(dest_dir)
  end

  if File.exists?(rakefile_path(dest_dir))
    puts "Updating Rakefile"
    update_rakefile(dest_dir)
  else
    puts "Creating Rakefile"
    create_rakefile(dest_dir)
  end

  if File.exists?(config_path(dest_dir))
    puts "Updating config.yml"
    update_config(dest_dir)
  else
    puts "Creating config.yml"
    create_config(dest_dir)
  end
end
update_config(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 226
def self.update_config(dest_dir)
  config = Project.load_config(dest_dir)
  config = Project::DEFAULT_CONFIG.merge(config)
  create_config(dest_dir, config)
end
update_gemfile(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 99
def self.update_gemfile(dest_dir)
  pre_lines = []
  lines = File.readlines(gemfile_path(dest_dir)).map {|l| l.chomp }

  if line = lines.find {|x| x =~ /source/ }
    delete_empty_lines_around lines, line
    pre_lines.push lines.delete(line)
  else
    pre_lines.push("source :rubygems")
  end

  if line = lines.find {|x| x =~ /gem/ && x =~ /musicality/ }
    delete_empty_lines_around lines, line
    lines.delete(line)
  end
  pre_lines.push GEM_MUSICALITY

  File.open(gemfile_path(dest_dir),"w") do |f|
    f.puts pre_lines
    if lines.any?
      f.puts [""] + lines
    end
  end
end
update_rakefile(dest_dir) click to toggle source
# File lib/musicality/project/project.rb, line 134
def self.update_rakefile(dest_dir)
  pre_lines = []
  lines = File.readlines(rakefile_path(dest_dir)).map {|l| l.chomp }

  if line = lines.find {|x| x =~ /^[\s]*require[\s]+[\'\"]musicality[\'\"]/}
    delete_empty_lines_around lines, line
    pre_lines.push lines.delete(line)
  else
    pre_lines.push "require 'musicality'"
  end
  pre_lines.push ""

  USEFUL_MODULES.each do |module_name|
    if line = lines.find {|x| x =~ /^[\s]*include[\s]+#{module_name}/}
      delete_empty_lines_around lines, line
      pre_lines.push lines.delete(line)
    else
      pre_lines.push "include #{module_name}"
    end
  end

  pre_lines.push ""
  if line = lines.find {|x| x =~ /Project\.load_config/ }
    delete_empty_lines_around lines, line
    pre_lines.push lines.delete(line)
  else
    pre_lines.push "config = Project.load_config(File.dirname(__FILE__))"
  end

  if line = lines.find {|x| x =~ /Project\.create_tasks/ }
    delete_empty_lines_around lines, line
    pre_lines.push lines.delete(line)
  else
    pre_lines.push "Project.create_tasks(config)"
  end

  File.open(rakefile_path(dest_dir),"w") do |f|
    f.puts pre_lines
    if lines.any?
      f.puts [""] + lines
    end
  end
end

Private Class Methods

delete_empty_lines_around(lines, line) click to toggle source
# File lib/musicality/project/project.rb, line 234
def self.delete_empty_lines_around lines, line
  # delete lines before
  i = lines.index(line)-1
  while (i >= 0) && lines[i].empty?
    lines.delete_at i
    i -= 1
  end

  # delete lines after
  i = lines.index(line)+1
  while (i < lines.size) && lines[i].empty?
    lines.delete_at i
  end
end