#!/usr/bin/env ruby require_relative 'lib/makeplugin/plugin_info' def param_sym(n) ('A'.ord + n).chr end def make_param_assigns(num) (0 ... num) .map { |n| "#{param_sym(n)} = *param[#{n}];" } .join("\n ") end def make_ctrl_port(n, name) %Q{ a lv2:InputPort , lv2:ControlPort ; lv2:index #{n} ; lv2:symbol "#{param_sym(n)}" ; lv2:name "#{name}" ; lv2:default 0.5 ; lv2:minimum 0.0 ; lv2:maximum 1.0 ;} end def make_lv2_port_defs(pi) num = pi.n_ctrl_ports ctrlports = (0 ... num) .map { |n| make_ctrl_port(n, pi.ctrl_ports[n]) } .join("\n ] , [\n") ctrlports + %Q{ ] , [ a lv2:InputPort , lv2:AudioPort ; lv2:index #{num} ; lv2:symbol "in_l" ; lv2:name "In left" ; ] , [ a lv2:InputPort , lv2:AudioPort ; lv2:index #{num + 1} ; lv2:symbol "in_r" ; lv2:name "In right" ; ] , [ a lv2:OutputPort , lv2:AudioPort ; lv2:index #{num + 2} ; lv2:symbol "out_l" ; lv2:name "Out left" ; ] , [ a lv2:OutputPort , lv2:AudioPort ; lv2:index #{num + 3} ; lv2:symbol "out_r" ; lv2:name "Out right" ;} end if ARGV.length < 1 puts "Usage: #{__FILE__} " exit end root = File.dirname(__FILE__) plugin_name = ARGV[0] plugin_slug = plugin_name.downcase target_dir = File.join(root, 'src', plugin_name) template_dir = File.join(root, 'Template') def get_lv2_plugin_type(plugin_info) case plugin_info.type when 'Saturation' 'DistortionPlugin' when 'EQ' 'EQPlugin' else 'EffectsPlugin' end end puts "Reading plugin info from cheatsheet..." pi = MakePlugin::PluginInfo.new(root, plugin_name) puts "Creating plugin #{pi.name}..." puts "Type: #{pi.type}" puts "CTRL ports: #{pi.ctrl_ports.length}" Templates = %w{ manifest.ttl.in Plugin.ttl Plugin.h Plugin.cpp } begin Dir.mkdir(target_dir) Templates.each do |t| tpl = IO.read(File.join(template_dir, t)) .gsub('@Plugin@', pi.name) .gsub('@plugin@', plugin_slug) .gsub('@NCtrlPorts@', pi.n_ctrl_ports.to_s) .gsub('@AssignParams@', make_param_assigns(pi.n_ctrl_ports)) .gsub('@TTLPortDefs@', make_lv2_port_defs(pi)) .gsub('@TTLPluginType@', get_lv2_plugin_type(pi)) fname = t.sub('Plugin', pi.name) puts " - #{fname}..." File.open(File.join(target_dir, fname), "w") do |f| f.write(tpl) end end rescue SystemCallError => e puts "Could not create plugin: #{e}" puts "Aborting!" end