<?xml version="1.0"?>
<!-- name="generator" content="blosxom/2.0" -->
<!DOCTYPE rss PUBLIC "-//Netscape Communications//DTD RSS 0.91//EN" "http://my.netscape.com/publish/formats/rss-0.91.dtd">

<rss version="0.91">
  <channel>
    <title>e dot dot dot 15 4 2026</title>
    <link>http://www.jamesraposa.com/index.cgi</link>
    <description>e dot dot dot - a mostly about the Internet weblog by James Raposa</description>
    <language>en</language>

  <item>
    <title>NAACP sues Elon Musk's xAI over Memphis data center air pollution</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___naacp_sues_elon_musk_s_xai_over_memphis_data_center_air_pollution</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Elon Musk, who is the world's richest person, has been counting on the greater Memphis area to serve as the backbone for xAI's buildout.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.cnbc.com/2026/04/14/elon-musk-xai-memphis-data-centers.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>Cramer: The market's biggest fears 'just didn't happen' - and that's why you can't leave the game</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___cramer__the_market_s_biggest_fears__just_didn_t_happen____and_that_s_why_you_can_t_leave_the_game</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;CNBC's Jim Cramer explained why bailing on stocks when things look bleak ends up hurting you in the long run. &lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.cnbc.com/2026/04/14/jim-cramer-says-the-market-rally-shows-why-you-cant-bail-on-stocks.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>Meta commits to 1 gigawatt of custom chips with Broadcom as Hock Tan decides to leave board</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___meta_commits_to_1_gigawatt_of_custom_chips_with_broadcom_as_hock_tan_decides_to_leave_board</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Meta commits to deploying 1 GW of custom in-house MTIA chips codesigned with Broadcom in sweeping new multiyear deal announced Tuesday&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.cnbc.com/2026/04/14/meta-commits-to-one-gigawatt-of-custom-chips-with-broadcom-as-hock-tan-agrees-to-leave-board.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>This simple email trick saves me from annoying marketing spam (and it's free to do)</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___this_simple_email_trick_saves_me_from_annoying_marketing_spam__and_it_s_free_to_do_</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;There's an easy way to curb ads and marketing emails in your inbox you've probably never thought of.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.zdnet.com/article/simple-email-trick-stops-marketing-spam-free/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>A data removal service helped me reclaim my privacy - see if you need one, too</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___a_data_removal_service_helped_me_reclaim_my_privacy___see_if_you_need_one__too</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Data removal services automate the removal of your information from the web, but their biggest benefit is something else.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.zdnet.com/article/is-a-data-removal-service-worthwhile-2026/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>I used the 'Plus Five' rule to fix my iPhone's slow wireless charging - here's how it works</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___i_used_the__plus_five__rule_to_fix_my_iphone_s_slow_wireless_charging___here_s_how_it_works</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Wireless charging is a helpful feature, but you may not be getting the optimal speed with your accessories. Here's what to check for.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.zdnet.com/article/plus-five-wireless-charging-rule-iphone-android-faster-speeds/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>Making an Asynchronous Clocking Drum Machine App in Perl</title>
    <link>http://www.jamesraposa.com/index.cgi/2026/04/15#auto___making_an_asynchronous_clocking_drum_machine_app_in_perl</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let&amp;rsquo;s Make a Drum Machine application! Yeah! :DThere are basically two important things to handle: A MIDI &amp;ldquo;clock&amp;rdquo; and a groove to play.Why asynchronous? Well, a simple &lt;code&gt;while (1) { Time::HiRes::sleep(); ... }&lt;/code&gt; will not do because the time between ticks will fluctuate, often dramatically. &lt;code&gt;IO::Async::Timer::Periodic&lt;/code&gt; is a great timer for this purpose. Its default scheduler uses system time, so intervals happen as close to the correct real-world time as possible.&lt;h2 id=&quot;clocks&quot;&gt;Clocks&lt;/h2&gt;A MIDI clock tells a MIDI device about the tempo. This can be handed to a drum machine or a sequencer. Each clock tick tells the device to advance a step of a measured interval. Usually this is very short, and is often 24 pulses per quarter-note (four quarter-notes to a measure of four beats).Here is code to do that, followed by an explanation of the parts:&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-perl&quot; data-lang=&quot;perl&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;#!/usr/bin/env perl&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; v5&lt;span style=&quot;color:#ae81ff&quot;&gt;.36&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; feature &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;try&amp;#39;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; IO::Async::Loop ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; IO::Async::Timer::Periodic ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::RtMidi::FFI::Device ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; shift &lt;span style=&quot;color:#f92672&quot;&gt;||&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;usb&amp;#39;&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# MIDI sequencer device&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;   &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; shift &lt;span style=&quot;color:#f92672&quot;&gt;||&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# beats per minute&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;60&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;/  /&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;24&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# time / bpm / clocks-per-beat&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;# open the named midi device for output&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; RtMidiOut&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;try { &lt;span style=&quot;color:#75715e&quot;&gt;# this will die on Windows but is needed for Mac&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;open_virtual_port(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;RtMidiOut&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;catch ($e) {}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;open_port_by_name(&lt;span style=&quot;color:#e6db74&quot;&gt;qr/\Q/&lt;/span&gt;i);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;start; &lt;span style=&quot;color:#75715e&quot;&gt;# start the sequencer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;{INT} &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;sub&lt;/span&gt; { &lt;span style=&quot;color:#75715e&quot;&gt;# halt gracefully&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    say &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;\nStop&amp;#34;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    try {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;stop; &lt;span style=&quot;color:#75715e&quot;&gt;# stop the sequencer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;panic; &lt;span style=&quot;color:#75715e&quot;&gt;# make sure all notes are off&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    catch ($e) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        warn &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;Can&amp;#39;t halt the MIDI out device: $e\n&amp;#34;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    exit;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; IO::Async::Loop&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; IO::Async::Timer::Periodic&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;   interval &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; ,&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;   on_tick  &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;sub&lt;/span&gt; { &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;clock }, &lt;span style=&quot;color:#75715e&quot;&gt;# send a clock tick!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;start;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;add();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;run;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;The above code does a few things. First it uses modern Perl, then the modules that will make execution asynchronous, and finally the module that makes real-time MIDI possible.Next up, a &lt;code&gt;&lt;/code&gt; variable is captured for a unique MIDI device. (And to see what the names of MIDI devices on the system are, use &lt;a href=&quot;https://metacpan.org/author/JBARRETT&quot;&gt;JBARRETT&lt;/a&gt;&amp;rsquo;s little &lt;a href=&quot;https://metacpan.org/release/JBARRETT/MIDI-RtMidi-FFI-0.10/source/examples/list_devices.pl&quot;&gt;list_devices&lt;/a&gt; script.) Also, the beats per minute is taken from the command-line. If neither is given, &lt;code&gt;usb&lt;/code&gt; is used for the name, and the BPM is set to &amp;ldquo;dance tempo.&amp;rdquo;The clock needs a time interval to tick off. For us, this is a fraction of a second based on the beats per minute, and is assigned to the &lt;code&gt;&lt;/code&gt; variable.To get the job done, we will need to open the named MIDI device for sending output messages to. This is done with the &lt;code&gt;&lt;/code&gt; provided.In order to not just die when we want to stop, &lt;code&gt;{INT}&lt;/code&gt; is redefined to gracefully halt. This also sends a &lt;code&gt;stop&lt;/code&gt; message to the open MIDI device. This stops the sequencer from playing.Now for the meat and potatoes: The asynchronous loop and periodic timer. These tell the program to do its thing, in a non-blocking and event-driven manner. The periodic timer ticks off a clock message every &lt;code&gt;&lt;/code&gt;. Pretty simple!As an example, here is the above code controlling my &lt;a href=&quot;https://www.korg.com/us/products/dj/volca_drum/&quot;&gt;Volca Drum&lt;/a&gt; drum machine on a stock, funky groove. We invoke it on the command-line like this:&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;perl clock-gen-async.pl&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;audio controls&gt;  &lt;source src=&quot;https://www.perl.com/media/making-an-asynchronous-clocking-drum-machine-in-perl/clocked-sequence.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;&lt;h2 id=&quot;grooves&quot;&gt;Grooves&lt;/h2&gt;What we really want is to make our drum machine actually play something of our own making. So it&amp;rsquo;s refactor time&amp;hellip; Let&amp;rsquo;s make a 4/4 time groove, with 16th-note resolution, that alternates between two different parts. &amp;ldquo;4/4&amp;rdquo; is a &amp;ldquo;time signature&amp;rdquo; in music jargon and means that there are four beats per measure (numerator), and a quarter note equals one beat (denominator). Other time signatures like the waltz&amp;rsquo;s 3/4 are simple, while odd meters like 7/8 are not.In order to generate syncopated patterns, &lt;a href=&quot;https://metacpan.org/pod/Math::Prime::XS&quot;&gt;Math::Prime::XS&lt;/a&gt; and &lt;a href=&quot;https://metacpan.org/pod/Music::CreatingRhythms&quot;&gt;Music::CreatingRhythms&lt;/a&gt; are added to the &lt;code&gt;use&lt;/code&gt; statements. &amp;ldquo;What are syncopated patterns?&amp;rdquo;, you may ask. Good question! &amp;ldquo;Syncopated&amp;rdquo; means, &amp;ldquo;characterized by displaced beats.&amp;rdquo; That is, every beat does not happen evenly, at exactly the same time. Instead, some are displaced. For example, a repeated &lt;code&gt;[1 1 1 1]&lt;/code&gt; is even and boring. But when it becomes a repeated &lt;code&gt;[1 1 0 1]&lt;/code&gt; things get spicier and more syncopated.The desired MIDI channel is added to the command-line inputs. Most commonly, this will be channel &lt;code&gt;9&lt;/code&gt; (in zero-based numbering). But some drum machines and sequencers are &amp;ldquo;multi-timbral&amp;rdquo; and use multiple channels simultaneously for individual sounds.Next we define the drums to use. This is a hash-reference that includes the MIDI patch number, the channel it&amp;rsquo;s on, and the pattern to play. The combined patterns of all the drums, when played together at tempo, make a groove.Now we compute intervals and friends. Previously, there was one &lt;code&gt;&lt;/code&gt;. Now there are a whole host of measurements to make before sending MIDI messages.Then, as before, a named MIDI output device is opened, and a graceful stop is defined.Next, a &lt;a href=&quot;https://metacpan.org/pod/Music::CreatingRhythms&quot;&gt;Music::CreatingRhythms&lt;/a&gt; object is created. And then, again as before, an asynchronous loop and periodic timer are instantiated and set in motion.The meaty bits are in the timer&amp;rsquo;s &lt;code&gt;on_tick&lt;/code&gt; callback. This contains all the logic needed to trigger our drum grooves.As was done in the previous clock code, a clock message is sent, but also we keep track of the number of clock ticks that have passed. This number of ticks is used to trigger the drums. We care about 16 beats. So every 16th beat, we construct and play a queue of events.Adjusting the drum patterns is where &lt;a href=&quot;https://metacpan.org/pod/Math::Prime::XS&quot;&gt;Math::Prime::XS&lt;/a&gt; and &lt;a href=&quot;https://metacpan.org/pod/Music::CreatingRhythms&quot;&gt;Music::CreatingRhythms&lt;/a&gt; come into play. The subroutine that does that is &lt;code&gt;adjust_drums()&lt;/code&gt; and is fired every 4th measure. A measure is equal to four quarter-notes, and we use four pulses for each, to make 16 beats per measure. This routine reassigns either Euclidean or manual patterns of 16 beats to each drum pattern.Managing the queue is next. If a drum is to be played at the current beat (as tallied by the &lt;code&gt;&lt;/code&gt; variable), it is added to the queue at full velocity (&lt;code&gt;127&lt;/code&gt;). Then, after all the drums have been accounted for, the queue is played with &lt;code&gt;-&amp;gt;note_on()&lt;/code&gt; messages. Lastly, the queue is &amp;ldquo;drained&amp;rdquo; by sending &lt;code&gt;-&amp;gt;note_off()&lt;/code&gt; messages.&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-perl&quot; data-lang=&quot;perl&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;#!/usr/bin/env perl&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; v5&lt;span style=&quot;color:#ae81ff&quot;&gt;.36&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; feature &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;try&amp;#39;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; IO::Async::Loop ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; IO::Async::Timer::Periodic ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; Math::Prime::XS &lt;span style=&quot;color:#e6db74&quot;&gt;qw(primes)&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::RtMidi::FFI::Device ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; Music::CreatingRhythms ();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; shift &lt;span style=&quot;color:#f92672&quot;&gt;||&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;usb&amp;#39;&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# MIDI sequencer device&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;   &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; shift &lt;span style=&quot;color:#f92672&quot;&gt;||&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# beats-per-minute&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; shift &lt;span style=&quot;color:#e6db74&quot;&gt;//&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# 0-15, 9=percussion, -1=multi-timbral&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    kick  &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; { num &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;36&lt;/span&gt;, chan &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; ? &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; : , pat &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;[]&lt;/span&gt; },&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    snare &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; { num &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;38&lt;/span&gt;, chan &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; ? &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt; : , pat &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;[]&lt;/span&gt; },&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    hihat &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; { num &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;42&lt;/span&gt;, chan &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; ? &lt;span style=&quot;color:#ae81ff&quot;&gt;2&lt;/span&gt; : , pat &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;[]&lt;/span&gt; },&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;16&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# beats in a measure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;4&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# divisions of a quarter-note into 16ths&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;24&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# PPQN&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;60&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;/  /&lt;/span&gt; ; &lt;span style=&quot;color:#75715e&quot;&gt;# time / bpm / ppqn&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;/&lt;/span&gt; ; &lt;span style=&quot;color:#75715e&quot;&gt;# clocks per 16th-note&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt; %primes &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; ( &lt;span style=&quot;color:#75715e&quot;&gt;# for computing the pattern&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    all  &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; [ primes() ],&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    to_5 &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; [ primes(&lt;span style=&quot;color:#ae81ff&quot;&gt;5&lt;/span&gt;) ],&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    to_7 &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; [ primes(&lt;span style=&quot;color:#ae81ff&quot;&gt;7&lt;/span&gt;) ],&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# clock ticks&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# how many beats?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# part A or B?&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt; @queue; &lt;span style=&quot;color:#75715e&quot;&gt;# priority queue for note_on/off messages&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;# open the named midi output device&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; RtMidiOut&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;try { &lt;span style=&quot;color:#75715e&quot;&gt;# this will die on Windows but is needed for Mac&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;open_virtual_port(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;RtMidiOut&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;catch ($e) {}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;open_port_by_name(&lt;span style=&quot;color:#e6db74&quot;&gt;qr/\Q/&lt;/span&gt;i);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;{INT} &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;sub&lt;/span&gt; { &lt;span style=&quot;color:#75715e&quot;&gt;# halt gracefully&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    say &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;\nStop&amp;#34;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    try {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;stop; &lt;span style=&quot;color:#75715e&quot;&gt;# stop the sequencer&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;panic; &lt;span style=&quot;color:#75715e&quot;&gt;# make sure all notes are off&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    catch ($e) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        warn &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;Can&amp;#39;t halt the MIDI out device: $e\n&amp;#34;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    exit;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#75715e&quot;&gt;# for computing the pattern&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; Music::CreatingRhythms&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; IO::Async::Loop&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; IO::Async::Timer::Periodic&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;new&lt;/span&gt;(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    interval &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; ,&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    on_tick  &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;sub&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;clock;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;++&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#66d9ef&quot;&gt;if&lt;/span&gt; ( % &lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;$&lt;/span&gt;sixteenth &lt;span style=&quot;color:#f92672&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#75715e&quot;&gt;# adjust the drum pattern every 4th measure&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#66d9ef&quot;&gt;if&lt;/span&gt; ( % &lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;($&lt;/span&gt;beats &lt;span style=&quot;color:#f92672&quot;&gt;*&lt;/span&gt; ) &lt;span style=&quot;color:#f92672&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                adjust_drums(, , &lt;span style=&quot;color:#f92672&quot;&gt;\&lt;/span&gt;%primes, &lt;span style=&quot;color:#f92672&quot;&gt;\&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#75715e&quot;&gt;# add simultaneous drums to the queue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#66d9ef&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  (keys %) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                &lt;span style=&quot;color:#66d9ef&quot;&gt;if&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{}{pat}[  % &lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;$&lt;/span&gt;beats ]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    push @queue, { drum &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; , velocity &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;127&lt;/span&gt; };&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#75715e&quot;&gt;# play the queue&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#66d9ef&quot;&gt;for&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  (@queue) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;note_on(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{ &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{drum} }{chan},&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{ &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{drum} }{num},&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{velocity}&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                );&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#f92672&quot;&gt;++&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#66d9ef&quot;&gt;else&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#75715e&quot;&gt;# drain the queue with note_off messages&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            &lt;span style=&quot;color:#66d9ef&quot;&gt;while&lt;/span&gt; (&lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; pop @queue) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;note_off(&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{ &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{drum} }{chan},&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{ &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{drum} }{num},&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                    &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;                );&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            @queue &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; (); &lt;span style=&quot;color:#75715e&quot;&gt;# ensure the queue is empty&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    },&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;start;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;add();&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;run;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;&lt;span style=&quot;color:#66d9ef&quot;&gt;sub&lt;/span&gt; &lt;span style=&quot;color:#a6e22e&quot;&gt;adjust_drums&lt;/span&gt;(, , , ) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color:#75715e&quot;&gt;# choose random primes to use by the hihat, kick, and snare&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt; ($p, $q, $r) &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; map { &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{$_}[ int rand &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{$_}&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;@&lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;]&lt;/span&gt; &lt;span style=&quot;color:#960050;background-color:#1e0010&quot;&gt;}&lt;/span&gt; sort keys %;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;if&lt;/span&gt; ($ &lt;span style=&quot;color:#f92672&quot;&gt;==&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        say &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;part A&amp;#39;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{hihat}{pat} &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;euclid($p, );&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{kick}{pat}  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;euclid($q, );&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{snare}{pat} &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;rotate_n($r, &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;euclid(&lt;span style=&quot;color:#ae81ff&quot;&gt;2&lt;/span&gt;, ));&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        $ &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# set to part B&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    &lt;span style=&quot;color:#66d9ef&quot;&gt;else&lt;/span&gt; {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        say &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;part B&amp;#39;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{hihat}{pat} &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;euclid($p, );&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{kick}{pat}  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;color:#e6db74&quot;&gt;qw(1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 1)&lt;/span&gt;];&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;{snare}{pat} &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; [&lt;span style=&quot;color:#e6db74&quot;&gt;qw(0 0 0 0 1 0 0 0 0 0 0 0 1 0 1 0)&lt;/span&gt;];&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;        $ &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# set to part A&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;(You may notice the inefficiency of attempting to drain an empty queue 23 times every 16th note. Oof! Fortunately, this doesn&amp;rsquo;t fire anything other than a single while loop condition. A more efficient solution would be to only drain the queue once, but this requires a bit more complexity that we won&amp;rsquo;t be adding, for brevity&amp;rsquo;s sake.)On Windows, this works fine:&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;perl clocked-euclidean-drums.pl &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;gs wavetable&amp;#34;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;90&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;To run with &lt;code&gt;fluidsynth&lt;/code&gt; and hear the General MIDI percussion sounds, open a fresh new terminal session, and start up &lt;code&gt;fluidsynth&lt;/code&gt; like so (mac syntax):&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;fluidsynth -a coreaudio -m coremidi -g 2.0 ~/Music/soundfont/FluidR3_GM.sf2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;The &lt;code&gt;FluidR3_GM.sf2&lt;/code&gt; is a MIDI &amp;ldquo;soundfont&amp;rdquo; file and can be downloaded for free.Next, enter this on the command-line (back in the &lt;strong&gt;previous&lt;/strong&gt; terminal session):&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;perl clocked-euclidean-drums.pl fluid &lt;span style=&quot;color:#ae81ff&quot;&gt;90&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;You will hear standard kick, snare, and closed hihat cymbal. And here is a poor recording of this with my phone:&lt;audio controls&gt;  &lt;source src=&quot;https://www.perl.com/media/making-an-asynchronous-clocking-drum-machine-in-perl/clocked-euclidean-drums-GM.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;To run the code with my multi-timbral drum machine, I enter this on the command-line:&lt;div class=&quot;highlight&quot;&gt;&lt;pre tabindex=&quot;0&quot; style=&quot;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;&quot;&gt;&lt;code class=&quot;language-shell&quot; data-lang=&quot;shell&quot;&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;perl clocked-euclidean-drums.pl usb &lt;span style=&quot;color:#ae81ff&quot;&gt;90&lt;/span&gt; -1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;And here is what that sounds like:&lt;audio controls&gt;  &lt;source src=&quot;https://www.perl.com/media/making-an-asynchronous-clocking-drum-machine-in-perl/clocked-euclidean-drums.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;&lt;h2 id=&quot;the-module&quot;&gt;The Module&lt;/h2&gt;I have coded this logic, and a bit more, into a friendly &lt;a href=&quot;https://metacpan.org/pod/Music::SimpleDrumMachine&quot;&gt;CPAN module&lt;/a&gt;. Check out the &lt;code&gt;eg/euclidean.pl&lt;/code&gt; example program in the distribution. It is a work in progress. YMMV.&lt;h2 id=&quot;credits&quot;&gt;Credits&lt;/h2&gt;Thank you to Andrew Rodland (hobbs), who helped me wrap my head around the &amp;ldquo;no-sleeping asynchronous&amp;rdquo; algorithm.&lt;h2 id=&quot;to-do-challenges&quot;&gt;To-do Challenges&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;Make patterns other than prime number based Euclidean phrases.&lt;/li&gt;&lt;li&gt;Toggle more than two groove parts.&lt;/li&gt;&lt;li&gt;Add snare fills to the (end of the) 4th bars. (&lt;a href=&quot;https://github.com/ology/Music/blob/master/clocked-euclidean-drum-fills.pl&quot;&gt;here&amp;rsquo;s my version&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;Make this code handle odd meter grooves.&lt;/li&gt;&lt;/ul&gt;&lt;h2 id=&quot;resources&quot;&gt;Resources&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;The &lt;a href=&quot;https://metacpan.org/pod/IO::Async::Loop&quot;&gt;IO::Async::Loop&lt;/a&gt; module&lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;https://metacpan.org/pod/IO::Async::Timer::Periodic&quot;&gt;IO::Async::Timer::Periodic&lt;/a&gt; module&lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;https://metacpan.org/pod/Math::Prime::XS&quot;&gt;Math::Prime::XS&lt;/a&gt; module&lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;https://metacpan.org/pod/MIDI::RtMidi::FFI::Device&quot;&gt;MIDI::RtMidi::FFI::Device&lt;/a&gt; module&lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;https://metacpan.org/pod/Music::CreatingRhythms&quot;&gt;Music::CreatingRhythms&lt;/a&gt; module&lt;/li&gt;&lt;li&gt;The &lt;a href=&quot;https://metacpan.org/pod/Music::SimpleDrumMachine&quot;&gt;Music::SimpleDrumMachine&lt;/a&gt; WIP module based on this logic&lt;/li&gt;&lt;li&gt;The cross-platform &lt;a href=&quot;https://www.fluidsynth.org/&quot;&gt;fluidsynth&lt;/a&gt; application&lt;/li&gt;&lt;li&gt;My original music: &lt;a href=&quot;https://www.youtube.com/@GeneBoggs&quot;&gt;https://www.youtube.com/@GeneBoggs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.perl.com/article/making-an-asynchronous-clocking-drum-machine-in-perl/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  </channel>
</rss>