Class: Musicality::Project
- Inherits:
-
Object
- Object
- Musicality::Project
- Defined in:
- lib/musicality/project/project.rb,
lib/musicality/project/create_tasks.rb
Defined Under Namespace
Classes: ConfigError
Constant Summary collapse
- CONFIG_FILE_NAME =
"config.yml"
- SCORES_DIR =
"scores"
- SCORE_EXT =
".score"
- OUT_DIR =
"output"
- SAMPLE_FORMATS =
["int8", "int16", "int24", "int32", "mulaw", "alaw", "float"]
- DEFAULT_CONFIG =
{ :tempo_sample_rate => 200, :audio_sample_rate => 44100, :audio_sample_format => "int16" }
- GEM_MUSICALITY =
"gem 'musicality', '~> #{VERSION}'"
- USEFUL_MODULES =
['Musicality','Pitches','Meters','Keys','Articulations','Dynamics']
Class Method Summary collapse
-
.check_config(config) ⇒ Object
config.yml.
- .config_path(dest_dir) ⇒ Object
- .create_config(dest_dir, config = Project::DEFAULT_CONFIG) ⇒ Object
-
.create_gemfile(dest_dir) ⇒ Object
Gemfile.
- .create_project_dir_if_needed(dest_dir) ⇒ Object
-
.create_rakefile(dest_dir) ⇒ Object
Rakefile.
- .create_scores_dir_if_needed(dest_dir, scores_dir = Project::SCORES_DIR) ⇒ Object
- .create_tasks(config) ⇒ Object
- .gemfile_path(dest_dir) ⇒ Object
- .load_config(project_root_dir) ⇒ Object
- .rakefile_path(dest_dir) ⇒ Object
- .update(dest_dir) ⇒ Object
- .update_config(dest_dir) ⇒ Object
- .update_gemfile(dest_dir) ⇒ Object
- .update_rakefile(dest_dir) ⇒ Object
Instance Method Summary collapse
-
#initialize(dest_dir) ⇒ Project
constructor
A new instance of Project.
Constructor Details
#initialize(dest_dir) ⇒ Project
Returns a new instance of Project.
20 21 22 23 24 |
# 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 |
Class Method Details
.check_config(config) ⇒ Object
config.yml
182 183 184 185 186 187 188 189 190 191 |
# 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) ⇒ Object
52 53 54 |
# 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) ⇒ Object
220 221 222 223 224 |
# 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) ⇒ Object
Gemfile
93 94 95 96 97 |
# 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) ⇒ Object
64 65 66 67 68 69 70 71 72 73 74 |
# 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) ⇒ Object
Rakefile
128 129 130 131 132 |
# 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) ⇒ Object
76 77 78 79 80 81 82 83 84 85 86 87 |
# 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) ⇒ Object
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
# 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) ⇒ Object
56 57 58 |
# 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) ⇒ Object
193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 |
# 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 |
.rakefile_path(dest_dir) ⇒ Object
60 61 62 |
# File 'lib/musicality/project/project.rb', line 60 def self.rakefile_path(dest_dir) File.join(dest_dir,"Rakefile") end |
.update(dest_dir) ⇒ Object
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 |
# 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) ⇒ Object
226 227 228 229 230 |
# 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) ⇒ Object
99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |
# 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) ⇒ Object
134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 |
# 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 |