Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/Grammar.pm view on Meta::CPAN
} keys %{$text->{commands}};
$Audio::Nama::AUTOSTUB = 1;
$Audio::Nama::RD_TRACE = 1;
$Audio::Nama::RD_ERRORS = 1; # Make sure the parser dies when it encounters an error
$Audio::Nama::RD_WARN = 1; # Enable warnings. This will warn on unused rules &c.
$Audio::Nama::RD_HINT = 1; # Give out hints to help fix problems.
$text->{grammar} = get_data_section('grammar');
$text->{parser} = Parse::RecDescent->new($text->{grammar}) or croak "Bad grammar!\n";
# Midish command keywords
# prepend 'm' to all midish commands
# suppress midi record, play, stop commands - Nama will handle them
# also suppress ct tnew tdel tren
my %skip = map{$_, 1} qw(r p s ct tnew tdel tren);
$text->{midi_cmd} =
{
map{ 'm'.$_, 1} grep{ !$skip{$_} } split " ", get_data_section("midi_commands")
};
for (keys %{$text->{midi_cmd}}){
say "$_: midi command same as Nama command" if $text->{commands}->{$_}
}
}
sub process_line {
state $total_effects_count;
logsub((caller(0))[3]);
no warnings 'uninitialized';
my ($user_input) = @_;
logpkg(__FILE__,__LINE__,'debug',"user input: $user_input");
if (defined $user_input and $user_input !~ /^\s*$/) {
push $text->{command_history}->@*, $user_input;
$text->{command_index} = scalar $text->{command_history}->@*;
# convert hyphenated commands to underscore form
while( my($from, $to) = each %{$text->{hyphenated_commands}} ){ $user_input =~ s/$from/$to/g }
my $context = context();
my $success = nama_cmd( $user_input );
my $command_stamp = { context => $context,
command => $user_input };
push(@{$project->{command_buffer}}, $command_stamp);
reconfigure_engine();
# reset current track to Main if it is
# undefined, or the track has been removed
# from the index
$this_track = $tn{Main} if ! $this_track or
(ref $this_track and ! $tn{$this_track->name});
}
if (! $this_engine->started() ){
my $result = check_fx_consistency();
pagers("Inconsistency found in effects data",
Dumper ($result)) if $result->{is_error};
}
my $output = delete $text->{output_buffer};
revise_prompt();
}
sub context {
return unless $this_track;
my $context = {};
$context->{track} = $this_track->name;
$context->{bus} = $this_bus;
$context->{op} = $this_track->op;
$context
}
sub nama_cmd {
my $input_was = my $input = shift;
# parse repeatedly until all input is consumed
# return true on complete success
# return false if any part of command fails
my $was_error = 0;
try {
while (do { no warnings 'uninitialized'; $input =~ /\S/ }) {
logpkg(__FILE__,__LINE__,'debug',"input: $input");
$text->{parser}->meta(\$input) or do
{
throw("bad command: $input_was\n");
$was_error++;
system($config->{beep_command}) if $config->{beep_command};
last;
};
}
}
catch { $was_error++; warn "caught error: $_" };
$ui->refresh; # in case we have a graphic environment
set_current_bus();
# select chain operator if appropriate
# and there is a current track
$this_engine->valid_setup() or return;
if ($this_track){
my $FX = fxn($this_track->op);
if ($FX and $this_track->n eq $FX->chain){
$this_engine->current_chain($this_track->n);
$FX->is_controller
? $this_engine->current_controller($FX->ecasound_controller_index)
: $this_engine->current_chain_operator($FX->ecasound_effect_index);
}
}
! $was_error
}
sub do_user_command {
my($cmd, @args) = @_;
$text->{user_command}->{$cmd}->(@args);
}
sub do_script {
my $name = shift;
my $script;
( run in 1.826 second using v1.01-cache-2.11-cpan-0b5f733616e )