Функция Tone() ставит паузы между нотами
Я попытался поэкспериментировать с функцией tone()
, которая поставляется с библиотекой arduino.
Я поэкспериментировал со стандартным примером кода, расположенным здесь: https://www.arduino.cc/en/Tutorial/BuiltInExamples/toneMelody
Это код:
#include "pitches.h"
int melody[] =
{
NOTE_C4, NOTE_G3, NOTE_G3, NOTE_A3, NOTE_G3, 0, NOTE_B3, NOTE_C4
};
int noteDurations[] =
{
4, 8, 8, 4, 4, 4, 4, 4
};
void setup()
{
for (int thisNote = 0; thisNote < 8; thisNote++)
{
int noteDuration = 1000 / noteDurations[thisNote];
tone(8, melody[thisNote], noteDuration);
// чтобы различать ноты, установите минимальное время между ними.
// продолжительность ноты + 30% работает хорошо:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
// остановить воспроизведение звука:
noTone(8);
}
}
void loop()
{
// не нужно повторять мелодию.
}
Однако проблема в том, что между заметками всегда есть пауза.
В музыкальных терминах это называется staccato
.
Я хочу иметь возможность играть короткие мелодии, в которых нет задержек между нотами, а одна нота естественным образом переходит в другую. Кстати, в теории музыки это называется legato
.
Теперь в этом примере задержка между нотами звучит хорошо, потому что это "музыкальное произведение" предполагается играть таким образом. Но в любой другой песне, с которой я экспериментировал, всегда были паузы между нотами.
Вот как звучит эта песня: https://soundcloud.com/nikowow-1/normal
Естественно, я подумал о функции delay(pauseBetweenNotes)
. Так что я подумал, что именно это вызывает задержку между нотами. Поэтому я установил его на 0,5
. Вот как это звучит: https://soundcloud.com/nikowow-1/05a
Как вы можете слышать, это просто ускоряет всю песню. Задержка между нотами сохраняется, но вся песня ускоряется (так сказать, в более высоком темпе).
Чтобы лучше расслышать задержку между нотами, пожалуйста, прослушайте песню, когда я выбрал значение 3
, чтобы уменьшить темп, чтобы можно было уменьшить задержку между нотами. легче слышно: https://soundcloud.com/nikowow-1/3a-1
Я хочу создать несколько мелодий, в которых нет задержек между нотами, и я застрял.
РЕДАКТИРОВАТЬ: Если полностью удалить линию задержки, песня будет воспроизводиться так быстро, что будет слышен только звук щелчка.
@user1584421, 👍0
Обсуждение1 ответ
Лучший ответ:
есть
// чтобы различать ноты, устанавливаем минимальное время между ними.
// продолжительность ноты + 30% работает хорошо:
int pauseBetweenNotes = noteDuration * 1.30;
delay(pauseBetweenNotes);
поэтому *1.30 создает паузу.
если вы измените его на
int pauseBetweenNotes = noteDuration;
между нотами не будет паузы.
Длина тона указывается в последнем параметре функции tone() (здесь noteDuration
).
- Воспроизведение файлов *.wav через Arduino
- Как подключить ардуино к разъему для наушников?
- Как избавиться от некачественного звука из усилителя DFPlayer plus?
- Выполнить регулировку громкости на динамике arduino
- Arduino распознает определенный звук?
- При нажатии кнопки мне нужно воспроизвести вступительный звуковой файл, затем один из 50 других звуков по порядку при каждом нажатии кнопки
- SimpleAudioPlayer + функция сна
- Tone() генерирует высокий звук при отпускании кнопки
https://www.arduino.cc/en/Tutorial/BuiltInExamples/BlinkWithoutDelay, @VE7JRO
@VE7JRO Спасибо! Но извините, но я не понимаю. Как это можно реализовать в функции
tone()
?, @user1584421Я, наверное, что-то путаю. Итак, я просто спрошу: что произойдет, если вы удалите (или закомментируете)
delay(pauseBetweenNotes);
?, @timemage@timemage Извините, я пропустил это в вопросе и отредактирую его. Но если убрать задержку, то песня проигрывается так быстро, что слышен только финтовый щелчок., @user1584421
Я понимаю. Сделали без блокировки. Это не совсем то, что я ожидал от ArduinoLand., @timemage
Замените «задержку» таймером «милли»., @VE7JRO
@VE7JRO, почему ты указываешь им на millis()? это не решение вопроса. Кстати: https://arduinoprosto.ru/q/17355/playing-melody-with-tone-without-using-delay/89697#89697, @Juraj
@Juraj Это было оно! Большое спасибо! Если хотите, вы можете дать правильный ответ, чтобы я мог проголосовать и отметить его как выбранный ответ. Еще раз огромное спасибо!, @user1584421
@Juraj, потому что отказ от использования «задержки» — самый важный урок, который может усвоить пользователь Arduino., @VE7JRO
@VE7JRO, ОП еще нет, @Juraj
@Juraj - Следующим вопросом будет «задержка» блокировки :), @VE7JRO
Я не уверен, что понимаю, что вы предлагаете. Я должен заменить «задержку» таймером «милли», чтобы выполнить задержку? Я думал, что «милли» считает только время. Он также выполняет обратный отсчет до определенного времени?, @user1584421
@VE7JRO, этот вопрос будет дубликатом https://arduinoprosto.ru/q/17355/playing-melody-with-tone-without-using-delay/89697., @Juraj