File Coverage

blib/lib/MIDI/Drummer/Tiny/Grooves.pm
Criterion Covered Total %
statement 32 140 22.8
branch 9 16 56.2
condition 1 3 33.3
subroutine 7 104 6.7
pod 3 3 100.0
total 52 266 19.5


line stmt bran cond sub pod time code
1             package MIDI::Drummer::Tiny::Grooves;
2             $MIDI::Drummer::Tiny::Grooves::VERSION = '0.7006';
3             our $AUTHORITY = 'cpan:GENE';
4              
5 2     2   555596 use Moo;
  2         14550  
  2         12  
6 2     2   3537 use strictures 2;
  2         2955  
  2         92  
7 2     2   1902 use MIDI::Drummer::Tiny ();
  2         8  
  2         78  
8 2     2   16 use namespace::clean;
  2         4  
  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 # 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 kick => { num => $self->kick, pat => ['1000001000000000'] },
68             #pod snare => { num => $self->snare, pat => ['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 1466 my ($self) = @_;
218 3         9 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 6358 my ($self, $args, $set) = @_;
233 2 50 33     8 unless ($set && keys %$set) {
234 2         4 $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         8 for my $k (keys %$set) {
240 82 100       172 if (lc($set->{$k}{cat}) =~ /$string/) {
241 10         14 $found->{$k} = $set->{$k};
242             }
243             }
244             }
245 2 100       8 if ($args->{name}) {
246 1         3 my $string = lc $args->{name};
247 1         8 for my $k (keys %$set) {
248 82 100       167 if (lc($set->{$k}{name}) =~ /$string/) {
249 3         5 $found->{$k} = $set->{$k};
250             }
251             }
252             }
253 2         262 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 map { $_ => [ split '', $patterns{$_}{pat}[0] ] } keys %patterns;
  0         0  
260             }
261             else {
262             $self->drummer->sync_patterns(
263 0         0 (map { $patterns{$_}{num} => $patterns{$_}{pat} } keys %patterns),
  0         0  
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 => { num => $self->kick, pat => ['1000001000000000'] },
280             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000000010000000'] },
291             snare => { num => $self->snare, pat => ['0000100000001000'] },
292             closed => { num => $self->closed, pat => ['1010101010101010'] },
293             ),
294             },
295             },
296              
297             3 => {
298             cat => "Basic Patterns",
299             name => "TINY HOUSE",
300             groove => sub {
301 0     0   0 $self->_groove(
302             kick => { num => $self->kick, pat => ['1000100010001000'] },
303             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1001001000100000'] },
314             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1010001100000010'] },
325             snare => { num => $self->snare, pat => ['0000100000001000'] },
326             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000000000100000'] },
337             snare => { num => $self->snare, pat => ['0000100000001000'] },
338             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000000000100000'] },
349             snare => { num => $self->snare, pat => ['0000100000001000'] },
350             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000000100100000'] },
361             snare => { num => $self->snare, pat => ['0000100000001000'] },
362             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1001001000100000'] },
373             snare => { num => $self->snare, pat => ['0100100100001000'] },
374             closed => { num => $self->closed, pat => ['0110110100000100'] },
375             open => { num => $self->open, pat => => ['0000000010000010'] },
376             ),
377             },
378             },
379              
380             10 => {
381             cat => "Rock",
382             name => "ROCK 1",
383             groove => sub {
384 0     0   0 $self->_groove(
385             kick => { num => $self->kick, pat => ['1000000110100000'] },
386             snare => { num => $self->snare, pat => ['0000100000001000'] },
387             closed => { num => $self->closed, pat => ['1010101010101010'] },
388             cymbal => { num => $self->cymbal, pat => ['1000000000000000'] },
389             ),
390             },
391             },
392              
393             11 => {
394             cat => "Rock",
395             name => "ROCK 2",
396             groove => sub {
397 0     0   0 $self->_groove(
398             kick => { num => $self->kick, pat => ['1000000110100000'] },
399             snare => { num => $self->snare, pat => ['0000100000001000'] },
400             closed => { num => $self->closed, pat => ['1010101010101010'] },
401             ),
402             },
403             },
404              
405             12 => {
406             cat => "Rock",
407             name => "ROCK 3",
408             groove => sub {
409 0     0   0 $self->_groove(
410             kick => { num => $self->kick, pat => ['1000000110100000'] },
411             snare => { num => $self->snare, pat => ['0000100000001000'] },
412             closed => { num => $self->closed, pat => ['1010101010101000'] },
413             open => { num => $self->open, pat => => ['0000000000000010'] },
414             ),
415             },
416             },
417              
418             13 => {
419             cat => "Rock",
420             name => "ROCK 4",
421             groove => sub {
422 0     0   0 $self->_groove(
423             kick => { num => $self->kick, pat => ['1000000110100000'] },
424             snare => { num => $self->snare, pat => ['0000100000001011'] },
425             closed => { num => $self->closed, pat => ['1010101010101000'] },
426             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1000001000000000'] },
437             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000001000100010'] },
448             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000000000100100'] },
461             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000001000010000'] },
472             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000001000010100'] },
483             snare => { num => $self->snare, pat => ['0000100000001000'] },
484             ),
485             },
486             },
487              
488             19 => {
489             cat => "Electro",
490             name => "ELECTRO 4",
491             groove => sub {
492 0     0   0 $self->_groove(
493             kick => { num => $self->kick, pat => ['1000001000100100'] },
494             snare => { num => $self->snare, pat => ['0000100000001000'] },
495             ),
496             },
497             },
498              
499             20 => {
500             cat => "Electro",
501             name => "SIBERIAN NIGHTS",
502             groove => sub {
503 0     0   0 $self->_groove(
504             kick => { num => $self->kick, pat => ['1000001000000000'] },
505             snare => { num => $self->snare, pat => ['0000100000001000'] },
506             closed => { num => $self->closed, pat => ['1011101110111011'] },
507             ),
508             },
509             },
510              
511             21 => {
512             cat => "Electro",
513             name => "NEW WAVE",
514             groove => sub {
515 0     0   0 $self->_groove(
516             kick => { num => $self->kick, pat => ['1000001011000000'] },
517             snare => { num => $self->snare, pat => ['0000100000001000'] },
518             closed => { num => $self->closed, pat => ['1101111111111111'] },
519             open => { num => $self->open, pat => => ['0010000000000000'] },
520             shaker => { num => $self->shaker, pat => ['0000100000001000'] },
521             ),
522             },
523             },
524              
525             22 => {
526             cat => "House",
527             name => "HOUSE",
528             groove => sub {
529 0     0   0 $self->_groove(
530             kick => { num => $self->kick, pat => ['1000100010001000'] },
531             snare => { num => $self->snare, pat => ['0000100000001000'] },
532             open => { num => $self->open, pat => => ['0010001000100010'] },
533             cymbal => { num => $self->cymbal, pat => ['1000000000000000'] },
534             ),
535             },
536             },
537              
538             23 => {
539             cat => "House",
540             name => "HOUSE 2",
541             groove => sub {
542 0     0   0 $self->_groove(
543             kick => { num => $self->kick, pat => ['1000001011000000'] },
544             snare => { num => $self->snare, pat => ['0000100000001000'] },
545             closed => { num => $self->closed, pat => ['1101101111011011'] },
546             open => { num => $self->open, pat => => ['0010010000100100'] },
547             ),
548             },
549             },
550              
551             24 => {
552             cat => "House",
553             name => "BRIT HOUSE",
554             groove => sub {
555 0     0   0 $self->_groove(
556             kick => { num => $self->kick, pat => ['1000001011000000'] },
557             snare => { num => $self->snare, pat => ['0000100000001000'] },
558             closed => { num => $self->closed, pat => ['1101110111011101'] },
559             open => { num => $self->open, pat => => ['0010001000100010'] },
560             cymbal => { num => $self->cymbal, pat => ['0010001000100010'] },
561             ),
562             },
563             },
564              
565             25 => {
566             cat => "House",
567             name => "FRENCH HOUSE",
568             groove => sub {
569 0     0   0 $self->_groove(
570             kick => { num => $self->kick, pat => ['1000001011000000'] },
571             snare => { num => $self->snare, pat => ['0000100000001000'] },
572             closed => { num => $self->closed, pat => ['1010101010101010'] },
573             open => { num => $self->open, pat => => ['0101010101010101'] },
574             shaker => { num => $self->shaker, pat => ['1110101111101011'] },
575             ),
576             },
577             },
578              
579             26 => {
580             cat => "House",
581             name => "DIRTY HOUSE",
582             groove => sub {
583 0     0   0 $self->_groove(
584             kick => { num => $self->kick, pat => ['1010100010101001'] },
585             snare => { num => $self->snare, pat => ['0000100000001000'] },
586             closed => { num => $self->closed, pat => ['0000000000100001'] },
587             open => { num => $self->open, pat => => ['0010000000000010'] },
588             clap => { num => $self->clap, pat => ['0010100010101000'] },
589             ),
590             },
591             },
592              
593             27 => {
594             cat => "House",
595             name => "DEEP HOUSE",
596             groove => sub {
597 0     0   0 $self->_groove(
598             kick => { num => $self->kick, pat => ['1000100010001000'] },
599             clap => { num => $self->clap, pat => ['0000100000001000'] },
600             closed => { num => $self->closed, pat => ['0100000101000000'] },
601             open => { num => $self->open, pat => => ['0010001000100010'] },
602             ),
603             },
604             },
605              
606             28 => {
607             cat => "House",
608             name => "DEEPER HOUSE",
609             groove => sub {
610 0     0   0 $self->_groove(
611             kick => { num => $self->kick, pat => ['1000100010001000'] },
612             clap => { num => $self->clap, pat => ['0100000001000000'] },
613             open => { num => $self->open, pat => => ['0010001000110010'] },
614             shaker => { num => $self->shaker, pat => ['0001000010000000'] },
615             mid_tom => { num => $self->mid_tom, pat => ['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             kick => { num => $self->kick, pat => ['1000100010001000'] },
626             clap => { num => $self->clap, pat => ['0000100000001000'] },
627             closed => { num => $self->closed, pat => ['1000100010001000'] },
628             open => { num => $self->open, pat => => ['0011001101100010'] },
629             shaker => { num => $self->shaker, pat => ['1111111111111111'] },
630             ),
631             },
632             },
633              
634             30 => {
635             cat => "House",
636             name => "FOOTWORK - A",
637             groove => sub {
638 0     0   0 $self->_groove(
639             kick => { num => $self->kick, pat => ['1001001010010010'] },
640             clap => { num => $self->clap, pat => ['0000000000001000'] },
641             closed => { num => $self->closed, pat => ['0010000000100000'] },
642             rimshot => { num => $self->rimshot, pat => ['1111111111111111'] },
643             ),
644             },
645             },
646              
647             31 => {
648             cat => "House",
649             name => "FOOTWORK - B",
650             groove => sub {
651 0     0   0 $self->_groove(
652             kick => { num => $self->kick, pat => ['1001001010010010'] },
653             clap => { num => $self->clap, pat => ['0000000000001000'] },
654             closed => { num => $self->closed, pat => ['0010001100100010'] },
655             rimshot => { num => $self->rimshot, pat => ['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             kick => { num => $self->kick, pat => ['1000001000100100'] },
666             snare => { num => $self->snare, pat => ['0000100000001000'] },
667             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000001000000000'] },
678             snare => { num => $self->snare, pat => ['0000100000001000'] },
679             closed => { num => $self->closed, pat => ['1011101110111011'] },
680             ),
681             },
682             },
683              
684             34 => {
685             cat => "Miami Bass",
686             name => "SALLY",
687             groove => sub {
688 0     0   0 $self->_groove(
689             kick => { num => $self->kick, pat => ['1000001000100010'] },
690             snare => { num => $self->snare, pat => ['0000100000001000'] },
691             closed => { num => $self->closed, pat => ['1010101010101010'] },
692             low_tom => { num => $self->low_tom, pat => ['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             kick => { num => $self->kick, pat => ['1001001000000000'] },
703             snare => { num => $self->snare, pat => ['0000100000001000'] },
704             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000001100010010'] },
715             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000000100010000'] },
726             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000000111010101'] },
737             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000000110010000'] },
748             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1010000010100000'] },
759             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1010000011010000'] },
770             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1001000101100001'] },
781             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1010000111100000'] },
792             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1010000110100001'] },
803             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1010000000110001'] },
814             snare => { num => $self->snare, pat => ['0000100000001000'] },
815             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000000100100101'] },
826             snare => { num => $self->snare, pat => ['0000100000001000'] },
827             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1001000010110000'] },
838             snare => { num => $self->snare, pat => ['0000100000001000'] },
839             closed => { num => $self->closed, pat => ['1101101111011011'] },
840             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1000001000001000'] },
851             snare => { num => $self->snare, pat => ['0000000010000000'] },
852             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['0010100000000000'] },
863             snare => { num => $self->snare, pat => ['0000000010000000'] },
864             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000001000000000'] },
875             snare => { num => $self->snare, pat => ['0000100000001000'] },
876             clap => { num => $self->clap, pat => ['0000100000001000'] },
877             closed => { num => $self->closed, pat => ['1011101110111111'] },
878             cowbell => { num => $self->cowbell, pat => ['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             kick => { num => $self->kick, pat => ['1000001000100100'] },
889             snare => { num => $self->snare, pat => ['0000100000001000'] },
890             clap => { num => $self->clap, pat => ['0000100000001000'] },
891             closed => { num => $self->closed, pat => ['1011101110111111'] },
892             cowbell => { num => $self->cowbell, pat => ['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             kick => { num => $self->kick, pat => ['0010000100100001'] },
903             snare => { num => $self->snare, pat => ['0000100000001000'] },
904             clap => { num => $self->clap, pat => ['0000100000001000'] },
905             open => { num => $self->open, pat => => ['1010101010101010'] },
906             ),
907             },
908             },
909              
910             53 => {
911             cat => "Hip Hop",
912             name => "ICE",
913             groove => sub {
914 0     0   0 $self->_groove(
915             kick => { num => $self->kick, pat => ['1000001000100010'] },
916             snare => { num => $self->snare, pat => ['0000100000001000'] },
917             shaker => { num => $self->shaker, pat => ['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             kick => { num => $self->kick, pat => ['1000001000000000'] },
928             snare => { num => $self->snare, pat => ['0000100000001000'] },
929             clap => { num => $self->clap, pat => ['0000101010001010'] },
930             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1000001000100100'] },
941             snare => { num => $self->snare, pat => ['0000100000001000'] },
942             clap => { num => $self->clap, pat => ['1000101010001000'] },
943             closed => { num => $self->closed, pat => ['1010101010100010'] },
944             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1001001000010000'] },
955             snare => { num => $self->snare, pat => ['0000100000001000'] },
956             clap => { num => $self->clap, pat => ['0000100000001000'] },
957             rimshot => { num => $self->rimshot, pat => ['0010010010010000'] },
958             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1001000100010010'] },
969             snare => { num => $self->snare, pat => ['0000100000001000'] },
970             shaker => { num => $self->shaker, pat => ['0000100000001000'] },
971             closed => { num => $self->closed, pat => ['1010101010101010'] },
972             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1001000100010010'] },
983             snare => { num => $self->snare, pat => ['0000100000001000'] },
984             shaker => { num => $self->shaker, pat => ['0000100000001000'] },
985             closed => { num => $self->closed, pat => ['1010101010000100'] },
986             open => { num => $self->open, pat => => ['0000000100111010'] },
987             hi_tom => { num => $self->hi_tom, pat => ['0000000001100000'] },
988             mid_tom => { num => $self->mid_tom, pat => ['0000000000010100'] },
989             low_tom => { num => $self->low_tom, pat => ['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             kick => { num => $self->kick, pat => ['1010010001000100'] },
1000             snare => { num => $self->snare, pat => ['0010001000100010'] },
1001             clap => { num => $self->clap, pat => ['0010001000100010'] },
1002             closed => { num => $self->closed, pat => ['1111111111111101'] },
1003             cowbell => { num => $self->cowbell, pat => ['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             kick => { num => $self->kick, pat => ['1000001011000001'] },
1014             snare => { num => $self->snare, pat => ['0000100000001000'] },
1015             clap => { num => $self->clap, pat => ['0000100000001000'] },
1016             closed => { num => $self->closed, pat => ['0010101010101010'] },
1017             cymbal => { num => $self->cymbal, pat => ['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             kick => { num => $self->kick, pat => ['0010001011000000'] },
1028             snare => { num => $self->snare, pat => ['0000100000001000'] },
1029             clap => { num => $self->clap, pat => ['0000100000001000'] },
1030             closed => { num => $self->closed, pat => ['0010101010101010'] },
1031             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1010000000110000'] },
1042             snare => { num => $self->snare, pat => ['0000000101001001'] },
1043             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1010000000110000'] },
1054             snare => { num => $self->snare, pat => ['0000100101001001'] },
1055             rimshot => { num => $self->rimshot, pat => ['0000100000000000'] },
1056             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1010000000100000'] },
1067             snare => { num => $self->snare, pat => ['0000100101001001'] },
1068             rimshot => { num => $self->rimshot, pat => ['0000000000000010'] },
1069             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1010000000100000'] },
1080             snare => { num => $self->snare, pat => ['0100100101000010'] },
1081             closed => { num => $self->closed, pat => ['1010101010001010'] },
1082             cymbal => { num => $self->cymbal, pat => ['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             kick => { num => $self->kick, pat => ['1010001000100100'] },
1093             snare => { num => $self->snare, pat => ['0000100101011001'] },
1094             closed => { num => $self->closed, pat => ['1111111011111011'] },
1095             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1000000110000010'] },
1106             snare => { num => $self->snare, pat => ['0000100000001000'] },
1107             closed => { num => $self->closed, pat => ['1010101110001010'] },
1108             open => { num => $self->open, pat => => ['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             kick => { num => $self->kick, pat => ['1100000100110000'] },
1119             snare => { num => $self->snare, pat => ['0000100000001000'] },
1120             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1010000000110001'] },
1131             snare => { num => $self->snare, pat => ['0000100000001000'] },
1132             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1001001010000000'] },
1143             snare => { num => $self->snare, pat => ['0000100000001000'] },
1144             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1010001011000000'] },
1155             snare => { num => $self->snare, pat => ['0000100000001000'] },
1156             closed => { num => $self->closed, pat => ['1010101010001010'] },
1157             open => { num => $self->open, pat => => ['0000000000100000'] },
1158             cowbell => { num => $self->cowbell, pat => ['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             kick => { num => $self->kick, pat => ['1000000110100001'] },
1169             snare => { num => $self->snare, pat => ['0000100000001000'] },
1170             closed => { num => $self->closed, pat => ['0000100010101011'] },
1171             cymbal => { num => $self->cymbal, pat => ['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             kick => { num => $self->kick, pat => ['1000100010001000'] },
1182             snare => { num => $self->snare, pat => ['0000100000001000'] },
1183             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1001010001011010'] },
1194             snare => { num => $self->snare, pat => ['0000100101100000'] },
1195             cymbal => { num => $self->cymbal, pat => ['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             kick => { num => $self->kick, pat => ['1001000101011010'] },
1206             snare => { num => $self->snare, pat => ['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             kick => { num => $self->kick, pat => ['1000100101011010'] },
1217             snare => { num => $self->snare, pat => ['0010111001000000'] },
1218             cymbal => { num => $self->cymbal, pat => ['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             kick => { num => $self->kick, pat => ['1000100101011010'] },
1229             snare => { num => $self->snare, pat => ['1010010011000000'] },
1230             cymbal => { num => $self->cymbal, pat => ['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             kick => { num => $self->kick, pat => ['1010000001000110'] },
1241             snare => { num => $self->snare, pat => ['0000101100101000'] },
1242             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['0000000000000010'] },
1253             snare => { num => $self->snare, pat => ['1000110100110011'] },
1254             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1100000000001101'] },
1265             snare => { num => $self->snare, pat => ['0010101100110010'] },
1266             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['1010010000010110'] },
1277             snare => { num => $self->snare, pat => ['0000100100100001'] },
1278             closed => { num => $self->closed, pat => ['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             kick => { num => $self->kick, pat => ['0000000000000000'] },
1290             snare => { num => $self->snare, pat => ['0000000000000000'] },
1291             rimshot => { num => $self->rimshot, pat => ['0000000000000000'] },
1292             clap => { num => $self->clap, pat => ['0000000000000000'] },
1293             shaker => { num => $self->shaker, pat => ['0000000000000000'] },
1294             closed => { num => $self->closed, pat => ['0000000000000000'] },
1295             open => { num => $self->open, pat => => ['0000000000000000'] },
1296             cowbell => { num => $self->cowbell, pat => ['0000000000000000'] },
1297             cymbal => { num => $self->cymbal, pat => ['0000000000000000'] },
1298             hi_tom => { num => $self->hi_tom, pat => ['0000000000000000'] },
1299             mid_tom => { num => $self->mid_tom, pat => ['0000000000000000'] },
1300             low_tom => { num => $self->low_tom, pat => ['0000000000000000'] },
1301             ),
1302             },
1303             },
1304              
1305 3         520 );
1306 3         15 return \%grooves;
1307             }
1308              
1309             1;
1310              
1311             __END__