{"id":808,"date":"2016-02-06T13:35:40","date_gmt":"2016-02-06T13:35:40","guid":{"rendered":"http:\/\/michael-edwards.org\/wp\/?p=808"},"modified":"2016-02-18T15:42:08","modified_gmt":"2016-02-18T15:42:08","slug":"using-auto-sequence-to-order-chords-part-2","status":"publish","type":"post","link":"https:\/\/michael-edwards.org\/wp\/?p=808","title":{"rendered":"using auto-sequence to order chords: part 2"},"content":{"rendered":"<p class=\"p1\"><a href=\"https:\/\/michael-edwards.org\/wp\/?p=667\">Back to part 1<\/a><\/p>\n<h2 class=\"p1\"><b>auto-sequence examples and analysis<\/b><\/h2>\n<p class=\"p1\">The following examples process a set-palette created from a harmonic reduction by <span class=\"s1\">Emilios Cambouropoulos <\/span>of Messiaen\u2019s <i>Quartet for the End of Time <\/i>(Quartet VII)<i>.*\u00a0<\/i>The examples intermingle explanations of\u00a0<i>Common Lisp <\/i>code and print statements with music notation output created directly from calls to <i>slippery chicken\u2019s<\/i> <i>Common Music Notation <\/i>(CMN) routines.<\/p>\n<p class=\"p1\">The code can also be <a href=\"http:\/\/www.michael-edwards.org\/stopen\/auto-sequence.lsp\" target=\"_blank\">downloaded<\/a> (try \u201csave link as\u201d rather than viewing the code in your browser\u2014web browsers tend to garble line breaks when showing code written in plain text). Just be sure to run <a href=\"http:\/\/michael-edwards.org\/sc\/robodoc\/utilities_lsp.html#utilities2fupdate2dapp2dsrc\" target=\"_blank\">(update-app-src) <\/a>before trying as I had to write some new code in order\u00a0to simplify these examples.<\/p>\n<p class=\"p1\">Note that in order to show what might be called the raw algorithm at work, the repeating-bass avoidance algorithm (see <a href=\"https:\/\/michael-edwards.org\/wp\/?p=667\" target=\"_blank\">part 1<\/a>) is turned off in all examples. It was however turned on for all generations of material in <i><a href=\"https:\/\/michael-edwards.org\/wp\/?p=697\" target=\"_blank\">jitterbug<\/a>.<\/i><\/p>\n<p class=\"p1\">First of all we create the\u00a0<em>set-palette\u00a0<\/em>object we&#8217;ll be interrogating:<\/p>\n<pre>;;; Reduction of the first six bars of Messiaen\u2019s Quartet for the End of Time,\r\n;;; Quartet VII*\r\n(let* ((sp (make-set-palette 'sp\r\n                             '((1 ((bf3 c4 e4 df5)))\r\n                               (2 ((bf3 df4 gf4 c5)))\r\n                               (3 ((bf3 ef3 g4 a4)))\r\n                               (4 ((g3 c4 e4 a4)))\r\n                               (5 ((e3 a3 cs4 fs4)))\r\n                               (6 ((g3 a3 cs4 bf4)))\r\n                               (7 ((g3 bf3 ef4 a4)))\r\n                               (8 ((g3 c4 e4 fs4)))\r\n                               (9 ((cs3 fs3 as3 ds4))))))\r\n       (count 0)) ; just for naming graphics files\r\n<\/pre>\n<p class=\"p1\">Next\u00a0we define two local helper functions which allow us to avoid repeating function arguments, etc.:<\/p>\n<pre>  (flet ((display (what)\r\n           (cmn-display what :include-missing-chromatic nil\r\n                        :break-line-each-set nil\r\n                        :text-y-offset 1\r\n                        :include-missing-non-chromatic nil))\r\n         (seq-map (centroid-env dissonance-env permutate)\r\n           (let ((sm (make-set-map\r\n                      (format nil \"set-map-~a\" (incf count))\r\n                      (auto-sequence sp :map-section 1 :permutate permutate\r\n                                     :dissonance-env dissonance-env\r\n                                     ;; we'll allow bass notes to repeat so we\r\n                                     ;; can see the raw algorithm at work\r\n                                     :verbose nil :repeating-bass t\r\n                                     :centroid-env centroid-env))))\r\n             (bind-palette sm sp)\r\n             sm)))\r\n    (set-sc-config 'default-spectra 'akoustik-piano-spectra)<\/pre>\n<p class=\"p1\">Now we&#8217;ll simply display the set-palette in the given order:<\/p>\n<pre> (display sp)<\/pre>\n<p class=\"p8\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-735\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/sp-1024x271.png\" alt=\"sp\" width=\"620\" height=\"164\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/sp-1024x271.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/sp-300x79.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/sp-768x203.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/sp.png 1120w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p>The following calls create printed\u00a0output for information:<\/p>\n<pre>(format t \"~&amp;*** Dissonance values ascending (default piano spectra): ~%~a\"\r\n        (calculate-dissonance sp :sort t))<\/pre>\n<pre class=\"output\">*** Dissonance values ascending (default piano spectra): \r\n(((3) 0.943890409317768d0) ((2) 0.9853051681697161d0)\r\n ((1) 1.0157344064133076d0) ((4) 1.0184718989548012d0)\r\n ((5) 1.141358173235601d0) ((7) 1.2290550594195926d0)\r\n ((8) 1.2717449079752114d0) ((6) 1.3435047613383702d0)\r\n ((9) 1.4817037428595998d0))\r\n<\/pre>\n<pre>(format t \"~&amp;Centroid values ascending: ~%~a\"\r\n        (calculate-spectral-centroid sp :sort t))\r\n<\/pre>\n<pre class=\"output\">Centroid values ascending:\r\n(((9) 540.8613295909009d0) ((5) 588.8115115588994d0)\r\n((3) 610.0100103269881d0) ((6) 621.9567770851219d0)\r\n((7) 626.8594112316986d0) ((8) 641.7953398271236d0)\r\n((4) 642.5722062493335d0) ((1) 676.9391516417646d0)\r\n((2) 689.4536760174341d0))\r\n<\/pre>\n<p class=\"p1\">We know from the above sorted spectral centroid values that if we sequence our set-palette from lowest to highest then we should get the order 9 5 3 6 7 8 4 1 2. The (0 0 100 1) envelope passed as the desired spectral centroid movement represents this as best we can with such a data type (remember that the X axis can have any arbitrary range so we\u2019re thinking in percent here; the Y axis ranges over 0.0 to 1.0, representing minimum to maximum detected values). So what we\u2019re showing in the next graphic\u00a0is that, in this instance at least, our <em>auto-sequence<\/em> method is aligned with the sorting method when using the default successive method:<\/p>\n<pre>(display (seq-map '(0 0 100 1) nil nil))<\/pre>\n<p class=\"p8\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-729\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-1-1024x281.png\" alt=\"set-map-1\" width=\"620\" height=\"170\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-1-1024x281.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-1-300x82.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-1-768x211.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-1.png 1118w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p class=\"p1\">Now we\u2019ll try the same thing with the dissonance envelope. From the printed values above, and continuing to use\u00a0the piano spectra with 12 partials by default, we know that 9 6 8 7 5 4 1 2 3 is the decreasing order of dissonance. The successive method, going down in dissonance, aligns perfectly with this:<\/p>\n<pre>(display (seq-map nil '(0 1 100 0) nil))<\/pre>\n<p class=\"p8\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-730\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-2-1024x261.png\" alt=\"set-map-2\" width=\"620\" height=\"158\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-2-1024x261.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-2-300x76.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-2-768x196.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-2.png 1111w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p class=\"p1\">Let\u2019s see what happens when we get<em> auto-sequence<\/em> to go the other way: from lowest to highest dissonance. Again, from the printed values above we know that the order of dissonance is 3 2 1 4 5 7 8 6 9. What we can see below (3 1 4 5 7 8 6 9 2) is that <em>auto-sequence\u2019s<\/em> default successive method returns something comparable, though not quite the same. The problem here, to the extent that there is\u00a0one, lies in the way the successive method chooses the set which best fits the current point in the curve, without taking a global view of where perhaps that set might be best placed over the whole duration of the curve. This goes most spectacularly wrong in the placement of set 2, which our analysis method\u00a0determined to be the 2nd most consonant set but which <em>auto-sequence<\/em> places at the very end of our ascending dissonance progression:<\/p>\n<pre>(display (seq-map nil '(0 0 100 1) nil))<\/pre>\n<p class=\"p1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-731\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-3-1024x269.png\" alt=\"set-map-3\" width=\"620\" height=\"163\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-3-1024x269.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-3-300x79.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-3-768x201.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-3.png 1113w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p class=\"p1\">This is where the question of the permutation method comes into focus. This takes permutations of all the sets from the palette and scores each ordering against the curves using a deviation method, as a form of fitness test. It returns the ordering with the best score (least deviation overall). By default it looks at 2000 permutations. This is what it\u00a0returns when trying, again, to go from lowest to highest dissonance:<\/p>\n<pre>(display (seq-map nil '(0 0 100 1) t))<\/pre>\n<p class=\"p1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-732\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-4-1024x286.png\" alt=\"set-map-4\" width=\"620\" height=\"173\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-4-1024x286.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-4-300x84.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-4-768x214.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-4.png 1115w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p class=\"p1\">Not so impressive. (Remember again that the order of dissonance from low to high is 3 2 1 4 5 7 8 6 9).<\/p>\n<p class=\"p1\">However the default 2000 permutations processed doesn\u2019t nearly cover the 362880 (9 factorial) possible permutations of our nine sets. Clearly we\u2019re missing our ideal solution in those first 2000 permutations and so we end up with a suboptimal result. What happens if we score all possible permutations?<\/p>\n<pre>(display (seq-map nil '(0 0 100 1) 'all))<\/pre>\n<h3 class=\"p1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-733\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-5-1024x275.png\" alt=\"set-map-5\" width=\"620\" height=\"167\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-5-1024x275.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-5-300x81.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-5-768x206.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-5.png 1113w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/h3>\n<h3 class=\"p1\"><b>what\u2019s wrong?<\/b><\/h3>\n<p class=\"p1\">This is significantly better, especially as set 2 is in 2nd place, as with the sorting routine, but it\u2019s still not the same result as the sorting routine. So what\u2019s going wrong? Well, nothing, actually, and that\u2019s why I\u2019ve been writing about our sequencing routines <i>aligning<\/i> with the sort routine, not being right or wrong. To put it more plainly, we\u2019re not sorting here, even when our curve is a straight line from minimum to maximum or vice-versa. What we\u2019re doing is trying to find the best sequence with relation to one or two curves, that is, the sequence which hugs the curves with the least deviation from them. When looking at the deviation scores of all permutations, the above result is indeed the closest fit we have to the dissonance curve. (The sort order is actually in place 30.) That may still sound wrong but it\u2019s all about the approach and what it is you\u2019re trying to do. If you want to sort by dissonance or spectral centroid, that\u2019s simple enough. But if you want to pass a curve with several or even many break points, the sorting routine is no longer capable (without considerable kneading) but our successive and permutation methods very much are.<\/p>\n<h3 class=\"p1\"><b>different spectra?<\/b><\/h3>\n<p class=\"p1\">Now let\u2019s go back and look at the original ordering of dissonance. Our default analysis\u2014again, using piano spectra and 12 partials\u2014places set 9 as the most dissonant. This might come as a bit of a surprise, given that it\u2019s essentially a 2nd inversion F# major triad with added sixth, a chord most jazz musicians would consider pretty consonant, at least in a different inversion. Surely set 1 for example, with its Bflat-C-Dflat or set 6, with its G-A-Bflat, are more dissonant? Well, again, thinking intervallically or functionally that may be true, but thinking and arguing spectrally for a moment, set 9 is the lowest set (as our spectral centroid analysis shows) so more of its partials will be down in the easily audible range wreaking havoc, as it were, and creating all sorts of interferences and beatings.<\/p>\n<p class=\"p1\">But what happens to the sets\u2019 dissonance values when we look at each pitch as a sine wave? The following call shows that dissonance values are overall a lot lower than those calculated from 12 partials, as we might expect when thinking spectrally, and also that set 9 has moved from first to third place in the dissonance table:<\/p>\n<pre>;; it somehow feels wrong that 9 is the most dissonant set. what happens if\r\n;; we only use 1 partial? \r\n(format t \"~&amp;Dissonance values descending with only one partial: ~%~a\" \r\n        (reverse (calculate-dissonance sp :num-partials 1 :sort t)))<\/pre>\n<pre class=\"output\">Dissonance values descending with only one partial:\r\n(((8) 0.16283403717366568d0) ((6) 0.15741114923293267d0)\r\n ((9) 0.15612688076448514d0) ((1) 0.13720045634452163d0)\r\n ((5) 0.11952484697275971d0) ((7) 0.11363826513535183d0)\r\n ((3) 0.09297959042575726d0) ((2) 0.09041846555744328d0)\r\n ((4) 0.08807535888419944d0))\r\n<\/pre>\n<p class=\"p1\">In the last\u00a0call we were still using piano spectra, albeit with only one partial playing a role in the calculations. The following shows what happens when we switch to the violin ensemble spectra, namely, pretty much nothing:<\/p>\n<pre>(set-sc-config 'default-spectra 'violin-ensemble-spectra)\r\n;; see bottom of spectra.lsp for the available spectra\r\n(format t \"~&amp;Dissonance values descending with only one partial and using ~\r\n            violin spectra: ~%~a\"\r\n    (reverse (calculate-dissonance sp :num-partials 1 :sort t)))<\/pre>\n<pre class=\"output\">Dissonance values descending with only one partial and using violin spectra:\r\n(((8) 0.15847954089203245d0) ((6) 0.1551409849509306d0)\r\n ((9) 0.15328308985631217d0) ((1) 0.13457628730614093d0)\r\n ((5) 0.11542805529804544d0) ((7) 0.11092087330375007d0)\r\n ((3) 0.09110252740542797d0) ((2) 0.08797409664316036d0)\r\n ((4) 0.08477404741277736d0))\r\n<\/pre>\n<p class=\"p1\">Yes, the dissonance values are slightly different\u2014as we would expect from the slightly different and always imperfect tunings of real instruments\u2014but the order is the same. With only one partial being used in the calculation, even on different instruments, if they\u2019re pitched instruments we would hope to get the same or close to the same ordering of dissonance for any arbitrary collection\/palette of different sets.<\/p>\n<p class=\"p1\">This raises another question: what\u2019s the situation like with the violin spectra but using 12-partials again? The following calls create this output:<\/p>\n<pre>(format t \"~&amp;Dissonance values descending with 12 partials and using ~\r\n            violin spectra: ~%~a\"\r\n        (reverse (calculate-dissonance sp :num-partials 12 :sort t)))<\/pre>\n<pre class=\"output\">Dissonance values descending with 12 partials and using violin spectra:\r\n(((8) 1.2382532227777618d0) ((1) 1.1352177902493907d0)\r\n ((6) 1.0851793051430236d0) ((9) 1.069710267705214d0)\r\n ((2) 1.048683042376949d0) ((5) 1.009007934804796d0)\r\n ((7) 0.9590334868795312d0) ((3) 0.9325752925750109d0)\r\n ((4) 0.8873721480041312d0))<\/pre>\n<p class=\"p1\">This is then reflected in our successive ordering of dissonance values from high to low using the violin spectra and the successive method:<\/p>\n<pre>(display (seq-map nil '(0 1 100 0) nil))<\/pre>\n<p class=\"p1\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-large wp-image-734\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-6-1024x274.png\" alt=\"set-map-6\" width=\"620\" height=\"166\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-6-1024x274.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-6-300x80.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-6-768x205.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/set-map-6.png 1119w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/p>\n<p class=\"p1\">This moves set 9 from third to fourth place\u2014getting closer perhaps to where our intuition would have placed it. But before we start feeling vindicated we should note that the two lowest notes of set 9 are below the violin\u2019s range so spectral data will be provided using the lowest available note (G3). This means that the relationship between the two faked lowest notes will be a perfect\u2014from the perspective of the equal tempered scale at least, which is far from perfect, but that\u2019s another story\u2014perfect 4th, instead of a slightly detuned one, which it inevitably would be if we had actual data for the two separate notes. (For example, the first partial multiplier for G3 in our violin data is 0.989; for B-flat-3 it\u2019s 1.012. If these were perfectly in tune both multipliers would be 1.0.)<\/p>\n<h3 class=\"p1\">and the moral of the story is?<\/h3>\n<p class=\"p1\">The moral of the piano vs. violin spectra story\u00a0is that dissonance values for any arbitrary set will be roughly comparable using different instruments\u2019 spectral data as long as we only look at one partial. This means that sequencing based on one partial will generally be the same no matter which pitched instrument\u2019s data we use. However, that is an artificial situation and probably not very useful for creating music. When we use 12 partials\u2019 data from different instruments we get quite significant differences in both dissonance values and therefore sequence ordering using dissonance envelopes (I leave it to the reader to experiment with the influence of different instruments&#8217; data on sequencing using spectral centroids) . So if you\u2019re going to use <em>auto-sequence<\/em> to gain practical results, use spectral data for the (types of) instruments you\u2019re writing for and, where possible, have data for the whole range of your sets. The latter point means it would probably be worthwhile using data from several instruments to cover the necessary range\u2014a hybrid spectrum, as it were.<\/p>\n<p class=\"p1\">In lieu of an overall conclusion I might answer the obvious question of why I\u2019d go to so much trouble to order a mere nine sets. Well, of course I wouldn\u2019t. The whole point of <i>auto-sequence<\/i> is to deal with significantly larger and, more importantly, algorithmically generated set-palettes, such as the one used in <i>jitterbug<\/i>\u00a0(below)<i>. <\/i>This was generated by ring modulation routines, filtered, then <em>auto-sequenced<\/em>, as documented in <a href=\"https:\/\/michael-edwards.org\/wp\/?p=697\" target=\"_blank\">another blog post<\/a> and (\u2026<i>ahem<\/i>..) <a href=\"https:\/\/sumtone.bandcamp.com\/album\/jitterbug\" target=\"_blank\">clearly audible<\/a> in the music.<\/p>\n<p class=\"p1\"><a href=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/jitterbug-set-map-1.png\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone wp-image-728 size-large\" src=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/jitterbug-set-map-1-1024x913.png\" alt=\"jitterbug-set-map\" width=\"620\" height=\"553\" srcset=\"https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/jitterbug-set-map-1-1024x913.png 1024w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/jitterbug-set-map-1-300x267.png 300w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/jitterbug-set-map-1-768x685.png 768w, https:\/\/michael-edwards.org\/wp\/wp-content\/uploads\/jitterbug-set-map-1.png 1153w\" sizes=\"auto, (max-width: 620px) 100vw, 620px\" \/><\/a><\/p>\n<hr \/>\n<p class=\"p9\"><span class=\"Apple-converted-space\">\u00a0\u00a0<\/span><span class=\"s1\">* Taken from Cambouropoulos, Emilios. \u2018The Harmonic Musical Surface and Two Novel Chord Representation Schemes\u2019. In <i>Computational Music Analysis<\/i>, edited by David Meredith, 31\u201356. Cham: Springer International Publishing, 2016. <a href=\"http:\/\/link.springer.com\/10.1007\/978-3-319-25931-4_2\" target=\"_blank\">http:\/\/link.springer.com\/10.1007\/978-3-319-25931-4_2<\/a>.<\/span><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Back to part 1 auto-sequence examples and analysis The following examples process a set-palette created from a harmonic reduction by Emilios Cambouropoulos of Messiaen\u2019s Quartet for the End of Time (Quartet VII).*\u00a0The examples intermingle explanations of\u00a0Common Lisp code and print statements with music notation output created directly from calls to slippery chicken\u2019s Common Music Notation [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":864,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2,27,11,108],"tags":[3,4,124,47,6],"class_list":["post-808","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmic-composition","category-composition","category-composition-documentation","category-slippery-chicken","tag-algorithms","tag-common-lisp","tag-jitterbug","tag-permutations","tag-slippery-chicken"],"_links":{"self":[{"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/808","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=808"}],"version-history":[{"count":31,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/808\/revisions"}],"predecessor-version":[{"id":862,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/posts\/808\/revisions\/862"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=\/wp\/v2\/media\/864"}],"wp:attachment":[{"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=808"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=808"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/michael-edwards.org\/wp\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=808"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}