The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.

use strict;
use Test;
BEGIN { plan tests => 47 }

use MIDI;
ok 1;

my $out = "temp20.mid";
unlink $out if -e $out;
{
 my @events = (
   ['text_event',0, 'MORE COWBELL'],
   ['set_tempo', 0, 450_000], # 1qn = .45 seconds
 );

 for (1 .. 20) {
   push @events,
     ['note_on' , 90,  9, 56, 127],
     ['note_off',  6,  9, 56, 127],
   ;
 }
 foreach my $delay (reverse(1..96)) {
   push @events,
     ['note_on' ,      0,  9, 56, 127],
     ['note_off', $delay,  9, 56, 127],
   ;
 }

 my $cowbell_track = MIDI::Track->new({ 'events' => \@events });
 ok 1;
 my $opus = MIDI::Opus->new(
  { 'format' => 0, 'ticks' => 96, 'tracks' => [ $cowbell_track ] } );
 ok 1;
 $opus->write_to_file( $out );
 ok 1;
}
sleep 1; # festina lente
ok -e $out or die;
ok -s $out;
ok -s $out >  900;
ok -s $out < 1100;

my $o = MIDI::Opus->new( { 'from_file' => $out } );
ok 1;
print "# Opus: [$o]\n";
ok ref($o), "MIDI::Opus", "checking opus classitude"; # sanity
ok $o->ticks, 96;
$o->ticks(123);
ok $o->ticks, 123;
ok $o->format, 0;
$o->format(1);
ok $o->format, 1;

my @t = $o->tracks;
print "# Tracks: [@t]\n";
ok scalar(@t), 1, "checking track count"  or die;

my $t = $t[0];
ok ref($t), "MIDI::Track";
ok $t->type, "MTrk";


ok defined( $o->tracks_r );
ok ref( $o->tracks_r ), 'ARRAY' or die;
ok scalar( @{ $o->tracks_r } ), 1;
ok $o->tracks_r->[0], $t; 

ok defined($t->events_r);
ok ref($t->events_r), "ARRAY" or die;
ok scalar(@{ $t->events_r } ), 234;
my @e = $t->events;
ok $e[0], $t->events_r->[0]; # tests coreference

print "# First event: [@{$e[0]}]\n";

ok ref($e[0]), "ARRAY" or die;
ok scalar( @{ $e[0] } ), 3 or die;
ok $e[0][0], "text_event";
ok $e[0][1], "0";
ok $e[0][2], "MORE COWBELL";

print "# Second event: [@{$e[1]}]\n";

ok scalar( @{ $e[1] } ), 3 or die;
ok $e[1][0], "set_tempo";
ok $e[1][1], "0";
ok $e[1][2], "450000";

print "# Third event: [@{$e[2]}]\n";

ok scalar( @{ $e[2] } ), 5 or die;
ok $e[2][0], "note_on";
ok $e[2][1], "90";
ok $e[2][2], "9";
ok $e[2][3], "56";
ok $e[2][4], "127";


print "# Fourth event: [@{$e[3]}]\n";
ok $e[3][0], "note_off";
ok $e[3][1], "6";
ok $e[3][2], "9";
ok $e[3][3], "56";
ok $e[3][4], "127";

$t->type("Muck");
ok $t->type, "Muck";

unlink $out;
print "# Okay, all done!\n";
ok 1;