{"id":1857,"date":"2024-06-29T15:00:55","date_gmt":"2024-06-29T09:15:55","guid":{"rendered":"https:\/\/eternalscoring.studio\/?page_id=1857"},"modified":"2024-12-21T11:06:47","modified_gmt":"2024-12-21T05:21:47","slug":"metronome","status":"publish","type":"page","link":"https:\/\/eternalscoring.studio\/ne\/metronome\/","title":{"rendered":"\u092e\u0947\u091f\u094d\u0930\u094b\u0928\u094b\u092e"},"content":{"rendered":"<div data-elementor-type=\"wp-page\" data-elementor-id=\"1857\" class=\"elementor elementor-1857\" data-elementor-post-type=\"page\">\n\t\t\t\t<div data-dce-background-overlay-image-url=\"https:\/\/eternalscoring.studio\/wp-content\/uploads\/2024\/01\/audio-2941753_1280.jpg\" class=\"elementor-element elementor-element-3caef23 e-flex e-con-boxed e-con e-parent\" data-id=\"3caef23\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9b3082a elementor-widget__width-initial elementor-widget elementor-widget-html\" data-id=\"9b3082a\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"metronome\">\r\n\u00a0 <h1 style=\"height: 20px; margin-top: 0px;\">\u092e\u0947\u091f\u094d\u0930\u094b\u0928\u094b\u092e<\/h1>\r\n\r\n\u00a0 <p id=\"currentBeat\" style=\"font-size: 100px; font-weight: bold; margin: -10px;\">1<\/p>\r\n\u00a0 <p>\u091f\u0947\u092e\u094d\u092a\u094b \u0917\u0924\u093f -<\/p>\r\n\u00a0 <input type=\"range\" id=\"tempoSlider\" min=\"40\" max=\"300\" value=\"120\" style=\"width: 60%; margin-bottom: 10px;\">\r\n\u00a0 <br>\r\n\u00a0 <input type=\"number\" id=\"tempoInput\" min=\"40\" max=\"300\" value=\"120\" style=\"width: 110px; text-align: center; margin-bottom: 10px; margin-right: 20px;\">\r\n\u00a0 <button id=\"tapTempoButton\" class=\"tap-tempo-button\" style=\"font-size: 16px; padding: 8px 15px; margin-bottom: 10px;\">\u091f\u0947\u092e\u094d\u092a\u094b \u0925\u093f\u091a\u094d\u0928\u0941\u0939\u094b\u0938\u094d<\/button>\r\n\u00a0 <br>\r\n\u00a0 <p style=\"text-align: center;\">\u0924\u093e\u0932<br>\r\n\u00a0 <input type=\"number\" id=\"numberOfBeats\" min=\"1\" value=\"4\" style=\"width: 10%; text-align: center; margin: 10px; bor\">\/ 4\r\n\u00a0 <\/p>\r\n\u00a0 <button id=\"startStopButton\" style=\"font-size: 22px; padding: 10px 25px; margin-bottom: 15px;\">\u0938\u0941\u0930\u0941 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d<\/button>\r\n\u00a0 <br><br>\r\n\u00a0 \u00a0\r\n\u00a0 <label for=\"soundSelection\">\u0906\u0935\u093e\u091c \u091b\u093e\u0928\u094d\u0928\u0941\u0939\u094b\u0938\u094d -<\/label>\r\n\u00a0 <select id=\"soundSelection\" style=\"width: 25%; margin: auto; margin-top: 10px; text-align: center;\">\r\n\u00a0 \u00a0 <option value=\"triangle\">Default<\/option>\r\n\u00a0 \u00a0 <option value=\"bell\">Triangle Bell<\/option>\r\n\u00a0 \u00a0 <option value=\"clav\">Clave<\/option>\r\n\u00a0 \u00a0 <option value=\"conga\">Conga<\/option>\r\n\u00a0 <\/select>\r\n\u00a0 \u00a0\r\n\u00a0 <p id=\"promptMessage\" class=\"prompt-message\" style=\"height: 20px;\"><\/p>\r\n<\/div>\r\n\r\n<script>\r\n\u00a0 let audioContext = new (window.AudioContext || window.webkitAudioContext)();\r\n\u00a0 let currentOscillator;\r\n\u00a0 let isPlaying = false;\r\n\u00a0 let tempo = 120;\r\n\u00a0 let timer;\r\n\u00a0 let beatCount = 0;\r\n\u00a0 let numberOfBeats = 4;\r\n\u00a0 let lastTapTime = 0;\r\n\u00a0 let tapTempoArray = [];\r\n\u00a0 let selectedSound = 'triangle'; \/\/ Default sound selection\r\n\r\n\u00a0 const audioBuffers = {\r\n\u00a0 \u00a0 bell: {},\r\n\u00a0 \u00a0 clav: {},\r\n\u00a0 \u00a0 conga: {}\r\n\u00a0 };\r\n\r\n\u00a0 function preloadAudioFiles() {\r\n\u00a0 \u00a0 const sounds = ['bell', 'clav', 'conga'];\r\n\u00a0 \u00a0 sounds.forEach(sound => {\r\n\u00a0 \u00a0 \u00a0 const accentedFile = `https:\/\/eternalscoring.studio\/wp-content\/uploads\/2024\/07\/${sound}_acc.ogg`;\r\n\u00a0 \u00a0 \u00a0 const subdividedFile = `https:\/\/eternalscoring.studio\/wp-content\/uploads\/2024\/07\/${sound}_sub.ogg`;\r\n\r\n\u00a0 \u00a0 \u00a0 fetch(accentedFile)\r\n\u00a0 \u00a0 \u00a0 \u00a0 .then(response => response.arrayBuffer())\r\n\u00a0 \u00a0 \u00a0 \u00a0 .then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer))\r\n\u00a0 \u00a0 \u00a0 \u00a0 .then(audioBuffer => {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 audioBuffers[sound].accented = audioBuffer;\r\n\u00a0 \u00a0 \u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 \u00a0 fetch(subdividedFile)\r\n\u00a0 \u00a0 \u00a0 \u00a0 .then(response => response.arrayBuffer())\r\n\u00a0 \u00a0 \u00a0 \u00a0 .then(arrayBuffer => audioContext.decodeAudioData(arrayBuffer))\r\n\u00a0 \u00a0 \u00a0 \u00a0 .then(audioBuffer => {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 audioBuffers[sound].subdivided = audioBuffer;\r\n\u00a0 \u00a0 \u00a0 \u00a0 });\r\n\u00a0 \u00a0 });\r\n\u00a0 }\r\n\r\n\u00a0 document.addEventListener('DOMContentLoaded', (event) => {\r\n\u00a0 \u00a0 preloadAudioFiles();\r\n\r\n\u00a0 \u00a0 document.getElementById('tempoSlider').addEventListener('input', function() {\r\n\u00a0 \u00a0 \u00a0 tempo = this.value;\r\n\u00a0 \u00a0 \u00a0 document.getElementById('tempoInput').value = tempo;\r\n\u00a0 \u00a0 \u00a0 if (isPlaying) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 clearInterval(timer);\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (tempo > 0 && tempo <= 300) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 timer = setInterval(playClick, (60 \/ tempo) * 1000);\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('tempoInput').addEventListener('input', function() {\r\n\u00a0 \u00a0 \u00a0 let inputTempo = this.value;\r\n\u00a0 \u00a0 \u00a0 if (inputTempo > 300) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 this.value = 300;\r\n\u00a0 \u00a0 \u00a0 \u00a0 inputTempo = 300;\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 tempo = parseInt(inputTempo);\r\n\u00a0 \u00a0 \u00a0 document.getElementById('tempoSlider').value = tempo;\r\n\u00a0 \u00a0 \u00a0 const promptMessage = document.getElementById('promptMessage');\r\n\u00a0 \u00a0 \u00a0 if (isPlaying) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (inputTempo === \"\" || tempo <= 0) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 stopMetronome();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 document.getElementById('startStopButton').textContent = 'Start';\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"Please set a valid tempo greater than 0.\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 clearInterval(timer);\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 timer = setInterval(playClick, (60 \/ tempo) * 1000);\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 } else if (inputTempo === \"\" || tempo <= 0) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"Please set a valid tempo greater than 0.\";\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"\";\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('tempoInput').setAttribute('max', 300);\r\n\u00a0 \u00a0 document.getElementById('tempoSlider').setAttribute('max', 300);\r\n\r\n\u00a0 \u00a0 document.getElementById('numberOfBeats').addEventListener('input', function() {\r\n\u00a0 \u00a0 \u00a0 numberOfBeats = parseInt(this.value);\r\n\u00a0 \u00a0 \u00a0 if (isPlaying) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 resetMetronome();\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('startStopButton').addEventListener('click', function() {\r\n\u00a0 \u00a0 \u00a0 toggleMetronome();\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.addEventListener('keydown', function(event) {\r\n\u00a0 \u00a0 \u00a0 if (event.code === 'Space') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 event.preventDefault();\r\n\u00a0 \u00a0 \u00a0 \u00a0 toggleMetronome();\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('tapTempoButton').addEventListener('mousedown', function() {\r\n\u00a0 \u00a0 \u00a0 let now = Date.now();\r\n\u00a0 \u00a0 \u00a0 if (lastTapTime && (now - lastTapTime) < 3000) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 let interval = now - lastTapTime;\r\n\u00a0 \u00a0 \u00a0 \u00a0 let newTempo = Math.round(60000 \/ interval);\r\n\u00a0 \u00a0 \u00a0 \u00a0 tapTempoArray.push(newTempo);\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (tapTempoArray.length > 4) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 tapTempoArray.shift();\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 \u00a0 let sum = tapTempoArray.reduce((a, b) => a + b, 0);\r\n\u00a0 \u00a0 \u00a0 \u00a0 tempo = Math.round(sum \/ tapTempoArray.length);\r\n\u00a0 \u00a0 \u00a0 \u00a0 document.getElementById('tempoInput').value = tempo;\r\n\u00a0 \u00a0 \u00a0 \u00a0 document.getElementById('tempoSlider').value = tempo;\r\n\u00a0 \u00a0 \u00a0 \u00a0 lastTapTime = now;\r\n\u00a0 \u00a0 \u00a0 \u00a0 const promptMessage = document.getElementById('promptMessage');\r\n\u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = `Tap tempo detected: ${newTempo} BPM`;\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Add class to style button when clicked\r\n\u00a0 \u00a0 \u00a0 \u00a0 document.getElementById('tapTempoButton').classList.add('clicked');\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Reset the metronome if it's playing\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (isPlaying) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 resetMetronome();\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 lastTapTime = now;\r\n\u00a0 \u00a0 \u00a0 \u00a0 tapTempoArray = [];\r\n\u00a0 \u00a0 \u00a0 \u00a0 const promptMessage = document.getElementById('promptMessage');\r\n\u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"Start tapping the tempo...\";\r\n\r\n\u00a0 \u00a0 \u00a0 \u00a0 \/\/ Remove class to revert button style\r\n\u00a0 \u00a0 \u00a0 \u00a0 document.getElementById('tapTempoButton').classList.remove('clicked');\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('tapTempoButton').addEventListener('mouseup', function() {\r\n\u00a0 \u00a0 \u00a0 \/\/ Remove class to revert button style when mouse is released\r\n\u00a0 \u00a0 \u00a0 document.getElementById('tapTempoButton').classList.remove('clicked');\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('tapTempoButton').addEventListener('mouseleave', function() {\r\n\u00a0 \u00a0 \u00a0 \/\/ Remove class to revert button style when mouse leaves button area\r\n\u00a0 \u00a0 \u00a0 document.getElementById('tapTempoButton').classList.remove('clicked');\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 document.getElementById('soundSelection').addEventListener('change', function() {\r\n\u00a0 \u00a0 \u00a0 selectedSound = this.value;\r\n\u00a0 \u00a0 \u00a0 if (selectedSound !== 'triangle') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 playCustomSound(selectedSound);\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 });\r\n\r\n\u00a0 \u00a0 function toggleMetronome() {\r\n\u00a0 \u00a0 \u00a0 const startStopButton = document.getElementById('startStopButton');\r\n\u00a0 \u00a0 \u00a0 const promptMessage = document.getElementById('promptMessage');\r\n\u00a0 \u00a0 \u00a0 if (isPlaying) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 stopMetronome();\r\n\u00a0 \u00a0 \u00a0 \u00a0 startStopButton.textContent = 'Start';\r\n\u00a0 \u00a0 \u00a0 \u00a0 startStopButton.classList.remove('active');\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 if (tempo > 0 && tempo <= 300) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 startMetronome();\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 startStopButton.textContent = 'Stop';\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 startStopButton.classList.add('active');\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 \u00a0 promptMessage.textContent = \"Please set a valid tempo greater than 0.\";\r\n\u00a0 \u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 function startMetronome() {\r\n\u00a0 \u00a0 \u00a0 isPlaying = true;\r\n\u00a0 \u00a0 \u00a0 beatCount = 0;\r\n\u00a0 \u00a0 \u00a0 timer = setInterval(playClick, (60 \/ tempo) * 1000);\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 function stopMetronome() {\r\n\u00a0 \u00a0 \u00a0 isPlaying = false;\r\n\u00a0 \u00a0 \u00a0 clearInterval(timer);\r\n\u00a0 \u00a0 \u00a0 resetMetronome();\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 function resetMetronome() {\r\n\u00a0 \u00a0 \u00a0 beatCount = 0;\r\n\u00a0 \u00a0 \u00a0 document.getElementById('currentBeat').textContent = 1;\r\n\u00a0 \u00a0 \u00a0 if (isPlaying) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 clearInterval(timer);\r\n\u00a0 \u00a0 \u00a0 \u00a0 timer = setInterval(playClick, (60 \/ tempo) * 1000);\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 function playClick() {\r\n\u00a0 \u00a0 \u00a0 beatCount = (beatCount % numberOfBeats) + 1;\r\n\u00a0 \u00a0 \u00a0 document.getElementById('currentBeat').textContent = beatCount;\r\n\u00a0 \u00a0 \u00a0 if (selectedSound === 'triangle') {\r\n\u00a0 \u00a0 \u00a0 \u00a0 playTriangleClick();\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 playCustomSound(selectedSound);\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 function playTriangleClick() {\r\n\u00a0 \u00a0 \u00a0 if (currentOscillator) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 currentOscillator.stop();\r\n\u00a0 \u00a0 \u00a0 \u00a0 currentOscillator.disconnect();\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 currentOscillator = audioContext.createOscillator();\r\n\u00a0 \u00a0 \u00a0 let gainNode = audioContext.createGain();\r\n\u00a0 \u00a0 \u00a0 currentOscillator.type = 'triangle';\r\n\u00a0 \u00a0 \u00a0 if (beatCount === 1) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 currentOscillator.frequency.value = 1600;\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 currentOscillator.frequency.value = 800;\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 currentOscillator.connect(gainNode);\r\n\u00a0 \u00a0 \u00a0 gainNode.connect(audioContext.destination);\r\n\u00a0 \u00a0 \u00a0 currentOscillator.start();\r\n\u00a0 \u00a0 \u00a0 currentOscillator.stop(audioContext.currentTime + 0.02);\r\n\u00a0 \u00a0 }\r\n\r\n\u00a0 \u00a0 function playCustomSound(sound) {\r\n\u00a0 \u00a0 \u00a0 if (!audioBuffers[sound] || !audioBuffers[sound].accented || !audioBuffers[sound].subdivided) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 console.error(`Audio buffers for ${sound} are not loaded.`);\r\n\u00a0 \u00a0 \u00a0 \u00a0 return;\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 const source = audioContext.createBufferSource();\r\n\u00a0 \u00a0 \u00a0 if (beatCount === 1) {\r\n\u00a0 \u00a0 \u00a0 \u00a0 source.buffer = audioBuffers[sound].accented;\r\n\u00a0 \u00a0 \u00a0 } else {\r\n\u00a0 \u00a0 \u00a0 \u00a0 source.buffer = audioBuffers[sound].subdivided;\r\n\u00a0 \u00a0 \u00a0 }\r\n\u00a0 \u00a0 \u00a0 source.connect(audioContext.destination);\r\n\u00a0 \u00a0 \u00a0 source.start();\r\n\u00a0 \u00a0 }\r\n\u00a0 });\r\n<\/script>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8145bc5 e-con-full e-flex e-con e-child\" data-id=\"8145bc5\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-b2435a1 elementor-widget__width-initial elementor-widget elementor-widget-text-editor\" data-id=\"b2435a1\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>\u0915\u0938\u0930\u0940 \u092a\u094d\u0930\u092f\u094b\u0917 \u0917\u0930\u094d\u0928\u0947 -<\/strong><\/p><ol><li class=\"translation-block\">\u0938\u094d\u0932\u093e\u0907\u0921\u0930 \u0935\u093e \u091f\u093e\u0907\u092a \u0917\u0930\u0947\u0930 \u091f\u0947\u092e\u094d\u092a\u094b \u0938\u0947\u091f \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d\u0964 \u0924\u092a\u093e\u0908\u0902\u0932\u0947 <strong>1 <\/strong> \u0926\u0947\u0916\u093f<strong> 300<\/strong> \u0915\u094b \u092c\u0940\u091a\u092e\u093e \u0915\u0941\u0928\u0948 \u092a\u0928\u093f \u0928\u092e\u094d\u092c\u0930 \u0932\u0947\u0916\u094d\u0928 \u0938\u0915\u094d\u0928\u0941\u0939\u0941\u0928\u094d\u091b\u0964<br><br><\/li><li class=\"translation-block\"><strong>\u091f\u0947\u092e\u094d\u092a\u094b \u0925\u093f\u091a\u094d\u0928\u0941\u0939\u094b\u0938\u094d<\/strong> \u092c\u091f\u0928\u0932\u0947 \u0924\u092a\u093e\u0907\u0901\u0915\u094b \u0917\u0940\u0924\u0915\u094b \u0924\u093e\u0932 \u0917\u0923\u0928 \u0917\u0930\u094d\u0928\u0947\u091b\u0964 \u0924\u092a\u093e\u0908\u0902\u0915\u094b \u092c\u0940\u091f\u0915\u094b \u0938\u092e\u092f\u092e\u093e \u092c\u091f\u0928 \u0925\u093f\u091a\u094d\u0928\u0941\u0939\u094b\u0938\u094d\/\u0915\u094d\u0932\u093f\u0915 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d, \u0930 \u092e\u0947\u091f\u094d\u0930\u094b\u0928\u094b\u092e\u0932\u0947 \u091f\u0947\u092e\u094d\u092a\u094b \u0917\u0923\u0928 \u0917\u0930\u094d\u0928\u0947\u091b\u0964<br><br><\/li><li class=\"translation-block\">\u0906\u0935\u0936\u094d\u092f\u0915\u0924\u093e \u0905\u0928\u0941\u0938\u093e\u0930 <strong>\u0924\u093e\u0932 <\/strong> \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d\u0964 4\/4 \u0915\u094b \u0932\u093e\u0917\u093f 4, 3\/4 \u0935\u093e\u0932\u094d\u091f\u094d\u091c\u0915\u094b \u0932\u093e\u0917\u093f 3, \u0930 6\/4 \u0924\u093e\u0932\u0915\u094b \u0932\u093e\u0917\u093f 6 \u092a\u094d\u0930\u092f\u094b\u0917 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d\u0964 6\/8 \u0935\u093e 7\/8 \u0915\u094b \u0932\u093e\u0917\u093f \u091f\u0947\u092e\u094d\u092a\u094b \u0917\u0924\u093f \u0926\u094b\u092c\u094d\u092c\u0930 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d\u0964<br><br><\/li><li class=\"translation-block\">\u092e\u0947\u091f\u094d\u0930\u094b\u0928\u094b\u092e \u0938\u0941\u0930\u0941 \u0917\u0930\u094d\u0928 <strong>\u0938\u0941\u0930\u0941 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d<\/strong> \u0935\u093e \u0906\u092b\u094d\u0928\u094b \u0915\u093f\u092c\u094b\u0930\u094d\u0921\u092e\u093e \u0938\u094d\u092a\u0947\u0938\u092c\u093e\u0930 \u0925\u093f\u091a\u094d\u0928\u0941\u0939\u094b\u0938\u094d\u0964<br><br><\/li><li class=\"translation-block\">\u092e\u0947\u091f\u094d\u0930\u094b\u0928\u094b\u092e\u0915\u094b \u0906\u0935\u093e\u091c \u092a\u0930\u093f\u0935\u0930\u094d\u0924\u0928 \u0917\u0930\u094d\u0928 <strong>\u0906\u0935\u093e\u091c \u091b\u093e\u0928\u094d\u0928\u0941\u0939\u094b\u0938\u094d<\/strong> \u092d\u0928\u094d\u0928\u0947 \u0921\u094d\u0930\u092a-\u0921\u093e\u0909\u0928 \u092e\u0947\u0928\u0941 \u092a\u094d\u0930\u092f\u094b\u0917 \u0917\u0930\u094d\u0928\u0941\u0939\u094b\u0938\u094d\u0964<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>","protected":false},"excerpt":{"rendered":"<p>An online metronome by Eternal Scoring Studio to help musicians stay in sync with the beat.<\/p>","protected":false},"author":1,"featured_media":1949,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_acf_changed":false,"footnotes":""},"class_list":["post-1857","page","type-page","status-publish","has-post-thumbnail","hentry"],"acf":[],"_links":{"self":[{"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/pages\/1857","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/comments?post=1857"}],"version-history":[{"count":0,"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/pages\/1857\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/media\/1949"}],"wp:attachment":[{"href":"https:\/\/eternalscoring.studio\/ne\/wp-json\/wp\/v2\/media?parent=1857"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}