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