ТРЕНАЖЁР ДЛИТЕЛЬНОСТЕЙ НОТ

Музыкальная грамота
Проверь себя и выполни ритмические упражнения
Укажи, какие длительности сейчас прозвучат
Нажмите "Пуск", чтобы начать упражнение
Выберите длительность
Нажимайте До, Ре или Ми в начале каждой длительности.
Компьютер: 1, 2, 3 или Q, W, E.
Музыкальная математика
Введите число в поле и нажмите Enter или кнопку "Проверить".
Нажмите "Новое задание".
Инструкция

Тренажёр содержит упражнения для запоминания ритмических длительностей. Выберите нужное упражнение в верхней части окна.

В первом упражнении вам нужно правильно указать, какие ритмические длительности звучат в выбранном музыкальном размере – четверти, половинные, восьмые или шестнадцатые.

Выберите музыкальный размер вручную или автоматически.

Нажмите "Пуск". Метроном начнёт отсчитывать доли музыкального метра, и со второго такта вы услышите звуки. Прослушайте их ритм и выберите кнопками внизу ритмические длительности тех звуков, которые вы услышали.

Во втором упражнении вам нужно в определённом музыкальном метре и темпе сыграть длительности нужной длины. Для этого сначала задайте музыкальный размер вручную или оставьте автоматический выбор. Затем нажмите "Новое упражнение". Тренажёр покажет размер и длительности, которые нужно будет сыграть в этом размере. После этого нажмите "Пуск".

Добивайтесь точного совпадения со звуками метронома. На клавиатуре компьютера для нажатий используйте клавиши 1, 2, 3 или Q, W, E.

Старайтесь удерживать клавишу столько времени, сколько должна длиться заданная нота.

Если вы не успеваете нажимать на клавиши во время упражнения, особенно при игре шестнадцатыми и восьмыми длительностями, снизьте скорость темпа.

Если вы ошибаетесь при выполнении упражнения, тренажёр проиграет вам правильный пример. Его можно остановить кнопкой "Стоп".

В упражнении "Музыкальная математика" введите ответ цифрами. После правильного или неправильного ответа нажмите "Новое задание", чтобы получить следующий вопрос.

Ползунками ниже можно изменить темп, громкость метронома и громкость звука клавиш.

'; } function preparePlayTask() { if (running || demoRunning) { return; } prepareTask(); applyAutomaticPlayTempo(); taskPrepared = true; setMeterText("Размер " + currentMeter, false); showPlayInstruction(); statusBox.textContent = "Нажмите \"Пуск\"."; startButton.textContent = "Пуск"; startButton.classList.remove("nt7-demo-stop"); setBarCounter(0, 0); } function scheduleListenTick() { var data = meterData(currentMeter); var ticksInBar = data.beats * data.ticks; var secondsPerTick = getTickSeconds(); var tickInBar = tickNumber % ticksInBar; var barNumber = Math.floor(tickNumber / ticksInBar); var beatNumber = Math.floor(tickInBar / data.ticks); var noteTicks; if (tickInBar % data.ticks === 0) { playMetronome(nextTick, tickInBar === 0); flashLight(beatNumber, nextTick); if (tickInBar === 0) { setBarCounter(barNumber + 1, 0); } } if (barNumber >= 1) { noteTicks = durationTicks(correctAnswer, currentMeter); if ( tickInBar % noteTicks === 0 && tickInBar + noteTicks startTolerance ) { break; } if ( notes[noteIndex].duration maximumDuration ) { break; } } if (noteIndex === pattern.length) { return true; } } return false; } function getFlexibleMeterEvaluationDelay() { if ( currentMeter === "3/4" && correctAnswer === "half" ) { return getBeatSeconds() * 1.05; } return 0.05; } function scheduleBarProcessing(time) { var delay = Math.max( 0, (time - audioContext.currentTime) * 1000 ); delay += getFlexibleMeterEvaluationDelay() * 1000; visualTimers.push( window.setTimeout(function () { if (!running || activeMode !== "play") { return; } processBars(audioContext.currentTime); }, delay) ); } function schedulePlayTick() { var data = meterData(currentMeter); var ticksInBar = data.beats * data.ticks; var tickInBar = tickNumber % ticksInBar; var barNumber = Math.floor(tickNumber / ticksInBar); var beatNumber = Math.floor(tickInBar / data.ticks); if (tickInBar % data.ticks === 0) { playMetronome(nextTick, tickInBar === 0); flashLight(beatNumber, nextTick); if (tickInBar === 0) { setBarCounter(Math.min(barNumber + 1, 8), 8); scheduleBarProcessing(nextTick); } } tickNumber++; nextTick += getTickSeconds(); } function playLoop() { if (!running || activeMode !== "play") { return; } while (nextTick = 0 && flexibleBar maximumHold) { event.failed = true; } if ( time > event.end + Math.min(0.28, event.duration * 0.45) ) { event.failed = true; } activeNote = null; } function markCurrentBarAsWrong(time) { var currentBar; var barSeconds; var i; if (time 5) { return; } for (i = 0; i = 16) { stopForRapidActions(); } } function trackRapidButtonAction() { var now = Date.now(); if (!running && !demoRunning) { return; } rapidButtonActions.push(now); rapidButtonActions = rapidButtonActions.filter(function (time) { return now - time = 6) { stopForRapidActions(); } } function pressPianoKey(keyName) { var now; var eventId; var event; var sound; var flexibleBar; if (!running || activeMode !== "play") { return; } trackRapidKeyAction(); if (!running) { return; } now = audioContext.currentTime; if (now > exerciseEndTime) { return; } if (activeNote) { finishActiveNote(now); } sound = createInstrumentNote(now, frequencies[keyName]); markKey(keyName, true); activeNote = { key: keyName, sound: sound, eventIndex: -1, start: now, flexibleMeter: false, bar: -1 }; if (now = 0 && flexibleBar = 2 && !correctShown) { correctShown = true; setMeterText("Правильно", true); instruction.textContent = "Можно продолжить играть или нажать \"Стоп\"."; statusBox.textContent = ""; } return; } events = getBarEvents(barNumber); hasInput = false; failed = false; for (i = 0; i = 2 && !correctShown) { correctShown = true; setMeterText("Правильно", true); instruction.textContent = "Можно продолжить играть или нажать \"Стоп\"."; statusBox.textContent = ""; } } function processBars(time) { var barSeconds = getBarSeconds(); var completedBar; var currentBar; if (time lastProcessedBar && lastProcessedBar = 0 && currentBar = precedence(tokens[index]) ) { applyOperator(); } operators.push(tokens[index]); } } while (operators.length) { applyOperator(); } if (values.length !== 1 || !isFinite(values[0])) { throw new Error("Некорректное выражение"); } return values[0]; } function prepareMathInput() { var answerRow; var mathActions; var calculator; var calculatorTitle; var calculatorDisplay; var calculatorGrid; var calculatorTransfer; var calculatorExpression = ""; function updateCalculatorDisplay() { calculatorDisplay.textContent = calculatorExpression || "0"; } function appendCalculatorValue(value) { if (calculatorExpression === "Ошибка") { calculatorExpression = ""; } calculatorExpression += value; updateCalculatorDisplay(); } function clearCalculator() { calculatorExpression = ""; updateCalculatorDisplay(); } function calculateCalculatorValue() { var result; try { result = calculateMathExpression( calculatorExpression ); if (Math.round(result) === result) { calculatorExpression = String(result); } else { calculatorExpression = String( Math.round(result * 100) / 100 ); } } catch (error) { calculatorExpression = "Ошибка"; } updateCalculatorDisplay(); } function transferCalculatorValue(target) { var result; try { result = calculateMathExpression( calculatorExpression ); } catch (error) { mathStatus.textContent = "Сначала получите корректный результат."; return; } if ( Math.round(result) !== result || result 0) { result++; } } return result; } function createMeterParts(totalUnits) { var result; var remaining; var available; var selected; var index; var attempts; var steps; for (attempts = 0; attempts 0 && steps = 2 ) { return result; } } return { half: 1, quarter: 1, eighth: 1, sixteenth: 2 }; } if ( typeof createMathTask.nextIsMeterQuestion === "undefined" ) { createMathTask.nextIsMeterQuestion = false; } isMeterQuestion = createMathTask.nextIsMeterQuestion; createMathTask.nextIsMeterQuestion = !createMathTask.nextIsMeterQuestion; if (!isMeterQuestion) { firstIndex = Math.floor( Math.random() * (durationOrder.length - 1) ); secondIndex = firstIndex + 1 + Math.floor( Math.random() * (durationOrder.length - firstIndex - 1) ); first = durationOrder[firstIndex]; second = durationOrder[secondIndex]; count = Math.random() = 2 && meter.units 0) { partText.push( getMeterPartText( parts[meterParts[i].key], meterParts[i].key ) ); } } answers = getMeterAnswers(selectedMeter.units); question = "Какой музыкальный размер может быть в такте, который содержит " + joinText(partText) + "?"; correction = "Правильный ответ: " + answers.join(" или ") + "."; return { question: question, answers: answers, correction: correction, isMeterQuestion: true }; } function clearMathAttempt() { mathInput.value = ""; mathNumeratorInput.value = ""; mathDenominatorInput.value = ""; if (typeof mathInput.resetCalculator === "function") { mathInput.resetCalculator(); } } function createNewMathTask() { prepareMathInput(); currentMathTask = createMathTask(); mathAnswered = false; mathQuestion.textContent = currentMathTask.question; clearMathAttempt(); mathInput.disabled = false; mathNumeratorInput.disabled = false; mathDenominatorInput.disabled = false; mathCheckButton.disabled = false; mathInput.calculator.style.display = "block"; if (currentMathTask.isMeterQuestion) { mathInput.style.display = "none"; mathMeterAnswerBox.style.display = "flex"; mathInput.calculatorTransfer.style.display = "grid"; mathInput.calculatorTransfer .querySelector(".nt7-calculator-transfer-answer") .style.display = "none"; mathInput.calculatorTransfer .querySelector(".nt7-calculator-transfer-numerator") .style.display = "block"; mathInput.calculatorTransfer .querySelector(".nt7-calculator-transfer-denominator") .style.display = "block"; mathStatus.textContent = "Введите числитель и знаменатель музыкального размера."; window.setTimeout(function () { mathNumeratorInput.focus(); }, 0); return; } mathInput.style.display = "block"; mathMeterAnswerBox.style.display = "none"; mathInput.calculatorTransfer.style.display = "grid"; mathInput.calculatorTransfer .querySelector(".nt7-calculator-transfer-answer") .style.display = "block"; mathInput.calculatorTransfer .querySelector(".nt7-calculator-transfer-numerator") .style.display = "none"; mathInput.calculatorTransfer .querySelector(".nt7-calculator-transfer-denominator") .style.display = "none"; mathStatus.textContent = "Введите ответ цифрами и нажмите Enter."; window.setTimeout(function () { mathInput.focus(); }, 0); } function checkMathAnswer() { var value; var isCorrect = false; var i; if (!currentMathTask || mathAnswered) { return; } if (currentMathTask.isMeterQuestion) { if ( !mathNumeratorInput.value || !mathDenominatorInput.value ) { mathStatus.textContent = "Введите числитель и знаменатель размера."; mathNumeratorInput.focus(); return; } value = mathNumeratorInput.value + "/" + mathDenominatorInput.value; } else { value = mathInput.value.replace(/\s/g, ""); if (!/^\d+$/.test(value)) { mathStatus.textContent = "Введите ответ цифрами."; mathInput.focus(); return; } } for ( i = 0; i