#!/usr/bin/env perl
use strict;
use warnings;

use Data::Dumper::Compact 'ddc';
use lib map { "$ENV{HOME}/sandbox/$_/lib" } qw(MIDI-Util);
use MIDI::Util;
use Music::MelodicDevice::Ornamentation;

my $score = MIDI::Util::setup_score(patch => 68);

my $md = Music::MelodicDevice::Ornamentation->new(
    scale_note => 'D',
    scale_name => 'minor',
#    verbose => 1,
);

my $motif = [(('qn') x 12), qw(dqn en hn)];
my $notes = [qw(E4 E4 F4 G4  G4 F4 E4 D4  C4 C4 D4 E4  E4 D4 D4)];

for my $n (0 .. $#$motif) {
    $score->n($motif->[$n], $notes->[$n]);
}

$notes = [qw(E4 E4 F4 G4  G4 F4 E4 D4  C4 C4 D4 E4  D4 C4 C4)];

for my $n (0 .. $#$motif) {
    my @note = ($motif->[$n], $notes->[$n]);
    my $spec;

    if ($n == 0) {
        $spec = $md->grace_note(@note, -1);
    }
    elsif ($n == 2) {
        $spec = $md->mordent(@note, 1);
    }
    elsif ($n == 6) {
        $spec = $md->trill(@note, 2, 1);
    }
    elsif ($n == 10) {
        $spec = $md->turn(@note, 1);
    }

    if ($spec) {
        $spec = [ map { [ MIDI::Util::midi_format(@$_) ] } @$spec ];
        $score->n(@$_) for @$spec;
    }
    else {
        @note = MIDI::Util::midi_format(@note);
        $score->n(@note);
    }
}

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