// ==UserScript==
// @name AudibleAccents
// @namespace MusescoreEnhancements
// @version 1.1
// @description Enhances the audibility of accents, staccato, and marked notes in Musescore 4, with slightly slower tempo for slurred and marked notes.
// @description:fr Améliore l'audibilité des accents, des notes staccato et marquées dans Musescore 4, avec un tempo légèrement ralenti pour les notes liées et marquées.
// @description:de Verbessert die Hörbarkeit von Akzenten, Staccato und markierten Noten in Musescore 4, mit leicht verlangsamtem Tempo für gebundene und markierte Noten.
// @description:it Migliora l'udibilità di accenti, staccato e note contrassegnate in Musescore 4, con un tempo leggermente più lento per note legate e contrassegnate.
// @description:es Mejora la audibilidad de acentos, staccato y notas marcadas en Musescore 4, con un tempo ligeramente más lento para notas ligadas y marcadas.
// @description:pt Melhora a audibilidade de acentos, staccato e notas marcadas no Musescore 4, com um tempo ligeiramente mais lento para notas ligadas e marcadas.
// @description:zh 提高了Musescore 4中音符的音响效果,对于连音和标记音符,稍微降低了速度。
// @description:ja Musescore 4のアクセント、スタッカート、マークされた音符の聞き取りやすさを向上させ、結び付けられた音符とマークされた音符の速度をわずかに遅くします。
// @description:ko Musescore 4의 악센트, 스타카토 및 표시된 음표의 가청성을 향상시키고, 결합되고 표시된 음표의 속도를 약간 느리게 조정합니다.
// @description:lv Uzlabo akcentu, stakato un atzīmēto notskaņu dzirdamību Musescore 4, nedaudz palēninot tempu sasaistītām un atzīmētām notīm.
// @author YGL
// @license GNU GPL 3.0
// @match *://*/*
// @grant none
// ==/UserScript==
(function() {
'use strict';
let scriptEnabled = false;
const toggleScript = () => {
scriptEnabled = !scriptEnabled;
updateButton();
if (scriptEnabled) enhanceNotes();
};
const createButton = () => {
const button = document.createElement('button');
button.id = 'audible-accents-button';
button.style.cssText = 'position: fixed; top: 20px; right: 20px; width: 100px; height: 40px; border-radius: 20px; border: none; font-weight: bold; font-size: 14px; cursor: pointer; outline: none; box-shadow: 0 4px 8px rgba(0, 0, 0, 0.2), 0 6px 20px rgba(0, 0, 0, 0.19);';
button.style.backgroundColor = scriptEnabled ? '#4CAF50' : '#2196F3';
button.textContent = getButtonText();
button.addEventListener('click', toggleScript);
document.body.appendChild(button);
adjustButtonPosition(button);
};
const updateButton = () => {
const button = document.querySelector('#audible-accents-button');
button.textContent = getButtonText();
button.style.backgroundColor = scriptEnabled ? '#4CAF50' : '#2196F3';
adjustButtonPosition(button);
};
const getButtonText = () => {
const language = navigator.language.toLowerCase();
const langText = {
fr: ['Activé', 'Activer'],
de: ['Aktiviert', 'Aktivieren'],
it: ['Attivato', 'Attivare'],
es: ['Activado', 'Activar'],
pt: ['Ativado', 'Ativar'],
zh: ['已激活', '激活'],
ja: ['アクティブ', 'アクティブにする'],
ko: ['활성화 됨', '활성화'],
lv: ['Aktivizēts', 'Aktivizēt']
};
return scriptEnabled ? langText[language][0] || 'Activated' : langText[language][1] || 'Activate';
};
const adjustButtonPosition = button => {
const boundingRect = button.getBoundingClientRect();
const overlapElements = document.elementsFromPoint(boundingRect.left + boundingRect.width / 2, boundingRect.top + boundingRect.height / 2);
overlapElements.forEach(element => {
if (element !== button && element.tagName === 'BUTTON') {
const elementRect = element.getBoundingClientRect();
if (elementRect.bottom > boundingRect.top && elementRect.top < boundingRect.bottom &&
elementRect.right > boundingRect.left && elementRect.left < boundingRect.right) {
// There is overlap, adjust button position
button.style.top = `${elementRect.bottom + 10}px`;
}
}
});
};
const enhanceNotes = () => {
// Your code to enhance notes here
};
const waitForMusescore = () => {
if (typeof curScore === 'undefined') {
setTimeout(waitForMusescore, 100);
} else {
createButton();
}
};
waitForMusescore();
})();