Advertisement
Guest User

Untitled

a guest
May 1st, 2016
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.74 KB | None | 0 0
  1. use Audio::PortMIDI;
  2. use Audio::MIDI::Note;
  3. use Music::Helpers;
  4.  
  5. sub MAIN(Str :$mode = 'major', Str :$root = 'C') {
  6. my $Mode = Mode.new(:$mode, root => ::($root));
  7.  
  8. my $pm = Audio::PortMIDI.new;
  9. my $stream = $pm.open-output(3, 32);
  10.  
  11. my $keys = Audio::MIDI::Note.new(:tempo(30), :$stream, :value(1), :velocity(85), :channel(0));
  12. my $drums = Audio::MIDI::Note.new(:tempo(30), :$stream, :value(1), :velocity(85), :channel(9));
  13. my $bass = Audio::MIDI::Note.new(:tempo(30), :$stream, :value(1), :velocity(85), :channel(2));
  14.  
  15. constant Kick = 'C3'; constant Snare = 'D3'; constant Stick = 'Cs3';
  16. constant CHat = 'Fs3'; constant HHat = 'Gs3'; constant OHat = 'As3';
  17.  
  18. my &hatloop = {
  19. .play(CHat, 1/4).play(HHat, 1/4).play(CHat, 1/4).play(HHat, 1/4)
  20. };
  21.  
  22. my &drumloop = {
  23. .aplay(CHat).play(Kick, 1/8).play(CHat, 1/8)
  24. .aplay(CHat).play(Snare, 1/8).play(CHat, 1/8)
  25. .play(CHat, 1/8).aplay(CHat).play(Kick, 1/8).aplay(CHat)
  26. .play(Snare, 1/8).play(CHat, 1/16).play(Stick, 1/16, :off)
  27. };
  28.  
  29. my @chords = $Mode.chords.eager.grep({ 2 < $_.root.octave < 4 }).pick(4);
  30.  
  31. my &chordloop = -> $note, @chords {
  32. $note.play(@chords[$++ % *].notes.map(~*).eager)
  33. };
  34.  
  35. my $key-promise = start { $keys.riff(&chordloop.assuming(*, @chords)) for ^8 };
  36. my $drum-promise = start { $drums.riff(&hatloop) for ^4 };
  37.  
  38. @chords = do [ .^can('changes-into') ?? $_."{.changes-into.pick.^shortname}"() !! $_ for @chords ];
  39.  
  40. await $drum-promise;
  41. $drum-promise = start { $drums.riff(&drumloop) for ^8 };
  42. await $key-promise;
  43. $key-promise = start { $keys.riff(&chordloop.assuming(*, @chords)) for ^8 };
  44. await $drum-promise;
  45. $drum-promise = start { $drums.riff(&hatloop) for ^4 };
  46. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement