Audio-Nama
view release on metacpan or search on metacpan
lib/Audio/Nama/Midi.pm view on Meta::CPAN
# ------------- MIDI routines -----------
package Audio::Nama;
use v5.36;
#use Audio::Nama::Log qw(logpkg);
use Carp;
{
my ($pid, $sel);
my @handles = my ($fh_midi_write, $fh_midi_read, $fh_midi_error) = map{ IO::Handle->new() } 1..3;
map{ $_->autoflush(1) } @handles;
sub start_midish_process {
logsub((caller(0))[3]);
my $executable = qx(which midish);
chomp $executable;
$executable or say("Midish not found!"), return;
$pid = open3($fh_midi_write, $fh_midi_read, $fh_midi_error,"$executable -v")
or warn "Midish failed to start!";
$sel = IO::Select->new();
$sel->add($fh_midi_read);
$sel->add($fh_midi_error);
midish_cmd( qq(print "Midish is ready.") );
write_aux_midi_commands();
midish_cmd( q(exec ").$file->aux_midi_commands.q(") );
$pid
}
sub midish_cmd {
my $command = shift;
logsub((caller(0))[3]);
return unless $config->{use_midi};
print $fh_midi_write "$command\n";
#say "applied midish command: $command";
$project->{midi_history} //=[];
push @{ $project->{midi_history} },$command;
my $length = 2**16;
sleeper(0.05);
my @result;
foreach my $h ($sel->can_read)
{
my $buf = '';
if ($h eq $fh_midi_error)
{
sysread($fh_midi_error,$buf,$length);
if($buf){print "MIDISH ERR-> $buf\n"}
}
else
{
sysread($fh_midi_read,$buf,$length);
if($buf){push @result, grep{ !/\+ready/ } split "\n", $buf}
}
}
join "\n", @result;
}
sub close_midish {
save_midish();
say "reaping midish";
kill_and_reap($pid);
}
sub save_midish {
my $fname = $file->midi_store;
midish_cmd( qq<save "$fname">);
}
sub reconfigure_midi {
add_midi_track($config->{midi_record_buffer}, n => 999, hide => 1)
if not $tn{$config->{midi_record_buffer}}
and $this_track->current_midi
and $this_track->rec;
my $midi_rec = $tn{$config->{midi_record_buffer}};
# mute all
my @all = $bn{Midi}->track_o;
$_->mute for @all; # same as setting OFF for MidiTracks
# unmute audible
my @audible = grep{ $_->play } @all;
$_->unmute for @audible;
# unset filters
do { $_->select_track; midish_cmd("fdel ".$_->name) } for @all;
( run in 0.953 second using v1.01-cache-2.11-cpan-302cb4679cc )