From bf54a06385e996637d05a0c62d4677a3d56ab430 Mon Sep 17 00:00:00 2001 From: Dele Olajide Date: Mon, 9 Dec 2024 15:59:52 +0000 Subject: [PATCH] add midi chord detection --- docs/index.html | 1 + docs/js/main.js | 33 +++++++++++++++++++++++++++++++++ docs/js/tonal.min.js | 2 ++ 3 files changed, 36 insertions(+) create mode 100644 docs/js/tonal.min.js diff --git a/docs/index.html b/docs/index.html index a40994f..453965a 100644 --- a/docs/index.html +++ b/docs/index.html @@ -135,6 +135,7 @@ + diff --git a/docs/js/main.js b/docs/js/main.js index 2180ae4..e78ed5b 100644 --- a/docs/js/main.js +++ b/docs/js/main.js @@ -25,6 +25,7 @@ const WHAMMY = 2; const LOGO = 12; const CONTROL = 100; +var midiNotes = new Map(); var streamDeckPointer = 0; var streamDeck = null; var bassVol = 95; @@ -1908,6 +1909,7 @@ function toggleStrumUpDown() { function handleNoteOff(note, device, velocity, channel) { console.debug("handleNoteOff", inputDeviceType, note); + midiNotes.delete(note.number); if (inputDeviceType == "chorda" && device != "INSTRUMENT1") { //console.debug("chorda handleNoteOff", note.number, device, velocity, channel); @@ -2024,6 +2026,37 @@ function handleNoteOff(note, device, velocity, channel) { function handleNoteOn(note, device, velocity, channel) { console.debug("handleNoteOn", inputDeviceType, note, device, velocity, channel); + midiNotes.set(note.number, {inputDeviceType, note, device, velocity, channel}); + + if (midiNotes.size == 4 || midiNotes.size == 3) { + const chord = []; + for (let [keyNote, value] of midiNotes) chord.push(value.note.number); + chord.sort(); + + const sorted = []; + for (no of chord) sorted.push(Tonal.Midi.midiToNoteName(no)); + const chords = Tonal.Chord.detect(sorted); + + if (chords.length > 0) { + const chordName = (midiNotes.size == 4 && chords.length > 1) ? chords[1] : chords[0]; + const detectedChord = Tonal.Chord.get(chordName); + console.debug("detected chord", detectedChord, midiNotes.size, chord); + + const arrChordType = (detectedChord.type == "suspended fourth" ? "sus" : (detectedChord.type == "minor" ? "min" : (detectedChord.type == "major" ? "maj" : "maj7"))); + const arrChord = (midiNotes.size == 4 ? chord[1] : chord[0]) % 12; + const key = "key" + arrChord + "_" + arrChordType + "_" + SECTION_IDS[sectionChange]; + const bassKey = "key" + (chord[0] % 12) + "_" + arrChordType + "_" + SECTION_IDS[sectionChange]; + + if (arranger == "webaudio" && realInstrument && styleStarted) { + const bassChecked = document.getElementById("arr-instrument-17")?.checked; + const chordChecked = document.getElementById("arr-instrument-18")?.checked; + console.debug("playing chord", bassChecked, bassKey, chordChecked, key); + + if (bassLoop && bassChecked) bassLoop.update(bassKey, false); + if (chordLoop && chordChecked) chordLoop.update(key, false); + } + } + } if (inputDeviceType == "chorda" && device != "INSTRUMENT1") { //console.debug("chorda handleNoteOn", note.number, device, velocity); diff --git a/docs/js/tonal.min.js b/docs/js/tonal.min.js new file mode 100644 index 0000000..6c1e3f9 --- /dev/null +++ b/docs/js/tonal.min.js @@ -0,0 +1,2 @@ +"use strict";var Tonal=(()=>{var Vt=Object.defineProperty;var ho=Object.getOwnPropertyDescriptor;var vo=Object.getOwnPropertyNames;var yo=Object.prototype.hasOwnProperty;var d=(t,n)=>{for(var e in n)Vt(t,e,{get:n[e],enumerable:!0})},bo=(t,n,e,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let o of vo(n))!yo.call(t,o)&&o!==e&&Vt(t,o,{get:()=>n[o],enumerable:!(r=ho(n,o))||r.enumerable});return t};var go=t=>bo(Vt({},"__esModule",{value:!0}),t);var bi={};d(bi,{AbcNotation:()=>Kt,Array:()=>Ut,Chord:()=>on,ChordDictionary:()=>vi,ChordType:()=>dt,Collection:()=>Qt,Core:()=>$t,DurationValue:()=>an,Interval:()=>nn,Key:()=>vn,Midi:()=>cn,Mode:()=>Sn,Note:()=>dn,PcSet:()=>hi,Pcset:()=>ft,Progression:()=>In,Range:()=>Tn,RhythmPattern:()=>Cn,RomanNumeral:()=>pn,Scale:()=>Rn,ScaleDictionary:()=>yi,ScaleType:()=>At,TimeSignature:()=>wn,Tonal:()=>Mi,VoiceLeading:()=>On,Voicing:()=>zn,VoicingDictionary:()=>kn,accToAlt:()=>L,altToAcc:()=>F,chroma:()=>Kn,coordToInterval:()=>q,coordToNote:()=>ct,coordinates:()=>U,deprecate:()=>Bn,distance:()=>g,fillStr:()=>lo,height:()=>kt,interval:()=>f,isNamed:()=>fo,isNamedPitch:()=>C,isPitch:()=>w,midi:()=>Un,note:()=>s,pitch:()=>X,stepToLetter:()=>zt,tokenizeInterval:()=>Lt,tokenizeNote:()=>Q,tonicIntervalsTransposer:()=>O,transpose:()=>p});var Kt={};d(Kt,{abcToScientificNotation:()=>et,default:()=>Oo,distance:()=>ae,scientificToAbcNotation:()=>Ht,tokenize:()=>Bt,transpose:()=>oe});function C(t){return t!==null&&typeof t=="object"&&"name"in t&&typeof t.name=="string"}var Hn=[0,2,4,5,7,9,11],Kn=({step:t,alt:n})=>(Hn[t]+n+120)%12,kt=({step:t,alt:n,oct:e,dir:r=1})=>r*(Hn[t]+n+12*(e===void 0?-100:e)),Un=t=>{let n=kt(t);return t.oct!==void 0&&n>=-12&&n<=115?n+12:null};function w(t){return t!==null&&typeof t=="object"&&"step"in t&&typeof t.step=="number"&&"alt"in t&&typeof t.alt=="number"&&!isNaN(t.step)&&!isNaN(t.alt)}var Xn=[0,2,4,-1,1,3,5],Qn=Xn.map(t=>Math.floor(t*7/12));function U(t){let{step:n,alt:e,oct:r,dir:o=1}=t,a=Xn[n]+7*e;if(r===void 0)return[o*a];let i=r-Qn[n]-4*e;return[o*a,o*i]}var Ao=[3,0,4,1,5,2,6];function X(t){let[n,e,r]=t,o=Ao[No(n)],a=Math.floor((n+1)/7);if(e===void 0)return{step:o,alt:a,dir:r};let i=e+4*a+Qn[o];return{step:o,alt:a,oct:i,dir:r}}function No(t){let n=(t+1)%7;return n<0?7+n:n}var Jn=(t,n)=>Array(Math.abs(n)+1).join(t),qt=Object.freeze({empty:!0,name:"",num:NaN,q:"",type:"",step:NaN,alt:NaN,dir:NaN,simple:NaN,semitones:NaN,chroma:NaN,coord:[],oct:NaN}),So="([-+]?\\d+)(d{1,4}|m|M|P|A{1,4})",Io="(AA|A|P|M|m|d|dd)([-+]?\\d+)",jo=new RegExp("^"+So+"|"+Io+"$");function Lt(t){let n=jo.exec(`${t}`);return n===null?["",""]:n[1]?[n[1],n[2]]:[n[4],n[3]]}var Wn={};function f(t){return typeof t=="string"?Wn[t]||(Wn[t]=xo(t)):w(t)?f(Co(t)):C(t)?f(t.name):qt}var Zn=[0,2,4,5,7,9,11],Yn="PMMPPMM";function xo(t){let n=Lt(t);if(n[0]==="")return qt;let e=+n[0],r=n[1],o=(Math.abs(e)-1)%7,a=Yn[o];if(a==="M"&&r==="P")return qt;let i=a==="M"?"majorable":"perfectable",m=""+e+r,c=e<0?-1:1,u=e===8||e===-8?e:c*(o+1),M=To(i,r),y=Math.floor((Math.abs(e)-1)/7),l=c*(Zn[o]+M+12*y),P=(c*(Zn[o]+M)%12+12)%12,h=U({step:o,alt:M,oct:y,dir:c});return{empty:!1,name:m,num:e,q:r,step:o,alt:M,dir:c,type:i,simple:u,semitones:l,chroma:P,coord:h,oct:y}}function q(t,n){let[e,r=0]=t,o=e*7+r*12<0,a=n||o?[-e,-r,-1]:[e,r,1];return f(X(a))}function To(t,n){return n==="M"&&t==="majorable"||n==="P"&&t==="perfectable"?0:n==="m"&&t==="majorable"?-1:/^A+$/.test(n)?n.length:/^d+$/.test(n)?-1*(t==="perfectable"?n.length:n.length+1):0}function Co(t){let{step:n,alt:e,oct:r=0,dir:o}=t;if(!o)return"";let a=n+1+7*r,i=a===0?n+1:a,m=o<0?"-":"",c=Yn[n]==="M"?"majorable":"perfectable";return m+i+Eo(c,e)}function Eo(t,n){return n===0?t==="majorable"?"M":"P":n===-1&&t==="majorable"?"m":n>0?Jn("A",n):Jn("d",t==="perfectable"?n:n+1)}var te=(t,n)=>Array(Math.abs(n)+1).join(t),ee=Object.freeze({empty:!0,name:"",letter:"",acc:"",pc:"",step:NaN,alt:NaN,chroma:NaN,height:NaN,coord:[],midi:null,freq:null}),ne=new Map,zt=t=>"CDEFGAB".charAt(t),F=t=>t<0?te("b",-t):te("#",t),L=t=>t[0]==="b"?-t.length:t.length;function s(t){let n=JSON.stringify(t),e=ne.get(n);if(e)return e;let r=typeof t=="string"?Ro(t):w(t)?s(wo(t)):C(t)?s(t.name):ee;return ne.set(n,r),r}var Do=/^([a-gA-G]?)(#{1,}|b{1,}|x{1,}|)(-?\d*)\s*(.*)$/;function Q(t){let n=Do.exec(t);return n?[n[1].toUpperCase(),n[2].replace(/x/g,"##"),n[3],n[4]]:["","","",""]}function ct(t){return s(X(t))}var _o=(t,n)=>(t%n+n)%n,Gt=[0,2,4,5,7,9,11];function Ro(t){let n=Q(t);if(n[0]===""||n[3]!=="")return ee;let e=n[0],r=n[1],o=n[2],a=(e.charCodeAt(0)+3)%7,i=L(r),m=o.length?+o:void 0,c=U({step:a,alt:i,oct:m}),u=e+r+o,M=e+r,y=(Gt[a]+i+120)%12,l=m===void 0?_o(Gt[a]+i,12)-12*99:Gt[a]+i+12*(m+1),P=l>=0&&l<=127?l:null,h=m===void 0?null:Math.pow(2,(l-69)/12)*440;return{empty:!1,acc:r,alt:i,chroma:y,coord:c,freq:h,height:l,letter:e,midi:P,name:u,oct:m,pc:M,step:a}}function wo(t){let{step:n,alt:e,oct:r}=t,o=zt(n);if(!o)return"";let a=o+F(e);return r||r===0?a+r:a}function p(t,n){let e=s(t),r=Array.isArray(n)?n:f(n).coord;if(e.empty||!r||r.length<2)return"";let o=e.coord,a=o.length===1?[o[0]+r[0]]:[o[0]+r[0],o[1]+r[1]];return ct(a).name}function O(t,n){let e=t.length;return r=>{if(!n)return"";let o=r<0?(e- -r%e)%e:r%e,a=Math.floor(r/e),i=p(n,[0,a]);return p(i,t[o])}}function g(t,n){let e=s(t),r=s(n);if(e.empty||r.empty)return"";let o=e.coord,a=r.coord,i=a[0]-o[0],m=o.length===2&&a.length===2?a[1]-o[1]:-Math.floor(i*7/12),c=r.height===e.height&&r.midi!==null&&e.oct===r.oct&&e.step>r.step;return q([i,m],c).name}var re=(t,n)=>Array(n+1).join(t),Fo=/^(_{1,}|=|\^{1,}|)([abcdefgABCDEFG])([,']*)$/;function Bt(t){let n=Fo.exec(t);return n?[n[1],n[2],n[3]]:["","",""]}function et(t){let[n,e,r]=Bt(t);if(e==="")return"";let o=4;for(let i=0;i96?e.toUpperCase()+a+(o+1):e+a+o}function Ht(t){let n=s(t);if(n.empty||!n.oct&&n.oct!==0)return"";let{letter:e,acc:r,oct:o}=n,a=r[0]==="b"?r.replace(/b/g,"_"):r.replace(/#/g,"^"),i=o>4?e.toLowerCase():e,m=o===5?"":o>4?re("'",o-5):re(",",4-o);return a+i+m}function oe(t,n){return Ht(p(et(t),n))}function ae(t,n){return g(et(t),et(n))}var Oo={abcToScientificNotation:et,scientificToAbcNotation:Ht,tokenize:Bt,transpose:oe,distance:ae};var Ut={};d(Ut,{compact:()=>Lo,permutations:()=>me,range:()=>ko,rotate:()=>qo,shuffle:()=>zo,sortedNoteNames:()=>ie,sortedUniqNoteNames:()=>Go});function $o(t,n){let e=[];for(;n--;e[n]=n+t);return e}function Vo(t,n){let e=[];for(;n--;e[n]=t-n);return e}function ko(t,n){return tn===0||n)}function ie(t){return t.map(e=>s(e)).filter(e=>!e.empty).sort((e,r)=>e.height-r.height).map(e=>e.name)}function Go(t){return ie(t).filter((n,e,r)=>e===0||n!==r[e-1])}function zo(t,n=Math.random){let e,r,o=t.length;for(;o;)e=Math.floor(n()*o--),r=t[o],t[o]=t[e],t[e]=r;return t}function me(t){return t.length===0?[[]]:me(t.slice(1)).reduce((n,e)=>n.concat(t.map((r,o)=>{let a=e.slice();return a.splice(o,0,t[0]),a})),[])}var on={};d(on,{chord:()=>Ge,chordScales:()=>Be,default:()=>it,degrees:()=>Xe,detect:()=>pt,extended:()=>He,get:()=>R,getChord:()=>at,notes:()=>Ue,reduced:()=>Ke,steps:()=>Qe,tokenize:()=>Y,transpose:()=>ze});var dt={};d(dt,{add:()=>Wt,addAlias:()=>Se,all:()=>D,chordType:()=>ve,default:()=>ma,entries:()=>Ae,get:()=>ot,keys:()=>ge,names:()=>ye,removeAll:()=>Ne,symbols:()=>be});var ft={};d(ft,{EmptyPcset:()=>I,chroma:()=>ut,chromas:()=>Pe,default:()=>Yo,filter:()=>he,get:()=>v,includes:()=>Zo,intervals:()=>fe,isChroma:()=>rt,isEqual:()=>Me,isNoteIncludedIn:()=>lt,isSubsetOf:()=>G,isSupersetOf:()=>z,modes:()=>W,notes:()=>pe,num:()=>de,pcset:()=>le});var Qt={};d(Qt,{compact:()=>J,default:()=>Ko,permutations:()=>Xt,range:()=>$,rotate:()=>E,shuffle:()=>se});function Bo(t,n){let e=[];for(;n--;e[n]=n+t);return e}function Ho(t,n){let e=[];for(;n--;e[n]=t-n);return e}function $(t,n){return tn===0||n)}function se(t,n=Math.random){let e,r,o=t.length;for(;o;)e=Math.floor(n()*o--),r=t[o],t[o]=t[e],t[e]=r;return t}function Xt(t){return t.length===0?[[]]:Xt(t.slice(1)).reduce((n,e)=>n.concat(t.map((r,o)=>{let a=e.slice();return a.splice(o,0,t[0]),a})),[])}var Ko={compact:J,permutations:Xt,range:$,rotate:E,shuffle:se};var I={empty:!0,name:"",setNum:0,chroma:"000000000000",normalized:"000000000000",intervals:[]},Jt=t=>Number(t).toString(2).padStart(12,"0"),ce=t=>parseInt(t,2),Uo=/^[01]{12}$/;function rt(t){return Uo.test(t)}var Xo=t=>typeof t=="number"&&t>=0&&t<=4095,Qo=t=>t&&rt(t.chroma),ue={[I.chroma]:I};function v(t){let n=rt(t)?t:Xo(t)?Jt(t):Array.isArray(t)?ea(t):Qo(t)?t.chroma:I.chroma;return ue[n]=ue[n]||na(n)}var le=v,ut=t=>v(t).chroma,fe=t=>v(t).intervals,de=t=>v(t).setNum,Jo=["1P","2m","2M","3m","3M","4P","5d","5P","6m","6M","7m","7M"];function Wo(t){let n=[];for(let e=0;e<12;e++)t.charAt(e)==="1"&&n.push(Jo[e]);return n}function pe(t){return v(t).intervals.map(n=>p("C",n))}function Pe(){return $(2048,4095).map(Jt)}function W(t,n=!0){let r=v(t).chroma.split("");return J(r.map((o,a)=>{let i=E(a,r);return n&&i[0]==="0"?null:i.join("")}))}function Me(t,n){return v(t).setNum===v(n).setNum}function G(t){let n=v(t).setNum;return e=>{let r=v(e).setNum;return n&&n!==r&&(r&n)===r}}function z(t){let n=v(t).setNum;return e=>{let r=v(e).setNum;return n&&n!==r&&(r|n)===r}}function lt(t){let n=v(t);return e=>{let r=s(e);return n&&!r.empty&&n.chroma.charAt(r.chroma)==="1"}}var Zo=lt;function he(t){let n=lt(t);return e=>e.filter(n)}var Yo={get:v,chroma:ut,num:de,intervals:fe,chromas:Pe,isSupersetOf:z,isSubsetOf:G,isNoteIncludedIn:lt,isEqual:Me,filter:he,modes:W,notes:pe,pcset:le};function ta(t){let n=t.split("");return n.map((e,r)=>E(r,n).join(""))}function na(t){let n=ce(t),e=ta(t).map(ce).filter(a=>a>=2048).sort()[0],r=Jt(e),o=Wo(t);return{empty:!1,name:"",setNum:n,chroma:t,normalized:r,intervals:o}}function ea(t){if(t.length===0)return I.chroma;let n,e=[0,0,0,0,0,0,0,0,0,0,0,0];for(let r=0;rt.name).filter(t=>t)}function be(){return Z.map(t=>t.aliases[0]).filter(t=>t)}function ge(){return Object.keys(B)}function D(){return Z.slice()}var Ae=D;function Ne(){Z=[],B={}}function Wt(t,n,e){let r=ia(t),o={...v(t),name:e||"",quality:r,intervals:t,aliases:n};Z.push(o),o.name&&(B[o.name]=o),B[o.setNum]=o,B[o.chroma]=o,o.aliases.forEach(a=>Se(o,a))}function Se(t,n){B[n]=t}function ia(t){let n=e=>t.indexOf(e)!==-1;return n("5A")?"Augmented":n("3M")?"Major":n("5d")?"Diminished":n("3m")?"Minor":"Unknown"}oa.forEach(([t,n,e])=>Wt(t.split(" "),e.split(" "),n));Z.sort((t,n)=>t.setNum-n.setNum);var ma={names:ye,symbols:be,get:ot,all:D,add:Wt,removeAll:Ne,keys:ge,entries:Ae,chordType:ve};var sa=t=>{let n=t.reduce((e,r)=>{let o=s(r).chroma;return o!==void 0&&(e[o]=e[o]||s(r).name),e},{});return e=>n[e]};function pt(t,n={}){let e=t.map(o=>s(o).pc).filter(o=>o);return s.length===0?[]:Pa(e,1,n).filter(o=>o.weight).sort((o,a)=>a.weight-o.weight).map(o=>o.name)}var Pt={anyThirds:384,perfectFifth:16,nonPerfectFifths:40,anySeventh:3},Mt=t=>n=>!!(n&t),ca=Mt(Pt.anyThirds),ua=Mt(Pt.perfectFifth),la=Mt(Pt.anySeventh),fa=Mt(Pt.nonPerfectFifths);function da(t){let n=parseInt(t.chroma,2);return ca(n)&&ua(n)&&la(n)}function pa(t){let n=parseInt(t,2);return fa(n)?t:(n|16).toString(2)}function Pa(t,n,e){let r=t[0],o=s(r).chroma,a=sa(t),i=W(t,!1),m=[];return i.forEach((c,u)=>{let M=e.assumePerfectFifth&&pa(c);D().filter(l=>e.assumePerfectFifth&&da(l)?l.chroma===M:l.chroma===c).forEach(l=>{let P=l.aliases[0],h=a(u);u!==o?m.push({weight:.5*n,name:`${h}${P}/${r}`}):m.push({weight:1*n,name:`${h}${P}`})})}),m}var nn={};d(nn,{add:()=>Yt,addTo:()=>Re,default:()=>tn,distance:()=>_e,fromSemitones:()=>De,get:()=>Zt,invert:()=>Ee,name:()=>je,names:()=>Ie,num:()=>Ce,quality:()=>Te,semitones:()=>xe,simplify:()=>ht,subtract:()=>vt,transposeFifths:()=>yt});function Ie(){return"1P 2M 3M 4P 5P 6m 7m".split(" ")}var Zt=f,je=t=>f(t).name,xe=t=>f(t).semitones,Te=t=>f(t).q,Ce=t=>f(t).num;function ht(t){let n=f(t);return n.empty?"":n.simple+n.q}function Ee(t){let n=f(t);if(n.empty)return"";let e=(7-n.step)%7,r=n.type==="perfectable"?-n.alt:-(n.alt+1);return f({step:e,alt:r,oct:n.oct,dir:n.dir}).name}var Ma=[1,2,2,3,3,4,5,5,6,6,7,7],ha="P m M m M P d P m M m M".split(" ");function De(t){let n=t<0?-1:1,e=Math.abs(t),r=e%12,o=Math.floor(e/12);return n*(Ma[r]+7*o)+ha[r]}var _e=g,Yt=we((t,n)=>[t[0]+n[0],t[1]+n[1]]),Re=t=>n=>Yt(t,n),vt=we((t,n)=>[t[0]-n[0],t[1]-n[1]]);function yt(t,n){let e=Zt(t);if(e.empty)return"";let[r,o,a]=e.coord;return q([r+n,o,a]).name}var tn={names:Ie,get:Zt,name:je,num:Ce,semitones:xe,quality:Te,fromSemitones:De,distance:_e,invert:Ee,simplify:ht,add:Yt,addTo:Re,subtract:vt,transposeFifths:yt};function we(t){return(n,e)=>{let r=f(n).coord,o=f(e).coord;if(r&&o){let a=t(r,o);return q(a).name}}}var At={};d(At,{NoScaleType:()=>Fe,add:()=>en,addAlias:()=>qe,all:()=>_,default:()=>ba,entries:()=>$e,get:()=>K,keys:()=>Ve,names:()=>gt,removeAll:()=>ke,scaleType:()=>Oe});var va=[["1P 2M 3M 5P 6M","major pentatonic","pentatonic"],["1P 2M 3M 4P 5P 6M 7M","major","ionian"],["1P 2M 3m 4P 5P 6m 7m","minor","aeolian"],["1P 2M 3m 3M 5P 6M","major blues"],["1P 3m 4P 5d 5P 7m","minor blues","blues"],["1P 2M 3m 4P 5P 6M 7M","melodic minor"],["1P 2M 3m 4P 5P 6m 7M","harmonic minor"],["1P 2M 3M 4P 5P 6M 7m 7M","bebop"],["1P 2M 3m 4P 5d 6m 6M 7M","diminished","whole-half diminished"],["1P 2M 3m 4P 5P 6M 7m","dorian"],["1P 2M 3M 4A 5P 6M 7M","lydian"],["1P 2M 3M 4P 5P 6M 7m","mixolydian","dominant"],["1P 2m 3m 4P 5P 6m 7m","phrygian"],["1P 2m 3m 4P 5d 6m 7m","locrian"],["1P 3M 4P 5P 7M","ionian pentatonic"],["1P 3M 4P 5P 7m","mixolydian pentatonic","indian"],["1P 2M 4P 5P 6M","ritusen"],["1P 2M 4P 5P 7m","egyptian"],["1P 3M 4P 5d 7m","neopolitan major pentatonic"],["1P 3m 4P 5P 6m","vietnamese 1"],["1P 2m 3m 5P 6m","pelog"],["1P 2m 4P 5P 6m","kumoijoshi"],["1P 2M 3m 5P 6m","hirajoshi"],["1P 2m 4P 5d 7m","iwato"],["1P 2m 4P 5P 7m","in-sen"],["1P 3M 4A 5P 7M","lydian pentatonic","chinese"],["1P 3m 4P 6m 7m","malkos raga"],["1P 3m 4P 5d 7m","locrian pentatonic","minor seven flat five pentatonic"],["1P 3m 4P 5P 7m","minor pentatonic","vietnamese 2"],["1P 3m 4P 5P 6M","minor six pentatonic"],["1P 2M 3m 5P 6M","flat three pentatonic","kumoi"],["1P 2M 3M 5P 6m","flat six pentatonic"],["1P 2m 3M 5P 6M","scriabin"],["1P 3M 5d 6m 7m","whole tone pentatonic"],["1P 3M 4A 5A 7M","lydian #5P pentatonic"],["1P 3M 4A 5P 7m","lydian dominant pentatonic"],["1P 3m 4P 5P 7M","minor #7M pentatonic"],["1P 3m 4d 5d 7m","super locrian pentatonic"],["1P 2M 3m 4P 5P 7M","minor hexatonic"],["1P 2A 3M 5P 5A 7M","augmented"],["1P 2M 4P 5P 6M 7m","piongio"],["1P 2m 3M 4A 6M 7m","prometheus neopolitan"],["1P 2M 3M 4A 6M 7m","prometheus"],["1P 2m 3M 5d 6m 7m","mystery #1"],["1P 2m 3M 4P 5A 6M","six tone symmetric"],["1P 2M 3M 4A 5A 6A","whole tone","messiaen's mode #1"],["1P 2m 4P 4A 5P 7M","messiaen's mode #5"],["1P 2M 3M 4P 5d 6m 7m","locrian major","arabian"],["1P 2m 3M 4A 5P 6m 7M","double harmonic lydian"],["1P 2m 2A 3M 4A 6m 7m","altered","super locrian","diminished whole tone","pomeroy"],["1P 2M 3m 4P 5d 6m 7m","locrian #2","half-diminished","aeolian b5"],["1P 2M 3M 4P 5P 6m 7m","mixolydian b6","melodic minor fifth mode","hindu"],["1P 2M 3M 4A 5P 6M 7m","lydian dominant","lydian b7","overtone"],["1P 2M 3M 4A 5A 6M 7M","lydian augmented"],["1P 2m 3m 4P 5P 6M 7m","dorian b2","phrygian #6","melodic minor second mode"],["1P 2m 3m 4d 5d 6m 7d","ultralocrian","superlocrian bb7","superlocrian diminished"],["1P 2m 3m 4P 5d 6M 7m","locrian 6","locrian natural 6","locrian sharp 6"],["1P 2A 3M 4P 5P 5A 7M","augmented heptatonic"],["1P 2M 3m 4A 5P 6M 7m","dorian #4","ukrainian dorian","romanian minor","altered dorian"],["1P 2M 3m 4A 5P 6M 7M","lydian diminished"],["1P 2M 3M 4A 5A 7m 7M","leading whole tone"],["1P 2M 3M 4A 5P 6m 7m","lydian minor"],["1P 2m 3M 4P 5P 6m 7m","phrygian dominant","spanish","phrygian major"],["1P 2m 3m 4P 5P 6m 7M","balinese"],["1P 2m 3m 4P 5P 6M 7M","neopolitan major"],["1P 2M 3M 4P 5P 6m 7M","harmonic major"],["1P 2m 3M 4P 5P 6m 7M","double harmonic major","gypsy"],["1P 2M 3m 4A 5P 6m 7M","hungarian minor"],["1P 2A 3M 4A 5P 6M 7m","hungarian major"],["1P 2m 3M 4P 5d 6M 7m","oriental"],["1P 2m 3m 3M 4A 5P 7m","flamenco"],["1P 2m 3m 4A 5P 6m 7M","todi raga"],["1P 2m 3M 4P 5d 6m 7M","persian"],["1P 2m 3M 5d 6m 7m 7M","enigmatic"],["1P 2M 3M 4P 5A 6M 7M","major augmented","major #5","ionian augmented","ionian #5"],["1P 2A 3M 4A 5P 6M 7M","lydian #9"],["1P 2m 2M 4P 4A 5P 6m 7M","messiaen's mode #4"],["1P 2m 3M 4P 4A 5P 6m 7M","purvi raga"],["1P 2m 3m 3M 4P 5P 6m 7m","spanish heptatonic"],["1P 2M 3m 3M 4P 5P 6M 7m","bebop minor"],["1P 2M 3M 4P 5P 5A 6M 7M","bebop major"],["1P 2m 3m 4P 5d 5P 6m 7m","bebop locrian"],["1P 2M 3m 4P 5P 6m 7m 7M","minor bebop"],["1P 2M 3M 4P 5d 5P 6M 7M","ichikosucho"],["1P 2M 3m 4P 5P 6m 6M 7M","minor six diminished"],["1P 2m 3m 3M 4A 5P 6M 7m","half-whole diminished","dominant diminished","messiaen's mode #2"],["1P 3m 3M 4P 5P 6M 7m 7M","kafi raga"],["1P 2M 3M 4P 4A 5A 6A 7M","messiaen's mode #6"],["1P 2M 3m 3M 4P 5d 5P 6M 7m","composite blues"],["1P 2M 3m 3M 4A 5P 6m 7m 7M","messiaen's mode #3"],["1P 2m 2M 3m 4P 4A 5P 6m 6M 7M","messiaen's mode #7"],["1P 2m 2M 3m 3M 4P 5d 5P 6m 6M 7m 7M","chromatic"]],ya=va,Fe={...I,intervals:[],aliases:[]},bt=[],H={};function gt(){return bt.map(t=>t.name)}function K(t){return H[t]||Fe}var Oe=K;function _(){return bt.slice()}var $e=_;function Ve(){return Object.keys(H)}function ke(){bt=[],H={}}function en(t,n,e=[]){let r={...v(t),name:n,intervals:t,aliases:e};return bt.push(r),H[r.name]=r,H[r.setNum]=r,H[r.chroma]=r,r.aliases.forEach(o=>qe(r,o)),r}function qe(t,n){H[n]=t}ya.forEach(([t,n,...e])=>en(t.split(" "),n,e));var ba={names:gt,get:K,all:_,add:en,removeAll:ke,keys:Ve,entries:$e,scaleType:Oe};var Le={empty:!0,name:"",symbol:"",root:"",bass:"",rootDegree:0,type:"",tonic:null,setNum:NaN,quality:"Unknown",chroma:"",normalized:"",aliases:[],notes:[],intervals:[]};function Y(t){let[n,e,r,o]=Q(t);return n===""?rn("",t):n==="A"&&o==="ug"?rn("","aug"):rn(n+e,r+o)}function rn(t,n){let e=n.split("/");if(e.length===1)return[t,e[0],""];let[r,o,a,i]=Q(e[1]);return r!==""&&a===""&&i===""?[t,e[0],r+o]:[t,n,""]}function R(t){if(Array.isArray(t))return at(t[1]||"",t[0],t[2]);if(t==="")return Le;{let[n,e,r]=Y(t),o=at(e,n,r);return o.empty?at(t):o}}function at(t,n,e){let r=ot(t),o=s(n||""),a=s(e||"");if(r.empty||n&&o.empty||e&&a.empty)return Le;let i=g(o.pc,a.pc),m=r.intervals.indexOf(i),c=m>=0,u=c?a:s(""),M=m===-1?NaN:m+1,y=a.pc&&a.pc!==o.pc,l=Array.from(r.intervals);if(c)for(let k=1;kp(o.pc,k));t=r.aliases.indexOf(t)!==-1?t:r.aliases[0];let h=`${o.empty?"":o.pc}${t}${c&&M>1?"/"+u.pc:y?"/"+a.pc:""}`,nt=`${n?o.pc+" ":""}${r.name}${c&&M>1?" over "+u.pc:y?" over "+a.pc:""}`;return{...r,name:nt,symbol:h,tonic:o.pc,type:r.name,root:u.pc,bass:y?a.pc:"",intervals:l,rootDegree:M,notes:P}}var Ge=R;function ze(t,n){let[e,r,o]=Y(t);if(!e)return t;let a=p(o,n),i=a?"/"+a:"";return p(e,n)+r+i}function Be(t){let n=R(t),e=z(n.chroma);return _().filter(r=>e(r.chroma)).map(r=>r.name)}function He(t){let n=R(t),e=z(n.chroma);return D().filter(r=>e(r.chroma)).map(r=>n.tonic+r.aliases[0])}function Ke(t){let n=R(t),e=G(n.chroma);return D().filter(r=>e(r.chroma)).map(r=>n.tonic+r.aliases[0])}function Ue(t,n){let e=R(t),r=n||e.tonic;return!r||e.empty?[]:e.intervals.map(o=>p(r,o))}function Xe(t,n){let e=R(t),r=n||e.tonic,o=O(e.intervals,r);return a=>a?o(a>0?a-1:a):""}function Qe(t,n){let e=R(t),r=n||e.tonic;return O(e.intervals,r)}var it={getChord:at,get:R,detect:pt,chordScales:Be,extended:He,reduced:Ke,tokenize:Y,transpose:ze,degrees:Xe,steps:Qe,notes:Ue,chord:Ge};var an={};d(an,{default:()=>Ia,fraction:()=>Ye,get:()=>St,names:()=>Je,shorthands:()=>We,value:()=>Ze});var ga=[[.125,"dl",["large","duplex longa","maxima","octuple","octuple whole"]],[.25,"l",["long","longa"]],[.5,"d",["double whole","double","breve"]],[1,"w",["whole","semibreve"]],[2,"h",["half","minim"]],[4,"q",["quarter","crotchet"]],[8,"e",["eighth","quaver"]],[16,"s",["sixteenth","semiquaver"]],[32,"t",["thirty-second","demisemiquaver"]],[64,"sf",["sixty-fourth","hemidemisemiquaver"]],[128,"h",["hundred twenty-eighth"]],[256,"th",["two hundred fifty-sixth"]]],Aa=ga,Nt=[];Aa.forEach(([t,n,e])=>ja(t,n,e));var Na={empty:!0,name:"",value:0,fraction:[0,0],shorthand:"",dots:"",names:[]};function Je(){return Nt.reduce((t,n)=>(n.names.forEach(e=>t.push(e)),t),[])}function We(){return Nt.map(t=>t.shorthand)}var Sa=/^([^.]+)(\.*)$/;function St(t){let[n,e,r]=Sa.exec(t)||[],o=Nt.find(m=>m.shorthand===e||m.names.includes(e));if(!o)return Na;let a=xa(o.fraction,r.length),i=a[0]/a[1];return{...o,name:t,dots:r,value:i,fraction:a}}var Ze=t=>St(t).value,Ye=t=>St(t).fraction,Ia={names:Je,shorthands:We,get:St,value:Ze,fraction:Ye};function ja(t,n,e){Nt.push({empty:!1,dots:"",name:"",value:1/t,fraction:t<1?[1/t,1]:[1,t],shorthand:n,names:e})}function xa(t,n){let e=Math.pow(2,n),r=t[0]*e,o=t[1]*e,a=r;for(let i=0;iQa,majorKey:()=>Mn,majorKeyChords:()=>Ua,majorTonicFromKeySignature:()=>Rr,minorKey:()=>hn,minorKeyChords:()=>Xa});var dn={};d(dn,{accidentals:()=>sr,ascending:()=>Ct,chroma:()=>fr,default:()=>S,descending:()=>Ar,distance:()=>Mr,enharmonic:()=>Dt,freq:()=>lr,fromFreq:()=>dr,fromFreqSharps:()=>pr,fromMidi:()=>Tt,fromMidiSharps:()=>Pr,get:()=>N,midi:()=>ur,name:()=>ir,names:()=>ar,octave:()=>cr,pitchClass:()=>mr,simplify:()=>Nr,sortedNames:()=>fn,sortedUniqNames:()=>Et,tr:()=>hr,trBy:()=>vr,trFifths:()=>br,trFrom:()=>yr,transpose:()=>A,transposeBy:()=>un,transposeFifths:()=>tt,transposeFrom:()=>ln,transposeOctaves:()=>gr});var cn={};d(cn,{chroma:()=>jt,default:()=>wa,freqToMidi:()=>mt,isMidi:()=>mn,midiToFreq:()=>tr,midiToNoteName:()=>j,pcset:()=>xt,pcsetDegrees:()=>er,pcsetNearest:()=>nr,pcsetSteps:()=>sn,toMidi:()=>It});function mn(t){return+t>=0&&+t<=127}function It(t){if(mn(t))return+t;let n=s(t);return n.empty?null:n.midi}function tr(t,n=440){return Math.pow(2,(t-69)/12)*n}var Ta=Math.log(2),Ca=Math.log(440);function mt(t){let n=12*(Math.log(t)-Ca)/Ta+69;return Math.round(n*100)/100}var Ea="C C# D D# E F F# G G# A A# B".split(" "),Da="C Db D Eb E F Gb G Ab A Bb B".split(" ");function j(t,n={}){if(isNaN(t)||t===-1/0||t===1/0)return"";t=Math.round(t);let r=(n.sharps===!0?Ea:Da)[t%12];if(n.pitchClass)return r;let o=Math.floor(t/12)-1;return r+o}function jt(t){return t%12}function _a(t){return t.split("").reduce((n,e,r)=>(r<12&&e==="1"&&n.push(r),n),[])}function Ra(t){return t.map(jt).sort((n,e)=>n-e).filter((n,e,r)=>e===0||n!==r[e-1])}function xt(t){return Array.isArray(t)?Ra(t):_a(t)}function nr(t){let n=xt(t);return e=>{let r=jt(e);for(let o=0;o<12;o++){if(n.includes(r+o))return e+o;if(n.includes(r-o))return e-o}}}function sn(t,n){let e=xt(t),r=e.length;return o=>{let a=o<0?(r- -o%r)%r:o%r,i=Math.floor(o/r);return e[a]+i*12+n}}function er(t,n){let e=sn(t,n);return r=>{if(r!==0)return e(r>0?r-1:r)}}var wa={chroma:jt,freqToMidi:mt,isMidi:mn,midiToFreq:tr,midiToNoteName:j,pcsetNearest:nr,pcset:xt,pcsetDegrees:er,pcsetSteps:sn,toMidi:It};var Fa=["C","D","E","F","G","A","B"],rr=t=>t.name,or=t=>t.map(s).filter(n=>!n.empty);function ar(t){return t===void 0?Fa.slice():Array.isArray(t)?or(t).map(rr):[]}var N=s,ir=t=>N(t).name,mr=t=>N(t).pc,sr=t=>N(t).acc,cr=t=>N(t).oct,ur=t=>N(t).midi,lr=t=>N(t).freq,fr=t=>N(t).chroma;function Tt(t){return j(t)}function dr(t){return j(mt(t))}function pr(t){return j(mt(t),{sharps:!0})}function Pr(t){return j(t,{sharps:!0})}var Mr=g,A=p,hr=p,un=t=>n=>A(n,t),vr=un,ln=t=>n=>A(t,n),yr=ln;function tt(t,n){return A(t,[n,0])}var br=tt;function gr(t,n){return A(t,[0,n])}var Ct=(t,n)=>t.height-n.height,Ar=(t,n)=>n.height-t.height;function fn(t,n){return n=n||Ct,or(t).sort(n).map(rr)}function Et(t){return fn(t,Ct).filter((n,e,r)=>e===0||n!==r[e-1])}var Nr=t=>{let n=N(t);return n.empty?"":j(n.midi||n.chroma,{sharps:n.alt>0,pitchClass:n.midi===null})};function Dt(t,n){let e=N(t);if(e.empty)return"";let r=N(n||j(e.midi||e.chroma,{sharps:e.alt<0,pitchClass:!0}));if(r.empty||r.chroma!==e.chroma)return"";if(e.oct===void 0)return r.pc;let o=e.chroma-e.alt,a=r.chroma-r.alt,i=o>11||a<0?-1:o<0||a>11?1:0,m=e.oct+i;return r.pc+m}var S={names:ar,get:N,name:ir,pitchClass:mr,accidentals:sr,octave:cr,midi:ur,ascending:Ct,descending:Ar,distance:Mr,sortedNames:fn,sortedUniqNames:Et,fromMidi:Tt,fromMidiSharps:Pr,freq:lr,fromFreq:dr,fromFreqSharps:pr,chroma:fr,transpose:A,tr:hr,transposeBy:un,trBy:vr,transposeFrom:ln,trFrom:yr,transposeFifths:tt,transposeOctaves:gr,trFifths:br,simplify:Nr,enharmonic:Dt};var pn={};d(pn,{default:()=>qa,get:()=>x,names:()=>xr,romanNumeral:()=>jr,tokenize:()=>Tr});var Ir={empty:!0,name:"",chordType:""},Sr={};function x(t){return typeof t=="string"?Sr[t]||(Sr[t]=ka(t)):typeof t=="number"?x(_t[t]||""):w(t)?Oa(t):C(t)?x(t.name):Ir}var jr=x;function xr(t=!0){return(t?_t:Va).slice()}function Oa(t){return x(F(t.alt)+_t[t.step])}var $a=/^(#{1,}|b{1,}|x{1,}|)(IV|I{1,3}|VI{0,2}|iv|i{1,3}|vi{0,2})([^IViv]*)$/;function Tr(t){return $a.exec(t)||["","","",""]}var Cr="I II III IV V VI VII",_t=Cr.split(" "),Va=Cr.toLowerCase().split(" ");function ka(t){let[n,e,r,o]=Tr(t);if(!r)return Ir;let a=r.toUpperCase(),i=_t.indexOf(a),m=L(e),c=1;return{empty:!1,name:n,roman:r,interval:f({step:i,alt:m,dir:c}).name,acc:e,chordType:o,alt:m,step:i,major:r===a,oct:0,dir:c}}var qa={names:xr,get:x,romanNumeral:jr};var b=Object.freeze([]),Dr={type:"major",tonic:"",alteration:0,keySignature:""},Rt={tonic:"",grades:b,intervals:b,scale:b,triads:b,chords:b,chordsHarmonicFunction:b,chordScales:b,secondaryDominants:b,secondaryDominantSupertonics:b,substituteDominantsMinorRelative:b,substituteDominants:b,substituteDominantSupertonics:b,secondaryDominantsMinorRelative:b},La={...Dr,...Rt,type:"major",minorRelative:"",scale:b,substituteDominants:b,secondaryDominantSupertonics:b,substituteDominantsMinorRelative:b},Ga={...Dr,type:"minor",relativeMajor:"",natural:Rt,harmonic:Rt,melodic:Rt},Pn=(t,n,e="")=>n.map((r,o)=>`${t[o]}${e}${r}`);function Ft(t,n,e,r,o){return a=>{let i=t.map(P=>x(P).interval||""),m=i.map(P=>A(a,P)),c=Pn(m,e),u=m.map(P=>A(P,"5P")).map(P=>m.includes(P)&&!c.includes(P+"7")?P+"7":""),M=Er(u,n),y=u.map(P=>{if(!P)return"";let h=P.slice(0,-1);return A(h,"5d")+"7"}),l=Er(y,n);return{tonic:a,grades:t,intervals:i,scale:m,triads:Pn(m,n),chords:c,chordsHarmonicFunction:r.slice(),chordScales:Pn(m,o," "),secondaryDominants:u,secondaryDominantSupertonics:M,substituteDominants:y,substituteDominantSupertonics:l,secondaryDominantsMinorRelative:M,substituteDominantsMinorRelative:l}}}var Er=(t,n)=>t.map((e,r)=>{if(!e)return"";let o=e.slice(0,-1),a=A(o,"5P");return n[r].endsWith("m")?a+"m7":a+"m7b5"}),_r=(t,n)=>{let e=s(t),r=s(n);return e.empty||r.empty?0:r.coord[0]-e.coord[0]},za=Ft("I II III IV V VI VII".split(" ")," m m m dim".split(" "),"maj7 m7 m7 maj7 7 m7 m7b5".split(" "),"T SD T SD D T D".split(" "),"major,dorian,phrygian,lydian,mixolydian,minor,locrian".split(",")),Ba=Ft("I II bIII IV V bVI bVII".split(" "),"m dim m m ".split(" "),"m7 m7b5 maj7 m7 m7 maj7 7".split(" "),"T SD T SD D SD SD".split(" "),"minor,locrian,major,dorian,phrygian,lydian,mixolydian".split(",")),Ha=Ft("I II bIII IV V bVI VII".split(" "),"m dim aug m dim".split(" "),"mMaj7 m7b5 +maj7 m7 7 maj7 o7".split(" "),"T SD T SD D SD D".split(" "),"harmonic minor,locrian 6,major augmented,lydian diminished,phrygian dominant,lydian #9,ultralocrian".split(",")),Ka=Ft("I II bIII IV V VI VII".split(" "),"m m aug dim dim".split(" "),"m6 m7 +maj7 7 7 m7b5 m7b5".split(" "),"T SD T SD D ".split(" "),"melodic minor,dorian b2,lydian augmented,lydian dominant,mixolydian b6,locrian #2,altered".split(","));function Mn(t){let n=s(t).pc;if(!n)return La;let e=za(n),r=_r("C",n);return{...e,type:"major",minorRelative:A(n,"-3m"),alteration:r,keySignature:F(r)}}function Ua(t){let n=Mn(t),e=[];return wt(n,e),e}function Xa(t){let n=hn(t),e=[];return wt(n.natural,e),wt(n.harmonic,e),wt(n.melodic,e),e}function wt(t,n){let e=(r,o)=>{if(!r)return;let a=n.find(i=>i.name===r);a||(a={name:r,roles:[]},n.push(a)),o&&!a.roles.includes(o)&&a.roles.push(o)};t.chords.forEach((r,o)=>e(r,t.chordsHarmonicFunction[o])),t.secondaryDominants.forEach((r,o)=>e(r,`V/${t.grades[o]}`)),t.secondaryDominantSupertonics.forEach((r,o)=>e(r,`ii/${t.grades[o]}`)),t.substituteDominants.forEach((r,o)=>e(r,`subV/${t.grades[o]}`)),t.substituteDominantSupertonics.forEach((r,o)=>e(r,`subii/${t.grades[o]}`))}function hn(t){let n=s(t).pc;if(!n)return Ga;let e=_r("C",n)-3;return{type:"minor",tonic:n,relativeMajor:A(n,"3m"),alteration:e,keySignature:F(e),natural:Ba(n),harmonic:Ha(n),melodic:Ka(n)}}function Rr(t){return typeof t=="number"?tt("C",t):typeof t=="string"&&/^b+|#+$/.test(t)?tt("C",L(t)):null}var Qa={majorKey:Mn,majorTonicFromKeySignature:Rr,minorKey:hn};var Sn={};d(Sn,{all:()=>An,default:()=>Wa,distance:()=>Nn,entries:()=>Or,get:()=>V,mode:()=>Fr,names:()=>$r,notes:()=>Vr,relativeTonic:()=>Gr,seventhChords:()=>Lr,triads:()=>qr});var bn=[[0,2773,0,"ionian","","Maj7","major"],[1,2902,2,"dorian","m","m7"],[2,3418,4,"phrygian","m","m7"],[3,2741,-1,"lydian","","Maj7"],[4,2774,1,"mixolydian","","7"],[5,2906,3,"aeolian","m","m7","minor"],[6,3434,5,"locrian","dim","m7b5"]],wr={...I,name:"",alt:0,modeNum:NaN,triad:"",seventh:"",aliases:[]},gn=bn.map(Ja),yn={};gn.forEach(t=>{yn[t.name]=t,t.aliases.forEach(n=>{yn[n]=t})});function V(t){return typeof t=="string"?yn[t.toLowerCase()]||wr:t&&t.name?V(t.name):wr}var Fr=V;function An(){return gn.slice()}var Or=An;function $r(){return gn.map(t=>t.name)}function Ja(t){let[n,e,r,o,a,i,m]=t,c=m?[m]:[],u=Number(e).toString(2);return{empty:!1,intervals:K(o).intervals,modeNum:n,chroma:u,normalized:u,name:o,setNum:e,alt:r,triad:a,seventh:i,aliases:c}}function Vr(t,n){return V(t).intervals.map(e=>p(n,e))}function kr(t){return(n,e)=>{let r=V(n);if(r.empty)return[];let o=E(r.modeNum,t),a=r.intervals.map(i=>p(e,i));return o.map((i,m)=>a[m]+i)}}var qr=kr(bn.map(t=>t[4])),Lr=kr(bn.map(t=>t[5]));function Nn(t,n){let e=V(n),r=V(t);return e.empty||r.empty?"":ht(yt("1P",r.alt-e.alt))}function Gr(t,n,e){return p(e,Nn(t,n))}var Wa={get:V,names:$r,all:An,distance:Nn,relativeTonic:Gr,notes:Vr,triads:qr,seventhChords:Lr,entries:Or,mode:Fr};var In={};d(In,{default:()=>Za,fromRomanNumerals:()=>zr,toRomanNumerals:()=>Br});function zr(t,n){return n.map(x).map(r=>p(t,f(r))+r.chordType)}function Br(t,n){return n.map(e=>{let[r,o]=Y(e),a=g(t,r);return x(f(a)).name+o})}var Za={fromRomanNumerals:zr,toRomanNumerals:Br};var Tn={};d(Tn,{chromatic:()=>Hr,default:()=>xn,numeric:()=>jn});function jn(t){let n=J(t.map(e=>typeof e=="number"?e:It(e)));return!t.length||n.length!==t.length?[]:n.reduce((e,r)=>{let o=e[e.length-1];return e.concat($(o,r).slice(1))},[n[0]])}function Hr(t,n){return jn(t).map(e=>j(e,n))}var xn={numeric:jn,chromatic:Hr};var Cn={};d(Cn,{binary:()=>Ya,euclid:()=>ai,hex:()=>ti,onsets:()=>ni,probability:()=>ri,random:()=>ei,rotate:()=>oi});function Ya(...t){return t.reduce((n,e)=>(e.toString(2).split("").forEach(r=>{n.push(parseInt(r))}),n),[])}function ti(t){let n=[];for(let e=0;e{n.push(a==="1"?1:0)})}return n}function ni(...t){return t.reduce((n,e)=>{n.push(1);for(let r=0;r=n?1:0);return r}function ri(t,n=Math.random){return t.map(e=>n()<=e?1:0)}function oi(t,n){let e=t.length,r=[];for(let o=0;osi,degrees:()=>Yr,detect:()=>Xr,extended:()=>Dn,get:()=>T,modeNames:()=>Wr,names:()=>Kr,rangeOf:()=>Zr,reduced:()=>Jr,scale:()=>Ur,scaleChords:()=>Qr,scaleNotes:()=>_n,steps:()=>to,tokenize:()=>En});var ii={empty:!0,name:"",type:"",tonic:null,setNum:NaN,chroma:"",normalized:"",aliases:[],notes:[],intervals:[]};function En(t){if(typeof t!="string")return["",""];let n=t.indexOf(" "),e=s(t.substring(0,n));if(e.empty){let o=s(t);return o.empty?["",t]:[o.name,""]}let r=t.substring(e.name.length+1).toLowerCase();return[e.name,r.length?r:""]}var Kr=gt;function T(t){let n=Array.isArray(t)?t:En(t),e=s(n[0]).name,r=K(n[1]);if(r.empty)return ii;let o=r.name,a=e?r.intervals.map(m=>p(e,m)):[],i=e?e+" "+o:o;return{...r,name:i,type:o,tonic:e,notes:a}}var Ur=T;function Xr(t,n={}){let e=ut(t),r=s(n.tonic??t[0]??""),o=r.chroma;if(o===void 0)return[];let a=e.split("");a[o]="1";let i=E(o,a).join(""),m=_().find(u=>u.chroma===i),c=[];return m&&c.push(r.name+" "+m.name),n.match==="exact"||Dn(i).forEach(u=>{c.push(r.name+" "+u)}),c}function Qr(t){let n=T(t),e=G(n.chroma);return D().filter(r=>e(r.chroma)).map(r=>r.aliases[0])}function Dn(t){let n=rt(t)?t:T(t).chroma,e=z(n);return _().filter(r=>e(r.chroma)).map(r=>r.name)}function Jr(t){let n=G(T(t).chroma);return _().filter(e=>n(e.chroma)).map(e=>e.name)}function _n(t){let n=t.map(o=>s(o).pc).filter(o=>o),e=n[0],r=Et(n);return E(r.indexOf(e),r)}function Wr(t){let n=T(t);if(n.empty)return[];let e=n.tonic?n.notes:n.intervals;return W(n.chroma).map((r,o)=>{let a=T(r).name;return a?[e[o],a]:["",""]}).filter(r=>r[0])}function mi(t){let n=Array.isArray(t)?_n(t):T(t).notes,e=n.map(r=>s(r).chroma);return r=>{let o=typeof r=="number"?s(Tt(r)):s(r),a=o.height;if(a===void 0)return;let i=a%12,m=e.indexOf(i);if(m!==-1)return Dt(o.name,n[m])}}function Zr(t){let n=mi(t);return(e,r)=>{let o=s(e).height,a=s(r).height;return o===void 0||a===void 0?[]:$(o,a).map(n).filter(i=>i)}}function Yr(t){let{intervals:n,tonic:e}=T(t),r=O(n,e);return o=>o?r(o>0?o-1:o):""}function to(t){let{intervals:n,tonic:e}=T(t);return O(n,e)}var si={degrees:Yr,detect:Xr,extended:Dn,get:T,modeNames:Wr,names:Kr,rangeOf:Zr,reduced:Jr,scaleChords:Qr,scaleNotes:_n,steps:to,tokenize:En,scale:Ur};var wn={};d(wn,{default:()=>fi,get:()=>ro,names:()=>eo,parse:()=>Ot});var ci={empty:!0,name:"",upper:void 0,lower:void 0,type:void 0,additive:[]},ui=["4/4","3/4","2/4","2/2","12/8","9/8","6/8","3/8"];function eo(){return ui.slice()}var li=/^(\d*\d(?:\+\d)*)\/(\d+)$/,no=new Map;function ro(t){let n=JSON.stringify(t),e=no.get(n);if(e)return e;let r=pi(Ot(t));return no.set(n,r),r}function Ot(t){if(typeof t=="string"){let[a,i,m]=li.exec(t)||[];return Ot([i,m])}let[n,e]=t,r=+e;if(typeof n=="number")return[n,r];let o=n.split("+").map(a=>+a);return o.length===1?[o[0],r]:[o,r]}var fi={names:eo,parse:Ot,get:ro},di=t=>Math.log(t)/Math.log(2)%1===0;function pi([t,n]){let e=Array.isArray(t)?t.reduce((m,c)=>m+c,0):t,r=n;if(e===0||r===0)return ci;let o=Array.isArray(t)?`${t.join("+")}/${n}`:`${t}/${n}`,a=Array.isArray(t)?t:[],i=r===4||r===2?"simple":r===8&&e%3===0?"compound":di(r)?"irregular":"irrational";return{empty:!1,name:o,type:i,upper:e,lower:r,additive:a}}var On={};d(On,{default:()=>Fn,topNoteDiff:()=>oo});var oo=(t,n)=>{if(!n||!n.length)return t[0];let e=o=>S.midi(o[o.length-1])||0,r=o=>Math.abs(e(n)-e(o));return t.sort((o,a)=>r(o)-r(a))[0]},Fn={topNoteDiff:oo};var zn={};d(zn,{default:()=>Pi,get:()=>Ln,search:()=>Gn,sequence:()=>uo});var kn={};d(kn,{all:()=>io,default:()=>st,defaultDictionary:()=>Vn,lefthand:()=>$n,lookup:()=>mo,triads:()=>ao});var ao={M:["1P 3M 5P","3M 5P 8P","5P 8P 10M"],m:["1P 3m 5P","3m 5P 8P","5P 8P 10m"],o:["1P 3m 5d","3m 5d 8P","5d 8P 10m"],aug:["1P 3m 5A","3m 5A 8P","5A 8P 10m"]},$n={m7:["3m 5P 7m 9M","7m 9M 10m 12P"],7:["3M 6M 7m 9M","7m 9M 10M 13M"],"^7":["3M 5P 7M 9M","7M 9M 10M 12P"],69:["3M 5P 6A 9M"],m7b5:["3m 5d 7m 8P","7m 8P 10m 12d"],"7b9":["3M 6m 7m 9m","7m 9m 10M 13m"],"7b13":["3M 6m 7m 9m","7m 9m 10M 13m"],o7:["1P 3m 5d 6M","5d 6M 8P 10m"],"7#11":["7m 9M 11A 13A"],"7#9":["3M 7m 9A"],mM7:["3m 5P 7M 9M","7M 9M 10m 12P"],m6:["3m 5P 6M 9M","6M 9M 10m 12P"]},io={M:["1P 3M 5P","3M 5P 8P","5P 8P 10M"],m:["1P 3m 5P","3m 5P 8P","5P 8P 10m"],o:["1P 3m 5d","3m 5d 8P","5d 8P 10m"],aug:["1P 3m 5A","3m 5A 8P","5A 8P 10m"],m7:["3m 5P 7m 9M","7m 9M 10m 12P"],7:["3M 6M 7m 9M","7m 9M 10M 13M"],"^7":["3M 5P 7M 9M","7M 9M 10M 12P"],69:["3M 5P 6A 9M"],m7b5:["3m 5d 7m 8P","7m 8P 10m 12d"],"7b9":["3M 6m 7m 9m","7m 9m 10M 13m"],"7b13":["3M 6m 7m 9m","7m 9m 10M 13m"],o7:["1P 3m 5d 6M","5d 6M 8P 10m"],"7#11":["7m 9M 11A 13A"],"7#9":["3M 7m 9A"],mM7:["3m 5P 7M 9M","7M 9M 10m 12P"],m6:["3m 5P 6M 9M","6M 9M 10m 12P"]},Vn=$n;function mo(t,n=Vn){if(n[t])return n[t];let{aliases:e}=it.get("C"+t),r=Object.keys(n).find(o=>e.includes(o))||"";if(r!==void 0)return n[r]}var st={lookup:mo,lefthand:$n,triads:ao,all:io,defaultDictionary:Vn};var qn=["C3","C5"],so=st.all,co=Fn.topNoteDiff;function Ln(t,n=qn,e=so,r=co,o){let a=Gn(t,n,e);return!o||!o.length?a[0]:r(a,o)}function Gn(t,n=qn,e=st.triads){let[r,o]=it.tokenize(t),a=st.lookup(o,e);if(!a)return[];let i=a.map(c=>c.split(" ")),m=xn.chromatic(n);return i.reduce((c,u)=>{let M=u.map(h=>tn.subtract(h,u[0])||""),y=S.transpose(r,u[0]),P=m.filter(h=>S.chroma(h)===S.chroma(y)).filter(h=>(S.midi(S.transpose(h,M[M.length-1]))||0)<=(S.midi(n[1])||0)).map(h=>S.enharmonic(h,y)).map(h=>M.map(nt=>S.transpose(h,nt)));return c.concat(P)},[])}function uo(t,n=qn,e=so,r=co,o){let{voicings:a}=t.reduce(({voicings:i,lastVoicing:m},c)=>{let u=Ln(c,n,e,r,m);return m=u,i.push(u),{voicings:i,lastVoicing:m}},{voicings:[],lastVoicing:o});return a}var Pi={get:Ln,search:Gn,sequence:uo};var $t={};d($t,{accToAlt:()=>L,altToAcc:()=>F,chroma:()=>Kn,coordToInterval:()=>q,coordToNote:()=>ct,coordinates:()=>U,deprecate:()=>Bn,distance:()=>g,fillStr:()=>lo,height:()=>kt,interval:()=>f,isNamed:()=>fo,isNamedPitch:()=>C,isPitch:()=>w,midi:()=>Un,note:()=>s,pitch:()=>X,stepToLetter:()=>zt,tokenizeInterval:()=>Lt,tokenizeNote:()=>Q,tonicIntervalsTransposer:()=>O,transpose:()=>p});var lo=(t,n)=>Array(Math.abs(n)+1).join(t);function Bn(t,n,e){return function(...r){return console.warn(`${t} is deprecated. Use ${n}.`),e.apply(this,r)}}var fo=Bn("isNamed","isNamedPitch",C);var Mi=$t,hi=ft,vi=dt,yi=At;return go(bi);})(); +//# sourceMappingURL=tonal.min.js.map \ No newline at end of file