NAME
Synth::Config - Synthesizer settings librarian
VERSION
version 0.0063
SYNOPSIS
use Synth::Config ();
my $model = 'Modular';
my $synth = Synth::Config->new(model => $model, verbose => 1);
# populate the database with patch settings
my $patches = $synth->import_patches(
file => "$model.yaml", # or string => '...' # one or the other is required
patches => ['Simple 001', 'Simple 002'], # optional
);
# populate the database with individual settings
my $patch = 'My favorite setting';
my $id1 = $synth->make_setting(name => $patch, group => 'filter', etc => '...');
my $id2 = $synth->make_setting(name => $patch, group => 'sequencer', etc => '...');
# update the group key
$synth->make_setting(id => $id1, group => 'envelope');
my $settings = $synth->recall_settings;
# [ { id => 1, group => 'envelope', etc => '...' }, { id => 2, group => 'sequencer', etc => '...' } ]
$settings = $synth->search_settings(name => $patch);
# [ { id => 1, group => 'envelope', etc => '...' }, { id => 2, group => 'sequencer', etc => '...' } ]
$settings = $synth->search_settings(group => 'sequencer');
# [ { id => 2, group => 'sequencer', etc => '...' } ]
my $setting = $synth->recall_setting(id => $id1);
# { id => 1, group => 'envelope', etc => '...' }
my $g = $synth->graphviz(settings => $setting);
# or
$synth->graphviz(
settings => $setting,
render => 1,
);
my $models = $synth->recall_models;
# [ 'moog_matriarch' ]
my $setting_names = $synth->recall_setting_names;
# [ 'My favorite setting' ]
# populate the database with the model specification
my $specs = $synth->import_specs(
file => "$model.yaml",
# or string => '...' # one or the other is required
);
# declare the possible setting specifications
my %spec = (
order => [qw(group parameter control group_to param_to bottom top value unit is_default)],
group => [],
parameter => {},
control => [qw(knob switch slider patch)],
group_to => [],
param_to => [],
bottom => [qw(off 0 1 7AM 20)],
top => [qw(on 3 4 6 7 5PM 20_000 100%)],
value => [],
unit => [qw(Hz o'clock)],
is_default => [0, 1],
);
my $spec_id = $synth->make_spec(%spec);
my $spec = $synth->recall_spec(id => $spec_id);
$specs = $synth->recall_specs;
# { order => [ ... ], etc => ... }
# remove stuff!
$synth->remove_spec; # remove the current model specification
$synth->remove_setting(id => $id1); # remove a particular setting
$synth->remove_settings(name => $patch); # remove all settings sharing the same name
$synth->remove_model(model => $model); # remove the entire model
DESCRIPTION
Synth::Config
provides a way to import, save, recall, and visualize synthesizer control settings in a database, and with GraphViz2.
This does not control the synth. It is simply a way to manually record the parameters defined by knob, slider, switch, or patch settings in an SQLite database. It is a "librarian", if you will.
ATTRIBUTES
model
$model = $synth->model;
The model name of the synthesizer.
This is turned into lowercase and all non-alpha-num characters are converted to an underline character (_
).
dbname
$dbname = $synth->dbname;
Database name
Default: synth-config.db
verbose
$verbose = $synth->verbose;
Show progress.
METHODS
new
$synth = Synth::Config->new(model => $model);
Create a new Synth::Config
object.
This automatically makes an SQLite database with a table named for the given model.
make_setting
my $id = $synth->make_setting(%args);
Save a named setting and return the record id.
The name is required to perform an insert. If an id is given, an update is performed.
The setting is a single JSON field that can contain any key/value pairs. These pairs must include at least a group
to be searchable.
Example:
name: 'My Best Setting!'
settings:
group parameter control bottom top value unit is_default
filters cutoff knob 20 20000 200 Hz 1
name: 'My Other Best Setting!'
settings:
group parameter control group_to param_to is_default
mixer output patch filters vcf-in 0
recall_setting
my $setting = $synth->recall_setting(id => $id);
Return the parameters of a setting for the given id.
search_settings
my $settings = $synth->search_settings(
some_setting => $val1,
another_setting => $val2,
);
Return all the settings given a search query.
recall_settings
my $settings = $synth->recall_settings;
Return all the settings for the synth model.
recall_models
my $models = $synth->recall_models;
Return all the know models. This method can be called without having specified a synth model in the constructor.
recall_setting_names
my $setting_names = $synth->recall_setting_names;
Return all the setting names for the current model.
remove_setting
$synth->remove_setting(id => $id);
Remove a setting given an id.
remove_settings
$synth->remove_settings; # all model settings
$synth->remove_settings(name => $name);
Remove all settings of the current model, or for given named setting.
remove_model
$synth->remove_model;
Remove the database table for the current object model.
make_spec
my $id = $synth->make_spec(%args);
Save a model specification and return the record id.
If an id is given, an update is performed.
The spec is a single JSON field that can contain any key/value pairs that define the configuration - groups, parameters, values, etc. of a model.
recall_specs
my $specs = $synth->recall_specs;
Return the specs for the model.
recall_spec
my $spec = $synth->recall_spec(id => $id);
Return the model configuration specification for the given id.
remove_spec
$synth->remove_spec;
Remove the database table for the current object model configuration specification.
import_specs
Add the specifications defined in a YAML file or string, to the database and return the spec name.
Option defaults:
file = undef
string = undef
import_patches
Add the settings defined in a YAML file or string, to the database and return the setting (patch) name.
A specific subset of patches can be imported, by providing their names in the options.
YAML format:
model: "Model name"
patches:
- patch: "Setting name"
settings:
- group: "Group name"
parameters:
- param: "Patch parameter name"
control: 'patch'
group_to: "Connect to group"
param_to: "Connected group parameter"
- param: "Control parameter name"
control: "Named physical control"
value: "Parameter value"
unit: "Parameter unit of measure"
- patch: "Another parameter name"
...
Please see the "SEE ALSO" section for examples of configuration files.
Option defaults:
file = undef
string = undef
patches = undef
graphviz
$g = $synth->graphviz(%options);
Visualize a patch of settings with the GraphViz2 module.
Option defaults:
settings = undef (required)
render = 0
path = .
extension = png
shape = oval
color = grey
model => 'Modular',
patches => [
{
patch => 'Simple 000',
settings => [
{
group => 'oscillator',
parameters => [
{ control => 'patch', group_to => 'mixer', param => 'out', param_to => 'in' },
{ control => 'knob', param => 'range', unit => "'", value => 8 },
{ control => 'switch', param => 'waveform', unit => '', value => 'square' },
],
}, {
group => 'mixer',
parameters => [ { control => 'patch', group_to => 'audio', param => 'stereo-out', param_to => 'stereo-in' } ],
},
],
}
SEE ALSO
The t/01-methods.t and the eg/*.pl files in this distribution
AUTHOR
Gene Boggs <gene@cpan.org>
COPYRIGHT AND LICENSE
This software is Copyright (c) 2023-2024 by Gene Boggs.
This is free software, licensed under:
The Artistic License 2.0 (GPL Compatible)