The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!perl
#
# modal_map proved tricky enough to need a bad sequel (or was never really
# fully thought through wrt transpose).

use strict;
use warnings;

use Test::More;    # plan is down at bottom

eval 'use Test::Differences';    # display convenience
my $deeply = $@ ? \&is_deeply : \&eq_or_diff;

BEGIN { use_ok('Music::Canon') }
my $mc = Music::Canon->new;

# some more scale tests + transpose
$mc = Music::Canon->new( contrary => 0, retrograde => 0 );
$mc->set_transpose(4);
$deeply->(
  [ $mc->modal_map( 60, 59, 57, 55, 53, 52, 50, 48 ) ],
  [ 64, 62, 60, 59, 57, 55, 53, 52 ],
  'Major I->iii'
);

$mc = Music::Canon->new( contrary => 0, retrograde => 0 );
# Middle c (60) -> g (55) in g-minor, transpose from scale degree 1 (g)
# to 3 (bes)
# $mc->set_modal_pitches( 55, 58 );
$mc->set_modal_scale_in('aeolian');
$mc->set_modal_scale_out('aeolian');
$mc->set_transpose('bes');
# 'got' pattern not possible using scale intervals? something cut?
$deeply->(
  [ $mc->modal_map( 55, 53, 51, 50, 48, 46, 45, 43 ) ],
  [ 58, 57, 55, 53, 51, 50, 48, 46 ],
  'minor i->III'
);

# Bug in v1.00 revealed by trying to do things in Bflat Major... or really how
# transpose should be defined when the tonic is a non-(n%12==0) pitch.
$mc = Music::Canon->new( contrary => 0, retrograde => 0 );
$mc->set_modal_pitches( 70, 70 );
$mc->set_transpose(2); # Bes to C
$deeply->(
  [ $mc->modal_map( qw/74 70 69 70 74 75 72 71 72 76 77/ ) ],
  [                 qw/75 72 70 72 75 77 74 73 74 78 79/ ],
  'bit of a subject'
);

$mc = Music::Canon->new;
$mc->modal_hook( sub { "testy" } );
$deeply->(
  [ $mc->modal_map( 0, 1 ) ],
  [ 'testy', 0 ],
  "major chromatic conversion 0 to 1 with hook"
);

# TODO need to work out handling of transpose to chromatic or unpossible scale
# degrees.

plan tests => 5;