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 )