Godtone (talk | contribs)
m add note for readers of the code of a subtle breaking change/bugfix
Godtone (talk | contribs)
 
(45 intermediate revisions by the same user not shown)
Line 2: Line 2:
<br/>
<br/>


=== Simple ratios and where I think limits should be drawn ===
== [[User:Godtone/Bird's eye view of temperaments by accuracy|Bird's eye view of temperaments by accuracy]] (W.I.P) ==
If you want to contribute make sure the temperaments make sure to follow the format, such as specifying the exact note count needed for a set of odds separately from the smallest MOS scale that has at least or more than that number of notes. The focus is on practically-useful temperaments of general interest. Many temperaments have not yet been documented there. It's supposed to be a compilation of "cream of the crop" basically, sorted by accuracy so that you can determine your own accuracy-to-simplicity tradeoff that is best for you, but note many higher-accuracy temperaments there are simple ''despite'' being accurate, so I recommend looking at the note counts and set of targetted odds for higher-accuracy stuff first.
 
== zeta and optimal_edo_sequence ==
On a separate subpage I've shown the best scoring equal temperaments according to the zeta function, using a small modification to the code kindly provided at [[User:Sintel/Zeta plot python]]:
* [[User:Godtone/zeta]]
Whose significance is backed up by the more psychoacoustically-informed tuning metrics I've designed (<code>optimal_edo_sequence</code>s from [[#My Python 3 code]]):
* [[User:Godtone/optimal edo sequences]] (and [[User:Godtone/strict_optimal_edo_sequences]])
...as well as by my own knowledge of tuning theory.
 
== Simple ratios and where I think limits should be drawn ==
This is maybe the obvious place to start. I listen to a variety of dyads in order to judge and try to absorb their qualities and to figure out if and why I like them. My opinions of intervals have changed over time. Anyway, as all positive rationals are ratios of positive naturals (nonzero everyday numbers), I think superparticular intervals are a good place to start. I think the melodic Just Noticeable Difference is important here so that intervals have a reasonable chance at being singable, even if the harmonic JND is significantly lower (partly depending on timbre). For me a reasonable upper limit on the melodic JND is about 11 cents as more than that and I hear something as pretty definitively mistuned, although that doesn't necessarily imply unusabibility as an approximation in a low-complexity system (one with a small amount of average tones per octave). This means that in the series of superparticular intervals (of the form (n+1)/n), the first two that are too close in size to be comfortably distinguished are 14/13 and 13/12, whose difference is 169/168 or about 10.274c.
This is maybe the obvious place to start. I listen to a variety of dyads in order to judge and try to absorb their qualities and to figure out if and why I like them. My opinions of intervals have changed over time. Anyway, as all positive rationals are ratios of positive naturals (nonzero everyday numbers), I think superparticular intervals are a good place to start. I think the melodic Just Noticeable Difference is important here so that intervals have a reasonable chance at being singable, even if the harmonic JND is significantly lower (partly depending on timbre). For me a reasonable upper limit on the melodic JND is about 11 cents as more than that and I hear something as pretty definitively mistuned, although that doesn't necessarily imply unusabibility as an approximation in a low-complexity system (one with a small amount of average tones per octave). This means that in the series of superparticular intervals (of the form (n+1)/n), the first two that are too close in size to be comfortably distinguished are 14/13 and 13/12, whose difference is 169/168 or about 10.274c.
I also think that powers of 2 in the denominator of an interval, broadly/generally speaking, helps the interval feel less disorienting due to a stronger suggestion of the fundamental, so beyond 13/12, for a bit, the superparticulars of the form (2n+1)/(2n) should be prioritised. This concludes at the following superparticular intervals being of particular (no pun intended) importance to a 'general melodic semi-harmonic system':<br/>
I also think that powers of 2 in the denominator of an interval, broadly/generally speaking, helps the interval feel less disorienting due to a stronger suggestion of the fundamental, so beyond 13/12, for a bit, the superparticulars of the form (2n+1)/(2n) should be prioritised. This concludes at the following superparticular intervals being of particular (no pun intended) importance to a 'general melodic semi-harmonic system':<br/>
Line 74: Line 84:
=== Favourite EDOs ===
=== Favourite EDOs ===
DISCLAIMER: The reasonings for the EDOs I note here are guaranteed to be incomplete; EDOs are fundamentally deep systems and the more I've learned the more reasons I've found to appreciate the various EDOs I speak of here. Therefore keep in mind that whatever I say is a rude oversimplification scratching the surface of its possibilities and deep elegances. Also, I've kept my old entries and reasonings here as they were based on somewhat different ways of thinking about these things so I believe still have value; for example, I now generally quite dislike [[22edo]] (and [[archy]] generally) as an approximation to harmony but I admit there is a lot of interesting music in it and it is something a beginner should consider and which has proven value to beginners (both listeners and musicians).<br/>
DISCLAIMER: The reasonings for the EDOs I note here are guaranteed to be incomplete; EDOs are fundamentally deep systems and the more I've learned the more reasons I've found to appreciate the various EDOs I speak of here. Therefore keep in mind that whatever I say is a rude oversimplification scratching the surface of its possibilities and deep elegances. Also, I've kept my old entries and reasonings here as they were based on somewhat different ways of thinking about these things so I believe still have value; for example, I now generally quite dislike [[22edo]] (and [[archy]] generally) as an approximation to harmony but I admit there is a lot of interesting music in it and it is something a beginner should consider and which has proven value to beginners (both listeners and musicians).<br/>
12, 13, 16, 17, 19, 20, 22, 24, 26, 31, 32, 34, 36, 37, 50, 53, 58, 65 (or 130), 68, 72, 77, 80, 87, 111, 311.<br/>
12, 13, 16, 17, 19, 20, 22, 26, 27, 28, 31, 32, 34, 35, 36, 48, 50, 53, 58, 63, 65, 68, 70, 72, 77, 80, 84, 104, 111(, 124, 140, 183, 217, 224, 270, 311).<br/>
EDOs < 12 not included as usually better conceptualised in a superset of that EDO and because otherwise I'd list too many consecutive EDOs.<br/>
EDOs < 12 not included as usually better conceptualised in a superset of that EDO and because otherwise I'd list too many consecutive EDOs.<br/>
Favourite EDOs best to worst, not listed = even worse, my opinion obviously, also my opinions are still in development about many of these:<br/>
Favourite EDOs best to worst (in brackets are ones I consider to be too many notes to be useful for most people and purposes), not listed = even worse, my opinion obviously, also my opinions are still in development about many of these:<br/>
* 12: [[Pythagorean tuning|Pythagorean]] [[Meantone]]: the musical language. From a circle-of-nths relative-consistency point of view, it is very strong in the 2.3.5.19(.17) subgroup. Not to be underestimated. Has melodic hints of the 7-limit through the inaccuracy of its 5. Has been called "the [[311edo|EDO chosen by God]]" by some - I'm definitely inclined to agree in the context of casual non-xen Western music.
* 12: [[Pythagorean tuning|Pythagorean]] [[Meantone]]: the musical language. From a circle-of-nths relative-consistency point of view, it is very strong in the 2.3.5.19(.17) subgroup. Not to be underestimated. Has melodic hints of the 7-limit through the inaccuracy of its 5. Has been called "the [[311edo|EDO chosen by God]]" by some - I'm definitely inclined to agree in the context of casual non-xen Western music.
* 13: Distorted 12. As such, almost xenharmonic by definition, due to maximising opportunities for alienness. The next good EDO after 12. Dreamy scales that I like a lot but I'm not sure about if that alone means they're good to use. I hope it does as 13 has huge potential if so.
* 13: Distorted 12. As such, almost xenharmonic by definition, due to maximising opportunities for alienness. The next good EDO after 12. Dreamy scales that I like a lot but I'm not sure about if that alone means they're good to use. I hope it does as 13 has huge potential if so.
* 16: The first interesting superset of 4 other than 12. Also a [[Pelogic_family#Mavila|mavila]] tuning, not that I like Mavila too much.
* 16: The first interesting superset of 4 other than 12. Also a [[Pelogic_family#Mavila|mavila]] tuning, not that I like Mavila too much.
* 17: Notable as the first step up from 12 in colour palette. Good fifths that are slightly worse than in 12 but in the sharp direction. Kinda a bright feel. It took me a while to deduce this, but its harmonic magic lies in its 2.3.25.13.17/15(.23) subgroup, especially in the glorious neogothic/neopythagorean pentads afforded by [[fiventeen]] which is tuned excellently. Also if someone tells you 17 has ~11 ask them to prove it with harmonic examples.
* 17: Notable as the first step up from 12 in colour palette. Good fifths that are slightly worse than in 12 but in the sharp direction. Kinda a bright feel. It took me a while to deduce this, but its harmonic magic lies in its 2.3.25.13.17/15(.23) subgroup, especially in the glorious neogothic/neopythagorean pentads afforded by [[fiventeen]] which is tuned excellently. Also if someone tells you 17 has ~11 ask them to prove it with harmonic examples.
* 19: Flattish/solemn [[meantone]] tuning with xenmelodic potential. The semifourth in [[semaphore]] has a very neat sound but I wouldn't say it approximates the 7-limit. If anything, 19 is 2.3.5.37 with it representing a circle of [[37/32]]'s, thus also being the first good approximation of the 2.37 subgroup, and thus of [[37/32]], which represents probably my favourite interval of 19.
* 19'''*''': Flattish/solemn [[meantone]] tuning with xenmelodic potential. '''* As someone who is basically only interested in EDOs, I highly recommend using [[30edt|30 EDT]] instead of 19 EDO, corresponding to using a sharp-tempered octave so that [[3/1]] is just.''' The semifourth in [[semaphore]] has a very neat sound but I wouldn't say it approximates the 7-limit, and similarly the 13 is too flat, but wide voicings with octave tempering fix both of these problems! If we're speaking of the plain EDO, 19 doesn't admit a very elegant subgroup: 2.3.5.37, with it representing a circle of [[37/32]]'s, thus also being the first good approximation of the 2.37 subgroup, and thus of [[37/32]], which represents probably my favourite interval of 19. But with octave-tempering, you get 7 and 13; a big difference in filling in gaps of its harmony! (Because actually a lot of its intervals can be interpreted purely as [[5-limit]].)
* 20: The first EDO to have both the 5L5s and 4L4s symmetrical scales, and significant for that reason alone. Can sound quite atonal, however:
* 20: The first EDO to have both the 5L5s and 4L4s symmetrical scales, and significant for that reason alone. Can sound quite atonal, however:
** Its 10 EDO subset has a very strong circle of [[16/13]]'s and [[15/14]]'s.
** Its 10 EDO subset has a very strong circle of [[16/13]]'s and [[15/14]]'s.
Line 88: Line 98:
** [[10/9]] is approximated well by 3\20 and [[14/11]] is approximated well by 7\20. Has a flattish approximation of [[7/4]] and some higher (octave-reduced) harmonics but I don't think I'd use it to approximate those higher harmonics.
** [[10/9]] is approximated well by 3\20 and [[14/11]] is approximated well by 7\20. Has a flattish approximation of [[7/4]] and some higher (octave-reduced) harmonics but I don't think I'd use it to approximate those higher harmonics.
: This gives it the (additional) remarkable property that all its flavours of seconds are arguably consonant other than 1\20, which is arguably an augmented unison anyway.
: This gives it the (additional) remarkable property that all its flavours of seconds are arguably consonant other than 1\20, which is arguably an augmented unison anyway.
* 22: The first EDO that melodically approximates the 11-limit, and very tone efficient for that purpose. Sounds harmonically complex. [[Superpyth]] + [[Orwell]] tuning. Really not a fan of porcupine; it's an [[exotemperament]] (AKA "troll temperament") IMO. Use [[echidna]] if you want 22ish structure with '''''harmonic''''' approximations of the 11-limit (not just melodic).
* 22: The first EDO that melodically approximates the 11-limit, and very tone efficient for that purpose. Sounds harmonically complex. [[Superpyth]] + [[Orwell]] tuning. Really not a fan of porcupine; it's an [[exotemperament]] (AKA "troll temperament") IMO. Use [[echidna]] tuned in [[58edo]] or [[80edo]] if you want 22ish structure with '''''harmonic''''' approximations of the 11-limit (not just melodic).
* 24: I think neutral intervals and semifourths are kinda cool as an addition and unexpected root movement is cool, so acts as a nice stepping stone into microtonality with a strong base of familiarity to build off of if what you are looking for is the ''microtonal''. But I wouldn't recommend it to a beginner as there are more approachable systems that offer a healthier introduction to microtonality and (especially) xenharmony, such as (especially?) 31 EDO. I  also include it because I like highly composite EDOs, and this is very clearly one. Represents the 2.3.11.17.19.31.37 subgroup particularly well.
* <del>24</del>: I think neutral intervals and semifourths are kinda cool as an addition and unexpected root movement is cool, so acts as a nice stepping stone into microtonality with a strong base of familiarity to build off of if what you are looking for is the ''microtonal''. But I wouldn't recommend it to a beginner as there are more approachable systems that offer a healthier introduction to microtonality and (especially) xenharmony, such as (especially?) 31 EDO. If you want to introduce a beginner to xen with a superset of 12 EDO, 36 EDO and 48 EDO are great picks, the latter of which a superset, hence why I've removed this one from my list of favourite EDOs and added 48 to make up for it. Represents the 2.3.11.17.19.31.37 subgroup particularly well.
* 26: Neat for having very good 8/7's and 10/9's, both flavours of major second that I very much appreciate (while 9/8 can get pretty bland). Basically the only tuning of [[flattone]] that I'd consider using as its about as big as a flattone system should be. Note that while 19 EDO is technically also flattone, it represents the border between sharper meantones and flattone, so I do not consider it a proper (in the sense of typical/representative) example of such (for example 19 EDO trying to combine the mappings of 7 as augmented sixth and diminished seventh results in [[49/48|S7]] being tempered, which is to me harmonically almost as implausible as tempering [[25/24]], so definitely an [[exotemperament]]/"troll temperament"). Furthermore, in this tuning of flattone the minor seconds are 13/12's, thus representing a near-equal diatonic such that the minor seconds are subneutral seconds. Has the benefit of extending 13 EDO into a larger and more complete colour set and conceptual framework, creating some truly xenharmonic and xenmelodic opportunities with flattone acting as a rough roadmap back to the more familiar things. Very nice model of the 2.7.11 subgroup; in my eye, it is to the 2.7.11 subgroup as 31 EDO is to the 2.5.7 subgroup.
* 26: Neat for having very good 8/7's and 10/9's, both flavours of major second that I very much appreciate (while 9/8 can get pretty bland). Basically the only tuning of [[flattone]] that I'd consider using as its about as big as a flattone system should be. Note that while 19 EDO is technically also flattone, it represents the border between sharper meantones and flattone, so I do not consider it a proper (in the sense of typical/representative) example of such (for example 19 EDO trying to combine the mappings of 7 as augmented sixth and diminished seventh results in [[49/48|S7]] being tempered, which is to me harmonically almost as implausible as tempering [[25/24]], so definitely an [[exotemperament]]/"troll temperament"). Furthermore, in this tuning of flattone the minor seconds are 13/12's, thus representing a near-equal diatonic such that the minor seconds are subneutral seconds. Has the benefit of extending 13 EDO into a larger and more complete colour set and conceptual framework, creating some truly xenharmonic and xenmelodic opportunities with flattone acting as a rough roadmap back to the more familiar things. Very nice model of the 2.7.11 subgroup; in my eye, it is to the 2.7.11 subgroup as 31 EDO is to the 2.5.7 subgroup.
* 27: Superpyth it was more in-tune and way cooler than 22 EDO. Also the only place where I accept the harmonically challenging equivalence [[3edo|1\3]] = [[~]][[5/4]] in peace, leading to some very interesting possibilities.
* 28: A suspiciously frequent subset of ridiculously strong generalist systems like 84 EDO, 140 EDO and 84 + 140 = 224 EDO, and a champion of idiosyncratic subgroup harmonies and of interpreting the 7 EDO fifth as [[~]][[3/2]] (when justified by more notes that contextualise it as such). As a result, this is not only a good EDO with a small note count, but one endowed with magical tuning qualities. As a result, it's probably one of the only EDOs that can justify [[~]][[6/5]] = 1\4 with the right chordal/harmonic context, which is arguably important because I really like the [[4edo|1\4]] = 300{{cent}} minor third and often find it ideal (if not almost essential!) for melodically satisfying progressions moving by minor thirds.
* 31: The next EDO that melodically approximates the 11-limit, and considerably better. Extremely nice arrangement of intervals that feels weirdly intuitive and ideal. Colourful EDO. Basically ideal meantone tuning as more notes than this is overkill for meantone if you don't specifically want meantone.
* 31: The next EDO that melodically approximates the 11-limit, and considerably better. Extremely nice arrangement of intervals that feels weirdly intuitive and ideal. Colourful EDO. Basically ideal meantone tuning as more notes than this is overkill for meantone if you don't specifically want meantone.
* 32: 16 EDO with a sharp fifth. I like it primarily because of it being a power of 2. Exploration into this EDO could be interesting. 80 EDO offers a reasonably good approximation of it through a 16L16s MOSS.
* 32: 16 EDO with a sharp fifth. I like it primarily because of it being a power of 2. Exploration into this EDO could be interesting. 80 EDO offers a reasonably good approximation of it through a 16L16s MOSS.
* 34: The first good approximation of the 5-prime-limit due to being the first reasonably accurate tuning of [[Kleismic family|Hanson AKA kleismic]]. 19 is also a tuning for kleismic but feels like it doesn't do justice to the accuracy and pristineness of kleismic to me. Has the sharp 3/2's of 17 EDO, and as 17 EDO is a good colour system, 34 EDO is a natural extension. Also is a very logical "completion" of 17 due to giving a very logical 2.3.5.13.17(.23)-subgroup interpretation of the sqrt(2).sqrt(3) subgroup with some really intriguing possibilities. If you're lacking in inspiration and its wide array of supported MOSSes aren't inspiration enough, try taking a look at the diaschismic-tetracot continuum ([[2048/2025]])<sup>n</sup> / ([[20000/19683]]).
* 34: The first good approximation of the 5-prime-limit due to being the first reasonably accurate tuning of [[Kleismic family|kleismic]] and [[srutal archagall]] which are IMO the best 5-limit temperaments that observe the [[81/80|syntonic comma]]. 19 is also a tuning for kleismic but feels like it doesn't do justice to the accuracy and pristineness of kleismic to me, plus its harmonic interpretation is pretty lacking. And 22 is very obviously too high-damage for srutal archagall. Has the sharp 3/2's of 17 EDO, and as 17 EDO is a good colour system, 34 EDO is a natural extension. Also is a very logical "completion" of 17 due to giving a very logical 2.3.5.13.17(.23)-subgroup interpretation of the sqrt(2).sqrt(3) subgroup with some really intriguing possibilities. If you're lacking in inspiration and its wide array of supported MOSSes aren't inspiration enough, try taking a look at the diaschismic-tetracot continuum ([[2048/2025]])<sup>n</sup> / ([[20000/19683]]).
* 35: A subset of 140 EDO, a ridiculously strong generalist system, which endows it with magical tuning qualities.
* 36: Because of being a superset of 12, quite overlooked. It is actually a very good subgroup temperament! A natural extension of 12 EDO's colour palette, preferring to avoid the neutral and semi- intervals of 24 EDO. I should note though that while both 24 and 36 are reasonably good systems, I do not think they should be used together, as there are preferable EDOs in the high end range, such as 80 EDO.
* 36: Because of being a superset of 12, quite overlooked. It is actually a very good subgroup temperament! A natural extension of 12 EDO's colour palette, preferring to avoid the neutral and semi- intervals of 24 EDO. I should note though that while both 24 and 36 are reasonably good systems, I do not think they should be used together, as there are preferable EDOs in the high end range, such as 80 EDO.
* 37: Truly an excellent no-3's [[13-limit]] system. Ridiculously overlooked just because of its not so great approximation of prime 3 (which is at least [[5L 2s|diatonic]] and sounds convincing enough especially in context). A logical system for building on it is [[111edo]] which keeps this 13-limit mapping (but improves the 3).
* <del>37</del>: An excellent no-3's [[13-limit]] system. Very overlooked just because of its not so great approximation of prime 3 (which is at least [[5L 2s|diatonic]] and sounds convincing enough especially in context). A logical system for building on it (which I highly recommend) is [[111edo]] which keeps this 13-limit mapping (but improves the 3). I've removed it from the list however because though it should objectively be good, I hate how it sounds, which I suspect is to do with that it makes 13-limit [[porcupine]] real*, therefore I highly recommend borrowing notes from [[111edo]] liberally wherever you're not satisfied with what 37edo offers on its own. (* I hate porcupine both in terms of how it sounds and from a tuning theorist perspective, cuz you can't temper out both 100/99 and 121/120; either you conflate 11/10 with 10/9 or with 12/11, not both! And most porcupine tunings are bad because either the 6/5 or 5/4 are too out of tune so that I consider it to be too close to an [[exotemperament]]).
* 48: Strong in the no-13's no-15's no-25's no-27's no-39's 41-odd-limit add-53; overlooked superset of 12edo. It solves the biggest problem of 24edo: Having to choose every note between a black-and-white contrast between super familiar and super unfamiliar, which hampers fluid xenharmonic and xenmelodic thinking and understanding severely.
* 50: The last meantone EDO that should ever be considered because it is the last EDO to consistently map 9/8 and 10/9 to the same step and because 81/80 is a rather large comma to temper at this scale and thus costs you a lot of accuracy. It is surprisingly consistent in the higher limits, and that it is quite composite is appealing to me, especially given that it is a superset of 10 EDO.
* 50: The last meantone EDO that should ever be considered because it is the last EDO to consistently map 9/8 and 10/9 to the same step and because 81/80 is a rather large comma to temper at this scale and thus costs you a lot of accuracy. It is surprisingly consistent in the higher limits, and that it is quite composite is appealing to me, especially given that it is a superset of 10 EDO.
* 53: [[Kleismic family#Catakleismic|Catakleismic]] [[Pythagorean tuning|Pythagorean]] [[Orwell]] [[Buzzard]]. If that description doesn't sound epic I don't really know what will. Very colourful EDO. Near-perfect 5-limit JI with good 7-limit, passable 11-limit through Orwell and good no-17's 19-limit. Normally I wouldn't like large prime EDOs but this is a rare exception as in this case it's a practically perfect representation of the [[3-limit|2.3]] subgroup.
* 53: My former-favourite, now-second-favourite EDO; [[Kleismic family#Catakleismic|Catakleismic]] [[Pythagorean tuning|Pythagorean]] [[Orwell]] [[Buzzard]]. If that description doesn't sound epic I don't really know what will. Very colourful EDO. Near-perfect 5-limit JI with good 7-limit, passable 11-limit through Orwell and good no-17's 19-limit add-41, though prime 19 is dubious (in terms of whether its concordance psychoacoustically registers) in some contexts that you'd hope it'd do better in. Normally I wouldn't like large prime EDOs but this is a rare exception as in this case it's a practically perfect representation of the [[3-limit|2.3]] subgroup.
* 58: Weirdly consistent tuning with a nice selection of colours. Also supports the important 53&58 temperament [[Buzzard]]. Record in [[Pepper ambiguity]] in the 13- and 15-odd-limit. The first EDO to be consistent in the 17-odd-limit. I haven't looked at this EDO very closely but suspect it may have some surprisingly accurate/good approximations hiding under its slightly meh prime error profile. It supports hemipyth thru 16/13 = 11/9, a questionable equivalence but arguably 58 is the only EDO to make it work/make sense. I like its organisation of intervals/colours a lot.
* 58: Weirdly consistent tuning with a nice selection of colours. Also supports the important 53&58 temperament [[Buzzard]]. Record in [[Pepper ambiguity]] in the 13- and 15-odd-limit. The first EDO to be consistent in the 17-odd-limit. I haven't looked at this EDO very closely but suspect it may have some surprisingly accurate/good approximations hiding under its slightly meh prime error profile. It supports hemipyth thru 16/13 = 11/9, a questionable equivalence but arguably 58 is the only EDO to make it work/make sense. I like its organisation of intervals/colours a lot.
* 65: Very cool. Underappreciated. Good [[nestoria]] + [[wurschmidt]] tuning, but more importantly, it is in some surprisingly exact sense the "dual" to what 53 EDO's schismic offers harmonically, including the fact that its subgroup is larger and involves larger primes at the cost of some accuracy (depending on how strict you wanna be about which primes you consider approximated for the purposes of interpreting harmony). Also has a very cool superset, [[130edo]], but I implore people to explore what 65 EDO has to offer first, being 5 * 13 with lots of cool xen stuff deriving from the implications of that.
* 65: Very cool and very underappreciated dual-7's (and either no- or dual-13's) [[31-limit]] system (add-47), so very tone efficient. Good [[nestoria]] + [[wurschmidt]] + [[gravity]] + [[trisedodge]] + [[sensible]] tuning, but more importantly, it is in some surprisingly exact sense the "dual" to what 53 EDO's schismic offers harmonically, including the fact that its subgroup is larger and involves larger primes at the cost of some accuracy (depending on how strict you wanna be about which primes you consider approximated for the purposes of interpreting harmony). Also has a very cool superset, [[130edo]], but I implore people to explore what 65 EDO has to offer first because it is truly vast and you may find you don't need more, and being 5 * 13 it has lots of cool xen stuff deriving from the implications of that.
* 68: Superset of 34 that enables the 7-prime-limit. Not too remarkable for that reason alone, however my interest in this EDO was increased when I deduced that it has a step size that is close to half the size of 49/48 meaning a 7/6, an 8/7 and a semifourth can all be distinguished with accuracy. For that reason, this EDO is important as an EDO around which other EDOs have the potential for a good selection of colours which approximate these 3 intervals of interest. It also performs well as a no-11's no-29's [[31-limit]] temperament, although it shares the idiosyncracy of 80 EDO of splitting the [[81/80|syntonic comma]] into two [[64/63]]'s.
* 68: Superset of 34 that enables the 7-prime-limit. Not too remarkable for that reason alone, however my interest in this EDO was increased when I deduced that it has a step size that is close to half the size of 49/48 meaning a 7/6, an 8/7 and a semifourth can all be distinguished with accuracy. For that reason, this EDO is important as an EDO around which other EDOs have the potential for a good selection of colours which approximate these 3 intervals of interest. It also performs well as a no-11's no-29's [[31-limit]] temperament, although it shares the idiosyncracy of 80 EDO of splitting the [[81/80|syntonic comma]] into two [[64/63]]'s.
* 70: For those who want to use 140 EDO but for which that's too many notes. Dual-5's dual-7's [[17-limit system]] with many hints of higher-limit JI, as per being a subset of 140 EDO. Its fifth is very special, being the exact midpoint between 4\7 and 3\5 and being the first convergent of the approximation log2(3/2)/log2(4/3) = sqrt(2) which doesn't yield a closer approximation of pyth (the last edo to do that is 53 EDO).
* 72: [[catakleismic]] [[miracle]] [[octopus]] (among other things). If you want the [[11-limit]] in a finite number of pitches, look no further, but it even does well in the no-13's 17-limit, the full 17-limit and the full 19-limit (with a few inconsistencies in the lattermost case). Added convenience of being a superset of 12 EDO and a very composite EDO. The first true EDO to represent [[ennealimmal]] (as [[27edo]] only makes sense if you want to use superpyth and [[45edo]] is a trollish flattone tuning). The page for the keenanisma, [[385/384]], has some explanation for why this is a theoretically interesting comma for extending the [[7-limit]] to the [[11-limit]], for which 72 does very logically (among the many very logical things it does).
* 72: [[catakleismic]] [[miracle]] [[octopus]] (among other things). If you want the [[11-limit]] in a finite number of pitches, look no further, but it even does well in the no-13's 17-limit, the full 17-limit and the full 19-limit (with a few inconsistencies in the lattermost case). Added convenience of being a superset of 12 EDO and a very composite EDO. The first true EDO to represent [[ennealimmal]] (as [[27edo]] only makes sense if you want to use superpyth and [[45edo]] is a trollish flattone tuning). The page for the keenanisma, [[385/384]], has some explanation for why this is a theoretically interesting comma for extending the [[7-limit]] to the [[11-limit]], for which 72 does very logically (among the many very logical things it does).
* 77: Very good (and elegant) high-limit system. See [[#Important 23-limit EDOs]]. I overlooked this one. Supports the rudely-named [[absurdity]] temperament, which is ironically very reasonable if not in some senses ideal for modelling higher-limit harmony.
* 77: Very good (and elegant) high-limit system. See [[#Important 23-limit EDOs]]. I overlooked this one. Supports the rudely-named [[absurdity]] temperament, which is ironically very reasonable if not in some senses ideal for modelling higher-limit harmony.
* 80: My former favourite EDO. In the past, my favourite was 53 EDO. Now I am leaning again to 53 EDO as my favourite but honestly there are so many seriously good EDOs that it feels unfair to single one out. 80 EDO may be a surprising choice for former favourite at first but there are a lot of reasons feeding into it which means if you don't get it it means you're probably underestimating it and haven't looked closely enough (I don't mean this as some way of trying to impose my opinion; there is a lot of exceptional properties that 80 EDO is hiding of many natures). Tunes [[Tolermic family|17-limit Tolermic]], a strange temperament which tempers many commas I'm interested in tempering; in fact there is a strange intuitiveness to 80 EDO's tempering. The highly complex 80&311 temperament [[superlimmal]] is of note as being essentially a no-31's 37- or 41-limit temperament.
* 80: My favourite EDO by a small margin. In the past, my favourite was 53 EDO. Now I am leaning again to 53 EDO as my favourite but honestly there are so many seriously good EDOs that it feels unfair to single one out. 80 EDO may be a surprising choice for former favourite at first but there are a lot of reasons feeding into it which means if you don't get it it means you're probably underestimating it and haven't looked closely enough (I don't mean this as some way of trying to impose my opinion; there is a lot of exceptional properties that 80 EDO is hiding of many natures). Tunes [[Tolermic family|17-limit Tolermic]], a strange temperament which tempers many commas I'm interested in tempering; in fact there is a strange intuitiveness to 80 EDO's tempering. The highly complex 80&311 temperament [[superlimmal]] is of note as being essentially a no-31's 37- or 41-limit temperament.
* 87: A good approximation of the 13-limit, with the 5-limit also good, and an alternative Tolermic tuning, so it's closely related to 80 EDO but with better fifths and harmonic sevenths. Compared to 80 EDO, 7/4 is still the worst prime but lower in both absolute and relative error, and it is tuned flatly instead of sharply. My former "final and most colourful EDO", but 80 EDO is more than enough colours for me in that it covers all the colours I'd want from 87 and in ways I prefer and find more intuitive. Has an interesting conceptualisation as 29 EDO representing an approximate 2.3 subgroup with 5, 7, 11 and 13 all being 1\87 flat of the 29 EDO circle, providing an elegant model of navigation. 29 EDO is itself not bad as something that sounds like a brighter 12 EDO, but it feels more elegantly and interestingly conceptualised in this superset.
* 84: Extremely overlooked high-limit generalist, part of a "trio" of such systems (high-limit generalists that also do reasonably (and sometimes exceptionally) well for most if not all of [[LCJI]] as well, AKA "truly general-purpose systems" (up to taste)), which are {77, 80, 84}.
* 111: an absurdly elegant system from a tempering perspective in the sheer wealth and intuitiveness of equivalences it affords you; so much so that it sacrifices tuning accuracy for temperamental beauty and efficiency. One of a kind EDO.
* 111: An absurdly elegant system from a tempering perspective in the sheer wealth and intuitiveness of equivalences it affords you; so much so that it sacrifices tuning accuracy for temperamental beauty and efficiency. This makes it a one of a kind EDO because it is basically ''the ideal'' hemicomma-precision EDO.
* 140: Extremely overlooked LCJI and high-limit generalist. The tuning and structure of the 17-limit is ridiculously elegant, and it performs so well in such a huge range of large odd-limits (talking from 19 all the way through to at least '''''125''''') that I suspect its intervals actually transcend a consistency-based mindset and elevate an "opportunistic and impressionistic harmony"-based mindset, a feature it shares with [[80edo]].
* 224: I suspect this is a very strong EDO but I honestly don't know much about it, so I'll leave it here in case others want to investigate its higher-limit capabilities more deeply.
* 270: For a long time, I overlooked this EDO because I thought it was just "very accurate [[13-limit]]" (for which [[140edo]] is far more desirable) with a few bonus harmonies, but in fact it's a full 53-limit system that is a worthy competitor to 311, discussed next.
* 311: If you asked God what his favourite EDO was, he would say [[311edo|311 EDO]]. It is almost unsettling how much of the harmonic series this EDO approximates well considering its comparatively small size. Very recommendable alternative to cents for low-complexity (in the sense of integer- or odd-limited) JI, as this EDO is not only consistent in the ''full'' 41-odd-limit, but ''many'' (mainly non-prime) odd harmonics greater than 41 can be added to the set without causing inconsistencies between them and other odd harmonics. I wonder if a precise JI harmonic series singer would implicitly target notes of 311 EDO in both singing and in their conceptualisation of JI. I find describing the prime subgroup interpretation of this EDO rather amusing, so here it is: 2.3.5.7.11.13.17.19.23.29.31.37.41.73.89.109.113. Note that as 89, 109 and 113 aren't as accurate as 73, so they could arguably be omitted because of their combination of complexity and inaccuracy. Fun fact: in Group Theory (a subfield of Abstract Algebra), excepting 37, all the primes up to and including 41 appear in the prime factorisation of the order of the Monster Group. The largest prime to appear in its factorisation is 71, the prime just before 73, which is the first prime after 41 that 311 EDO approximates well.
* 311: If you asked God what his favourite EDO was, he would say [[311edo|311 EDO]]. It is almost unsettling how much of the harmonic series this EDO approximates well considering its comparatively small size. Very recommendable alternative to cents for low-complexity (in the sense of integer- or odd-limited) JI, as this EDO is not only consistent in the ''full'' 41-odd-limit, but ''many'' (mainly non-prime) odd harmonics greater than 41 can be added to the set without causing inconsistencies between them and other odd harmonics. I wonder if a precise JI harmonic series singer would implicitly target notes of 311 EDO in both singing and in their conceptualisation of JI. I find describing the prime subgroup interpretation of this EDO rather amusing, so here it is: 2.3.5.7.11.13.17.19.23.29.31.37.41.73.89.109.113. Note that as 89, 109 and 113 aren't as accurate as 73, so they could arguably be omitted because of their combination of complexity and inaccuracy. Fun fact: in Group Theory (a subfield of Abstract Algebra), excepting 37, all the primes up to and including 41 appear in the prime factorisation of the order of the Monster Group. The largest prime to appear in its factorisation is 71, the prime just before 73, which is the first prime after 41 that 311 EDO approximates well.


Line 196: Line 214:


==== Generalised colours of supertonics, subtonics, leads and contraleads ====
==== Generalised colours of supertonics, subtonics, leads and contraleads ====
Note: This scheme is a bit idiosyncratic and is instead intuitive in nature; specifically, a more systematic view would usually consider 11/10 as a submajor second, and 10/9 as a major second, but here I interpreted 11/10 instead as a sharp flavour of neutral.
<pre>
<pre>
inframinor (AKA 'ultraminor') second aka one quarter-tone: (many things)
inframinor (AKA 'ultraminor') second aka one quarter-tone: (many things)
Line 266: Line 285:
...
...
</pre>
</pre>
==== 87 EDO interval colours/types (seconds and thirds) ====
<pre>
<pre>
80 EDO MOSS gens table:
41.4c fifth-tone
 
55.2c ultraminor (AKA quarter-tone)
(1\10: 120c)
69.0c subminor (AKA third-tone)
(~1\9: 135c (~~8L1s))
82.8c neominor
(1\8: 150c)
96.6c novaminor
7L1s: 165c
110.3c minor
6L1s: 180c (7L6s) (note 195c (6L7s) is extreme with L/s=6.5)
124.1c supraminor
5L1s: 210c (6L5s), 225c (5L6s)
137.9c subneutral (AKA minor neutral)
(1\5: 240c)
151.7c superneutral (AKA major neutral)
5L4s: 255c
165.5c submajor
4L5s: 270c, 285c
179.3c major
(1\4: 300c)
193.1c novamajor
4L7s: 315c
206.9c neomajor
(~~1\11: 330c (~7L4s))
220.7c supermajor
7L3s: 345c
234.5c ultramajor
3L4s: 360c
248.3c semifourth
3L7s: 375c, 390c
262.1c ultraminor
3L8s: 405c, 420c, 435c (all also ofc 3L5s; biased to 435c)
275.9c subminor
(3\8: 450c)
289.7c neominor
5L3s: 465c
303.4c novaminor
(2\5: 480c)
317.2c minor
5L2s: 495c, 510c
331.0c supraminor
7L2s: 525c
344.8c subneutral
2L7s: 540c, 555c, 570c, 585c (all also ofc 2L5s; biased to 540c)
358.6c superneutral
</pre>
372.4c submajor
 
386.2c major
==== RINGER 80 ====
400.0c novamajor
80 EDO is a great no-limit system for conceptualising and internalising harmonic series interval categories/structures through '''RINGER 80''' which contains the entirety of the no-127's no-135's no-141's 145-odd-limit and in which ~84.44% of all intervals present are mapped consistently. This '''RINGER 80''' uses the best-performing val for 125-odd-limit consistency by various metrics (squared error, sum of error, number of inconsistencies, number of inconsistencies if we require <25% error, etc.). To achieve the CS ([[constant structure]]) property, the primes '''31, 47, 53, 61, 67, 73, 79, 107, 109''' are sharpened by 1 step compared to their flat patent val mapping (AKA are mapped to their second-best mapping); all other primes are patent val. This scale has a few remarkable properties. Firstly, all the intervals that are not inconsistent are mapped - at worst - to their second-best mapping, meaning you will never have a categorical/interval mapping exceeding 15 cents (which seems like a very reasonable result for a RINGER scale). Secondly, all of the "filler harmonics" beyond the 125-odd-limit fit in an obvious way; note how there are no warts beyond the 113-prime-limit (which the 125-odd-limit corresponds to due to a '''record prime gap''' from 113 to 127) meaning all composite harmonics were either already part of the 113-prime-limit or if prime the primes were patent val and sharp-tending. "In an obvious way" also means that every superparticular '''(n+1)/n''' in the 125-odd-limit that was mapped to 2 steps is split into '''(2n+2)/(2n+1)''' and '''(2n+1)/(2n)''', retaining the lowest possible complexity. Finally, note that while composite odd harmonics start going missing after the 125th harmonic, that prime harmonics are very much not lacking. This scale exists inside the no-127's no-151's no-163's 179-prime-limit, meaning that '''all primes up to and including 179''' are present excepting those three, making it full of prime flavour (on top of its high compositeness due to the 125-odd-limit corresponding to a record-prime-gap). My only personal qualm with this scale is that prime 73 is not patent val when I'd like it to be, but keeping it warted allows the introduction of the 145th harmonic which adds a lot of low-complexity and consistent intervals, and not warting it means no longer using the best-performing mapping and using the "147.2th" harmonic instead of the much-preferable "145th". Specifically, all intervals made in ratio with the 145th harmonic that simplify are mapped consistently. Furthermore, warting prime 73 means that 73/63 is mapped correctly as an extremely accurate approximation of the 255c semifourth (80 EDO is a circle of 73/63's). Finally, its worth noting that I used [[#My_Python_3_code]] to find and hone this scale.
413.8c neomajor
427.6c supermajor
441.4c ultramajor
455.2c semisixth
</pre>
== Miscellaneous ==
==== 80 EDO MOSS gens table ====
<pre>
<pre>
mode 63 of the harmonic series (corresponding to 125-odd-limit) with added odds from mode 63*2=126 in square brackets:
80 EDO MOSS gens table:
63:64:[129]:65:[131]:66:[133]:67:68:[137]:69:[139]:70:71:[143]:72:[145]:73:74:[149]
75:76:[153]:77:78:[157]:79:80:[161]:81:82:83:[167]:84:85:86:[173]:87:88:89
[179]:90:91:92:[185]:93:94:95:96:97:[195]:98:99:100:101:102:103:104:[209]:105
106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123:124:125(:126)
(the above is split into 20 harmonics per line AKA ~300c worth of harmonic content)


in lowest terms as a /105 scale (corresponding to a primodal /107, /109 or /113 first-octave scale or to a primodal /53 or /59 second-octave scale or even to a primodal /29 third-octave scale or /7 fifth-octave scale):
(1\10: 120c)
105:106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123:124:125:126:128:129:130:131:132:133:134:136:137:138:139:140:142:143:144:145:146:148:149:150:152:153:154:156:157:158:160:161:162:164:166:167:168:170:172:173:174:176:178:179:180:182:184:185:186:188:190:192:194:195:196:198:200:202:204:206:208:209:210
(~1\9: 135c (~~8L1s))
</pre>
(1\8: 150c)
 
7L1s: 165c
==== 87 EDO interval colours/types (seconds and thirds) ====
6L1s: 180c (7L6s) (note 195c (6L7s) is extreme with L/s=6.5)
<pre>
5L1s: 210c (6L5s), 225c (5L6s)
41.4c fifth-tone
(1\5: 240c)
55.2c ultraminor (AKA quarter-tone)
5L4s: 255c
69.0c subminor (AKA third-tone)
4L5s: 270c, 285c
82.8c neominor
(1\4: 300c)
96.6c novaminor
4L7s: 315c
110.3c minor
(~~1\11: 330c (~7L4s))
124.1c supraminor
7L3s: 345c
137.9c subneutral (AKA minor neutral)
3L4s: 360c
151.7c superneutral (AKA major neutral)
3L7s: 375c, 390c
165.5c submajor
3L8s: 405c, 420c, 435c (all also ofc 3L5s; biased to 435c)
179.3c major
(3\8: 450c)
193.1c novamajor
5L3s: 465c
206.9c neomajor
(2\5: 480c)
220.7c supermajor
5L2s: 495c, 510c
234.5c ultramajor
7L2s: 525c
248.3c semifourth
2L7s: 540c, 555c, 570c, 585c (all also ofc 2L5s; biased to 540c)
262.1c ultraminor
275.9c subminor
289.7c neominor
303.4c novaminor
317.2c minor
331.0c supraminor
344.8c subneutral
358.6c superneutral
372.4c submajor
386.2c major
400.0c novamajor
413.8c neomajor
427.6c supermajor
441.4c ultramajor
455.2c semisixth
</pre>
</pre>


== MOSS names i think are pretty ==
==== RINGER 80 ====
Note: I am only considering octave-period MOSSes here. Table is an edited version of the standardised version at [[TAMNAMS#Mos_pattern_names]]. I made a few small changes of personal preference:
80 EDO is a great no-limit system for conceptualising and internalising harmonic series interval categories/structures through '''RINGER 80''' which contains the entirety of the no-127's no-135's no-141's 145-odd-limit and in which ~84.44% of all intervals present are mapped consistently. This '''RINGER 80''' uses the best-performing val for 125-odd-limit consistency by various metrics (squared error, sum of error, number of inconsistencies, number of inconsistencies if we require <25% error, etc.). To achieve the CS ([[constant structure]]) property, the primes '''31, 47, 53, 61, 67, 73, 79, 107, 109''' are sharpened by 1 step compared to their flat patent val mapping (AKA are mapped to their second-best mapping); all other primes are patent val. This scale has a few remarkable properties. Firstly, all the intervals that are not inconsistent are mapped - at worst - to their second-best mapping, meaning you will never have a categorical/interval mapping exceeding 15 cents (which seems like a very reasonable result for a RINGER scale). Secondly, all of the "filler harmonics" beyond the 125-odd-limit fit in an obvious way; note how there are no warts beyond the 113-prime-limit (which the 125-odd-limit corresponds to due to a '''record prime gap''' from 113 to 127) meaning all composite harmonics were either already part of the 113-prime-limit or if prime the primes were patent val and sharp-tending. "In an obvious way" also means that every superparticular '''(n+1)/n''' in the 125-odd-limit that was mapped to 2 steps is split into '''(2n+2)/(2n+1)''' and '''(2n+1)/(2n)''', retaining the lowest possible complexity. Finally, note that while composite odd harmonics start going missing after the 125th harmonic, that prime harmonics are very much not lacking. This scale exists inside the no-127's no-151's no-163's 179-prime-limit, meaning that '''all primes up to and including 179''' are present excepting those three, making it full of prime flavour (on top of its high compositeness due to the 125-odd-limit corresponding to a record-prime-gap). My only personal qualm with this scale is that prime 73 is not patent val when I'd like it to be, but keeping it warted allows the introduction of the 145th harmonic which adds a lot of low-complexity and consistent intervals, and not warting it means no longer using the best-performing mapping and using the "147.2th" harmonic instead of the much-preferable "145th". Specifically, all intervals made in ratio with the 145th harmonic that simplify are mapped consistently. Furthermore, warting prime 73 means that 73/63 is mapped correctly as an extremely accurate approximation of the 255c semifourth (80 EDO is a circle of 73/63's). Finally, its worth noting that I used [[#My_Python_3_code]] to find and hone this scale.
 
<pre>
* [[4L 1s]] I call "pentoid" after [[Bug_family#Pentoid|the 11-limit 4&5 exotemperament]] for which practically the entire tuning range of the MOSS is valid due to its impractically low accuracy/high damage (this is evidenced by it also being supported by patent val in EDOs 4+5=9 (the basic tuning) and 4+5+4=14 (the hard tuning), and by the 13b val (the soft tuning) where you take the (only barely) second-best fifth).
mode 63 of the harmonic series (corresponding to 125-odd-limit) with added odds from mode 63*2=126 in square brackets:
 
63:64:[129]:65:[131]:66:[133]:67:68:[137]:69:[139]:70:71:[143]:72:[145]:73:74:[149]
75:76:[153]:77:78:[157]:79:80:[161]:81:82:83:[167]:84:85:86:[173]:87:88:89
[179]:90:91:92:[185]:93:94:95:96:97:[195]:98:99:100:101:102:103:104:[209]:105
106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123:124:125(:126)
(the above is split into 20 harmonics per line AKA ~300c worth of harmonic content)
 
in lowest terms as a /105 scale (corresponding to a primodal /107, /109 or /113 first-octave scale or to a primodal /53 or /59 second-octave scale or even to a primodal /29 third-octave scale or /7 fifth-octave scale):
105:106:107:108:109:110:111:112:113:114:115:116:117:118:119:120:121:122:123:124:125:126:128:129:130:131:132:133:134:136:137:138:139:140:142:143:144:145:146:148:149:150:152:153:154:156:157:158:160:161:162:164:166:167:168:170:172:173:174:176:178:179:180:182:184:185:186:188:190:192:194:195:196:198:200:202:204:206:208:209:210
</pre>
 
== MOSS names i think are pretty ==
Note: I am only considering octave-period MOSSes here. Table is an edited version of the standardised version at [[TAMNAMS#Mos_pattern_names]]. I made a few small changes of personal preference:
 
* [[4L 1s]] I call "pentoid" after [[Bug_family#Pentoid|the 11-limit 4&5 exotemperament]] for which practically the entire tuning range of the MOSS is valid due to its impractically low accuracy/high damage (this is evidenced by it also being supported by patent val in EDOs 4+5=9 (the basic tuning) and 4+5+4=14 (the hard tuning), and by the 13b val (the soft tuning) where you take the (only barely) second-best fifth).
 
* [[1L 6s]] I find significant as a 7-note scale underlying all nL1s scales for n>=7. I have named it "onyx", which has a variety of aesthetic reasonings for it: "1Ln-ic's" and "nL1-ic's (like, the -ic suffix applied to MOSS names, collectivised for 1Lns and nL1s) sounds like "one-el-en-ics" or "en-el-one-ics" which abbreviated sort of sounds like "one-ics" => "onyx". Then "onyx" sounds sort of like "one-six". Furthermore the onyx mineral comes in many colours and types, which seems fitting given this is the parent scale for a wide variety of MOSSes; specifically of interest being [[7L 1s]] (pine), [[8L 1s]] (subneutralic) and [[9L 1s]] (sinatonic). Finally, the name "onyx" is also supposed to be vaguely reminiscent of "anti-archaeotonic" as "chi" (the greek letter) is written like an "x" (this is related to why "christmas" is abbreviated sometimes as "X-mas") and other than that, the letters "o" and "n" and their sounds are also present in "archaeotonic", and "x" is vaguely reminiscent of negation and multiplication. There is also something like a "y" sound in "archaeotonic" in the "aeo" part (depending partially on your pronounciation).
* [[1L 6s]] I find significant as a 7-note scale underlying all nL1s scales for n>=7. I have named it "onyx", which has a variety of aesthetic reasonings for it: "1Ln-ic's" and "nL1-ic's (like, the -ic suffix applied to MOSS names, collectivised for 1Lns and nL1s) sounds like "one-el-en-ics" or "en-el-one-ics" which abbreviated sort of sounds like "one-ics" => "onyx". Then "onyx" sounds sort of like "one-six". Furthermore the onyx mineral comes in many colours and types, which seems fitting given this is the parent scale for a wide variety of MOSSes; specifically of interest being [[7L 1s]] (pine), [[8L 1s]] (subneutralic) and [[9L 1s]] (sinatonic). Finally, the name "onyx" is also supposed to be vaguely reminiscent of "anti-archaeotonic" as "chi" (the greek letter) is written like an "x" (this is related to why "christmas" is abbreviated sometimes as "X-mas") and other than that, the letters "o" and "n" and their sounds are also present in "archaeotonic", and "x" is vaguely reminiscent of negation and multiplication. There is also something like a "y" sound in "archaeotonic" in the "aeo" part (depending partially on your pronounciation).


Line 408: Line 429:
| [[2L 7s]] || joanatonic || jo- || jo || From [[joan]] temperament.
| [[2L 7s]] || joanatonic || jo- || jo || From [[joan]] temperament.
|-
|-
| [[4L 5s]] || orwelloid || or- || or || From [[orwell]] temperament.
| [[4L&nbsp;5s]] || gramitonic || gram- || gm || From "grave minor third". Formerly "orwelloid".
|-
|-
| [[5L 4s]] || semiquartal || sequar- || seq || From ''half-fourth''.
| [[5L 4s]] || semiquartal || sequar- || seq || From ''half-fourth''.
Line 445: Line 466:


== My Python 3 code ==
== My Python 3 code ==
IMPORTANT NOTE: there seems to be a bug for subgroup mappings at the moment, pending investigation, but ideally usage of subgroups should be made far easier too:
IMPORTANT NOTE: there seems to be bugs for subgroup mappings at the moment, pending investigation, but ideally usage of subgroups should be made far easier too:
<syntaxhighlight lang="python">
<syntaxhighlight lang="python">
>>> sg = [2, 3, 7, 11, 13, 17, 19]
>>> sg = [2, 3, 7, 11, 13, 17, 19]
Line 585: Line 606:
def sub_iv(r1, r2):
def sub_iv(r1, r2):
return iv( r1[0]*r2[1] - r2[0]*r1[1], r1[1]*r2[1] )
return iv( r1[0]*r2[1] - r2[0]*r1[1], r1[1]*r2[1] )
# IMPORTANT: assume x and y are nonnegative!
def iv_greater_than(x, y):
result = div_iv(x,y)
return result[0] > result[1]
def iv_greater_or_equal(x, y):
result = div_iv(x,y)
return result[0] >= result[1]
def iv_less_than(x, y):
return not iv_greater_or_equal(x, y)
def iv_less_or_equal(x, y):
return not iv_greater_than(x, y)
def as_float(x, p=None):
def as_float(x, p=None):
if type(x)==list: # monzo (factored)
if type(x)==list: # monzo (factored)
Line 1,147: Line 1,181:
# returns [] if cs or details of earliest counterexample if not;
# returns [] if cs or details of earliest counterexample if not;
# "earliest" is defined as "search all 1-steps from beginning to end, then all 2-steps, etc."
# "earliest" is defined as "search all 1-steps from beginning to end, then all 2-steps, etc."
def cs(scale_in):
def notcs(scale_in): # the alias cs for this function is deprecated due to being named confusingly but defined for convenience/backwards-compatibility
stepmap = dict()
stepmap = dict()
scale = scale_in.copy()
scale = scale_in.copy()
Line 1,161: Line 1,195:
stepmap[interval] = j
stepmap[interval] = j
return []
return []
cs = notcs # the alias cs for this function is deprecated due to being named confusingly but defined for convenience/backwards-compatibility


def rotate(scale,n,p=(2,1)):
def rotate(scale,n,p=(2,1)):
Line 1,210: Line 1,245:
print(edo,'EDO interpretation')
print(edo,'EDO interpretation')
if not sg:
if not sg:
sg = lim(ol)
sg = lim(max(ol,max(add)))
odds = [odd for odd in range(1,ol+1,2) if in_subgroup(odd,sg) and odd not in no] + add
odds = [odd for odd in range(1,ol+1,2) if in_subgroup(odd,sg) and odd not in no] + add
sedo = 0
sedo = 0
Line 1,218: Line 1,253:
styler=lambda x,relerr: hyperlink(x) if abs(relerr) < considered_bad else dec+hyperlink(x)+dec[::-1]
styler=lambda x,relerr: hyperlink(x) if abs(relerr) < considered_bad else dec+hyperlink(x)+dec[::-1]
for x in sorted( odd_lim(1,[],odds), key=lambda x: steps(x,ed(edo)) ):
for x in sorted( odd_lim(1,[],odds), key=lambda x: steps(x,ed(edo)) ):
sedoofx = pval(x,ed(edo))
sedoofx = map_iv( val(sg,ed(edo)), x, sg ) # this allows things like having 9 but not 3 in the subgroup
relerr = steps(x,ed(edo)) - sedoofx
relerr = steps(x,ed(edo)) - sedoofx
if sedoofx!=sedo:
if sedoofx!=sedo:
Line 1,303: Line 1,338:
# the default badness is the sum of the squares of the errors with each interval's contribution weighted proportional to its odd-limit complexity,
# the default badness is the sum of the squares of the errors with each interval's contribution weighted proportional to its odd-limit complexity,
# in terms of absolute (cent/octave) error (corresponding to the multiplication by et2) and divided by the sum of the weightings of the intervals.
# in terms of absolute (cent/octave) error (corresponding to the multiplication by et2) and divided by the sum of the weightings of the intervals.
def et_badness(ivs,v,badness=lambda rel_err,x,et2: rel_err**2 * et2**2,weighting=lambda x: iv_complexity(x),combine='avg',et2=0):
# IMPORTANT: on Jan 9 i corrected rel_err**2 * et2 to rel_err**2 * et2**2 in et_badness which optimal_edo_sequence depends on;
#            strict_optimal_edo_sequence is unaffected however.
def et_badness(ivs,v,badness=lambda rel_err,x,et2: rel_err**2 * et2**2,weighting=lambda x: iv_complexity(x),combine='avg',mapping=True,et2=0):
# if the weighting is unspecified, use the default of:
# if the weighting is unspecified, use the default of:
# weighting an interval x proportional to its odd-limit complexity iv_complexity(x);
# weighting an interval x's (by default squared) error contribution proportional to its odd-limit complexity (iv_complexity(x));
# this is a compromise between theoretic sensitivity (approx. equal to the square of the odd-limit complexity)
# this is a compromise between theoretic sensitivity (approx. equal to the square of the odd-limit complexity)
# and not underweighting simpler intervals and accounting for that more complex intervals will tend to be used
# and not underweighting simpler intervals and accounting for that more complex intervals will tend to be used
# in a harmonic/chordal context which justifies their otherwise-higher effective felt error through templating
# in a harmonic/chordal context which justifies their otherwise-higher effective felt error through templating
if weighting==1 or weighting in ['unweighted','trivial','basic','CE','CEE']:
if type(weighting)==str:
weighting = lambda x: 1 # for use with prime harmonic interval sets
if weighting in [None,'none','unweighted','trivial','basic','constant']:
elif weighting==2 or weighting in ['natural', 'harmonic', 'TE', 'te', 'tenney']:
weighting = 0
weighting = lambda x: 1/math.log2(x[0] * x[1]) # mainly for use with prime harmonic interval sets
elif weighting in ['','default','proportional']:
weighting = 1
elif weighting in ['sensitive','dyadic']:
weighting = 2
elif weighting=='simple':
weighting = -0.5 # as we may square after when doing a MSE, we use the square root
if type(weighting) in [int,float]:
weighting = lambda x,w=weighting: iv_complexity(x)**w
global ivs_cache
global ivs_cache
global ivs_int_cache
global ivs_int_cache
Line 1,356: Line 1,400:
# alternatively, feed the real number of divisions of the octave that generates your val for each val you want to compare.   
# alternatively, feed the real number of divisions of the octave that generates your val for each val you want to compare.   
global patent_vals
global patent_vals
if type(v)==int:
if type(v)==int and v:
if v in patent_vals:
if v in patent_vals:
v = patent_vals[v]
v = patent_vals[v]
Line 1,364: Line 1,408:
elif type(v)==float:
elif type(v)==float:
v = val(lim(255),ed(v))
v = val(lim(255),ed(v))
elif not mapping and not v:
pass # not using a val
elif mapping and not v:
raise(Exception('mapping=True but no val v is given'))
# deduce the number of arguments in the badness function to allow only using the first n arguments as needed
# deduce the number of arguments in the badness function to allow only using the first n arguments as needed
num_args = badness.__code__.co_argcount
num_args = badness.__code__.co_argcount
Line 1,377: Line 1,425:
et2 = 1/v[0]
et2 = 1/v[0]
# finally, return the result:
# finally, return the result:
return combine([ badness3args(abs( map_iv(v,x) - steps(x,et2) ), x, et2) * weighting(x) for x in ivs ]) / (ivs_sum_weights_cache if using_avg else 1)
if not mapping: # new path
return combine([ badness3args(abs( step_err(x,et2) ), x, et2) * weighting(x) for x in ivs ]) / (ivs_sum_weights_cache if using_avg else 1)
else:
return combine([ badness3args(abs( map_iv(v,x) - steps(x,et2) ), x, et2) * weighting(x) for x in ivs ]) / (ivs_sum_weights_cache if using_avg else 1)
# if you just give a list or set of intervals (a,b), the default behaviour is to judge the badness of an edo as:
# if you just give a list or set of intervals (a,b), the default behaviour is to judge the badness of an edo as:
# * sum of squares of errors with each interval's contribution weighted proportional to its odd-limit complexity,
# * sum of squares of errors with each interval's contribution weighted proportional to its odd-limit complexity,
Line 1,384: Line 1,435:
# IMPORTANT: on Jan 9 i corrected rel_err**2 * et2 to rel_err**2 * et2**2 in et_badness which optimal_edo_sequence depends on;
# IMPORTANT: on Jan 9 i corrected rel_err**2 * et2 to rel_err**2 * et2**2 in et_badness which optimal_edo_sequence depends on;
#            strict_optimal_edo_sequence is unaffected however.
#            strict_optimal_edo_sequence is unaffected however.
def optimal_edo_sequence(ivs_or_edo_badness,edo_set=range(2,311+1),weighting=lambda x: iv_complexity(x),combine='avg'):
def optimal_edo_sequence(ivs_or_edo_badness,edo_set=range(2,311+1),weighting=lambda x: iv_complexity(x),combine='avg',mapping=True,times_better=1+2**-29):
et_badness_judger = ivs_or_edo_badness
et_badness_judger = ivs_or_edo_badness
if type(ivs_or_edo_badness) in [int,set,list]: # user gave intervals (default et_badness)
if type(ivs_or_edo_badness) in [int,set,list]: # user gave intervals (default et_badness)
ivs = ivs_or_edo_badness
ivs = ivs_or_edo_badness
et_badness_judger = lambda edo: et_badness(ivs,edo,weighting=weighting,combine=combine)
et_badness_judger = lambda edo: et_badness(ivs,edo,weighting=weighting,combine=combine,mapping=mapping)
# else user gave et_badness manually (custom)
# else user gave et_badness manually (custom)
best_edo = et_badness_judger(1)
best_edo = et_badness_judger(1)
Line 1,394: Line 1,445:
for edo in edo_set:
for edo in edo_set:
current = et_badness_judger(edo)
current = et_badness_judger(edo)
if current < best_edo:
if current < best_edo * times_better:
best_edo = current
best_edo = current
best_edos.append(edo)
best_edos.append(edo)
Line 1,402: Line 1,453:
# this gives much sparser but also much more interesting lists.
# this gives much sparser but also much more interesting lists.
# default weighting of an interval x is proportional to its odd-limit complexity iv_complexity(x).
# default weighting of an interval x is proportional to its odd-limit complexity iv_complexity(x).
def strict_optimal_edo_sequence(ivs,edo_set=range(2,311+1),weighting=lambda x: iv_complexity(x),combine='avg'):
def strict_optimal_edo_sequence(ivs,edo_set=range(2,311+1),weighting=lambda x: iv_complexity(x),combine='avg',mapping=True):
return optimal_edo_sequence(lambda edo: et_badness(ivs,edo,lambda rel_err: rel_err**2,weighting,combine),edo_set)
return optimal_edo_sequence(lambda edo: et_badness(ivs,edo,lambda rel_err: rel_err**2,weighting,combine,mapping),edo_set)


</syntaxhighlight>
# returns a set of odds in the subgroup that are sorted by their octave-reduced size
# which map to every distinct number of steps/degrees of the val given, therefore,
# dwarf(lim(p),N) is the set of odds for the dwarf scale of N EDO in the p-limit
def dwarf(sg,v):
if type(v)==int: # to be able to specify N for the patent val for N EDO
v = val( lim(max(sg)), ed(v) )
result = [0] * v[0] # implies you can have a tritave dwarf if sg and v agree on the subgroup
odd = 1
while 0 in result:
if in_subgroup(odd,sg) and result[ map_iv(v,(odd,1)) % v[0] ]==0:
result[ map_iv(v,(odd,1)) % v[0] ] = odd
odd += 2
return result


=== Important 23-limit EDOs ===
def scalestr(liststr):
Produced with the help of my above code and corrected with love. Below are theoretically important [[23-limit]] [[EDO]]s in that they do an increasingly better job at representing the [[27-odd-limit]] minus zero or one of composite odds 25 and 27. The exception is that if an EDO (such as 94) achieves less than 2 inconsistencies in the [[25-odd-limit]] or no-25's [[27-odd-limit]] then we don't consider a record to be set to give a chance to larger EDOs that are often interesting for having better approximations (of the intervals mentioned or of other intervals in higher limits). The logical stopping point is [[311edo]] due to its extreme efficiency and elegance as a [[23-limit]] and [[41-limit]] temperament (plus a handful of optional large primes). Please note that there may be one or two important 23-limit EDOs missing here, because I've only checked patent val and occasionally a non-patent-val will perform better for consistency, however, one can argue that a patent val representation should be a requirement for any serious 23-limit EDO.
commastrs = []
if ',' in liststr:
commastrs = [comma.strip() for comma in liststr.split(',')]
else:
commastrs = liststr.split()
return [iv( int(comma.split('/')[0]), int(comma.split('/')[1]) ) for comma in commastrs]


It should hopefully go without saying that by "serious 23-limit EDO" I mean in terms of archetypal and structural importance; to me it's obvious, with the exception of maybe EDOs 46 and 53 (corresponding to [[Eros]] (rank 3) and maybe also [[Amity]] (rank 2)), that any 23-limit EDO must have at least 77 notes, to allow for the fitting of a submajor third ([[21/17]] plus various higher-complexity submajor thirds), a superneutral third ([[16/13]]), a subneutral third ([[11/9]]) and a supraminor third (most notably [[17/14]] and [[23/19]]; equated in any "small" system) between 5/4 and 6/5, corresponding to splitting 25/24 into 5 equal parts. If you do this with one part equated to [[81/80]] you get [[absurdity]], explaining its non-absurdity and, to the contrary, ''intuitiveness'', as a [[29-limit]] temperament (given that prime 29 is essentially free for multiples of 7 EDO). If you instead choose to exaggerate 81/80 to 2 parts you get an extension of 5-limit [[artoneutral]] (I specify 5-limit as [[80edo]], one logical tuning for it, uses a different mapping for 7).
# find positive (possibly contorted) comma for a^n ~ b and by default print the result
def continuumpt(a,b,n,printcomma=1): # assumes n >= 0
comma = div_iv( (a[0]**n[0], a[1]**n[0]), (b[0]**n[1], b[1]**n[1]) )
if comma[0] < comma[1]:
comma = recip_iv(comma)
if printcomma==1:
return print(striv(comma))
elif printcomma>=2:
print('['+' '.join([ str(k) for k in fact(comma) ])+']',end='')
if printcomma==2:
return print()
elif printcomma==3:
return print(' = '+striv(comma))
else:
return comma


[[10edo]] gets 13 wrong in the no-25's 27-odd-limit (and 14 wrong in the 25-odd-limit (noticed the code produced a mistake here))
# note: the default can be used to get n octaves of an interval set (ivs) contained in the 1/1 to 2/1 range
def interleave(n,ivs,offset=(2,1)): # https://en.xen.wiki/w/Interleaving
totalivs = []
for i in range(n):
totalivs = totalivs + [mul_iv( *([x] + [offset]*i) ) for x in ivs if x not in totalivs]
totalivs.sort(key=lambda x: as_float(x))
return totalivs


[[12edo]] gets 12 wrong in the no-25's 27-odd-limit (and 13 wrong in the 25-odd-limit (noticed the code produced a mistake here))
 
def mediant_path(x):
x = convert(x,tuple)
x = iv(x[0], x[1])
bottom, middle, top = (0, 1), (1, 1), (1, 0)
result = ''
while x != middle:
if iv_less_than(x, middle):
result += 'D'
top = middle
else:
result += 'U'
bottom = middle
middle = (bottom[0] + top[0], bottom[1] + top[1])
return result
 
# the length of the mediant path of whichever octave-revoicing gives the interval x the least length
def mediant_complexity(x,revoicing_octs=7):
mincomplexity = 2**30
for octs in range(revoicing_octs+1):
mincomplexity = min(mincomplexity,len(mediant_path( div_iv(x,(2**octs,1)) )))
mincomplexity = min(mincomplexity,len(mediant_path( mul_iv(x,(2**octs,1)) )))
return mincomplexity
 
# showmode: minimum number of equated interval pairs (incl. distinct octave-complements).
# if minimum isnt reached, only the spacing interval is shown. 0 means dont print anything.
# for odd-limits, to look for "multiple indistinction commas", use 3 for showmode.
def spaces_in_set(ivs,max_cents = 100,showmode = 1):
spaces = dict()
if type(max_cents) in [tuple,float,int]:
max_cents = steps(max_cents,ed(1200))
for lower in ivs:
for upper in ivs:
diff = div_iv(upper,lower)
if 0 < steps(diff,ed(1200)) <= max_cents:
if diff not in spaces:
spaces[diff] = [(upper,lower)]
else:
spaces[diff].append((upper,lower))
commas = [comma for comma in spaces]
commas.sort(key=lambda x: steps(x,1))
if showmode:
for comma in commas:
print(striv(comma)+':',', '.join([
'('+striv(ivpair[0])+')/('+striv(ivpair[1])+')' for ivpair in spaces[comma]
if len(spaces[comma])>=showmode
]))
print()
return spaces
 
# there is only finitely many EDOs which provide some simplification of a set of intervals as contrasted to all-distinct
def efficient_edos( n, inconsistencies=0, min_simplifications=1, edos=range(1,1000) ):
if type(n)==int:
n = odd_lim(n)
elif type(n)==list and type(n[0])==int:
n = odd_lim(1,[],n)
results = []
for edo in edos:
v = edo
if type(v)==int:
v = val( lim(max([ prime_idx(len(fact(x))-1) for x in n ])), ed(edo) )
# else v is assumed to be a mapping
m = dict()
for x in n: # collect mappings of intervals
sedo = map_iv(v,x)
if sedo in m:
m[sedo].append(x)
else:
m[sedo] = [x]
if len(inconsistent_ivs_by_val(n,v)) <= inconsistencies:
if len(n) - len([ sedo for sedo in m ]) >= min_simplifications:
results.append(edo)
return results
</syntaxhighlight>
 
=== Important 23-limit EDOs ===
Produced with the help of my above code and corrected with love. Below are theoretically important [[23-limit]] [[EDO]]s in that they do an increasingly better job at representing the [[27-odd-limit]] minus zero or one of composite odds 25 and 27. The exception is that if an EDO (such as 94) achieves less than 2 inconsistencies in the [[25-odd-limit]] or no-25's [[27-odd-limit]] then we don't consider a record to be set to give a chance to larger EDOs that are often interesting for having better approximations (of the intervals mentioned or of other intervals in higher limits). The logical stopping point is [[311edo]] due to its extreme efficiency and elegance as a [[23-limit]] and [[41-limit]] temperament (plus a handful of optional large primes). Please note that there may be one or two important 23-limit EDOs missing here, because I've only checked patent val and occasionally a non-patent-val will perform better for consistency, however, one can argue that a patent val representation should be a requirement for any serious 23-limit EDO.
 
It should hopefully go without saying that by "serious 23-limit EDO" I mean in terms of archetypal and structural importance; to me it's obvious, with the exception of maybe EDOs 46 and 53 (corresponding to [[Eros]] (rank 3) and maybe also [[Amity]] (rank 2)), that any 23-limit EDO must have at least 77 notes, to allow for the fitting of a submajor third ([[21/17]] plus various higher-complexity submajor thirds), a superneutral third ([[16/13]]), a subneutral third ([[11/9]]) and a supraminor third (most notably [[17/14]] and [[23/19]]; equated in any "small" system) between 5/4 and 6/5, corresponding to splitting 25/24 into 5 equal parts. If you do this with one part equated to [[81/80]] you get [[absurdity]], explaining its non-absurdity and, to the contrary, ''intuitiveness'', as a [[29-limit]] temperament (given that prime 29 is essentially free for multiples of 7 EDO). If you instead choose to exaggerate 81/80 to 2 parts you get an extension of 5-limit [[artoneutral]] (I specify 5-limit as [[80edo]], one logical tuning for it, uses a different mapping for 7).
 
[[10edo]] gets 13 wrong in the no-25's 27-odd-limit (and 14 wrong in the 25-odd-limit (noticed the code produced a mistake here))
 
[[12edo]] gets 12 wrong in the no-25's 27-odd-limit (and 13 wrong in the 25-odd-limit (noticed the code produced a mistake here))


[[15edo]] gets 9 wrong in the 25-odd-limit
[[15edo]] gets 9 wrong in the 25-odd-limit
Line 1,464: Line 1,634:
[[311edo]] gets 0 wrong in the 27-odd-limit
[[311edo]] gets 0 wrong in the 27-odd-limit


== Novation Launchpad isomorphic keyboard code ==
== Novation Launchpad isomorphic keyboard code ==
The code and usage/debugging instructions are the same as for the Novation Launchpad Pro MK3, so see [[#Novation Launchpad Pro MK3 isomorphic keyboard code]].
The code and usage/debugging instructions are the same as for the Novation Launchpad Pro MK3, so see [[#Novation Launchpad Pro MK3 isomorphic keyboard code]].
 
 
Note that in theory, any Launchpad with programmer mode should work, so any MK3 model such as the Launchpad X and the cheaper (but not velocity-sensitive) mini version of that should work.
Note that any Launchpad with programmer mode should work, so any MK3 model such as the Launchpad X and the cheaper (but not velocity-sensitive) mini version of that should work. The Launchpad X has successfully been used as an isomorphic keyboard with this code, but currently requires manually specifying the MIDI ports; how to do this is explained below.
 
 
A launchpad X is potentially recommendable as having more comfortable/similar side/control buttons so that you get what feels more like a proper 9x9 grid (also due to being less costly), as the Pro MK3 has hard side-buttons that require significantly more pressure, though in both cases note that these buttons do not have pressure sensitivity so depend on the default velocity outputted by the program.
A launchpad X is potentially recommendable as having more comfortable/similar side/control buttons so that you get what feels more like a proper 9x9 grid (also due to being less costly), as the Pro MK3 has hard side-buttons that require significantly more pressure, though in both cases note that these buttons do not have pressure sensitivity so depend on the default velocity outputted by the program.
 
 
(More generally, Launchpads are '''''very''''' affordable xen MIDI instruments, nearly optimal for xen in that (with the help of the code below) they provide a fully customisable isomorphic MIDI keyboard with custom highlighting options. Also note that the tuning itself is not specified by the program; only the layout, though for the aforementioned large tunings the code will give you a .scl file to use, with all such .scl files using the same MIDI mapping, but requiring the base MIDI note/reference being 0.)
(More generally, Launchpads are '''''very''''' affordable xen MIDI instruments, nearly optimal for xen in that (with the help of the code below) they provide a fully customisable isomorphic MIDI keyboard with custom highlighting options. Also note that the tuning itself is not specified by the program; only the layout, though for the aforementioned large tunings the code will give you a .scl file to use, with all such .scl files using the same MIDI mapping, but requiring the base MIDI note/reference being 0.)
 
 
== Novation Launchpad Pro MK3 isomorphic keyboard code ==
== Novation Launchpad Pro MK3 isomorphic keyboard code ==
This code is licensed under the AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.html), a version of the [[wikipedia:Affero General Public License|AGPL]] corresponding to the [[wikipedia:GNU General Public License#Version 3|GPLv3]].
This code is licensed under the AGPLv3 (https://www.gnu.org/licenses/agpl-3.0.html), a version of the [[wikipedia:Affero General Public License|AGPL]] corresponding to the [[wikipedia:GNU General Public License#Version 3|GPLv3]].
 
 
'''It should be compatible with any Launchpad that has programmer mode; it has been confirmed to work for the Launchpad X so will likely also work for a Launchpad Mini MK3.'''
'''It should be compatible with any Launchpad that has [[#Putting the Launchpad in programmer mode|programmer mode]]; it has been confirmed to work for the Launchpad X so will likely also work for a Launchpad Mini MK3.'''
 
 
NOTE: I discovered it was possible to use custom colour palettes after I'd spent a lot of time making these rainbows using the rather limited and uneven set of factory colours. I haven't tested using this yet, but for those who want to take that route to achieve a more even rainbow, here is the link: https://fw.mat1jaczyyy.com/
ALSO: This should go without saying but take care of your launchpad! If you wipe it don't expect it to be properly responsive until fully dry and even then wiping it can have risks if the liquid goes inside. Similarly, do not bang it and probably don't leave it upside down (especially if for long periods of time) in case it causes the velocity sensitivity to go weird. Treat it as an instrument. If you do all this, it should be fine to use it for its intended purpose: just don't press ''too'' hard; try not press with more velocity than the buttons actually require, if possible. (Because of my silliness (not heeding such obvious procedures) there is a possibility that I may have weared my launchpad slightly in that I think I now require more pressure for the pressure-sensitive pads. I thought it responsible to add this note about taking care of your launchpad, as we are technically using it in a nonstandard way by treating the buttons as though they were just insensitive pads that require extra velocity/pressure.)
 
 
ALSO: This should go without saying but take care of your launchpad! If you wipe it don't expect it to be properly responsive until fully dry and even then wiping it can have risks if the liquid goes inside. Similarly, do not bang it and probably don't leave it upside down (especially if for long periods of time) in case it causes the velocity sensitivity to go weird. Treat it as an instrument. If you do all this, it should be fine to use it for its intended purpose: just don't press ''too'' hard; try not press with more velocity than the buttons actually require, if possible. (Because of my silliness (not heeding such obvious procedures) there is a possibility that I may have weared my launchpad slightly in that I think I now require more pressure for the pressure-sensitive pads. I thought it responsible to add this note about taking care of your launchpad, as we are technically using it in a nonstandard way by treating the buttons as though they were just insensitive pads that require extra velocity/pressure.)
IMPORTANT: for the Python 3 code to work, it requires the launchpad to be plugged in with updated firmware and be in [[#Putting the Launchpad in programmer mode|programmer mode]]! Also requires [https://www.tobias-erichsen.de/software/loopmidi.html loopMIDI] on Windows.
 
 
IMPORTANT: for the Python 3 code to work, it requires the launchpad to be plugged in with updated firmware and be in programmer mode! Also requires loopMIDI on Windows.
=== Installation issues/troubleshooting strategies/recommendations ===
 
The most potentially difficult part is that depending on what OS you are using, how you have Python installed, what version, etc. there can be complications so that running <code>pip install rtmidi</code> and <code>pip install mido</code> in a terminal does not work, or only appears to work so that there's issues when the code tries to use mido. I list potential issues below, so please read carefully for something applicable to your case if it isn't going smoothly.
=== Installation issues/troubleshooting strategies/recommendations: ===
 
The most potentially difficult part is that depending on what OS you are using, how you have Python installed, what version, etc. there can be complications so that running <code>pip install rtmidi</code> in a terminal does not work. I list potential issues below, so please read carefully for something applicable to your case if it isn't going smoothly.
'''IMPORTANT: A strange error has been found: Python 3.14 and later versions have removed a functionality used by mido internally, so downgrading to Python 3.12 is required if nothing here works.'''
 
 
0. Technically not an issue with rtmidi, but an easy one to solve: you forgot to update the firmware of your launchpad to be up-to-date via the official site: https://components.novationmusic.com/
'''IMPORTANT:''' Before deeming an installation of mido/rtmidi to "not be working", make sure that the issue is not just one of what MIDI ports are being autoselected; see (6.) onwards for details.
 
 
1. The easiest issue is if you have a version of Python 2 installed (regardless of whether you have Python 3 installed), then sometimes <code>pip</code> and <code>python</code> refer to Python 2, so use <code>pip3</code> and <code>python3</code> instead wherever applicable. Alternatively, if you don't need Python 2, uninstalling it may help.
0. Technically not an issue with rtmidi, but an easy one to solve: you forgot to update the firmware of your launchpad to be up-to-date via the official site: https://components.novationmusic.com/
 
 
2. If you installed Python 3 but it doesn't work on command line, maybe you haven't used an official installer, as that usually shouldn't be an issue, or if you did use an official installer, you may not have marked the checkbox that makes it change PATH environment variables for you automatically, in which case adding the location of the Python 3 (and potentially pip) executables should fix it.
1. The easiest issue is if you have a version of Python 2 installed (regardless of whether you have Python 3 installed), then sometimes <code>pip</code> and <code>python</code> refer to Python 2, so use <code>pip3</code> and <code>python3</code> instead wherever applicable. Alternatively, if you don't need Python 2, uninstalling it may help.
 
 
3. <code>rtmidi</code> seems to install but there's issues when trying to use it; installing <code>python-rtmidi</code> may help in such a case. That's why I have "pip install mido && pip install python-rtmidi" with a note about the loopMIDI requirement on Windows as the default/simplest installation recommendation present at the beginning of the code where I <code>import mido</code>.
2. If you installed Python 3 but it doesn't work on command line, maybe you haven't used an official installer, as that usually shouldn't be an issue, or if you did use an official installer, you may not have marked the checkbox that makes it change PATH environment variables for you automatically, in which case adding the location of the Python 3 (and potentially pip) executables should fix it.
 
3. <code>rtmidi</code> doesn't seem to exist when trying to install it; try installing <code>python-rtmidi</code> instead.
 
3.1. <code>rtmidi</code> seems to install but there's issues when trying to use it; installing <code>python-rtmidi</code> may help in such a case; if that still doesn't help, try uninstalling rtmidi (<code>pip uninstall rtmidi</code>) and following the instructions of (7.1.). {{nowrap| (As a note of my experience: }} in the code, as a comment, I have <code>pip install mido && pip install python-rtmidi</code> (with a note about the loopMIDI requirement on Windows) as the default/simplest installation goal/recommendation, present at the beginning of the code where I <code>import mido</code>, because lately it seems that's the most reliable, however some systems may need <code>rtmidi</code> instead of <code>python-rtmidi</code> or may need both; I'm not sure what the most common case is.)
 
4. If you are getting a long error where towards the end there is <code>error: Microsoft Visual C++ 14.0 or greater is required.</code> (which might happen if you are using an older version of Windows) then try <code>pip install --only-binary :all: rtmidi</code> which will save you a huge amount of trouble if it works. Versions apparently should be available for almost every relevant version of Python 3, so if it isn't, try a different version of Python 3 if you know how. If your system doesn't use Python 3 and you installed it, it should definitely be safe to uninstall the current version.
 
4.1. I haven't seen this issue, but possibly if <code>pip install --only-binary :all: rtmidi</code> seems to work but then brings an error when trying to use the code, try <code>pip install --only-binary :all: python-rtmidi</code> in case it helps.
 
5. If you are on Windows, make sure you have [https://www.tobias-erichsen.de/software/loopmidi.html loopMIDI] installed and running with the default port name! (The default name should work; the code searches for the first name starting with "loop".) Though it hasn't been observed, if loopMIDI itself doesn't seem to be working, check that it's not a firewall issue.
 
6. '''If after all these remedies it doesn't work,''' then it's likely because the attempt at autoselecting the name of the MIDI input and MIDI output failed. To fix this:
 
6.0. A trivial but easy to forget fix: make sure that the USB you're using isn't faulty by trying a different USB that you can confirm works/isn't faulty.
 
6.1. First check that the Launchpad, ''after being set into programmer mode'' (see [[#Putting the Launchpad in programmer mode]]), is responsive, by using it as a MIDI input on [[Scale Workshop]] and checking if one of the Launchpad-related options makes Scale Workshop clearly press/release notes based on what you are pressing/releasing (so not as a mess of vaguely correlated noisy data, but as obviously directly responding to you touching the Launchpad). If this doesn't work (no [[#Success indicators]]), see (step 0.) and try restarting your computer (which is much more likely to be a relevant fix if you are using Windows).
 
6.2. Look at the output of running <code>iso()</code>; specifically, it'll tell you <code>midi outputs detected:</code> followed by a list of the ''text strings'' that correspond to valid MIDI outputs detected (here meaning valid devices/targets which the code can ''output''/''send'' MIDI data to); so you want to find the one that corresponds to telling the Launchpad how to light up, EG {{nowrap| <code>iso(midi_out_col{{=}}'MIDIOUT2 (LPX MIDI) 2')</code> }} if you saw {{nowrap| <code>MIDIOUT2 (LPX MIDI) 2</code> }} in the list.  If this is the only fix that was needed, you should see all [[#Success indicators]].
 
6.3. '''If this did not fix it,''' you should get a new error with new information to help you; you should see <code>midi_inputs_detected:</code> followed by a list of the ''text strings'' that correspond to valid MIDI inputs (here meaning valid devices/targets that the code can ''input''/''read'' MIDI data from); so you want to find the one that corresponds to receiving the data about what pads and buttons are pressed on the Launchpad, EG {{nowrap| <code>iso(midi_out_col{{=}}'MIDIOUT2 (LPX MIDI) 2',midi_input{{=}}'MIDIIN2 (LPX MIDI) 1')</code> }} if you saw {{nowrap| <code>MIDIIN2 (LPX MIDI) 1</code> }} in the list, where note we need to keep the {{nowrap| <code>midi_out_col=...</code> }} part so that we don't go back to failing at the first error. Again, if this was the last fix that was needed, you should see all [[#Success indicators]]. If you ''still'' can't get it working, see the final remedies below:
 
7. '''Final remedies''' (mainly for Windows being janky):
 
7.1. Try uninstalling and reinstalling <code>mido</code> and <code>python-rtmidi</code> with <code>pip</code> (or if on your system that corresponds to Python 2 rather than Python 3, then with <code>pip3</code> instead):
<pre>
pip uninstall python-rtmidi
pip uninstall mido
pip install mido
pip install python-rtmidi
</pre>
 
7.2. Restart the system (this is especially likely to fix things if you use Windows). (Possibly followed by uninstalling and reinstalling if that didn't fix it or fix something at least.)
 
7.3. Try installing (or if you did that, uninstalling and reinstalling) <code>rtmidi</code> in case it helps (note the distinctness from <code>python-rtmidi</code>). I vaguely recall this being a valid installation target in some cases. However, if installing <code>rtmidi</code> is valid (it installs) but it doesn't help, uninstall it and then uninstall and reinstall <code>python-rtmidi</code> and <code>mido</code> as shown in (7.1) above.
 
'''Mix and match these solutions as you find them potentially relevant to your situation, and hopefully you should be able to get it working.''' Also, remember, the order of doing these can matter; for example, if the installation is subtly bugged for whatever incomprehensible reason, then that'll invalidate all the other steps you took so you'll have to do them again with a non-bugged installation.
 
Feel free to send me a friend request to ask me for help on Discord (<code>@osmiumic</code>).


4. If you are getting a long error where towards the end there is <code>error: Microsoft Visual C++ 14.0 or greater is required.</code> (which might happen if you are using an older version of Windows) then try <code>pip install --only-binary :all: rtmidi</code> which will save you a huge amount of trouble if it works. Versions apparently should be available for almost every relevant version of Python 3, so if it isn't, try a different version of Python 3 if you know how. If your system doesn't use Python 3 and you installed it, it should definitely be safe to uninstall the current version.
==== Putting the Launchpad in programmer mode ====
'''Launchpad X''': Once plugged in by USB and on, "hold Session, then press bottom Scene Launch button" (which I think should be orange?); the pads may flash to display a running text saying "Program" for confirmation. Once successfully put in programmer mode, the Launchpad should become unlit and appear unresponsive. '''This means it worked.''' To get it out of programmer mode and into the default mode, simply unplug it and plug it in again.


4.1. I haven't seen this issue, but possibly if <code>pip install --only-binary :all: rtmidi</code> seems to work but then brings an error when trying to use the code, try <code>pip install --only-binary :all: python-rtmidi</code> in case it helps.
'''Launchpad Pro MK3:''' Once plugged in by USB and on, hold the small "Setup" button (bottom left) and press and release the "Print to Clip" button (bottom right). The Launchpad should become unlit and appear unresponsive. '''This means it worked.''' To get it out of programmer mode and into the default mode, simply unplug it and plug it in again.


5. If you are on Windows, make sure you have [https://www.tobias-erichsen.de/software/loopmidi.html loopMIDI] installed and running with the default port name! (The default name should work; the code searches for a name starting with "loop".)
==== Success indicators ====
 
If your fixes worked, then assuming you didn't specify a colouring so that you didn't specify anything other than running either <code>iso()</code>, <code>iso(midi_out_col='...')</code> or <code>iso(midi_out_col='...',midi_input='...')</code>, the launchpad should turn fully cyan. Then, assuming the call to <code>iso(...)</code> is currently running in your terminal/console, you should be able to see MIDI data being printed to the terminal/console whenever you press and release a pad or button on your Launchpad. As a result, and assuming that if on Windows you set up loopMIDI correctly and that it's running, you should be able to select the appropriate instance of RtMidi or loopMIDI as a MIDI input in Scale Workshop and play whatever scale you have loaded via the Launchpad. ''Remember to allow the website MIDI permissions first before looking at its list of MIDI inputs, as there can be a small (few seconds) latency for it to update the list of detected MIDI inputs, and that list may not update unless you close the browser and open it again to hard-refresh the page.''
'''Mix and match these solutions as you find them potentially relevant to your situation, and hopefully you should be able to get it working.'''
 
Feel free to send me a friend request to ask me for help on Discord (<code>@osmiumic</code>).


=== Isomorphic keyboard code for launchpads with programmer mode ===
=== Isomorphic keyboard code for launchpads with programmer mode ===
Line 1,788: Line 1,994:
if j!=0 or i!=0: # equiv. if (i,j) != (0,0) (i think)
if j!=0 or i!=0: # equiv. if (i,j) != (0,0) (i think)
steps = i*x - i//every_x*x_reducer + j*y - j//every_y*y_reducer
steps = i*x - i//every_x*x_reducer + j*y - j//every_y*y_reducer
print( str(steps)+'\\'+str(edo) if args.get('backslash') or args.get('backslashes') else int(.5 + 10000 * steps/edo*1200)/10000 )
print( str(steps)+'\\'+str(edo) if args.get('backslash') or args.get('backslashes') else int(.5 + 1000**2 * steps/edo*1200)/1000**2 )
print()
print()
# for the launchpad pro MK3 specifically:
# for the launchpad pro MK3 specifically: