MuseScore Volume Control

Adds a simple volume control to scores on MuseScore.com.

  1. // ==UserScript==
  2. // @name MuseScore Volume Control
  3. // @name:de MuseScore Lautstärke-Regler
  4. // @namespace http://tampermonkey.net/
  5. // @version 1.1
  6. // @description Adds a simple volume control to scores on MuseScore.com.
  7. // @description:de Fügt einen einfachen Lautstärke-Regler zu Notenblättern auf MuseScore.com ein.
  8. // @author klischee
  9. // @match https://musescore.com/*/*
  10. // @grant GM_setValue
  11. // @grant GM_getValue
  12. // ==/UserScript==
  13.  
  14. (function() {
  15. 'use strict';
  16.  
  17. class MSVolume {
  18.  
  19. constructor() {
  20. // Wait some time for the play btn and do the stuff when it appears
  21. let i = setInterval((e) => {
  22. let btn = this.getPlayBtn();
  23. if(!btn) return false;
  24. btn.addEventListener('click', (e) => {
  25. this.onPlayBtn();
  26. });
  27. this.insertSlider();
  28. clearInterval(i);
  29. }, 100);
  30. setTimeout(() => {
  31. clearInterval(i);
  32. }, 5000);
  33. }
  34.  
  35. getPlayer() {
  36. if(this.player) return this.player;
  37. this.player = document.querySelector('.uniqueplayerclass');
  38. return this.player;
  39. }
  40.  
  41. getPlayBtn() {
  42. if(this.playBtn) return this.playBtn;
  43. this.playBtn = document.querySelector('button[title="Toggle Play"]');
  44. return this.playBtn;
  45. }
  46.  
  47. onPlayBtn() {
  48. let interval = setInterval(() => {
  49. let player = this.getPlayer();
  50. this.setVol();
  51. if(player) clearInterval(interval);
  52. }, 100);
  53. }
  54.  
  55. setVol() {
  56. let player = this.getPlayer()
  57. let volume = this.getVol();
  58. GM_setValue('volume', volume);
  59. if(player) this.player.volume = volume / 100;
  60. }
  61.  
  62. getVol() {
  63. return this.volSlider.value;
  64. }
  65.  
  66. insertSlider() {
  67. let volume = GM_getValue('volume');
  68. if(!volume) volume = 100;
  69. let volSlider = document.createElement('div');
  70. volSlider.style.display = 'grid';
  71. volSlider.innerHTML = `<input type="range" min="0" max="100" value="${volume}">`;
  72. let playBtn = this.getPlayBtn();
  73. let playBtnParent = playBtn.parentNode;
  74. this.insertAfter(volSlider, playBtnParent);
  75. this.volSlider = volSlider.querySelector('input');
  76. this.volSlider.addEventListener('input', (e) => { this.setVol(); });
  77. return true;
  78. }
  79.  
  80. insertAfter(newNode, referenceNode) {
  81. referenceNode.parentNode.insertBefore(newNode, referenceNode.nextSibling);
  82. }
  83.  
  84. }
  85.  
  86. new MSVolume();
  87.  
  88. })();