├── .gitignore ├── LICENSE ├── README.md ├── css └── style.css ├── img ├── G_clef.png ├── GitHub-Mark-24px.png ├── french_flag.png ├── magnifier_16.png └── magnifier_grey_16.png ├── index.html ├── js ├── chords │ ├── chord_finder.js │ ├── chord_finder.js.map │ ├── chord_generator.js │ ├── chord_generator.js.map │ ├── chords.js │ ├── chords.js.map │ ├── chords_microtonal.js │ └── chords_microtonal.js.map ├── functions_play.js ├── functions_play.js.map ├── gui │ ├── fretboard.js │ ├── fretboard.js.map │ ├── interface.js │ ├── interface.js.map │ ├── keyboard.js │ ├── keyboard.js.map │ ├── positions_guitar.js │ ├── positions_guitar.js.map │ ├── strings.js │ ├── strings.js.map │ ├── tunings_guitar.js │ └── tunings_guitar.js.map ├── intervals.js ├── intervals.js.map ├── midi │ ├── Base64.js │ ├── Base64binary.js │ ├── WebAudioAPI.js │ ├── audioDetect.js │ ├── dom_request_script.js │ ├── dom_request_xhr.js │ ├── gm.js │ ├── loader.js │ ├── plugin.audiotag.js │ ├── plugin.webaudio.js │ ├── plugin.webmidi.js │ └── soundfonts │ │ ├── acoustic_bass-ogg.js │ │ ├── acoustic_grand_piano-ogg.js │ │ ├── acoustic_guitar_steel-ogg.js │ │ ├── bright_acoustic_piano-ogg.js │ │ ├── celesta-ogg.js │ │ ├── choir_aahs-ogg.js │ │ ├── church_organ-ogg.js │ │ ├── electric_grand_piano-ogg.js │ │ ├── fx_2_soundtrack-ogg.js │ │ ├── fx_5_brightness-ogg.js │ │ ├── fx_7_echoes-ogg.js │ │ ├── glockenspiel-ogg.js │ │ ├── honkytonk_piano-ogg.js │ │ ├── koto-ogg.js │ │ ├── lead_7_fifths-ogg.js │ │ ├── marimba-ogg.js │ │ ├── music_box-ogg.js │ │ ├── pad_1_new_age-ogg.js │ │ ├── pad_2_warm-ogg.js │ │ ├── pad_5_bowed-ogg.js │ │ ├── pad_8_sweep-ogg.js │ │ ├── percussive_organ-ogg.js │ │ ├── pizzicato_strings-ogg.js │ │ ├── reed_organ-ogg.js │ │ ├── rock_organ-ogg.js │ │ ├── slap_bass_2-ogg.js │ │ ├── steel_drums-ogg.js │ │ ├── synth_drum-ogg.js │ │ ├── synth_strings_1-ogg.js │ │ ├── tango_accordion-ogg.js │ │ ├── timpani-ogg.js │ │ ├── tremolo_strings-ogg.js │ │ ├── tubular_bells-ogg.js │ │ ├── vibraphone-ogg.js │ │ ├── voice_oohs-ogg.js │ │ └── xylophone-ogg.js ├── notes.js ├── notes.js.map ├── pages │ ├── chord_explorer.js │ ├── chord_explorer.js.map │ ├── chord_tester.js │ ├── chord_tester.js.map │ ├── scale_explorer.js │ ├── scale_explorer.js.map │ ├── scale_finder.js │ └── scale_finder.js.map ├── scale_keyboard │ ├── instruments.js │ ├── instruments.js.map │ ├── scale_keyboard.js │ └── scale_keyboard.js.map ├── scales │ ├── negative_harmony.js │ ├── negative_harmony.js.map │ ├── scala.js │ ├── scala.js.map │ ├── scales.js │ ├── scales.js.map │ ├── scales_functions.js │ ├── scales_functions.js.map │ ├── scales_quartertones.js │ ├── scales_quartertones.js.map │ ├── scales_xenharmonic.js │ └── scales_xenharmonic.js.map ├── song_generator │ ├── chord_progression.js │ ├── chord_progression.js.map │ ├── counterpoint_1_1.js │ ├── counterpoint_1_1.js.map │ ├── counterpoint_2_1.js │ ├── counterpoint_2_1.js.map │ ├── counterpoint_3_1.js │ ├── counterpoint_3_1.js.map │ ├── counterpoint_4_1.js │ ├── counterpoint_4_1.js.map │ ├── counterpoint_4th_spec.js │ ├── counterpoint_4th_spec.js.map │ ├── melodic_fluency.js │ ├── melodic_fluency.js.map │ ├── midiFile.js │ ├── midiFile.js.map │ ├── midiHeader.js │ ├── midiHeader.js.map │ ├── midiHelper.js │ ├── midiHelper.js.map │ ├── midiTrack.js │ ├── midiTrack.js.map │ ├── midiTrackEvent.js │ ├── midiTrackEvent.js.map │ ├── midiTrackEventType.js │ ├── midiTrackEventType.js.map │ ├── random_tools.js │ ├── random_tools.js.map │ ├── sequence.js │ ├── sequence.js.map │ ├── song_generator.js │ └── song_generator.js.map └── tools │ ├── array_tools.js │ ├── array_tools.js.map │ ├── roman.js │ ├── roman.js.map │ ├── roman_numerals.js │ ├── roman_numerals.js.map │ ├── url_parameters.js │ └── url_parameters.js.map ├── ts ├── chords │ ├── chord_finder.ts │ ├── chord_generator.ts │ ├── chords.ts │ └── chords_microtonal.ts ├── functions_play.ts ├── gui │ ├── fretboard.ts │ ├── interface.ts │ ├── keyboard.ts │ ├── positions_guitar.ts │ ├── strings.ts │ └── tunings_guitar.ts ├── intervals.ts ├── notes.ts ├── pages │ ├── chord_explorer.ts │ ├── chord_tester.ts │ ├── scale_explorer.ts │ └── scale_finder.ts ├── scale_keyboard │ ├── instruments.ts │ └── scale_keyboard.ts ├── scales │ ├── negative_harmony.ts │ ├── scala.ts │ ├── scales.ts │ ├── scales_functions.ts │ ├── scales_quartertones.ts │ └── scales_xenharmonic.ts ├── song_generator │ ├── chord_progression.ts │ ├── counterpoint_1_1.ts │ ├── counterpoint_2_1.ts │ ├── counterpoint_3_1.ts │ ├── counterpoint_4_1.ts │ ├── counterpoint_4th_spec.ts │ ├── melodic_fluency.ts │ ├── midiFile.ts │ ├── midiHeader.ts │ ├── midiHelper.ts │ ├── midiTrack.ts │ ├── midiTrackEvent.ts │ ├── midiTrackEventType.ts │ ├── random_tools.ts │ ├── sequence.ts │ └── song_generator.ts └── tools │ ├── array_tools.ts │ ├── roman_numerals.ts │ └── url_parameters.ts └── tsconfig.json /.gitignore: -------------------------------------------------------------------------------- 1 | /.vscode 2 | /js_backup 3 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 Modrigue 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Music Toolbox 2 | 3 | Easy to use online music scale and chords generator, finder and player. 4 | 5 | * Scale explorer with more than 90 scales / modes (incl. quarter tones), 6 | * Scale finder, 7 | * Chord explorer, finder and interactive player, 8 | * Scales and chords visualization on guitar and keyboard, 9 | * Adjustable guitar nb. of strings and tuning, 10 | * Play along with the scale keyboard (incl. microtonal / xenharmonic scales), 11 | * Visualize common chords between different scales. 12 | 13 | [Try it here](https://modrigue.github.io/MusicToolbox/) 14 | 15 | _Uses [MIDI.js](https://github.com/mudcube/MIDI.js/) to play notes and [js soundfonts](https://cindyjs.org/dist/v0.8.8/soundfonts/)._ 16 | -------------------------------------------------------------------------------- /img/G_clef.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modrigue/MusicToolbox/4d7e0e2906a45243abef153df973cfad2c5adb2a/img/G_clef.png -------------------------------------------------------------------------------- /img/GitHub-Mark-24px.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modrigue/MusicToolbox/4d7e0e2906a45243abef153df973cfad2c5adb2a/img/GitHub-Mark-24px.png -------------------------------------------------------------------------------- /img/french_flag.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modrigue/MusicToolbox/4d7e0e2906a45243abef153df973cfad2c5adb2a/img/french_flag.png -------------------------------------------------------------------------------- /img/magnifier_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modrigue/MusicToolbox/4d7e0e2906a45243abef153df973cfad2c5adb2a/img/magnifier_16.png -------------------------------------------------------------------------------- /img/magnifier_grey_16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Modrigue/MusicToolbox/4d7e0e2906a45243abef153df973cfad2c5adb2a/img/magnifier_grey_16.png -------------------------------------------------------------------------------- /js/chords/chords_microtonal.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // quarter tone approximated harmonics 3 | // h7 = 9.5, ‡6 (7/4) 4 | // h11 = 5.5, ‡4 (11/8) 5 | // h13 = 8.5, d6 (13/8) 6 | // quarter tone chords with 3 notes 7 | chords3Dict.set("n", [0, 3.5, 7]); 8 | chords3Dict.set("n65", [0, 7, 8.5]); 9 | chords3Dict.set("h7sus4", [0, 5, 9.5]); 10 | chords3Dict.set("h7sus2", [0, 2, 9.5]); 11 | chords3Dict.set("h13sus4", [0, 5, 8.5]); 12 | chords3Dict.set("h13sus2", [0, 2, 8.5]); 13 | chords3Dict.set("h11sus2", [0, 2, 5.5]); 14 | chords3Dict.set("d5", [0, 4, 6.5]); 15 | chords3Dict.set("nd5", [0, 3.5, 6.5]); 16 | chords3Dict.set("mind5", [0, 3, 6.5]); 17 | chords3Dict.set("addh13(no5)", [0, 4, 8.5]); 18 | chords3Dict.set("naddh13(no5)", [0, 3.5, 8.5]); 19 | chords3Dict.set("maddh13(no5)", [0, 3, 8.5]); 20 | // quarter tone chords with 4 notes 21 | chords4Dict.set("h7", [0, 4, 7, 9.5]); // harmonic 7th / quartertone dominant 7th 22 | chords4Dict.set("nh7", [0, 3.5, 7, 9.5]); // neutral harmonic 7th 23 | chords4Dict.set("mh7", [0, 3, 7, 9.5]); // minor harmonic 7th 24 | chords4Dict.set("nh7flat5", [0, 3.5, 6, 9.5]); // neutral diminished 7th 25 | chords4Dict.set("h13", [0, 3, 5.5, 8.5]); // harmonic 13th 26 | chords4Dict.set("nh13", [0, 3.5, 5.5, 8.5]); // neutral harmonic 13th 27 | chords4Dict.set("addh13", [0, 4, 7, 8.5]); 28 | chords4Dict.set("naddh13", [0, 3.5, 7, 8.5]); 29 | chords4Dict.set("maddh13", [0, 3, 7, 8.5]); 30 | chords4Dict.set("addh11", [0, 4, 7, 17.5]); 31 | chords4Dict.set("naddh11", [0, 3.5, 7, 17.5]); 32 | chords4Dict.set("maddh11", [0, 3, 7, 17.5]); 33 | chords4Dict.set("h7h11(no5)", [0, 4, 9.5, 17.5]); 34 | chords4Dict.set("n7", [0, 3.5, 7, 10.5]); 35 | chords4Dict.set("n7sus2", [0, 2, 7, 10.5]); 36 | chords4Dict.set("n7sus4", [0, 5, 7, 10.5]); 37 | chords4Dict.set("nadd9", [0, 3.5, 7, 14]); 38 | chords4Dict.set("nadd11", [0, 3.5, 5, 17]); 39 | chords4Dict.set("19to15", [0, 3, 6.5, 9.5]); // 19th to 15th 40 | // quarter tone chords with 5 notes 41 | chords5Dict.set("h7db9", [0, 4, 7, 9.5, 12.5]); 42 | chords5Dict.set("h7h11", [0, 4, 7, 9.5, 17.5]); 43 | chords5Dict.set("h7h11h13(no5)", [0, 4, 9.5, 17.5, 20.5]); 44 | chords5Dict.set("n9sus", [0, 5, 7, 10.5, 14]); 45 | // quarter tone chords with 6 notes 46 | chords6Dict.set("h7h11h13", [0, 4, 7, 9.5, 17.5, 20.5]); 47 | // quarter tone chords functions 48 | function isQuarterToneChord(chordId) { 49 | const chordValues = getChordValues(chordId); 50 | return areQuarterToneChordValues(chordValues); 51 | } 52 | function isXenharmonicChord(chordId) { 53 | const chordValues = getChordValues(chordId); 54 | return areXenharmonicChordValues(chordValues); 55 | } 56 | function areQuarterToneChordValues(chordValues) { 57 | for (const value of chordValues) 58 | if (isQuarterToneInterval(value)) 59 | return true; 60 | return false; 61 | } 62 | function areXenharmonicChordValues(chordValues) { 63 | for (const value of chordValues) 64 | if (isXenharmonicInterval(value)) 65 | return true; 66 | return false; 67 | } 68 | //# sourceMappingURL=chords_microtonal.js.map -------------------------------------------------------------------------------- /js/chords/chords_microtonal.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"chords_microtonal.js","sourceRoot":"","sources":["../../ts/chords/chords_microtonal.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /js/gui/positions_guitar.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | //////////////////////////////// GUITAR POSITIONS ///////////////////////////// 3 | function initGuitarPositionSelector(id, useURLParams = true, nbPos = 7, position = -1) { 4 | // get selector 5 | const posSelect = document.getElementById(id); 6 | const initialized = (posSelect.options != null && posSelect.options.length > 0); 7 | if (initialized) // nop if already initialized 8 | return; 9 | // add tunings 10 | for (let i = -1; i < nbPos; i++) { 11 | const positionAll = (i == -1); 12 | let option = document.createElement('option'); 13 | option.value = i.toString(); 14 | option.innerHTML = positionAll ? "" : (i + 1).toString(); 15 | if (i == position) 16 | option.selected = true; 17 | posSelect.appendChild(option); 18 | } 19 | // disable if only 1 option 20 | posSelect.disabled = (posSelect.options.length <= 1); 21 | } 22 | function updateGuitarPositionGivenNbNotes(id, nbNotes) { 23 | const posSelect = document.getElementById(id); 24 | const posFormer = getSelectedGuitarPosition(id); 25 | // replace selector options and try to select former corresponding guitar tuning 26 | removeAllChildNodes(posSelect); 27 | const position = (posFormer <= nbNotes) ? posFormer : -1; 28 | initGuitarPositionSelector(id, false, nbNotes, position); 29 | } 30 | function getSelectedGuitarPosition(id) { 31 | const posSelect = document.getElementById(id); 32 | let posId = posSelect.value; 33 | return parseInt(posId); 34 | } 35 | //# sourceMappingURL=positions_guitar.js.map -------------------------------------------------------------------------------- /js/gui/positions_guitar.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"positions_guitar.js","sourceRoot":"","sources":["../../ts/gui/positions_guitar.ts"],"names":[],"mappings":";AAAA,+EAA+E;AAG/E,SAAS,0BAA0B,CAAC,EAAU,EAAE,eAAwB,IAAI,EACxE,QAAgB,CAAC,EAAE,WAAmB,CAAC,CAAC;IAExC,eAAe;IACf,MAAM,SAAS,GAAyC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACpF,MAAM,WAAW,GAAG,CAAC,SAAS,CAAC,OAAO,IAAI,IAAI,IAAI,SAAS,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IAChF,IAAI,WAAW,EAAE,6BAA6B;QAC1C,OAAO;IAEX,cAAc;IACd,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAC/B,CAAC;QACG,MAAM,WAAW,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAE9B,IAAI,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,CAAC;QAC5B,MAAM,CAAC,SAAS,GAAG,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;QACzD,IAAI,CAAC,IAAI,QAAQ;YACb,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC;QAE3B,SAAS,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAED,2BAA2B;IAC3B,SAAS,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,OAAO,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,gCAAgC,CAAC,EAAU,EAAE,OAAe;IAEjE,MAAM,SAAS,GAAyC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACpF,MAAM,SAAS,GAAW,yBAAyB,CAAC,EAAE,CAAC,CAAC;IAExD,gFAAgF;IAChF,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACzD,0BAA0B,CAAC,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;AAC7D,CAAC;AAED,SAAS,yBAAyB,CAAC,EAAU;IAEzC,MAAM,SAAS,GAAyC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC,CAAC;IACpF,IAAI,KAAK,GAAG,SAAS,CAAC,KAAK,CAAC;IAE5B,OAAO,QAAQ,CAAC,KAAK,CAAC,CAAC;AAC3B,CAAC"} -------------------------------------------------------------------------------- /js/gui/tunings_guitar.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // guitar tunings with 4 notes (bass) 3 | const guitarTunings4Dict = new Map(); 4 | guitarTunings4Dict.set("standard", [4, 9, 2, 7]); 5 | guitarTunings4Dict.set("open_d", [2, 9, 2, 6]); 6 | guitarTunings4Dict.set("open_e7", [4, 11, 2, 8]); 7 | guitarTunings4Dict.set("open_g", [7, 11, 2, 7]); 8 | guitarTunings4Dict.set("dropped_d", [2, 9, 2, 7]); 9 | guitarTunings4Dict.set("ukulele", [7, 0, 4, 9]); 10 | // guitar tunings with 7 notes -bass / mandolin) 11 | const guitarTunings5Dict = new Map(); 12 | guitarTunings5Dict.set("standard", [11, 4, 9, 2, 7]); 13 | // guitar tunings with 6 notes 14 | const guitarTunings6Dict = new Map(); 15 | guitarTunings6Dict.set("standard", [4, 9, 2, 7, 11, 4]); 16 | guitarTunings6Dict.set("dropped_d", [2, 9, 2, 7, 11, 4]); 17 | guitarTunings6Dict.set("open_d", [2, 9, 2, 6, 9, 2]); 18 | guitarTunings6Dict.set("open_e", [4, 11, 4, 8, 11, 4]); 19 | guitarTunings6Dict.set("open_e7", [4, 11, 2, 8, 11, 4]); 20 | guitarTunings6Dict.set("open_g", [2, 7, 2, 7, 11, 2]); 21 | guitarTunings6Dict.set("open_c", [0, 7, 0, 7, 0, 4]); 22 | guitarTunings6Dict.set("open_csus2", [0, 7, 2, 7, 0, 2]); 23 | guitarTunings6Dict.set("dadgad", [2, 9, 2, 7, 9, 2]); 24 | // guitar tunings with 7 notes 25 | const guitarTunings7Dict = new Map(); 26 | guitarTunings7Dict.set("standard", [11, 4, 9, 2, 7, 11, 4]); 27 | // global guitar tunings dictionary 28 | const guitarTuningsDict = new Map(); 29 | guitarTuningsDict.set(4, guitarTunings4Dict); 30 | guitarTuningsDict.set(5, guitarTunings5Dict); 31 | guitarTuningsDict.set(6, guitarTunings6Dict); 32 | guitarTuningsDict.set(7, guitarTunings7Dict); 33 | ///////////////////////////////// GUITAR TUNING /////////////////////////////// 34 | function initGuitarTuningSelector(id, useURLParams = true, nbStrings = 6, tuningId = "Standard") { 35 | // get selector 36 | const tuningSelect = document.getElementById(id); 37 | const initialized = (tuningSelect.options != null && tuningSelect.options.length > 0); 38 | if (initialized) // nop if already initialized 39 | return; 40 | // get nb. strings and tuning parameter if existing 41 | if (useURLParams) { 42 | const nbStringsParamValue = parseParameterById("guitar_nb_strings"); 43 | const tuningParamValue = parseParameterById("guitar_tuning"); 44 | if (nbStringsParamValue != "") 45 | nbStrings = parseInt(nbStringsParamValue); 46 | if (tuningParamValue != "") 47 | tuningId = tuningParamValue; 48 | } 49 | // add tunings 50 | let guitarTuningDict = guitarTuningsDict.get(nbStrings); 51 | for (const [key, value] of guitarTuningDict) { 52 | let option = document.createElement('option'); 53 | option.value = key; 54 | option.innerHTML = getGuitarTuningNotation(key); 55 | if (key == tuningId) 56 | option.selected = true; 57 | tuningSelect.appendChild(option); 58 | } 59 | // disable if only 1 option 60 | tuningSelect.disabled = (tuningSelect.options.length <= 1); 61 | } 62 | function updateGuitarTuningGivenNbStrings(id, nbStrings) { 63 | const tuningSelect = document.getElementById(id); 64 | const tuningIdFormer = getSelectedGuitarTuningId(id); 65 | // get corresponding guitar tunings 66 | if (!guitarTuningsDict.has(nbStrings)) 67 | return; 68 | const guitarTuningDict = guitarTuningsDict.get(nbStrings); 69 | // replace selector options and try to select former corresponding guitar tuning 70 | removeAllChildNodes(tuningSelect); 71 | const tuningId = guitarTuningDict.has(tuningIdFormer) ? tuningIdFormer : "standard"; 72 | initGuitarTuningSelector(id, false, nbStrings, tuningId); 73 | } 74 | function getGuitarTuningNotation(tuningId) { 75 | // specific 76 | if (tuningId.toUpperCase() == "DADGAD") 77 | return "DADGAD"; 78 | let tuning = tuningId.replace(/_/g, " "); 79 | tuning = toTitleCase(tuning); 80 | return tuning; 81 | } 82 | function getSelectedGuitarTuningId(id) { 83 | const tuningSelect = document.getElementById(id); 84 | let tuningId = tuningSelect.value; 85 | return tuningId; 86 | } 87 | function getSelectedGuitarTuningValue(id) { 88 | const tuningSelect = document.getElementById(id); 89 | let tuningId = tuningSelect.value; 90 | // get tunings dict corresponding to selected nb. strings 91 | const nbStringsSelectId = id.replace('guitar_tuning', 'guitar_nb_strings'); 92 | const nbStrings = getSelectedGuitarNbStrings(nbStringsSelectId); 93 | const guitarTuningDict = guitarTuningsDict.get(nbStrings); 94 | if (!guitarTuningDict.has(tuningId)) 95 | tuningId = "Standard"; // fallback 96 | return guitarTuningDict.get(tuningId); 97 | } 98 | //////////////////////////////////// UTILS //////////////////////////////////// 99 | function removeAllChildNodes(parent) { 100 | while (parent.firstChild) { 101 | parent.removeChild(parent.firstChild); 102 | } 103 | } 104 | ////////////////////////////// NUMBER OF STRINGS ////////////////////////////// 105 | function initGuitarNbStringsSelector(id, minNbStrings = 4, maxNbStrings = 7, defaultNbStrings = 6) { 106 | // get chord selecor 107 | const nbStringsSelect = document.getElementById(id); 108 | const initialized = (nbStringsSelect.options != null && nbStringsSelect.options.length > 0); 109 | if (initialized) // nop if already initialized 110 | return; 111 | // get nb. strings and tuning parameter if existing 112 | const nbStringsParamValue = parseParameterById("guitar_nb_strings"); 113 | if (nbStringsParamValue != "") 114 | defaultNbStrings = parseInt(nbStringsParamValue); 115 | // add tunings 116 | for (let i = minNbStrings; i <= maxNbStrings; i++) { 117 | let option = document.createElement('option'); 118 | option.value = i.toString(); 119 | option.innerHTML = i.toString(); 120 | if (i == defaultNbStrings) 121 | option.selected = true; 122 | nbStringsSelect.appendChild(option); 123 | } 124 | } 125 | function getSelectedGuitarNbStrings(id) { 126 | const nbStringsSelect = document.getElementById(id); 127 | let nbStrings = parseInt(nbStringsSelect.value); 128 | return nbStrings; 129 | } 130 | //# sourceMappingURL=tunings_guitar.js.map -------------------------------------------------------------------------------- /js/gui/tunings_guitar.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"tunings_guitar.js","sourceRoot":"","sources":["../../ts/gui/tunings_guitar.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /js/intervals.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // intervals dictionnary 3 | const intervalsDict = new Map(); 4 | intervalsDict.set(0, "T"); 5 | intervalsDict.set(0.5, "T‡"); 6 | intervalsDict.set(1, "♭2"); 7 | intervalsDict.set(1.5, "d2"); 8 | intervalsDict.set(2, "2"); 9 | intervalsDict.set(2.5, "‡2"); 10 | intervalsDict.set(3, "♭3"); 11 | intervalsDict.set(3.5, "d3"); 12 | intervalsDict.set(4, "3"); 13 | intervalsDict.set(4.5, "‡3"); 14 | intervalsDict.set(5, "4"); 15 | intervalsDict.set(5.5, "‡4"); 16 | intervalsDict.set(6, "♭5"); 17 | intervalsDict.set(6.5, "d5"); 18 | intervalsDict.set(7, "5"); 19 | intervalsDict.set(7.5, "‡5"); 20 | intervalsDict.set(8, "♭6"); 21 | intervalsDict.set(8.5, "d6"); 22 | intervalsDict.set(9, "6"); 23 | intervalsDict.set(9.5, "‡6"); 24 | intervalsDict.set(10, "♭7"); 25 | intervalsDict.set(10.5, "d7"); 26 | intervalsDict.set(11, "7"); 27 | intervalsDict.set(11.5, "⧥7"); 28 | // >= 1 octave 29 | intervalsDict.set(12.5, "d♭9"); 30 | intervalsDict.set(13, "♭9"); 31 | intervalsDict.set(13.5, "d9"); 32 | intervalsDict.set(14, "9"); 33 | intervalsDict.set(14.5, "‡9"); 34 | intervalsDict.set(15, "#9"); 35 | intervalsDict.set(16.5, "d11"); 36 | intervalsDict.set(17, "11"); 37 | intervalsDict.set(17.5, "‡11"); 38 | intervalsDict.set(18, "#11"); 39 | intervalsDict.set(20, "b13"); 40 | intervalsDict.set(21, "13"); 41 | intervalsDict.set(21.5, "‡13"); 42 | function getAltIntervalNotation(intervalValue, index) { 43 | index += 1; 44 | // tonic: nop 45 | if (index == 1) 46 | return "T"; 47 | const exactInterval = getIntervalKeyFromValue(index.toString()); 48 | let res = index.toString(); 49 | // exact interval: nop 50 | if (intervalValue == exactInterval) { 51 | return intervalsDict.get(intervalValue); 52 | } 53 | // ♭'s 54 | else if (intervalValue < exactInterval) { 55 | for (let i = 0; i < exactInterval - intervalValue; i++) { 56 | res = "♭" + res; 57 | } 58 | return res; 59 | } 60 | // #'s 61 | else if (intervalValue > exactInterval) { 62 | for (let i = 0; i < intervalValue - exactInterval; i++) { 63 | res = "#" + res; 64 | } 65 | return res; 66 | } 67 | return "?"; 68 | } 69 | function getIntervalChordNotation(intervalValue) { 70 | let intervalName = ""; 71 | if (intervalsDict.has(intervalValue)) 72 | intervalName = intervalsDict.get(intervalValue); 73 | else { 74 | intervalName = intervalsDict.get((intervalValue + 12) % 12); 75 | const octave = Math.floor(intervalValue / 12); 76 | intervalName += `(${octave}ve)`; 77 | } 78 | intervalName = intervalName.replace("T", "F"); 79 | return intervalName; 80 | } 81 | function getIntervalString(intervalName, intervalNameAlt) { 82 | if (intervalName == intervalNameAlt) 83 | return intervalName; 84 | const index = getIndexFromInterval(intervalName); 85 | const indexAlt = getIndexFromInterval(intervalNameAlt); 86 | if (index <= indexAlt) 87 | return intervalName + " / " + intervalNameAlt; 88 | else 89 | return intervalNameAlt + " / " + intervalName; 90 | } 91 | function getIndexFromInterval(intervalName) { 92 | const indexString = intervalName.replace(/♭/gi, "").replace(/#/gi, ""); 93 | return parseInt(indexString); 94 | } 95 | function getIntervalKeyFromValue(value) { 96 | for (const [key, valueCur] of intervalsDict) { 97 | if (valueCur == value) 98 | return key; 99 | } 100 | return -1; 101 | } 102 | function isQuarterToneInterval(interval) { 103 | return (interval - Math.floor(interval) == 0.5); 104 | } 105 | function isXenharmonicInterval(interval) { 106 | return ((interval - Math.floor(interval)) % 0.5 != 0); 107 | } 108 | //# sourceMappingURL=intervals.js.map -------------------------------------------------------------------------------- /js/intervals.js.map: -------------------------------------------------------------------------------- 1 | {"version":3,"file":"intervals.js","sourceRoot":"","sources":["../ts/intervals.ts"],"names":[],"mappings":"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"} -------------------------------------------------------------------------------- /js/midi/Base64.js: -------------------------------------------------------------------------------- 1 | //https://github.com/davidchambers/Base64.js 2 | 3 | ;(function () { 4 | var object = typeof exports != 'undefined' ? exports : this; // #8: web workers 5 | var chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; 6 | 7 | function InvalidCharacterError(message) { 8 | this.message = message; 9 | } 10 | InvalidCharacterError.prototype = new Error; 11 | InvalidCharacterError.prototype.name = 'InvalidCharacterError'; 12 | 13 | // encoder 14 | // [https://gist.github.com/999166] by [https://github.com/nignag] 15 | object.btoa || ( 16 | object.btoa = function (input) { 17 | for ( 18 | // initialize result and counter 19 | var block, charCode, idx = 0, map = chars, output = ''; 20 | // if the next input index does not exist: 21 | // change the mapping table to "=" 22 | // check if d has no fractional digits 23 | input.charAt(idx | 0) || (map = '=', idx % 1); 24 | // "8 - idx % 1 * 8" generates the sequence 2, 4, 6, 8 25 | output += map.charAt(63 & block >> 8 - idx % 1 * 8) 26 | ) { 27 | charCode = input.charCodeAt(idx += 3/4); 28 | if (charCode > 0xFF) { 29 | throw new InvalidCharacterError("'btoa' failed: The string to be encoded contains characters outside of the Latin1 range."); 30 | } 31 | block = block << 8 | charCode; 32 | } 33 | return output; 34 | }); 35 | 36 | // decoder 37 | // [https://gist.github.com/1020396] by [https://github.com/atk] 38 | object.atob || ( 39 | object.atob = function (input) { 40 | input = input.replace(/=+$/, '') 41 | if (input.length % 4 == 1) { 42 | throw new InvalidCharacterError("'atob' failed: The string to be decoded is not correctly encoded."); 43 | } 44 | for ( 45 | // initialize result and counters 46 | var bc = 0, bs, buffer, idx = 0, output = ''; 47 | // get next character 48 | buffer = input.charAt(idx++); 49 | // character found in table? initialize bit storage and add its ascii value; 50 | ~buffer && (bs = bc % 4 ? bs * 64 + buffer : buffer, 51 | // and if not first of each 4 characters, 52 | // convert the first 8 bits to one ascii character 53 | bc++ % 4) ? output += String.fromCharCode(255 & bs >> (-2 * bc & 6)) : 0 54 | ) { 55 | // try to find character in table (0-63, not found => -1) 56 | buffer = chars.indexOf(buffer); 57 | } 58 | return output; 59 | }); 60 | 61 | }()); -------------------------------------------------------------------------------- /js/midi/Base64binary.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license ------------------------------------------------------------------- 3 | * module: Base64Binary 4 | * src: http://blog.danguer.com/2011/10/24/base64-binary-decoding-in-javascript/ 5 | * license: Simplified BSD License 6 | * ------------------------------------------------------------------- 7 | * Copyright 2011, Daniel Guerrero. All rights reserved. 8 | * 9 | * Redistribution and use in source and binary forms, with or without 10 | * modification, are permitted provided that the following conditions are met: 11 | * - Redistributions of source code must retain the above copyright 12 | * notice, this list of conditions and the following disclaimer. 13 | * - Redistributions in binary form must reproduce the above copyright 14 | * notice, this list of conditions and the following disclaimer in the 15 | * documentation and/or other materials provided with the distribution. 16 | * 17 | * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND 18 | * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 19 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 20 | * DISCLAIMED. IN NO EVENT SHALL DANIEL GUERRERO BE LIABLE FOR ANY 21 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 22 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 23 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 24 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 25 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 26 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 27 | */ 28 | 29 | var Base64Binary = { 30 | _keyStr : "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=", 31 | 32 | /* will return a Uint8Array type */ 33 | decodeArrayBuffer: function(input) { 34 | var bytes = Math.ceil( (3*input.length) / 4.0); 35 | var ab = new ArrayBuffer(bytes); 36 | this.decode(input, ab); 37 | 38 | return ab; 39 | }, 40 | 41 | decode: function(input, arrayBuffer) { 42 | //get last chars to see if are valid 43 | var lkey1 = this._keyStr.indexOf(input.charAt(input.length-1)); 44 | var lkey2 = this._keyStr.indexOf(input.charAt(input.length-1)); 45 | 46 | var bytes = Math.ceil( (3*input.length) / 4.0); 47 | if (lkey1 == 64) bytes--; //padding chars, so skip 48 | if (lkey2 == 64) bytes--; //padding chars, so skip 49 | 50 | var uarray; 51 | var chr1, chr2, chr3; 52 | var enc1, enc2, enc3, enc4; 53 | var i = 0; 54 | var j = 0; 55 | 56 | if (arrayBuffer) 57 | uarray = new Uint8Array(arrayBuffer); 58 | else 59 | uarray = new Uint8Array(bytes); 60 | 61 | input = input.replace(/[^A-Za-z0-9\+\/\=]/g, ""); 62 | 63 | for (i=0; i> 4); 71 | chr2 = ((enc2 & 15) << 4) | (enc3 >> 2); 72 | chr3 = ((enc3 & 3) << 6) | enc4; 73 | 74 | uarray[i] = chr1; 75 | if (enc3 != 64) uarray[i+1] = chr2; 76 | if (enc4 != 64) uarray[i+2] = chr3; 77 | } 78 | 79 | return uarray; 80 | } 81 | }; -------------------------------------------------------------------------------- /js/midi/WebAudioAPI.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @license ------------------------------------------------------------------- 3 | * module: WebAudioShim - Fix naming issues for WebAudioAPI supports 4 | * src: https://github.com/Dinahmoe/webaudioshim 5 | * author: Dinahmoe AB 6 | * ------------------------------------------------------------------- 7 | * Copyright (c) 2012 DinahMoe AB 8 | * 9 | * Permission is hereby granted, free of charge, to any person 10 | * obtaining a copy of this software and associated documentation 11 | * files (the "Software"), to deal in the Software without 12 | * restriction, including without limitation the rights to use, 13 | * copy, modify, merge, publish, distribute, sublicense, and/or sell 14 | * copies of the Software, and to permit persons to whom the 15 | * Software is furnished to do so, subject to the following 16 | * conditions: 17 | * 18 | * The above copyright notice and this permission notice shall be 19 | * included in all copies or substantial portions of the Software. 20 | * 21 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 22 | * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES 23 | * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 24 | * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 25 | * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 26 | * WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 28 | * OTHER DEALINGS IN THE SOFTWARE. 29 | */ 30 | 31 | window.AudioContext = window.AudioContext || window.webkitAudioContext || null; 32 | window.OfflineAudioContext = window.OfflineAudioContext || window.webkitOfflineAudioContext || null; 33 | 34 | (function (Context) { 35 | var isFunction = function (f) { 36 | return Object.prototype.toString.call(f) === "[object Function]" || 37 | Object.prototype.toString.call(f) === "[object AudioContextConstructor]"; 38 | }; 39 | var contextMethods = [ 40 | ["createGainNode", "createGain"], 41 | ["createDelayNode", "createDelay"], 42 | ["createJavaScriptNode", "createScriptProcessor"] 43 | ]; 44 | /// 45 | var proto; 46 | var instance; 47 | var sourceProto; 48 | /// 49 | if (!isFunction(Context)) { 50 | return; 51 | } 52 | instance = new Context(); 53 | if (!instance.destination || !instance.sampleRate) { 54 | return; 55 | } 56 | proto = Context.prototype; 57 | sourceProto = Object.getPrototypeOf(instance.createBufferSource()); 58 | 59 | if (!isFunction(sourceProto.start)) { 60 | if (isFunction(sourceProto.noteOn)) { 61 | sourceProto.start = function (when, offset, duration) { 62 | switch (arguments.length) { 63 | case 0: 64 | throw new Error("Not enough arguments."); 65 | case 1: 66 | this.noteOn(when); 67 | break; 68 | case 2: 69 | if (this.buffer) { 70 | this.noteGrainOn(when, offset, this.buffer.duration - offset); 71 | } else { 72 | throw new Error("Missing AudioBuffer"); 73 | } 74 | break; 75 | case 3: 76 | this.noteGrainOn(when, offset, duration); 77 | } 78 | }; 79 | } 80 | } 81 | 82 | if (!isFunction(sourceProto.noteOn)) { 83 | sourceProto.noteOn = sourceProto.start; 84 | } 85 | 86 | if (!isFunction(sourceProto.noteGrainOn)) { 87 | sourceProto.noteGrainOn = sourceProto.start; 88 | } 89 | 90 | if (!isFunction(sourceProto.stop)) { 91 | sourceProto.stop = sourceProto.noteOff; 92 | } 93 | 94 | if (!isFunction(sourceProto.noteOff)) { 95 | sourceProto.noteOff = sourceProto.stop; 96 | } 97 | 98 | contextMethods.forEach(function (names) { 99 | var name1; 100 | var name2; 101 | while (names.length) { 102 | name1 = names.pop(); 103 | if (isFunction(this[name1])) { 104 | this[names.pop()] = this[name1]; 105 | } else { 106 | name2 = names.pop(); 107 | this[name1] = this[name2]; 108 | } 109 | } 110 | }, proto); 111 | })(window.AudioContext); -------------------------------------------------------------------------------- /js/midi/audioDetect.js: -------------------------------------------------------------------------------- 1 | /* 2 | ---------------------------------------------------------- 3 | MIDI.audioDetect : 2015-05-16 4 | ---------------------------------------------------------- 5 | https://github.com/mudcube/MIDI.js 6 | ---------------------------------------------------------- 7 | Probably, Maybe, No... Absolutely! 8 | Test to see what types of