<?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 16 03 2026</title>
    <link>http://www.jamesraposa.com/index</link>
    <description>e dot dot dot - a mostly about the Internet weblog by James Raposa</description>
    <language>en</language>

  <item>
    <title>Amazon is selling Jackery's Explorer 2000 power station for 50% right now - and I can vouch for it</title>
    <link>http://www.jamesraposa.com/index/2026/03/16#auto___amazon_is_selling_jackery_s_explorer_2000_power_station_for_50__right_now___and_i_can_vouch_for_it</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Save $750 on the Explorer 2000 v2, Jackery's compact LiFePO4-powered backup power unit, perfect for in-home use, camping, and outdoor work.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.zdnet.com/article/jackery-explorer-2000-power-station-amazon-deal/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>Are free VPNs legit? I asked security experts to learn the true cost (and what services to avoid)</title>
    <link>http://www.jamesraposa.com/index/2026/03/16#auto___are_free_vpns_legit__i_asked_security_experts_to_learn_the_true_cost__and_what_services_to_avoid_</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;You want to protect your privacy, but you don't want to pay. Is the solution a free VPN? Here's what to know before subscribing to one.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.zdnet.com/article/free-vpns-what-you-need-to-know/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>Musical Rhythms with Math in Perl</title>
    <link>http://www.jamesraposa.com/index/2026/03/16#auto___musical_rhythms_with_math_in_perl</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let&amp;rsquo;s talk about music programming! There are a million aspects to this subject, but today, we&amp;rsquo;ll touch on generating rhythmic patterns with mathematical and combinatorial techniques. These include the generation of partitions, necklaces, and Euclidean patterns.Stefan and J. Richard Hollos wrote an &lt;a href=&quot;https://abrazol.com/books/rhythm1/&quot;&gt;excellent little book&lt;/a&gt; called &amp;ldquo;Creating Rhythms&amp;rdquo; that has been turned into &lt;a href=&quot;https://abrazol.com/books/rhythm1/software.html&quot;&gt;C, Perl, and Python&lt;/a&gt;. It features a number of algorithms that produce or modify lists of numbers or bit-vectors (of ones and zeroes). These can be beat onsets (the ones) and rests (the zeroes) of a rhythm. We&amp;rsquo;ll check out these concepts with Perl.For each example, we&amp;rsquo;ll save the MIDI with the &lt;a href=&quot;https://metacpan.org/pod/MIDI::Util&quot;&gt;MIDI::Util&lt;/a&gt; module. Also, in order to actually &lt;em&gt;hear&lt;/em&gt; the rhythms, we will need a MIDI synthesizer. For these illustrations, &lt;a href=&quot;https://www.fluidsynth.org/&quot;&gt;fluidsynth&lt;/a&gt; will work. Of course, any MIDI capable synth will do! I often control my eurorack analog synthesizer with code (and a MIDI interface module).Here&amp;rsquo;s how I start &lt;code&gt;fluidsynth&lt;/code&gt; on my mac in the terminal, in a &lt;em&gt;separate&lt;/em&gt; session. It uses a generic soundfont file (&lt;code&gt;sf2&lt;/code&gt;) that can be downloaded &lt;a href=&quot;https://keymusician01.s3.amazonaws.com/FluidR3_GM.zip&quot;&gt;here&lt;/a&gt; (124MB zip).&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;&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;So, how does Perl know what output port to use? There are a few ways, but with &lt;a href=&quot;https://metacpan.org/author/JBARRETT&quot;&gt;JBARRETT&lt;/a&gt;&amp;rsquo;s &lt;a href=&quot;https://metacpan.org/pod/MIDI::RtMidi::FFI::Device&quot;&gt;MIDI::RtMidi::FFI::Device&lt;/a&gt;, you can do 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;&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:#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; RtMidiIn&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 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;&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;print&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;Input devices:\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 style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;print_ports;&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;print&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;\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;&lt;span style=&quot;color:#66d9ef&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;Output devices:\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 style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;print_ports;&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;print&lt;/span&gt; &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;This shows that &lt;code&gt;fluidsynth&lt;/code&gt; is alive and ready for interaction.Okay, on with the show!First-up, let&amp;rsquo;s look at partition algorithms. With the &lt;code&gt;part()&lt;/code&gt; function, we can generate all partitions of &lt;code&gt;n&lt;/code&gt;, where &lt;code&gt;n&lt;/code&gt; is &lt;code&gt;5&lt;/code&gt;, and the &amp;ldquo;parts&amp;rdquo; all add up to &lt;code&gt;5&lt;/code&gt;. Then taking one of these (say, the third element), we convert it to a binary sequence that can be interpreted as a rhythmic phrase, and play it 4 times.&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;&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 style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; strict;&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; warnings;&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; 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; 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; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;part(&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;&lt;span style=&quot;color:#75715e&quot;&gt;# [ [ 1, 1, 1, 1, 1 ], [ 1, 1, 1, 2 ], [ 1, 2, 2 ], [ 1, 1, 3 ], [ 2, 3 ], [ 1, 4 ], [ 5 ] ]&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; $p &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[&lt;span style=&quot;color:#ae81ff&quot;&gt;2&lt;/span&gt;]; &lt;span style=&quot;color:#75715e&quot;&gt;# [ 1, 2, 2 ]&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;int2b([$p]); &lt;span style=&quot;color:#75715e&quot;&gt;# [ [ 1, 1, 0, 1, 0 ] ]&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Now we render and save the rhythm:&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;&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:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::Util &lt;span style=&quot;color:#e6db74&quot;&gt;qw(setup_score)&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; setup_score(bpm &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;, channel &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&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;for&lt;/span&gt; (&lt;span style=&quot;color:#ae81ff&quot;&gt;1&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&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;  (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[&lt;span style=&quot;color:#ae81ff&quot;&gt;0&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&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&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;n(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;, &lt;span style=&quot;color:#ae81ff&quot;&gt;40&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;r(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&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;    }&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;write_score(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;perldotcom-1.mid&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;In order to play the MIDI file that is produced, we can use &lt;code&gt;fluidsynth&lt;/code&gt; 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;&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 -i ~/Music/soundfont/FluidR3_GM.sf2 perldotcom-1.mid&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/musical-rhythms-with-math-in-perl/perldotcom-1.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;Not terribly exciting yet.Let&amp;rsquo;s see what the &amp;ldquo;compositions&amp;rdquo; of a number reveal. According to the &lt;a href=&quot;https://metacpan.org/pod/Music::CreatingRhythms&quot;&gt;Music::CreatingRhythms&lt;/a&gt; docs, a composition of a number is &amp;ldquo;the set of combinatorial variations of the partitions of &lt;code&gt;n&lt;/code&gt; with the duplicates removed.&amp;rdquo;Okay. Well, the 7 partitions of &lt;code&gt;5&lt;/code&gt; are:&lt;pre tabindex=&quot;0&quot;&gt;&lt;code&gt;[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 3], [1, 2, 2], [1, 4], [2, 3], [5]]&lt;/code&gt;&lt;/pre&gt;And the 16 compositions of &lt;code&gt;5&lt;/code&gt; are:&lt;pre tabindex=&quot;0&quot;&gt;&lt;code&gt;[[1, 1, 1, 1, 1], [1, 1, 1, 2], [1, 1, 2, 1], [1, 1, 3], [1, 2, 1, 1], [1, 2, 2], [1, 3, 1], [1, 4], [2, 1, 1, 1], [2, 1, 2], [2, 2, 1], [2, 3], [3, 1, 1], [3, 2], [4, 1], [5]]&lt;/code&gt;&lt;/pre&gt;That is, the list of compositions has, not only the partition &lt;code&gt;[1, 2, 2]&lt;/code&gt;, but also its variations: &lt;code&gt;[2, 1, 2]&lt;/code&gt; and &lt;code&gt;[2, 2, 1]&lt;/code&gt;. Same with the other partitions. Selections from this list will produce possibly cool rhythms.Here are the compositions of &lt;code&gt;5&lt;/code&gt; turned into sequences, played by a snare drum, and written to the disk:&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;&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:#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 style=&quot;color:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::Util &lt;span style=&quot;color:#e6db74&quot;&gt;qw(setup_score)&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; 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; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;compm(&lt;span style=&quot;color:#ae81ff&quot;&gt;5&lt;/span&gt;, &lt;span style=&quot;color:#ae81ff&quot;&gt;3&lt;/span&gt;); &lt;span style=&quot;color:#75715e&quot;&gt;# compositions of 5 with 3 elements&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;int2b();&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; setup_score(bpm &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;, channel &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&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;for&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;my&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&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;  (@) {&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&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;n(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;, &lt;span style=&quot;color:#ae81ff&quot;&gt;40&lt;/span&gt;); &lt;span style=&quot;color:#75715e&quot;&gt;# snare patch&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;r(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&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;    }&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;write_score(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;perldotcom-2.mid&amp;#39;&lt;/span&gt;);&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/musical-rhythms-with-math-in-perl/perldotcom-2.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;A little better. Like a syncopated snare solo.&lt;h2 id=&quot;sidebar&quot;&gt;Sidebar&lt;/h2&gt;Another way to play the MIDI file is to use &lt;a href=&quot;https://wiki.archlinux.org/title/Timidity++&quot;&gt;timidity&lt;/a&gt;. On my mac, with the soundfont specified in the &lt;code&gt;timidity.cfg&lt;/code&gt; configuration file, this would be:&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;&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;timidity -c ~/timidity.cfg -Od perldotcom-2.mid&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;To convert a MIDI file to an mp3 (or other audio formats), I do 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;&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;timidity -c ~/timidity.cfg perldotcom-2.mid -Ow -o - | ffmpeg -i - -acodec libmp3lame -ab 64k perldotcom-2.mp3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Okay. Enough technical details! What if we want a kick bass drum and hi-hat cymbals, too? Refactor time&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;&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:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::Util &lt;span style=&quot;color:#e6db74&quot;&gt;qw(setup_score)&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; 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; 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; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;compm(&lt;span style=&quot;color:#ae81ff&quot;&gt;4&lt;/span&gt;, &lt;span style=&quot;color:#ae81ff&quot;&gt;2&lt;/span&gt;); &lt;span style=&quot;color:#75715e&quot;&gt;# 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;  &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;int2b();&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;compm(&lt;span style=&quot;color:#ae81ff&quot;&gt;4&lt;/span&gt;, &lt;span style=&quot;color:#ae81ff&quot;&gt;3&lt;/span&gt;); &lt;span style=&quot;color:#75715e&quot;&gt;# kick&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;-&amp;gt;&lt;/span&gt;int2b();&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; setup_score(bpm &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;, channel &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&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;for&lt;/span&gt; (&lt;span style=&quot;color:#ae81ff&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;..&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;8&lt;/span&gt;) { &lt;span style=&quot;color:#75715e&quot;&gt;# repeats&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;-&amp;gt;&lt;/span&gt;[ int rand @ ];&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;-&amp;gt;&lt;/span&gt;[ int rand @ ];&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;for&lt;/span&gt; &lt;span style=&quot;color:#66d9ef&quot;&gt;my&lt;/span&gt; $i (&lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;..&lt;/span&gt; $#) { &lt;span style=&quot;color:#75715e&quot;&gt;# pattern position&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; @notes &lt;span style=&quot;color:#f92672&quot;&gt;=&lt;/span&gt; (&lt;span style=&quot;color:#ae81ff&quot;&gt;42&lt;/span&gt;); &lt;span style=&quot;color:#75715e&quot;&gt;# hi-hat every time&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;40&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;if&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &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&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;n(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;, @notes);&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;write_score(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;perldotcom-3.mid&amp;#39;&lt;/span&gt;);&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/musical-rhythms-with-math-in-perl/perldotcom-3.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;Here we play generated kick and snare patterns, along with a steady hi-hat.Next up, let&amp;rsquo;s look at rhythmic &amp;ldquo;necklaces.&amp;rdquo; Here we find many grooves of the world.&lt;img height=400 width=500 src=&quot;https://www.perl.com/images/musical-rhythms-with-math-in-perl/rhythm-necklaces.png&quot; alt=&quot;World rhythms&quot;&gt;Image from &lt;a href=&quot;https://cgm.cs.mcgill.ca/~godfried/publications/geometry-of-rhythm.pdf&quot;&gt;The Geometry of Musical Rhythm&lt;/a&gt;Rhythm necklaces are circular diagrams of equally spaced, connected nodes. A necklace is a lexicographical ordering with no rotational duplicates. For instance, the necklaces of &lt;code&gt;3&lt;/code&gt; beats are &lt;code&gt;[[1, 1, 1], [1, 1, 0], [1, 0, 0], [0, 0, 0]]&lt;/code&gt;. Notice that there is no &lt;code&gt;[1, 0, 1]&lt;/code&gt; or &lt;code&gt;[0, 1, 1]&lt;/code&gt;. Also, there are no rotated versions of &lt;code&gt;[1, 0, 0]&lt;/code&gt;, either.So, how many 16 beat rhythm necklaces are there?&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;&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:#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;-&amp;gt;&lt;/span&gt;neck(&lt;span style=&quot;color:#ae81ff&quot;&gt;16&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;print&lt;/span&gt; scalar @, &lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# 4116 of &amp;#39;em!&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;Okay. Let&amp;rsquo;s generate necklaces of &lt;code&gt;8&lt;/code&gt; instead, pull a random choice, and play the pattern with a percussion instrument.&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;&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:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::Util &lt;span style=&quot;color:#e6db74&quot;&gt;qw(setup_score)&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; 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:#ae81ff&quot;&gt;75&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# claves&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; 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; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;neck(&lt;span style=&quot;color:#ae81ff&quot;&gt;8&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;-&amp;gt;&lt;/span&gt;[ int rand @ ];&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; setup_score(bpm &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;, channel &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&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;for&lt;/span&gt; (&lt;span style=&quot;color:#ae81ff&quot;&gt;1&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;# repeats&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;  (@) { &lt;span style=&quot;color:#75715e&quot;&gt;# pattern position&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&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;n(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&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;        &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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;r(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&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;    }&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;write_score(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;perldotcom-4.mid&amp;#39;&lt;/span&gt;);&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/musical-rhythms-with-math-in-perl/perldotcom-4.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;Here we choose from &lt;strong&gt;all&lt;/strong&gt; necklaces. But note that this also includes the sequence with all ones and the sequence with all zeroes. More sophisticated code might skip these.More interesting would be playing simultaneous beats.&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;&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:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::Util &lt;span style=&quot;color:#e6db74&quot;&gt;qw(setup_score)&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; 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; 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; &lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;neck(&lt;span style=&quot;color:#ae81ff&quot;&gt;8&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[ int rand @ ];&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;-&amp;gt;&lt;/span&gt;[ int rand @ ];&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;-&amp;gt;&lt;/span&gt;[ int rand @ ];&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; setup_score(bpm &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;, channel &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&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;for&lt;/span&gt; (&lt;span style=&quot;color:#ae81ff&quot;&gt;1&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;# repeats&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; $i (&lt;span style=&quot;color:#ae81ff&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color:#f92672&quot;&gt;..&lt;/span&gt; $#) { &lt;span style=&quot;color:#75715e&quot;&gt;# pattern position&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; @notes;&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;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;75&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# claves&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;if&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;63&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# hi_conga&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;if&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;64&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# low_conga&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;n(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;, @notes);&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;write_score(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;perldotcom-5.mid&amp;#39;&lt;/span&gt;);&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;And that sounds like:&lt;audio controls&gt;  &lt;source src=&quot;https://www.perl.com/media/musical-rhythms-with-math-in-perl/perldotcom-5.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;How about Euclidean patterns? What are they, and why are they named for a geometer?Euclidean patterns are a set number of positions &lt;code&gt;P&lt;/code&gt; that are filled with a number of beats &lt;code&gt;Q&lt;/code&gt; that is less than or equal to &lt;code&gt;P&lt;/code&gt;. They are named for Euclid because they are generated by applying the &amp;ldquo;Euclidean algorithm,&amp;rdquo; which was originally designed to find the greatest common divisor (GCD) of two numbers, to distribute musical beats as evenly as possible.&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;&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:#66d9ef&quot;&gt;use&lt;/span&gt; MIDI::Util &lt;span style=&quot;color:#e6db74&quot;&gt;qw(setup_score)&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; 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; 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; &lt;span style=&quot;color:#ae81ff&quot;&gt;16&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;rotate_n(&lt;span style=&quot;color:#ae81ff&quot;&gt;4&lt;/span&gt;, &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 style=&quot;color:#75715e&quot;&gt;# 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;  &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(&lt;span style=&quot;color:#ae81ff&quot;&gt;2&lt;/span&gt;, ); &lt;span style=&quot;color:#75715e&quot;&gt;# kick&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;-&amp;gt;&lt;/span&gt;euclid(&lt;span style=&quot;color:#ae81ff&quot;&gt;11&lt;/span&gt;, ); &lt;span style=&quot;color:#75715e&quot;&gt;# hi-hats&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; setup_score(bpm &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;120&lt;/span&gt;, channel &lt;span style=&quot;color:#f92672&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color:#ae81ff&quot;&gt;9&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;for&lt;/span&gt; (&lt;span style=&quot;color:#ae81ff&quot;&gt;1&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;# repeats&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; $i (&lt;span style=&quot;color:#ae81ff&quot;&gt;0&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:#ae81ff&quot;&gt;1&lt;/span&gt;) { &lt;span style=&quot;color:#75715e&quot;&gt;# pattern position&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; @notes;&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;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;40&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# snare&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;if&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;36&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# kick&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;if&lt;/span&gt; (&lt;span style=&quot;color:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;[$i]) {&lt;/span&gt;&lt;/span&gt;&lt;span style=&quot;display:flex;&quot;&gt;&lt;span&gt;            push @notes, &lt;span style=&quot;color:#ae81ff&quot;&gt;42&lt;/span&gt;; &lt;span style=&quot;color:#75715e&quot;&gt;# hi-hats&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;if&lt;/span&gt; (@notes) {&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;n(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&amp;#39;&lt;/span&gt;, @notes);&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:#f92672&quot;&gt;-&amp;gt;&lt;/span&gt;r(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;en&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;    }&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;write_score(&lt;span style=&quot;color:#e6db74&quot;&gt;&amp;#39;perldotcom-6.mid&amp;#39;&lt;/span&gt;);&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/musical-rhythms-with-math-in-perl/perldotcom-6.mp3&quot; type=&quot;audio/mpeg&quot;&gt;  Your browser does not support the audio element.&lt;/audio&gt;Now we&amp;rsquo;re talkin&amp;rsquo; - an actual drum groove! To reiterate, the &lt;code&gt;euclid()&lt;/code&gt; method distributes a number of beats, like &lt;code&gt;2&lt;/code&gt; or &lt;code&gt;11&lt;/code&gt;, over the number of beats, &lt;code&gt;16&lt;/code&gt;. The kick and snare use the same arguments, but the snare pattern is rotated by 4 beats, so that they alternate.&lt;h2 id=&quot;so-what-have-we-learned-today&quot;&gt;So what have we learned today?&lt;/h2&gt;&lt;ol&gt;&lt;li&gt;That you can use mathematical functions to generate sequences to represent rhythmic patterns.&lt;/li&gt;&lt;li&gt;That you can play an entire sequence or simultaneous notes with MIDI.&lt;/li&gt;&lt;/ol&gt;&lt;h2 id=&quot;references&quot;&gt;References:&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;https://github.com/ology/Music/tree/master/mrwmip/&quot;&gt;Article repository&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://abrazol.com/books/rhythm1/&quot;&gt;Creating Rhythms book&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metacpan.org/pod/MIDI::RtMidi::FFI::Device&quot;&gt;MIDI::RtMidi::FFI::Device&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metacpan.org/pod/MIDI::Util&quot;&gt;MIDI::Util&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://metacpan.org/pod/Music::CreatingRhythms&quot;&gt;Music::CreatingRhythms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://www.fluidsynth.org/&quot;&gt;fluidsynth&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href=&quot;https://wiki.archlinux.org/title/Timidity++&quot;&gt;timidity&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/musical-rhythms-with-math-in-perl/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>JD.com takes on Amazon in Europe as China's e-commerce titans expand globally</title>
    <link>http://www.jamesraposa.com/index/2026/03/16#auto___jd_com_takes_on_amazon_in_europe_as_china_s_e_commerce_titans_expand_globally</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;JD.com is pushing same-day delivery and international brands as a way to help it compete with Amazon. &lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.cnbc.com/2026/03/16/jd-launches-joybuy-in-europe-amazon-rival.html&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  <item>
    <title>You can buy LG's premium soundbar system for nearly 50% off - Amazon Prime not required</title>
    <link>http://www.jamesraposa.com/index/2026/03/16#auto___you_can_buy_lg_s_premium_soundbar_system_for_nearly_50__off___amazon_prime_not_required</link>
    <description>Furnished content.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The LG S95TR sound system comes with a soundbar, two rear surround speakers, and a wireless subwoofer. You can pick one up for a discounted price at Amazon.&lt;br /&gt;&lt;br /&gt;Read more &lt;a class=&quot;sw_sl&quot; href=&quot;https://www.zdnet.com/article/lg-s95tr-amazon-deal/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;</description>
  </item>
  </channel>
</rss>