#!/usr/bin/env ruby 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) %Q{ a lv2:InputPort , lv2:ControlPort ; lv2:index #{n} ; lv2:symbol "#{param_sym(n)}" ; lv2:name "Parameter #{param_sym(n)}" ; lv2:default 0.5 ; lv2:minimum 0.0 ; lv2:maximum 1.0 ;} end def make_lv2_port_defs(num) ctrlports = (0 ... num) .map { |n| make_ctrl_port(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 n_ctrl_ports = ARGV[1] || '1' target_dir = File.join(root, 'src', plugin_name) template_dir = File.join(root, 'Template') PLUGIN_FIELDS = %w{Type Use Description Comment} def find_plugin_info(db, plugin_name) pi = { name: plugin_name } found = false File.open(db) do |f| pat = /^\s*(\w+): \"([^"]+)\",/ f.each_line do |line| if found && line =~ /^\s*\},$/ return pi end pat.match(line) do |m| if m[1] == 'Name' && m[2] == plugin_name found = true elsif found && PLUGIN_FIELDS.include?(m[1]) pi[m[1].downcase.to_sym] = m[2] end end end end return pi end def get_lv2_plugin_type(plugin_info) case plugin_info[:type] when 'Saturation' 'DistortionPlugin' else 'EffectsPlugin' end end puts "Reading plugin info from cheatsheet..." plugin_info = find_plugin_info(File.join(root, '../../cheatsheet/src/database.js'), plugin_name) puts "Creating plugin #{plugin_name}..." puts "Type: #{plugin_info[:type]}" 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@', plugin_name) .gsub('@plugin@', plugin_slug) .gsub('@NCtrlPorts@', n_ctrl_ports) .gsub('@AssignParams@', make_param_assigns(n_ctrl_ports.to_i)) .gsub('@TTLPortDefs@', make_lv2_port_defs(n_ctrl_ports.to_i)) .gsub('@TTLPluginType@', get_lv2_plugin_type(plugin_info)) fname = t.sub('Plugin', plugin_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