File Coverage

blib/lib/MIDI/Drummer/Tiny/Grooves.pm
Criterion Covered Total %
statement 32 138 23.1
branch 9 16 56.2
condition 1 3 33.3
subroutine 7 104 6.7
pod 3 3 100.0
total 52 264 19.7


line stmt bran cond sub pod time code
1             package MIDI::Drummer::Tiny::Grooves;
2             $MIDI::Drummer::Tiny::Grooves::VERSION = '0.7003';
3             our $AUTHORITY = 'cpan:GENE';
4              
5 2     2   494781 use Moo;
  2         13476  
  2         8  
6 2     2   3259 use strictures 2;
  2         2741  
  2         61  
7 2     2   1737 use MIDI::Drummer::Tiny ();
  2         8  
  2         81  
8 2     2   19 use namespace::clean;
  2         3  
  2         18  
9              
10             #pod =head1 SYNOPSIS
11             #pod
12             #pod use MIDI::Drummer::Tiny ();
13             #pod use MIDI::Drummer::Tiny::Grooves ();
14             #pod # TODO use MIDI::Drummer::Tiny::Grooves qw(:house :rock);
15             #pod
16             #pod my $drummer = MIDI::Drummer::Tiny->new(
17             #pod file => "grooves.mid",
18             #pod kick => 36,
19             #pod );
20             #pod
21             #pod my $grooves = MIDI::Drummer::Tiny::Grooves->new(
22             #pod drummer => $drummer,
23             #pod );
24             #pod
25             #pod my $all = $grooves->all_grooves;
26             #pod
27             #pod my $groove = $grooves->get_groove; # random groove
28             #pod $groove = $grooves->get_groove(42); # numbered groove
29             #pod say $groove->{cat};
30             #pod say $groove->{name};
31             #pod $groove->{groove}->() for 1 .. 4; # add to score
32             #pod
33             #pod my $set = $grooves->search({}, { cat => 'house' });
34             #pod $set = $grooves->search($set, { name => 'deep' });
35             #pod my @nums = keys %$set;
36             #pod for (1 .. 4) {
37             #pod $groove = $set->{ $nums[ rand @nums ] };
38             #pod say $groove->{cat};
39             #pod say $groove->{name};
40             #pod $groove->{groove}->();
41             #pod }
42             #pod
43             #pod $grooves->drummer->write;
44             #pod # then:
45             #pod # > timidity grooves.mid
46             #pod
47             #pod =head1 DESCRIPTION
48             #pod
49             #pod Return the common grooves, as listed in the "Pocket Operations", that
50             #pod are L.
51             #pod
52             #pod A groove is a numbered and named hash reference, with the following
53             #pod structure:
54             #pod
55             #pod { 1 => {
56             #pod cat => "Basic Patterns",
57             #pod name => "ONE AND SEVEN & FIVE AND THIRTEEN",
58             #pod groove => sub {
59             #pod $self->_groove(
60             #pod $self->kick => ['1000001000000000'],
61             #pod $self->snare => ['0000100000001000'],
62             #pod ),
63             #pod },
64             #pod },
65             #pod 2 => { ... }, ... }
66             #pod
67             #pod =cut
68              
69             #pod =head1 ACCESSORS
70             #pod
71             #pod =head2 drummer
72             #pod
73             #pod $drummer = $grooves->drummer;
74             #pod $grooves->drummer($drummer);
75             #pod
76             #pod The L object. If not given in the constructor, a
77             #pod new one is created when a method is called.
78             #pod
79             #pod =cut
80              
81             has drummer => (
82             is => 'rw',
83             isa => sub { die "Invalid drummer object" unless ref($_[0]) eq 'MIDI::Drummer::Tiny' },
84             default => sub { MIDI::Drummer::Tiny->new },
85             );
86              
87             #pod =head2 duration
88             #pod
89             #pod $duration = $grooves->duration;
90             #pod $grooves->duration($duration);
91             #pod
92             #pod The "resolution" duration that is given to the
93             #pod L method.
94             #pod
95             #pod This is initialized to the sixteenth duration of the drummer
96             #pod L object.
97             #pod
98             #pod =cut
99              
100             has duration => (
101             is => 'lazy',
102             );
103 0     0   0 sub _build_duration { shift->drummer->sixteenth }
104              
105             #pod =head2 kick, rimshot, snare, clap, cowbell, shaker, closed, open, cymbal, hi_tom, mid_tom, low_tom
106             #pod
107             #pod $kick = $grooves->kick;
108             #pod $grooves->kick(36);
109             #pod
110             #pod The drum patches that are used by the grooves.
111             #pod
112             #pod Each is initialized to a corresponding patch of the drummer
113             #pod L object that is given to, or created by the
114             #pod constructor. (So changing these can be done in either the
115             #pod L object, or in the C constructor.)
116             #pod
117             #pod =cut
118              
119             #pod =head2 return_patterns
120             #pod
121             #pod $return_patterns = $grooves->return_patterns;
122             #pod
123             #pod Either return the raw patterns of 16 beats or C'ed B
124             #pod object phrases.
125             #pod
126             #pod Default: C<0>
127             #pod
128             #pod =cut
129              
130             has return_patterns => (
131             is => 'rw',
132             isa => sub { die "Not a Boolean" unless $_[0] =~ /^[01]$/ },
133             default => sub { 0 },
134             );
135              
136             for my $patch (qw(
137             kick
138             rimshot
139             snare
140             clap
141             cowbell
142             shaker
143             closed
144             open
145             cymbal
146             hi_tom
147             mid_tom
148             low_tom
149             )) {
150             has $patch => (
151             is => 'lazy',
152             builder => '_build_' . $patch,
153             );
154             }
155 0     0   0 sub _build_kick { shift->drummer->kick }
156 0     0   0 sub _build_rimshot { shift->drummer->side_stick }
157 0     0   0 sub _build_snare { shift->drummer->snare }
158 0     0   0 sub _build_clap { shift->drummer->clap }
159 0     0   0 sub _build_cowbell { shift->drummer->cowbell }
160 0     0   0 sub _build_shaker { shift->drummer->maracas }
161 0     0   0 sub _build_closed { shift->drummer->closed_hh }
162 0     0   0 sub _build_open { shift->drummer->open_hh }
163 0     0   0 sub _build_cymbal { shift->drummer->crash1 }
164 0     0   0 sub _build_hi_tom { shift->drummer->hi_mid_tom }
165 0     0   0 sub _build_mid_tom { shift->drummer->low_mid_tom }
166 0     0   0 sub _build_low_tom { shift->drummer->low_tom }
167              
168             #pod =head1 METHODS
169             #pod
170             #pod =head2 new
171             #pod
172             #pod $grooves = MIDI::Drummer::Tiny::Grooves->new;
173             #pod $grooves = MIDI::Drummer::Tiny::Grooves->new(drummer => $drummer);
174             #pod
175             #pod Return a new C object.
176             #pod
177             #pod =head2 get_groove
178             #pod
179             #pod $groove = $grooves->get_groove($groove_number);
180             #pod $groove = $grooves->get_groove; # random groove
181             #pod $groove = $grooves->get_groove(0, $set); # random groove of set
182             #pod $groove = $grooves->get_groove($groove_number, $set); # numbered groove of set
183             #pod
184             #pod Return a numbered or random groove from either the given B or
185             #pod all known grooves.
186             #pod
187             #pod =cut
188              
189             sub get_groove {
190 0     0 1 0 my ($self, $groove_number, $set) = @_;
191 0 0       0 unless (keys %$set) {
192 0         0 $set = $self->all_grooves;
193             }
194 0 0       0 unless ($groove_number) {
195 0         0 my @keys = keys %$set;
196 0         0 $groove_number = $keys[ int rand @keys ];
197             }
198 0         0 return $set->{$groove_number};
199             }
200              
201             #pod =head2 all_grooves
202             #pod
203             #pod $all = $grooves->all_grooves;
204             #pod
205             #pod Return all the known grooves as a hash reference.
206             #pod
207             #pod =cut
208              
209             sub all_grooves {
210 3     3 1 1883 my ($self) = @_;
211 3         8 return $self->_grooves();
212             }
213              
214             #pod =head2 search
215             #pod
216             #pod $set = $grooves->search({ cat => $x, name => $y }); # search all grooves
217             #pod $set = $grooves->search({ cat => $x, name => $y }, $set); # search a subset
218             #pod
219             #pod Return the found grooves with names matching the B or B
220             #pod strings and given an optional set of grooves to search in.
221             #pod
222             #pod =cut
223              
224             sub search {
225 2     2 1 8305 my ($self, $args, $set) = @_;
226 2 50 33     10 unless ($set && keys %$set) {
227 2         6 $set = $self->all_grooves;
228             }
229 2         4 my $found = {};
230 2 100       8 if ($args->{cat}) {
231 1         3 my $string = lc $args->{cat};
232 1         10 for my $k (keys %$set) {
233 82 100       171 if (lc($set->{$k}{cat}) =~ /$string/) {
234 10         15 $found->{$k} = $set->{$k};
235             }
236             }
237             }
238 2 100       9 if ($args->{name}) {
239 1         4 my $string = lc $args->{name};
240 1         42 for my $k (keys %$set) {
241 82 100       177 if (lc($set->{$k}{name}) =~ /$string/) {
242 3         6 $found->{$k} = $set->{$k};
243             }
244             }
245             }
246 2         205 return $found;
247             }
248              
249             sub _groove {
250 0     0   0 my ($self, %patterns) = @_;
251 0 0       0 if ($self->return_patterns) {
252 0         0 return \%patterns;
253             }
254             else {
255 0         0 $self->drummer->sync_patterns(
256             %patterns,
257             duration => $self->duration,
258             );
259             }
260             }
261              
262             sub _grooves {
263 3     3   6 my ($self) = @_;
264              
265             my %grooves = (
266              
267             1 => {
268             cat => "Basic Patterns",
269             name => "ONE AND SEVEN & FIVE AND THIRTEEN",
270             groove => sub {
271 0     0   0 $self->_groove(
272             kick => ['1000001000000000'],
273             snare => ['0000100000001000'],
274             );
275             },
276             },
277              
278             2 => {
279             cat => "Basic Patterns",
280             name => "BOOTS N' CATS",
281             groove => sub {
282 0     0   0 $self->_groove(
283             $self->kick => ['1000000010000000'],
284             $self->snare => ['0000100000001000'],
285             $self->closed => ['1010101010101010'],
286             ),
287             },
288             },
289              
290             3 => {
291             cat => "Basic Patterns",
292             name => "TINY HOUSE",
293             groove => sub {
294 0     0   0 $self->_groove( # 123456789ABCDEF0
295             $self->kick => ['1000100010001000'],
296             $self->open => ['0010001000100010'],
297             ),
298             },
299             },
300              
301             4 => {
302             cat => "Basic Patterns",
303             name => "GOOD TO GO",
304             groove => sub {
305 0     0   0 $self->_groove(
306             $self->kick => ['1001001000100000'],
307             $self->snare => ['0000100000001000'],
308             ),
309             },
310             },
311              
312             5 => {
313             cat => "Basic Patterns",
314             name => "HIP HOP",
315             groove => sub {
316 0     0   0 $self->_groove(
317             $self->kick => ['1010001100000010'],
318             $self->snare => ['0000100000001000'],
319             $self->closed => ['1010101010101010'],
320             ),
321             },
322             },
323              
324             6 => {
325             cat => "Standard Breaks",
326             name => "STANDARD BREAK 1",
327             groove => sub {
328 0     0   0 $self->_groove(
329             $self->kick => ['1000000000100000'],
330             $self->snare => ['0000100000001000'],
331             $self->closed => ['1010101011101010'],
332             ),
333             },
334             },
335              
336             7 => {
337             cat => "Standard Breaks",
338             name => "STANDARD BREAK 2",
339             groove => sub {
340 0     0   0 $self->_groove(
341             $self->kick => ['1000000000100000'],
342             $self->snare => ['0000100000001000'],
343             $self->closed => ['1010101110100010'],
344             ),
345             },
346             },
347              
348             8 => {
349             cat => "Standard Breaks",
350             name => "ROLLING BREAK",
351             groove => sub {
352 0     0   0 $self->_groove(
353             $self->kick => ['1000000100100000'],
354             $self->snare => ['0000100000001000'],
355             $self->closed => ['1010101010101010'],
356             ),
357             },
358             },
359              
360             9 => {
361             cat => "Standard Breaks",
362             name => "THE UNKNOWN DRUMMER",
363             groove => sub {
364 0     0   0 $self->_groove(
365             $self->kick => ['1001001000100000'],
366             $self->snare => ['0100100100001000'],
367             $self->closed => ['0110110100000100'],
368             $self->open => ['0000000010000010'],
369             ),
370             },
371             },
372              
373             10 => {
374             cat => "Rock",
375             name => "ROCK 1",
376             groove => sub {
377 0     0   0 $self->_groove(
378             $self->kick => ['1000000110100000'],
379             $self->snare => ['0000100000001000'],
380             $self->closed => ['1010101010101010'],
381             $self->cymbal => ['1000000000000000'],
382             ),
383             },
384             },
385              
386             11 => {
387             cat => "Rock",
388             name => "ROCK 2",
389             groove => sub {
390 0     0   0 $self->_groove(
391             $self->kick => ['1000000110100000'],
392             $self->snare => ['0000100000001000'],
393             $self->closed => ['1010101010101010'],
394             ),
395             },
396             },
397              
398             12 => {
399             cat => "Rock",
400             name => "ROCK 3",
401             groove => sub {
402 0     0   0 $self->_groove(
403             $self->kick => ['1000000110100000'],
404             $self->snare => ['0000100000001000'],
405             $self->closed => ['1010101010101000'],
406             $self->open => ['0000000000000010'],
407             ),
408             },
409             },
410              
411             13 => {
412             cat => "Rock",
413             name => "ROCK 4",
414             groove => sub {
415 0     0   0 $self->_groove(
416             $self->kick => ['1000000110100000'],
417             $self->snare => ['0000100000001011'],
418             $self->closed => ['1010101010101000'],
419             $self->open => ['0000000000000010'],
420             ),
421             },
422             },
423              
424             14 => {
425             cat => "Electro",
426             name => "ELECTRO 1 - A",
427             groove => sub {
428 0     0   0 $self->_groove(
429             $self->kick => ['1000001000000000'],
430             $self->snare => ['0000100000001000'],
431             ),
432             },
433             },
434              
435             15 => {
436             cat => "Electro",
437             name => "ELECTRO 1 - B",
438             groove => sub {
439 0     0   0 $self->_groove(
440             $self->kick => ['1000001000100010'],
441             $self->snare => ['0000100000001000'],
442             ),
443             },
444             },
445              
446             # nb: ELECTRO 2 - A == ELECTRO 1 - A
447              
448             16 => {
449             cat => "Electro",
450             name => "ELECTRO 2 - B",
451             groove => sub {
452 0     0   0 $self->_groove(
453             $self->kick => ['1000000000100100'],
454             $self->snare => ['0000100000001000'],
455             ),
456             },
457             },
458              
459             17 => {
460             cat => "Electro",
461             name => "ELECTRO 3 - A",
462             groove => sub {
463 0     0   0 $self->_groove(
464             $self->kick => ['1000001000010000'],
465             $self->snare => ['0000100000001000'],
466             ),
467             },
468             },
469              
470             18 => {
471             cat => "Electro",
472             name => "ELECTRO 3 - B",
473             groove => sub {
474 0     0   0 $self->_groove(
475             $self->kick => ['1000001000010100'],
476             $self->snare => ['0000100000001000'],
477             ),
478             },
479             },
480              
481             19 => {
482             cat => "Electro",
483             name => "ELECTRO 4",
484             groove => sub {
485 0     0   0 $self->_groove(
486             $self->kick => ['1000001000100100'],
487             $self->snare => ['0000100000001000'],
488             ),
489             },
490             },
491              
492             20 => {
493             cat => "Electro",
494             name => "SIBERIAN NIGHTS",
495             groove => sub {
496 0     0   0 $self->_groove(
497             $self->kick => ['1000001000000000'],
498             $self->snare => ['0000100000001000'],
499             $self->closed => ['1011101110111011'],
500             ),
501             },
502             },
503              
504             21 => {
505             cat => "Electro",
506             name => "NEW WAVE",
507             groove => sub {
508 0     0   0 $self->_groove(
509             $self->kick => ['1000001011000000'],
510             $self->snare => ['0000100000001000'],
511             $self->closed => ['1101111111111111'],
512             $self->open => ['0010000000000000'],
513             $self->shaker => ['0000100000001000'],
514             ),
515             },
516             },
517              
518             22 => {
519             cat => "House",
520             name => "HOUSE",
521             groove => sub {
522 0     0   0 $self->_groove(
523             $self->kick => ['1000100010001000'],
524             $self->snare => ['0000100000001000'],
525             $self->open => ['0010001000100010'],
526             $self->cymbal => ['1000000000000000'],
527             ),
528             },
529             },
530              
531             23 => {
532             cat => "House",
533             name => "HOUSE 2",
534             groove => sub {
535 0     0   0 $self->_groove(
536             $self->kick => ['1000001011000000'],
537             $self->snare => ['0000100000001000'],
538             $self->closed => ['1101101111011011'],
539             $self->open => ['0010010000100100'],
540             ),
541             },
542             },
543              
544             24 => {
545             cat => "House",
546             name => "BRIT HOUSE",
547             groove => sub {
548 0     0   0 $self->_groove(
549             $self->kick => ['1000001011000000'],
550             $self->snare => ['0000100000001000'],
551             $self->closed => ['1101110111011101'],
552             $self->open => ['0010001000100010'],
553             $self->cymbal => ['0010001000100010'],
554             ),
555             },
556             },
557              
558             25 => {
559             cat => "House",
560             name => "FRENCH HOUSE",
561             groove => sub {
562 0     0   0 $self->_groove(
563             $self->kick => ['1000001011000000'],
564             $self->snare => ['0000100000001000'],
565             $self->closed => ['1010101010101010'],
566             $self->open => ['0101010101010101'],
567             $self->shaker => ['1110101111101011'],
568             ),
569             },
570             },
571              
572             26 => {
573             cat => "House",
574             name => "DIRTY HOUSE",
575             groove => sub {
576 0     0   0 $self->_groove(
577             $self->kick => ['1010100010101001'],
578             $self->snare => ['0000100000001000'],
579             $self->closed => ['0000000000100001'],
580             $self->open => ['0010000000000010'],
581             $self->clap => ['0010100010101000'],
582             ),
583             },
584             },
585              
586             27 => {
587             cat => "House",
588             name => "DEEP HOUSE",
589             groove => sub {
590 0     0   0 $self->_groove(
591             $self->kick => ['1000100010001000'],
592             $self->clap => ['0000100000001000'],
593             $self->closed => ['0100000101000000'],
594             $self->open => ['0010001000100010'],
595             ),
596             },
597             },
598              
599             28 => {
600             cat => "House",
601             name => "DEEPER HOUSE",
602             groove => sub {
603 0     0   0 $self->_groove(
604             $self->kick => ['1000100010001000'],
605             $self->clap => ['0100000001000000'],
606             $self->open => ['0010001000110010'],
607             $self->shaker => ['0001000010000000'],
608             $self->mid_tom => ['0010000100100000'],
609             ),
610             },
611             },
612              
613             29 => {
614             cat => "House",
615             name => "SLOW DEEP HOUSE",
616             groove => sub {
617 0     0   0 $self->_groove(
618             $self->kick => ['1000100010001000'],
619             $self->clap => ['0000100000001000'],
620             $self->closed => ['1000100010001000'],
621             $self->open => ['0011001101100010'],
622             $self->shaker => ['1111111111111111'],
623             ),
624             },
625             },
626              
627             30 => {
628             cat => "House",
629             name => "FOOTWORK - A",
630             groove => sub {
631 0     0   0 $self->_groove(
632             $self->kick => ['1001001010010010'],
633             $self->clap => ['0000000000001000'],
634             $self->closed => ['0010000000100000'],
635             $self->rimshot => ['1111111111111111'],
636             ),
637             },
638             },
639              
640             31 => {
641             cat => "House",
642             name => "FOOTWORK - B",
643             groove => sub {
644 0     0   0 $self->_groove(
645             $self->kick => ['1001001010010010'],
646             $self->clap => ['0000000000001000'],
647             $self->closed => ['0010001100100010'],
648             $self->rimshot => ['1111111111111111'],
649             ),
650             },
651             },
652              
653             32 => {
654             cat => "Miami Bass",
655             name => "MIAMI BASS - A",
656             groove => sub {
657 0     0   0 $self->_groove(
658             $self->kick => ['1000001000100100'],
659             $self->snare => ['0000100000001000'],
660             $self->closed => ['1011101110111011'],
661             ),
662             },
663             },
664              
665             33 => {
666             cat => "Miami Bass",
667             name => "MIAMI BASS - B",
668             groove => sub {
669 0     0   0 $self->_groove(
670             $self->kick => ['1000001000000000'],
671             $self->snare => ['0000100000001000'],
672             $self->closed => ['1011101110111011'],
673             ),
674             },
675             },
676              
677             34 => {
678             cat => "Miami Bass",
679             name => "SALLY",
680             groove => sub {
681 0     0   0 $self->_groove(
682             $self->kick => ['1000001000100010'],
683             $self->snare => ['0000100000001000'],
684             $self->closed => ['1010101010101010'],
685             $self->low_tom => ['1000001000100010'],
686             ),
687             },
688             },
689              
690             35 => {
691             cat => "Miami Bass",
692             name => "ROCK THE PLANET",
693             groove => sub {
694 0     0   0 $self->_groove(
695             $self->kick => ['1001001000000000'],
696             $self->snare => ['0000100000001000'],
697             $self->closed => ['1011101110111111'],
698             ),
699             },
700             },
701              
702             36 => {
703             cat => "Hip Hop",
704             name => "HIP HOP 1 - A",
705             groove => sub {
706 0     0   0 $self->_groove(
707             $self->kick => ['1000001100010010'],
708             $self->snare => ['0000100000001000'],
709             ),
710             },
711             },
712              
713             37 => {
714             cat => "Hip Hop",
715             name => "HIP HOP 1 - B",
716             groove => sub {
717 0     0   0 $self->_groove(
718             $self->kick => ['1000000100010000'],
719             $self->snare => ['0000100000001000'],
720             ),
721             },
722             },
723              
724             38 => {
725             cat => "Hip Hop",
726             name => "HIP HOP 2 - A",
727             groove => sub {
728 0     0   0 $self->_groove(
729             $self->kick => ['1000000111010101'],
730             $self->snare => ['0000100000001000'],
731             ),
732             },
733             },
734              
735             39 => {
736             cat => "Hip Hop",
737             name => "HIP HOP 2 - B",
738             groove => sub {
739 0     0   0 $self->_groove(
740             $self->kick => ['1000000110010000'],
741             $self->snare => ['0000100000001000'],
742             ),
743             },
744             },
745              
746             40 => {
747             cat => "Hip Hop",
748             name => "HIP HOP 3 - A",
749             groove => sub {
750 0     0   0 $self->_groove(
751             $self->kick => ['1010000010100000'],
752             $self->snare => ['0000100000001000'],
753             ),
754             },
755             },
756              
757             41 => {
758             cat => "Hip Hop",
759             name => "HIP HOP 3 - B",
760             groove => sub {
761 0     0   0 $self->_groove(
762             $self->kick => ['1010000011010000'],
763             $self->snare => ['0000100000001000'],
764             ),
765             },
766             },
767              
768             42 => {
769             cat => "Hip Hop",
770             name => "HIP HOP 4 - A",
771             groove => sub {
772 0     0   0 $self->_groove(
773             $self->kick => ['1001000101100001'],
774             $self->snare => ['0000100000001000'],
775             ),
776             },
777             },
778              
779             43 => {
780             cat => "Hip Hop",
781             name => "HIP HOP 4 - B",
782             groove => sub {
783 0     0   0 $self->_groove(
784             $self->kick => ['1010000111100000'],
785             $self->snare => ['0000100000001000'],
786             ),
787             },
788             },
789              
790             44 => {
791             cat => "Hip Hop",
792             name => "HIP HOP 5",
793             groove => sub {
794 0     0   0 $self->_groove(
795             $self->kick => ['1010000110100001'],
796             $self->snare => ['0000100000001000'],
797             ),
798             },
799             },
800              
801             45 => {
802             cat => "Hip Hop",
803             name => "HIP HOP 6",
804             groove => sub {
805 0     0   0 $self->_groove(
806             $self->kick => ['1010000000110001'],
807             $self->snare => ['0000100000001000'],
808             $self->closed => ['1010101010101010'],
809             ),
810             },
811             },
812              
813             46 => {
814             cat => "Hip Hop",
815             name => "HIP HOP 7",
816             groove => sub {
817 0     0   0 $self->_groove(
818             $self->kick => ['1000000100100101'],
819             $self->snare => ['0000100000001000'],
820             $self->closed => ['1010101010101010'],
821             ),
822             },
823             },
824              
825             47 => {
826             cat => "Hip Hop",
827             name => "HIP HOP 8",
828             groove => sub {
829 0     0   0 $self->_groove(
830             $self->kick => ['1001000010110000'],
831             $self->snare => ['0000100000001000'],
832             $self->closed => ['1101101111011011'],
833             $self->open => ['0000010000000100'],
834             ),
835             },
836             },
837              
838             48 => {
839             cat => "Hip Hop",
840             name => "TRAP - A",
841             groove => sub {
842 0     0   0 $self->_groove(
843             $self->kick => ['1000001000001000'],
844             $self->snare => ['0000000010000000'],
845             $self->closed => ['1010101010101010'],
846             ),
847             },
848             },
849              
850             49 => {
851             cat => "Hip Hop",
852             name => "TRAP - B",
853             groove => sub {
854 0     0   0 $self->_groove(
855             $self->kick => ['0010100000000000'],
856             $self->snare => ['0000000010000000'],
857             $self->closed => ['1110101010101110'],
858             ),
859             },
860             },
861              
862             50 => {
863             cat => "Hip Hop",
864             name => "PLANET ROCK - A",
865             groove => sub {
866 0     0   0 $self->_groove(
867             $self->kick => ['1000001000000000'],
868             $self->snare => ['0000100000001000'],
869             $self->clap => ['0000100000001000'],
870             $self->closed => ['1011101110111111'],
871             $self->cowbell => ['1010101101011010'],
872             ),
873             },
874             },
875              
876             51 => {
877             cat => "Hip Hop",
878             name => "PLANET ROCK - B",
879             groove => sub {
880 0     0   0 $self->_groove(
881             $self->kick => ['1000001000100100'],
882             $self->snare => ['0000100000001000'],
883             $self->clap => ['0000100000001000'],
884             $self->closed => ['1011101110111111'],
885             $self->cowbell => ['1010101101011010'],
886             ),
887             },
888             },
889              
890             52 => {
891             cat => "Hip Hop",
892             name => "INNA CLUB",
893             groove => sub {
894 0     0   0 $self->_groove( # 123456789ABCDEF0
895             $self->kick => ['0010000100100001'],
896             $self->snare => ['0000100000001000'],
897             $self->clap => ['0000100000001000'],
898             $self->open => ['1010101010101010'],
899             ),
900             },
901             },
902              
903             53 => {
904             cat => "Hip Hop",
905             name => "ICE",
906             groove => sub {
907 0     0   0 $self->_groove(
908             $self->kick => ['1000001000100010'],
909             $self->snare => ['0000100000001000'],
910             $self->shaker => ['1010101010101010'],
911             ),
912             },
913             },
914              
915             54 => {
916             cat => "Hip Hop",
917             name => "BACK TO CALI - A",
918             groove => sub {
919 0     0   0 $self->_groove(
920             $self->kick => ['1000001000000000'],
921             $self->snare => ['0000100000001000'],
922             $self->clap => ['0000101010001010'],
923             $self->closed => ['1010101010101010'],
924             ),
925             },
926             },
927              
928             55 => {
929             cat => "Hip Hop",
930             name => "BACK TO CALI - B",
931             groove => sub {
932 0     0   0 $self->_groove(
933             $self->kick => ['1000001000100100'],
934             $self->snare => ['0000100000001000'],
935             $self->clap => ['1000101010001000'],
936             $self->closed => ['1010101010100010'],
937             $self->open => ['0000000000001000'],
938             ),
939             },
940             },
941              
942             56 => {
943             cat => "Hip Hop",
944             name => "SNOOP STYLES",
945             groove => sub {
946 0     0   0 $self->_groove(
947             $self->kick => ['1001001000010000'],
948             $self->snare => ['0000100000001000'],
949             $self->clap => ['0000100000001000'],
950             $self->rimshot => ['0010010010010000'],
951             $self->open => ['1001001000010000'],
952             ),
953             },
954             },
955              
956             57 => {
957             cat => "Hip Hop",
958             name => "THE GROOVE - A",
959             groove => sub {
960 0     0   0 $self->_groove(
961             $self->kick => ['1001000100010010'],
962             $self->snare => ['0000100000001000'],
963             $self->shaker => ['0000100000001000'],
964             $self->closed => ['1010101010101010'],
965             $self->open => ['0000000100000000'],
966             ),
967             },
968             },
969              
970             58 => {
971             cat => "Hip Hop",
972             name => "THE GROOVE - B",
973             groove => sub {
974 0     0   0 $self->_groove(
975             $self->kick => ['1001000100010010'],
976             $self->snare => ['0000100000001000'],
977             $self->shaker => ['0000100000001000'],
978             $self->closed => ['1010101010000100'],
979             $self->open => ['0000000100111010'],
980             $self->hi_tom => ['0000000001100000'],
981             $self->mid_tom => ['0000000000010100'],
982             $self->low_tom => ['0000000000000011'],
983             ),
984             },
985             },
986              
987             59 => {
988             cat => "Hip Hop",
989             name => "BOOM BAP",
990             groove => sub {
991 0     0   0 $self->_groove(
992             $self->kick => ['1010010001000100'],
993             $self->snare => ['0010001000100010'],
994             $self->clap => ['0010001000100010'],
995             $self->closed => ['1111111111111101'],
996             $self->cowbell => ['0000000010000000'],
997             ),
998             },
999             },
1000              
1001             60 => {
1002             cat => "Hip Hop",
1003             name => "MOST WANTED - A",
1004             groove => sub {
1005 0     0   0 $self->_groove(
1006             $self->kick => ['1000001011000001'],
1007             $self->snare => ['0000100000001000'],
1008             $self->clap => ['0000100000001000'],
1009             $self->closed => ['0010101010101010'],
1010             $self->cymbal => ['1000000000000000'],
1011             ),
1012             },
1013             },
1014              
1015             61 => {
1016             cat => "Hip Hop",
1017             name => "MOST WANTED - B",
1018             groove => sub {
1019 0     0   0 $self->_groove(
1020             $self->kick => ['0010001011000000'],
1021             $self->snare => ['0000100000001000'],
1022             $self->clap => ['0000100000001000'],
1023             $self->closed => ['0010101010101010'],
1024             $self->open => ['0010000000000000'],
1025             ),
1026             },
1027             },
1028              
1029             62 => {
1030             cat => "Funk and Soul",
1031             name => "AMEN BREAK - A",
1032             groove => sub {
1033 0     0   0 $self->_groove(
1034             $self->kick => ['1010000000110000'],
1035             $self->snare => ['0000000101001001'],
1036             $self->closed => ['1010101010101010'],
1037             ),
1038             },
1039             },
1040              
1041             63 => {
1042             cat => "Funk and Soul",
1043             name => "AMEN BREAK - B",
1044             groove => sub {
1045 0     0   0 $self->_groove(
1046             $self->kick => ['1010000000110000'],
1047             $self->snare => ['0000100101001001'],
1048             $self->rimshot => ['0000100000000000'],
1049             $self->closed => ['1010101010101010'],
1050             ),
1051             },
1052             },
1053              
1054             64 => {
1055             cat => "Funk and Soul",
1056             name => "AMEN BREAK - C",
1057             groove => sub {
1058 0     0   0 $self->_groove(
1059             $self->kick => ['1010000000100000'],
1060             $self->snare => ['0000100101001001'],
1061             $self->rimshot => ['0000000000000010'],
1062             $self->closed => ['1010101010101010'],
1063             ),
1064             },
1065             },
1066              
1067             65 => {
1068             cat => "Funk and Soul",
1069             name => "AMEN BREAK - D",
1070             groove => sub {
1071 0     0   0 $self->_groove(
1072             $self->kick => ['1010000000100000'],
1073             $self->snare => ['0100100101000010'],
1074             $self->closed => ['1010101010001010'],
1075             $self->cymbal => ['0000000000100000'],
1076             ),
1077             },
1078             },
1079              
1080             66 => {
1081             cat => "Funk and Soul",
1082             name => "THE FUNKY DRUMMER",
1083             groove => sub {
1084 0     0   0 $self->_groove(
1085             $self->kick => ['1010001000100100'],
1086             $self->snare => ['0000100101011001'],
1087             $self->closed => ['1111111011111011'],
1088             $self->open => ['0000000100000100'],
1089             ),
1090             },
1091             },
1092              
1093             67 => {
1094             cat => "Funk and Soul",
1095             name => "IMPEACH THE PRESIDENT",
1096             groove => sub {
1097 0     0   0 $self->_groove(
1098             $self->kick => ['1000000110000010'],
1099             $self->snare => ['0000100000001000'],
1100             $self->closed => ['1010101110001010'],
1101             $self->open => ['0000000000100000'],
1102             ),
1103             },
1104             },
1105              
1106             68 => {
1107             cat => "Funk and Soul",
1108             name => "WHEN THE LEVEE BREAKS",
1109             groove => sub {
1110 0     0   0 $self->_groove(
1111             $self->kick => ['1100000100110000'],
1112             $self->snare => ['0000100000001000'],
1113             $self->closed => ['1010101010101010'],
1114             ),
1115             },
1116             },
1117              
1118             69 => {
1119             cat => "Funk and Soul",
1120             name => "IT'S A NEW DAY",
1121             groove => sub {
1122 0     0   0 $self->_groove(
1123             $self->kick => ['1010000000110001'],
1124             $self->snare => ['0000100000001000'],
1125             $self->closed => ['1010101010101010'],
1126             ),
1127             },
1128             },
1129              
1130             70 => {
1131             cat => "Funk and Soul",
1132             name => "THE BIG BEAT",
1133             groove => sub {
1134 0     0   0 $self->_groove(
1135             $self->kick => ['1001001010000000'],
1136             $self->snare => ['0000100000001000'],
1137             $self->closed => ['0000100000001000'],
1138             ),
1139             },
1140             },
1141              
1142             71 => {
1143             cat => "Funk and Soul",
1144             name => "ASHLEY'S ROACHCLIP",
1145             groove => sub {
1146 0     0   0 $self->_groove(
1147             $self->kick => ['1010001011000000'],
1148             $self->snare => ['0000100000001000'],
1149             $self->closed => ['1010101010001010'],
1150             $self->open => ['0000000000100000'],
1151             $self->cowbell => ['1010101010101010'],
1152             ),
1153             },
1154             },
1155              
1156             72 => {
1157             cat => "Funk and Soul",
1158             name => "PAPA WAS TOO",
1159             groove => sub {
1160 0     0   0 $self->_groove(
1161             $self->kick => ['1000000110100001'],
1162             $self->snare => ['0000100000001000'],
1163             $self->closed => ['0000100010101011'],
1164             $self->cymbal => ['0000100000000000'],
1165             ),
1166             },
1167             },
1168              
1169             73 => {
1170             cat => "Funk and Soul",
1171             name => "SUPERSTITION",
1172             groove => sub {
1173 0     0   0 $self->_groove(
1174             $self->kick => ['1000100010001000'],
1175             $self->snare => ['0000100000001000'],
1176             $self->closed => ['1010101111101011'],
1177             ),
1178             },
1179             },
1180              
1181             74 => {
1182             cat => "Funk and Soul",
1183             name => "CISSY STRUT - A",
1184             groove => sub {
1185 0     0   0 $self->_groove(
1186             $self->kick => ['1001010001011010'],
1187             $self->snare => ['0000100101100000'],
1188             $self->cymbal => ['0000000000001010'],
1189             ),
1190             },
1191             },
1192              
1193             75 => {
1194             cat => "Funk and Soul",
1195             name => "CISSY STRUT - B",
1196             groove => sub {
1197 0     0   0 $self->_groove(
1198             $self->kick => ['1001000101011010'],
1199             $self->snare => ['0010011011000000'],
1200             ),
1201             },
1202             },
1203              
1204             76 => {
1205             cat => "Funk and Soul",
1206             name => "CISSY STRUT - C",
1207             groove => sub {
1208 0     0   0 $self->_groove(
1209             $self->kick => ['1000100101011010'],
1210             $self->snare => ['0010111001000000'],
1211             $self->cymbal => ['0000000000001010'],
1212             ),
1213             },
1214             },
1215              
1216             77 => {
1217             cat => "Funk and Soul",
1218             name => "CISSY STRUT - D",
1219             groove => sub {
1220 0     0   0 $self->_groove(
1221             $self->kick => ['1000100101011010'],
1222             $self->snare => ['1010010011000000'],
1223             $self->cymbal => ['0000000000001010'],
1224             ),
1225             },
1226             },
1227              
1228             78 => {
1229             cat => "Funk and Soul",
1230             name => "HOOK AND SLING - A",
1231             groove => sub {
1232 0     0   0 $self->_groove(
1233             $self->kick => ['1010000001000110'],
1234             $self->snare => ['0000101100101000'],
1235             $self->closed => ['1011010011010010'],
1236             ),
1237             },
1238             },
1239              
1240             79 => {
1241             cat => "Funk and Soul",
1242             name => "HOOK AND SLING - B",
1243             groove => sub {
1244 0     0   0 $self->_groove(
1245             $self->kick => ['0000000000000010'],
1246             $self->snare => ['1000110100110011'],
1247             $self->closed => ['1101001011001010'],
1248             ),
1249             },
1250             },
1251              
1252             80 => {
1253             cat => "Funk and Soul",
1254             name => "HOOK AND SLING - C",
1255             groove => sub {
1256 0     0   0 $self->_groove(
1257             $self->kick => ['1100000000001101'],
1258             $self->snare => ['0010101100110010'],
1259             $self->closed => ['1010110101001100'],
1260             ),
1261             },
1262             },
1263              
1264             81 => {
1265             cat => "Funk and Soul",
1266             name => "HOOK AND SLING - D",
1267             groove => sub {
1268 0     0   0 $self->_groove(
1269             $self->kick => ['1010010000010110'],
1270             $self->snare => ['0000100100100001'],
1271             $self->closed => ['1010110100000000'],
1272             ),
1273             },
1274             },
1275              
1276             # TODO MORE!
1277             0 => {
1278             cat => "",
1279             name => "",
1280             groove => sub {
1281 0     0   0 $self->_groove( # 123456789ABCDEF0
1282             $self->kick => ['0000000000000000'],
1283             $self->snare => ['0000000000000000'],
1284             $self->rimshot => ['0000000000000000'],
1285             $self->clap => ['0000000000000000'],
1286             $self->shaker => ['0000000000000000'],
1287             $self->closed => ['0000000000000000'],
1288             $self->open => ['0000000000000000'],
1289             $self->cowbell => ['0000000000000000'],
1290             $self->cymbal => ['0000000000000000'],
1291             $self->hi_tom => ['0000000000000000'],
1292             $self->mid_tom => ['0000000000000000'],
1293             $self->low_tom => ['0000000000000000'],
1294             ),
1295             },
1296             },
1297              
1298 3         589 );
1299 3         20 return \%grooves;
1300             }
1301              
1302             1;
1303              
1304             __END__