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