File Coverage

blib/lib/MIDI/Simple/Drummer/Rudiments.pm
Criterion Covered Total %
statement 40 442 9.0
branch 6 26 23.0
condition 1 3 33.3
subroutine 12 57 21.0
pod 47 47 100.0
total 106 575 18.4


line stmt bran cond sub pod time code
1             package MIDI::Simple::Drummer::Rudiments;
2             $MIDI::Simple::Drummer::Rudiments::VERSION = '0.0811';
3             our $AUTHORITY = 'cpan:GENE';
4 1     1   683 use strict;
  1         3  
  1         24  
5 1     1   4 use warnings;
  1         2  
  1         25  
6 1     1   334 use parent 'MIDI::Simple::Drummer';
  1         239  
  1         4  
7              
8 1     1   46 use constant PAN_LEFT => 0;
  1         1  
  1         46  
9 1     1   4 use constant PAN_CENTER => 64;
  1         2  
  1         35  
10 1     1   5 use constant PAN_RIGHT => 1;
  1         2  
  1         4039  
11              
12              
13             sub new {
14 1     1 1 516 my $self = shift;
15 1         6 $self->SUPER::new(
16             -pan_width => 32, # [ 0 .. 64 ] # From center
17             -chorus => 0,
18             -reverb => 1,
19             @_,
20             );
21             }
22              
23             sub _default_patterns {
24 1     1   1 my $self = shift;
25             return {
26 1         28 1 => \&single_stroke_roll,
27             2 => \&single_stroke_four,
28             3 => \&single_stroke_seven,
29             4 => \&multiple_bounce_roll,
30             5 => \&triple_stroke_roll,
31             6 => \&double_stroke_open_roll,
32             7 => \&five_stroke_roll,
33             8 => \&six_stroke_roll,
34             9 => \&seven_stroke_roll,
35             10 => \&nine_stroke_roll,
36             11 => \&ten_stroke_roll,
37             12 => \&eleven_stroke_roll,
38             13 => \&thirteen_stroke_roll,
39             14 => \&fifteen_stroke_roll,
40             15 => \&seventeen_stroke_roll,
41             16 => \&single_paradiddle,
42             17 => \&double_paradiddle,
43             18 => \&triple_paradiddle,
44             19 => \¶diddle_diddle,
45             20 => \&flam,
46             21 => \&flam_accent,
47             22 => \&flam_tap,
48             23 => \&flamacue,
49             24 => \&flam_paradiddle,
50             25 => \&flammed_mill,
51             26 => \&flam_paradiddle_diddle,
52             27 => \&pataflafla,
53             28 => \&swiss_army_triplet,
54             29 => \&inverted_flam_tap,
55             30 => \&flam_drag,
56             31 => \&drag,
57             32 => \&single_drag_tap,
58             33 => \&double_drag_tap,
59             34 => \&lesson_25_two_and_three,
60             35 => \&single_dragadiddle,
61             36 => \&drag_paradiddle_1,
62             37 => \&drag_paradiddle_2,
63             38 => \&single_ratamacue,
64             39 => \&double_ratamacue,
65             40 => \&triple_ratamacue,
66             };
67             };
68              
69              
70             sub single_stroke_roll { # 1
71 0     0 1 0 my $self = shift;
72 0         0 my %args = (
73             critical => [PAN_RIGHT .. 8],
74             @_
75             );
76 0         0 $self->alternate_note(%args);
77             }
78              
79              
80             sub single_stroke_four { # 2
81 0     0 1 0 my $self = shift;
82 0         0 my %args = (
83             critical => [4, 8],
84             alternate_pan => 2,
85             accent => $self->EIGHTH,
86             note => $self->TRIPLET_SIXTEENTH,
87             );
88 0         0 $self->single_stroke_n(%args);
89             }
90              
91              
92             sub single_stroke_seven { # 3
93 0     0 1 0 my $self = shift;
94 0         0 my %args = (
95             critical => [7],
96             @_
97             );
98 0         0 $self->single_stroke_n(%args);
99             }
100              
101              
102             sub multiple_bounce_roll { # 4 TODO
103 0     0 1 0 my $self = shift;
104             # TODO Set $multiple and then do a figure below.
105             }
106              
107              
108             sub triple_stroke_roll { # 5
109 0     0 1 0 my $self = shift;
110 0         0 my %args = (
111             critical => [1 .. 12],
112             groups_of => 3,
113             note => $self->TRIPLET_SIXTEENTH,
114             @_
115             );
116 0         0 $self->alternate_note(%args);
117             }
118              
119              
120             sub double_stroke_open_roll { # 6
121 1     1 1 2 my $self = shift;
122 1         4 my %args = (
123             critical => [1 .. 8],
124             groups_of => 2,
125             @_
126             );
127 1         4 $self->alternate_note(%args);
128             }
129              
130              
131             sub five_stroke_roll { # 7
132 0     0 1 0 my $self = shift;
133 0         0 my %args = (
134             critical => [0 .. 3],
135             groups_of => 2,
136             accent => $self->EIGHTH,
137             @_
138             );
139 0         0 $self->alternate_note(%args);
140 0         0 $self->pan_left;
141 0         0 $self->accent_note($args{accent});
142              
143 0         0 $args{critical} = [1 .. 4];
144 0         0 $self->alternate_note(%args);
145 0         0 $self->pan_right;
146 0         0 $self->accent_note($args{accent});
147             }
148              
149              
150             sub six_stroke_roll { #8
151 0     0 1 0 my $self = shift;
152 0         0 my %args = (
153             critical => [0 .. 3],
154             groups_of => 2,
155             accent => $self->EIGHTH,
156             @_
157             );
158 0         0 $self->pan_left;
159 0         0 $self->accent_note($args{accent});
160 0         0 $self->alternate_note(%args);
161 0         0 $self->pan_right;
162 0         0 $self->accent_note($args{accent});
163              
164 0         0 $args{critical} = [1 .. 4];
165 0         0 $self->accent_note($args{accent});
166 0         0 $self->alternate_note(%args);
167 0         0 $self->pan_left;
168 0         0 $self->accent_note($args{accent});
169             }
170              
171              
172             sub seven_stroke_roll { # 9
173 0     0 1 0 my $self = shift;
174 0         0 my %args = (
175             critical => [0 .. 5],
176             groups_of => 2,
177             accent => $self->EIGHTH,
178             note => $self->TRIPLET_SIXTEENTH,
179             @_
180             );
181 0         0 $self->alternate_note(%args);
182 0         0 $self->pan_right;
183 0         0 $self->accent_note($args{accent});
184              
185 0         0 $args{critical} = [1 .. 6];
186 0         0 $self->alternate_note(%args);
187 0         0 $self->pan_left;
188 0         0 $self->accent_note($args{accent});
189             }
190              
191              
192             sub nine_stroke_roll { # 10
193 0     0 1 0 my $self = shift;
194 0         0 my %args = (
195             critical => [0 .. 7],
196             groups_of => 2,
197             accent => $self->EIGHTH,
198             @_
199             );
200 0         0 $self->alternate_note(%args);
201 0         0 $self->pan_right;
202 0         0 $self->accent_note($args{accent});
203              
204 0         0 $args{critical} = [1 .. 8];
205 0         0 $self->alternate_note(%args);
206 0         0 $self->pan_left;
207 0         0 $self->accent_note($args{accent});
208             }
209              
210              
211             sub ten_stroke_roll { # 11
212 0     0 1 0 my $self = shift;
213 0         0 my %args = (
214             critical => [0 .. 7],
215             groups_of => 2,
216             accent => $self->EIGHTH,
217             @_
218             );
219 0         0 $self->alternate_note(%args);
220 0         0 $self->pan_right;
221 0         0 $self->accent_note($args{accent});
222 0         0 $self->pan_left;
223 0         0 $self->accent_note($args{accent});
224              
225 0         0 $args{critical} = [1 .. 8];
226 0         0 $self->alternate_note(%args);
227 0         0 $self->pan_left;
228 0         0 $self->accent_note($args{accent});
229 0         0 $self->pan_right;
230 0         0 $self->accent_note($args{accent});
231             }
232              
233              
234             sub eleven_stroke_roll { # 12
235 0     0 1 0 my $self = shift;
236 0         0 my %args = (
237             critical => [0 .. 9],
238             groups_of => 2,
239             accent => $self->EIGHTH,
240             @_
241             );
242 0         0 $self->alternate_note(%args);
243 0         0 $self->pan_right;
244 0         0 $self->accent_note($args{accent});
245              
246 0         0 $args{critical} = [1 .. 10];
247 0         0 $self->alternate_note(%args);
248 0         0 $self->pan_left;
249 0         0 $self->accent_note($args{accent});
250             }
251              
252              
253             sub thirteen_stroke_roll { # 13
254 0     0 1 0 my $self = shift;
255 0         0 my %args = (
256             critical => [0 .. 11],
257             groups_of => 2,
258             accent => $self->EIGHTH,
259             note => $self->TRIPLET_SIXTEENTH,
260             @_
261             );
262 0         0 $self->alternate_note(%args);
263 0         0 $self->pan_right;
264 0         0 $self->accent_note($args{accent});
265              
266 0         0 $args{critical} = [1 .. 12];
267 0         0 $self->alternate_note(%args);
268 0         0 $self->pan_left;
269 0         0 $self->accent_note($args{accent});
270             }
271              
272              
273             sub fifteen_stroke_roll { # 14
274 0     0 1 0 my $self = shift;
275 0         0 my %args = (
276             critical => [0 .. 13],
277             groups_of => 2,
278             accent => $self->EIGHTH,
279             @_
280             );
281 0         0 $self->alternate_note(%args);
282 0         0 $self->pan_right;
283 0         0 $self->accent_note($args{accent});
284              
285 0         0 $args{critical} = [1 .. 14];
286 0         0 $self->alternate_note(%args);
287 0         0 $self->pan_left;
288 0         0 $self->accent_note($args{accent});
289             }
290              
291              
292             sub seventeen_stroke_roll { # 15
293 0     0 1 0 my $self = shift;
294 0         0 my %args = (
295             critical => [0 .. 15],
296             groups_of => 2,
297             accent => $self->EIGHTH,
298             @_
299             );
300 0         0 $self->alternate_note(%args);
301 0         0 $self->pan_right;
302 0         0 $self->accent_note($args{accent});
303              
304 0         0 $args{critical} = [1 .. 16];
305 0         0 $self->alternate_note(%args);
306 0         0 $self->pan_left;
307 0         0 $self->accent_note($args{accent});
308             }
309              
310              
311             sub single_paradiddle { # 16
312 0     0 1 0 my $self = shift;
313 0         0 my %args = (
314             critical => [0 .. 1],
315             @_
316             );
317 0         0 $self->alternate_note(%args);
318 0         0 $self->alternate_note(%args, groups_of => 2);
319              
320 0         0 $args{critical} = [1 .. 2];
321 0         0 $self->alternate_note(%args);
322 0         0 $self->alternate_note(%args, groups_of => 2);
323             }
324              
325              
326             sub double_paradiddle { # 17
327 0     0 1 0 my $self = shift;
328 0         0 my %args = (
329             critical => [0 .. 3],
330             @_
331             );
332 0         0 $self->alternate_note(%args);
333 0         0 $args{critical} = [0 .. 1];
334 0         0 $self->alternate_note(%args, groups_of => 2);
335              
336 0         0 $args{critical} = [1 .. 4];
337 0         0 $self->alternate_note(%args);
338 0         0 $args{critical} = [1 .. 2];
339 0         0 $self->alternate_note(%args, groups_of => 2);
340             }
341              
342              
343             sub triple_paradiddle { # 18
344 0     0 1 0 my $self = shift;
345 0         0 my %args = (
346             critical => [0 .. 5],
347             @_
348             );
349 0         0 $self->alternate_note(%args);
350 0         0 $args{critical} = [0 .. 1];
351 0         0 $self->alternate_note(%args, groups_of => 2);
352              
353 0         0 $args{critical} = [1 .. 6];
354 0         0 $self->alternate_note(%args);
355 0         0 $args{critical} = [1 .. 2];
356 0         0 $self->alternate_note(%args, groups_of => 2);
357             }
358              
359              
360             sub paradiddle_diddle { # 19
361 0     0 1 0 my $self = shift;
362 0         0 my %args = (
363             critical => [0 .. 1],
364             @_
365             );
366 0         0 $self->alternate_note(%args);
367 0         0 $self->alternate_note(%args, groups_of => 2);
368              
369 0         0 $args{critical} = [1 .. 2];
370 0         0 $self->alternate_note(%args);
371 0         0 $self->alternate_note(%args, groups_of => 2);
372             }
373              
374              
375             sub flam { # 20
376 0     0 1 0 my $self = shift;
377 0         0 my %args = (
378             note => $self->EIGHTH,
379             @_
380             );
381 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
382 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
383             }
384              
385              
386             sub flam_accent { # 21
387 0     0 1 0 my $self = shift;
388 0         0 my %args = (
389             critical => [0 .. 1],
390             note => $self->EIGHTH,
391             @_
392             );
393 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
394 0         0 $self->alternate_note(%args);
395              
396 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
397 0         0 $args{critical} = [1 .. 2];
398 0         0 $self->alternate_note(%args);
399             }
400              
401              
402             sub flam_tap { # 22
403 0     0 1 0 my $self = shift;
404 0         0 my %args = (
405             note => $self->SIXTEENTH,
406             @_
407             );
408 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
409 0         0 $self->note($args{note}, $self->strike);
410              
411 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
412 0         0 $self->note($args{note}, $self->strike);
413             }
414              
415              
416             sub flamacue { # 23
417 0     0 1 0 my $self = shift;
418 0         0 my %args = (
419             note => $self->SIXTEENTH,
420             @_
421             );
422 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 0);
423 0         0 $self->pan_left;
424 0         0 $self->accent_note($args{note});
425 0         0 $self->alternate_note(critical => [0 .. 1], note => $self->EIGHTH);
426 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 0);
427              
428 0         0 $self->_flambit(PAN_LEFT, $args{note}, 0);
429 0         0 $self->pan_right;
430 0         0 $self->accent_note($args{note});
431 0         0 $self->alternate_note(critical => [1 .. 2], note => $self->EIGHTH);
432 0         0 $self->_flambit(PAN_LEFT, $args{note}, 0);
433             }
434              
435              
436             sub flam_paradiddle { # 24
437 0     0 1 0 my $self = shift;
438 0         0 my %args = (
439             note => $self->SIXTEENTH,
440             @_
441             );
442 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
443 0         0 $self->pan_left;
444 0         0 $self->note($args{note}, $self->strike);
445 0         0 $self->pan_right;
446 0         0 $self->note($args{note}, $self->strike);
447 0         0 $self->note($args{note}, $self->strike);
448              
449 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
450 0         0 $self->pan_right;
451 0         0 $self->note($args{note}, $self->strike);
452 0         0 $self->pan_left;
453 0         0 $self->note($args{note}, $self->strike);
454 0         0 $self->note($args{note}, $self->strike);
455             }
456              
457              
458             sub flammed_mill { # 25
459 0     0 1 0 my $self = shift;
460 0         0 my %args = (
461             note => $self->SIXTEENTH,
462             @_
463             );
464 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
465 0         0 $self->alternate_note(%args, critical => [1 .. 3]);
466              
467 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
468 0         0 $self->alternate_note(%args, critical => [0 .. 2]);
469              
470             }
471              
472              
473             sub flam_paradiddle_diddle { # 26
474 0     0 1 0 my $self = shift;
475 0         0 my %args = (
476             critical => [0 .. 3],
477             note => $self->SIXTEENTH,
478             @_
479             );
480 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
481 0         0 $self->pan_left;
482 0         0 $self->note($args{note}, $self->strike);
483 0         0 $self->alternate_note(%args, groups_of => 2);
484              
485 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
486 0         0 $self->pan_right;
487 0         0 $self->note($args{note}, $self->strike);
488 0         0 $args{critical} = [1 .. 4];
489 0         0 $self->alternate_note(%args, groups_of => 2);
490             }
491              
492              
493             sub pataflafla { # 27
494 0     0 1 0 my $self = shift;
495 0         0 my %args = (
496             critical => [0 .. 1],
497             note => $self->SIXTEENTH,
498             @_
499             );
500 0         0 for (@{$args{critical}}) {
  0         0  
501             # Flam tap tap Flam!
502 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
503 0         0 $self->alternate_note(%args);
504 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
505             }
506             }
507              
508              
509             sub swiss_army_triplet { # 28
510 0     0 1 0 my $self = shift;
511 0         0 my %args = (
512             critical => [0 .. 1],
513             note => $self->SIXTEENTH,
514             @_
515             );
516 0         0 for (@{$args{critical}}) {
  0         0  
517             # Flam!
518 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
519 0         0 $self->note($args{note}, $self->strike);
520 0         0 $self->pan_left;
521 0         0 $self->note($args{note}, $self->strike);
522             }
523             }
524              
525              
526             sub inverted_flam_tap { # 29
527 0     0 1 0 my $self = shift;
528 0         0 my %args = (
529             critical => [0 .. 1],
530             note => $self->TRIPLET_SIXTEENTH,
531             @_
532             );
533 0         0 for (@{$args{critical}}) {
  0         0  
534 0         0 $self->_flambit(PAN_RIGHT, $args{note}, 1);
535 0         0 $self->pan_left;
536 0         0 $self->note($args{note}, $self->strike);
537              
538 0         0 $self->_flambit(PAN_LEFT, $args{note}, 1);
539 0         0 $self->pan_right;
540 0         0 $self->note($args{note}, $self->strike);
541             }
542             }
543              
544              
545             sub flam_drag { # 30
546 0     0 1 0 my $self = shift;
547 0         0 my %args = (
548             critical => [0 .. 1],
549             note => $self->SIXTEENTH,
550             @_
551             );
552              
553 0         0 $self->_flambit(PAN_RIGHT, $self->EIGHTH, 1);
554 0         0 $self->pan_left;
555 0         0 $self->note($args{note}, $self->strike);
556 0         0 $self->note($args{note}, $self->strike);
557 0         0 $self->pan_right;
558 0         0 $self->accent_note($self->EIGHTH);
559              
560 0         0 $self->_flambit(PAN_LEFT, $self->EIGHTH, 1);
561 0         0 $self->pan_right;
562 0         0 $self->note($args{note}, $self->strike);
563 0         0 $self->note($args{note}, $self->strike);
564 0         0 $self->pan_left;
565 0         0 $self->accent_note($self->EIGHTH);
566             }
567              
568             sub _flambit {
569 0     0   0 my ($self, $direction, $note, $accent) = @_;
570              
571             # Set pan direction.
572 0 0       0 if ($direction) {
573 0         0 $self->pan_right;
574             }
575             else {
576 0         0 $self->pan_left;
577             }
578              
579             # Play a grace note.
580 0         0 $self->note($self->THIRTYSECOND, $self->strike);
581              
582             # Alternate pan direction.
583 0 0       0 if ($direction) {
584 0         0 $self->pan_left;
585             }
586             else {
587 0         0 $self->pan_right;
588             }
589              
590             # Should we accent the final note?
591 0 0       0 if ($accent) {
592 0         0 $self->accent_note($note);
593             }
594             else {
595 0         0 $self->note($note, $self->strike);
596             }
597             }
598              
599              
600             sub drag { # 31
601 0     0 1 0 my $self = shift;
602 0         0 my %args = (
603             note => $self->QUARTER,
604             @_
605             );
606 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
607 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
608             }
609              
610              
611             sub single_drag_tap { # 32
612 0     0 1 0 my $self = shift;
613 0         0 my %args = (
614             note => $self->EIGHTH,
615             @_
616             );
617              
618 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
619 0         0 $self->pan_left;
620 0         0 $self->accent_note($args{note});
621              
622 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
623 0         0 $self->pan_right;
624 0         0 $self->accent_note($args{note});
625              
626             }
627              
628              
629             sub double_drag_tap { # 33
630 0     0 1 0 my $self = shift;
631 0         0 my %args = (
632             note => $self->EIGHTH,
633             @_
634             );
635              
636 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
637 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
638 0         0 $self->pan_left;
639 0         0 $self->accent_note($args{note});
640              
641 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
642 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
643 0         0 $self->pan_right;
644 0         0 $self->accent_note($args{note});
645             }
646              
647              
648             sub lesson_25_two_and_three { # 34
649 0     0 1 0 my $self = shift;
650 0         0 my %args = (
651             note => $self->EIGHTH,
652             @_
653             );
654 0         0 $self->_dragit(PAN_RIGHT, $self->SIXTEENTH, 0);
655 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
656 0         0 $self->pan_left;
657 0         0 $self->accent_note($args{note});
658             }
659              
660              
661             sub single_dragadiddle { # 35
662 0     0 1 0 my $self = shift;
663 0         0 my %args = (
664             note => $self->SIXTEENTH,
665             @_
666             );
667              
668 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
669 0         0 $self->pan_right;
670 0         0 $self->note($args{note}, $self->strike);
671 0         0 $self->note($args{note}, $self->strike);
672              
673 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
674 0         0 $self->pan_left;
675 0         0 $self->note($args{note}, $self->strike);
676 0         0 $self->note($args{note}, $self->strike);
677             }
678              
679              
680             sub drag_paradiddle_1 { # 36
681 0     0 1 0 my $self = shift;
682 0         0 my %args = (
683             note => $self->SIXTEENTH,
684             accent => $self->EIGHTH,
685             @_
686             );
687              
688 0         0 $self->pan_right;
689 0         0 $self->accent_note($args{accent});
690 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
691 0         0 $self->pan_left;
692 0         0 $self->note($args{note}, $self->strike);
693 0         0 $self->pan_right;
694 0         0 $self->note($args{note}, $self->strike);
695 0         0 $self->note($args{note}, $self->strike);
696              
697 0         0 $self->pan_left;
698 0         0 $self->accent_note($args{accent});
699 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
700 0         0 $self->pan_right;
701 0         0 $self->note($args{note}, $self->strike);
702 0         0 $self->pan_left;
703 0         0 $self->note($args{note}, $self->strike);
704 0         0 $self->note($args{note}, $self->strike);
705              
706             }
707              
708              
709             sub drag_paradiddle_2 { # 37
710 0     0 1 0 my $self = shift;
711 0         0 my %args = (
712             note => $self->SIXTEENTH,
713             accent => $self->EIGHTH,
714             @_
715             );
716              
717 0         0 $self->pan_right;
718 0         0 $self->accent_note($args{accent});
719 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
720 0         0 $self->pan_left;
721 0         0 $self->note($args{note}, $self->strike);
722 0         0 $self->pan_right;
723 0         0 $self->note($args{note}, $self->strike);
724 0         0 $self->note($args{note}, $self->strike);
725              
726 0         0 $self->pan_left;
727 0         0 $self->accent_note($args{accent});
728 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
729 0         0 $self->pan_right;
730 0         0 $self->note($args{note}, $self->strike);
731 0         0 $self->pan_left;
732 0         0 $self->note($args{note}, $self->strike);
733 0         0 $self->note($args{note}, $self->strike);
734              
735             }
736              
737              
738             sub single_ratamacue { # 38
739 0     0 1 0 my $self = shift;
740 0         0 my %args = (
741             note => $self->TRIPLET_SIXTEENTH,
742             accent => $self->EIGHTH,
743             @_
744             );
745              
746 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
747 0         0 $self->pan_left;
748 0         0 $self->note($args{note}, $self->strike);
749 0         0 $self->pan_right;
750 0         0 $self->note($args{note}, $self->strike);
751 0         0 $self->pan_left;
752 0         0 $self->accent_note($args{accent});
753              
754 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
755 0         0 $self->pan_right;
756 0         0 $self->note($args{note}, $self->strike);
757 0         0 $self->pan_left;
758 0         0 $self->note($args{note}, $self->strike);
759 0         0 $self->pan_right;
760 0         0 $self->accent_note($args{accent});
761             }
762              
763              
764             sub double_ratamacue { # 39
765 0     0 1 0 my $self = shift;
766 0         0 my %args = (
767             note => $self->TRIPLET_SIXTEENTH,
768             accent => $self->EIGHTH,
769             @_
770             );
771              
772 0         0 $self->_dragit(PAN_RIGHT, $args{accent}, 1);
773 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
774 0         0 $self->pan_left;
775 0         0 $self->note($args{note}, $self->strike);
776 0         0 $self->pan_right;
777 0         0 $self->note($args{note}, $self->strike);
778 0         0 $self->pan_left;
779 0         0 $self->accent_note($args{accent});
780              
781 0         0 $self->_dragit(PAN_LEFT, $args{accent}, 1);
782 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
783 0         0 $self->pan_right;
784 0         0 $self->note($args{note}, $self->strike);
785 0         0 $self->pan_left;
786 0         0 $self->note($args{note}, $self->strike);
787 0         0 $self->pan_right;
788 0         0 $self->accent_note($args{accent});
789              
790             }
791              
792              
793             sub triple_ratamacue { # 40
794 0     0 1 0 my $self = shift;
795 0         0 my %args = (
796             note => $self->TRIPLET_SIXTEENTH,
797             accent => $self->EIGHTH,
798             @_
799             );
800              
801 0         0 $self->_dragit(PAN_RIGHT, $args{accent}, 0);
802 0         0 $self->_dragit(PAN_RIGHT, $args{accent}, 0);
803 0         0 $self->_dragit(PAN_RIGHT, $args{note}, 0);
804 0         0 $self->pan_left;
805 0         0 $self->note($args{note}, $self->strike);
806 0         0 $self->pan_right;
807 0         0 $self->note($args{note}, $self->strike);
808 0         0 $self->pan_left;
809 0         0 $self->accent_note($args{accent});
810              
811 0         0 $self->_dragit(PAN_LEFT, $args{accent}, 0);
812 0         0 $self->_dragit(PAN_LEFT, $args{accent}, 0);
813 0         0 $self->_dragit(PAN_LEFT, $args{note}, 0);
814 0         0 $self->pan_right;
815 0         0 $self->note($args{note}, $self->strike);
816 0         0 $self->pan_left;
817 0         0 $self->note($args{note}, $self->strike);
818 0         0 $self->pan_right;
819 0         0 $self->accent_note($args{accent});
820              
821             }
822              
823             sub _groups_of { # Beat groupings
824 8     8   12 my ($beat, $group) = @_;
825 8         524 return ($beat - 1) % $group;
826             }
827              
828             sub _dragit { # Common drag direction & accent.
829 0     0   0 my ($self, $direction, $note, $accent) = @_;
830              
831             # Set pan direction.
832 0 0       0 if ($direction) {
833 0         0 $self->pan_right;
834             }
835             else {
836 0         0 $self->pan_left;
837             }
838              
839             # Drag it!
840 0         0 $self->note($self->SIXTEENTH, $self->strike);
841 0         0 $self->note($self->SIXTEENTH, $self->strike);
842              
843             # Set pan direction.
844 0 0       0 if ($direction) {
845 0         0 $self->pan_right;
846             }
847             else {
848 0         0 $self->pan_left;
849             }
850 0         0 $self->pan_right;
851              
852             # Accented?
853 0 0       0 if ($accent) {
854 0         0 $self->accent_note($note);
855             }
856             else {
857 0         0 $self->note($note, $self->strike);
858             }
859             }
860              
861              
862             sub pan_left {
863 0     0 1 0 my $self = shift;
864 0         0 $self->pan(PAN_CENTER - $self->pan_width);
865             }
866             sub pan_center {
867 0     0 1 0 my $self = shift;
868 0         0 $self->pan(PAN_CENTER);
869             }
870             sub pan_right {
871 0     0 1 0 my $self = shift;
872 0         0 $self->pan(PAN_CENTER + $self->pan_width);
873             }
874              
875              
876             sub alternate_pan {
877 8     8 1 11 my ($self, $pan, $width) = @_;
878              
879             # Pan hard left if not given.
880 8 50       28 $pan = 0 unless defined $pan;
881              
882             # Set balance to center unless a width is given.
883 8 50       10 $width = PAN_CENTER unless defined $width;
884              
885             # Pan the stereo balance.
886 8 100       30 $self->pan( $pan ? abs($width - PAN_CENTER) : PAN_CENTER + $width );
887              
888             # Return the pan dimensions.
889 8         9 return $pan, $width;
890             }
891              
892              
893             sub alternate_note {
894 1     1 1 2 my $self = shift;
895 1         11 my %args = (
896             critical => [0, 1],
897             alternate_pan => 2,
898             groups_of => 0,
899             note => $self->SIXTEENTH,
900             accent => 0,
901             @_
902             );
903              
904             # Add single strokes with different types of pan values.
905 1         2 for my $beat (@{$args{critical}}) {
  1         8  
906             # Use a beat grouping if requested.
907 8 50       383 if ($args{groups_of}) {
    0          
908 8         15 $self->alternate_pan(_groups_of($beat, $args{groups_of}), $self->pan_width);
909             }
910             # Use beat modulo otherwise.
911             elsif ($args{alternate_pan}) {
912 0         0 $self->alternate_pan($beat % $args{alternate_pan}, $self->pan_width);
913             }
914              
915             # Add the note but accent the 1st if requested.
916 8 50 33     25 if ($beat == ($args{critical})[0] && $args{accent}) {
917 0         0 $self->accent_note($args{note});
918             }
919             else {
920 8         20 $self->note($args{note}, $self->strike);
921             }
922             }
923             }
924              
925              
926             sub single_stroke_n {
927 0     0 1   my $self = shift;
928 0           my %args = (
929             critical => [4, 8],
930             alternate_pan => 2,
931             accent => $self->EIGHTH,
932             note => $self->TRIPLET_SIXTEENTH,
933             @_
934             );
935              
936             # Assume critical beats have increasing order.
937 0           for my $beat (1 .. (@{$args{critical}})[-1]) {
  0            
938             # Alternate hands by modulo.
939 0           $self->alternate_pan($beat % $args{alternate_pan}, $self->pan_width);
940              
941             # Accent if on a critical beat.
942 0 0         if (grep { $beat == $_ } @{ $args{critical} }) {
  0            
  0            
943 0           $self->accent_note($args{accent});
944             }
945             else {
946 0           $self->note($args{note}, $self->strike);
947             }
948             }
949             }
950              
951             1;
952              
953             __END__