#!/usr/bin/env perl

# Example: perl eg/cadence 16 A minor 4 110 '2 7'

use strict;
use warnings;

use lib '/Users/gene/sandbox/MIDI-Util/lib';
use MIDI::Util; # https://metacpan.org/release/MIDI-Util
use lib '/Users/gene/sandbox/Music-Cadence/lib';
use Music::Cadence; # https://metacpan.org/release/Music-Cadence
use Music::Scales;

my $max    = shift || 16;
my $note   = shift || 'C';
my $type   = shift || 'major';
my $octave = shift // 4;
my $bpm    = shift || 100;
my $leads  = shift || '1 2 4 7';

my $half    = 'hn';
my $quarter = 'qn';

my @scale = get_scale_notes( $note, $type );
for ( @scale ) {
    s/#/s/;
    s/b/f/;
}

my @leaders = split /\s+/, $leads;

my $score = MIDI::Util::setup_score( bpm => $bpm );
 
my $mc = Music::Cadence->new(
    key    => $note,
    scale  => $type,
    octave => $octave,
);

for my $i ( 1 .. $max ) {
    my @notes = map { $scale[ int rand @scale ] } 1 .. 3;
    $score->n( $quarter, @notes );

    if ( $i % 4 == 0 ) {
        my $chords = $mc->cadence(
            type    => 'half',
            leading => $leaders[ int rand @leaders ],
        );
        $score->n( $half, @$_ ) for @$chords;
    }
}

my $chords = $mc->cadence( type => 'deceptive' );
$score->n( $half, @$_ ) for @$chords;

$chords = $mc->cadence( type => 'plagal' );
$score->n( $half, @$_ ) for @$chords;

$score->write_score("$0.mid");
