Функция Tone() ставит паузы между нотами

audio sound delay wave

Я попытался поэкспериментировать с функцией 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

Я хочу создать несколько мелодий, в которых нет задержек между нотами, и я застрял.

РЕДАКТИРОВАТЬ: Если полностью удалить линию задержки, песня будет воспроизводиться так быстро, что будет слышен только звук щелчка.

, 👍0

Обсуждение

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


1 ответ


Лучший ответ:

3

есть

      // чтобы различать ноты, устанавливаем минимальное время между ними.
      // продолжительность ноты + 30% работает хорошо:
      int pauseBetweenNotes = noteDuration * 1.30;
      delay(pauseBetweenNotes);

поэтому *1.30 создает паузу.

если вы измените его на

   int pauseBetweenNotes = noteDuration;

между нотами не будет паузы.

Длина тона указывается в последнем параметре функции tone() (здесь noteDuration).

,