// Helpers function appendElement(parentElement, tag) { element = document.createElement(tag) parentElement.appendChild(element) return element } function appendText(parentElement, text) { element = document.createTextNode(text) parentElement.appendChild(element) return element } // Only suggest sharps for the moment tonalities = ['C', 'C♯', 'D', 'D♯', 'E', 'F', 'F♯', 'G', 'G♯', 'A', 'A♯', 'B'] function getRoot(c) { if (c.indexOf('♯') > -1 || c.indexOf('♭') > -1) { return c.substring(0, 2) } else { return c[0] } } function getShift(t1, t2) { return tonalities.indexOf(getRoot(t2)) - tonalities.indexOf(getRoot(t1)) } function applyShift(t1, s) { let root = getRoot(t1) let mode = t1.substring(root.length) root = tonalities[(tonalities.indexOf(root) + s + tonalities.length) % tonalities.length] return `${root}${mode}` } const node = document.querySelector('[data-tonality]') let tonality = node.dataset.tonality mode = tonality[tonality.length - 1] == 'm' ? 'm' : '' label = appendElement(node, 'label') label['className'] = 'g-Chords__Tonality' label.onchange = (e) => { const shift = getShift(tonality, e.target.value) tonality = e.target.value document.querySelectorAll('.g-Chords__Chord').forEach(chord => { if (chord.innerText !== '%') { chord.innerText = applyShift(chord.innerText, shift) } }) } appendText(label, 'Tonalité :') select = appendElement(label, 'select') select['name'] = 'tonality' tonalities.forEach(t => { option = appendElement(select, 'option') option['value'] = t if (tonality == `${t}${mode}`) { option['selected'] = true } appendText(option, `${t}${mode}`) })