Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- use Audio::PortMIDI;
- use Audio::MIDI::Note;
- use Music::Helpers;
- sub MAIN(Str :$mode = 'major', Str :$root = 'C') {
- my $Mode = Mode.new(:$mode, root => ::($root));
- my $pm = Audio::PortMIDI.new;
- my $stream = $pm.open-output(3, 32);
- my $keys = Audio::MIDI::Note.new(:tempo(30), :$stream, :value(1), :velocity(85), :channel(0));
- my $drums = Audio::MIDI::Note.new(:tempo(30), :$stream, :value(1), :velocity(85), :channel(9));
- my $bass = Audio::MIDI::Note.new(:tempo(30), :$stream, :value(1), :velocity(85), :channel(2));
- constant Kick = 'C3'; constant Snare = 'D3'; constant Stick = 'Cs3';
- constant CHat = 'Fs3'; constant HHat = 'Gs3'; constant OHat = 'As3';
- my &hatloop = {
- .play(CHat, 1/4).play(HHat, 1/4).play(CHat, 1/4).play(HHat, 1/4)
- };
- my &drumloop = {
- .aplay(CHat).play(Kick, 1/8).play(CHat, 1/8)
- .aplay(CHat).play(Snare, 1/8).play(CHat, 1/8)
- .play(CHat, 1/8).aplay(CHat).play(Kick, 1/8).aplay(CHat)
- .play(Snare, 1/8).play(CHat, 1/16).play(Stick, 1/16, :off)
- };
- my @chords = $Mode.chords.eager.grep({ 2 < $_.root.octave < 4 }).pick(4);
- my &chordloop = -> $note, @chords {
- $note.play(@chords[$++ % *].notes.map(~*).eager)
- };
- my $key-promise = start { $keys.riff(&chordloop.assuming(*, @chords)) for ^8 };
- my $drum-promise = start { $drums.riff(&hatloop) for ^4 };
- @chords = do [ .^can('changes-into') ?? $_."{.changes-into.pick.^shortname}"() !! $_ for @chords ];
- await $drum-promise;
- $drum-promise = start { $drums.riff(&drumloop) for ^8 };
- await $key-promise;
- $key-promise = start { $keys.riff(&chordloop.assuming(*, @chords)) for ^8 };
- await $drum-promise;
- $drum-promise = start { $drums.riff(&hatloop) for ^4 };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement