The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl
use strict;
use warnings;

use MIDI::Simple::Drummer::Rock;

my $d = MIDI::Simple::Drummer::Rock->new(
    -bpm    => shift || 96,
    -volume => shift || 100,
    -file   => "$0.mid",
);

# Common beat() arguments.
my %args = (
    -fill => 1,
);

# Set our custom patterns.
$d->patterns('1 fill' => \&fill_one);
$d->patterns('2 fill' => \&fill_two);
$d->patterns('3 fill' => \&fill_three);
$d->patterns('4 fill' => \&fill_four);
$d->patterns('3.1'    => \&beat_three_one);
$d->patterns('3.2'    => \&beat_three_two);
$d->patterns('3.3'    => \&beat_three_three);
$d->patterns('3.4'    => \&beat_three_four);

# Intro
$d->count_in(2, 'Pedal Hi-Hat');
$d->beat(-name => 2.1, %args);
$d->beat(-name => 2.1) for 0 .. 1;
$d->fill(-name => 1);
$d->beat(-name => 2.1, %args);
$d->beat(-name => 2.1) for 0 .. 1;
$d->fill(-name => 2);

# Verse
for (0 .. 1) {
    $d->beat(-name => 2.1, %args);
    $d->beat(-name => 2.1) for 0 .. 1;
    $d->fill(-name => 1);
    $d->beat(-name => 2.1, %args);
    $d->beat(-name => 2.1) for 0 .. 1;
    $d->fill(-name => 3);

    # Chorus
    $d->beat(-name => 2.1, %args) for 0 .. 5;
    $d->beat(-name => 2.2, %args);
    $d->fill(-name => 4);
}

# Solo
for (0 .. 2) {
    $d->beat(-name => 2.1, %args);
    $d->beat(-name => 2.1);
    $d->beat(-name => 2.1, %args);
    $d->beat(-name => 3.1);
}
$d->beat(-name => 2.1, %args);
$d->beat(-name => 3.2);
$d->beat(-name => 3.3);
$d->beat(-name => 3.4);

# Chorus
# Bridge
# Chorus
# Solo 2

$d->write;

sub fill_one {
    my $d = shift;

    $d->note($d->EIGHTH, $d->kick, $d->tick);
    $d->note($d->EIGHTH, $d->tick);

    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);

    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));

    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->EIGHTH, $d->snare);
}
sub fill_two {
    my $d = shift;

    $d->note($d->EIGHTH, $d->kick, $d->tick);
    $d->note($d->EIGHTH, $d->tick);

    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);

    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
}
sub fill_three {
    my $d = shift;
    $d->note($d->EIGHTH, $d->kick, $d->tick);
    $d->note($d->EIGHTH, $d->tick);

    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);

    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->kick, $d->strike('Open Hi-Hat'));

    $d->note($d->SIXTEENTH, $d->strike('Pedal Hi-Hat'));
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->snare);
    $d->note($d->SIXTEENTH, $d->snare);
}
sub fill_four {
    my $d = shift;

    $d->note($d->DOTTED_EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->DOTTED_EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->DOTTED_QUARTER, $d->kick, $d->strike('Crash Cymbal 1'));

    $d->note($d->THIRTYSECOND, $d->snare);
    $d->note($d->QUARTER, $d->snare);
}

sub beat_three_one {
    my $d = shift;

    $d->note($d->EIGHTH, $d->kick, $d->tick);
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->strike('Splash Cymbal'));

    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->strike('Splash Cymbal'));
}

sub beat_three_two {
    my $d = shift;

    $d->note($d->EIGHTH, $d->kick, $d->tick);
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->tick);
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->tick);
}

sub beat_three_three {
    my $d = shift;

    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->tick);

    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->tick);
}

sub beat_three_four {
    my $d = shift;

    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->EIGHTH, $d->tick);
    $d->note($d->EIGHTH, $d->snare, $d->tick);
    $d->note($d->EIGHTH, $d->kick, $d->tick);

    $d->note($d->DOTTED_EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->DOTTED_EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
    $d->note($d->EIGHTH, $d->kick, $d->strike('Crash Cymbal 1'));
}