Фоновое воспроизведение музыки на Ардуино

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
Всем привет!

Для одного проекта на ардуине требовалось воспроизведение музыки через спикер во время выполнения основного цикла программы. В последствии решил оформить всё в виде библиотеки и выложить в опенсорс, вдруг кому ещё пригодится.
За одно начал разбираться, как работать с гитхабом.
 
  • Лойс +1
Реакции: Un_ka

bort707

★★★★★★✩
21 Сен 2020
2,949
885
интересная штука...
правда дефайны нот непонятны...
Все эти дефайны дадут на выходе одно и тоже:
C++:
#define NOTE_A7  int(10000/3520)
#define NOTE_AS7 int(10000/3729)
#define NOTE_B7  int(10000/3951)
#define NOTE_C8  int(10000/4186)
#define NOTE_CS8 int(10000/4435)
#define NOTE_D8  int(10000/4699)
#define NOTE_DS8 int(10000/4978)
Тогда зачем столько разных нот, если они, по факту. одинаковые?
 

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
Для совместимости с гуляющим по сети pitches.h. Не проверял, насколько они разные при воспроизведении через стандартную tone, но решил пока оставить так. ))
 

Геннадий П

★★★★★★✩
14 Апр 2021
1,926
617
44
Не проверял, насколько они разные
Все одинаковые, почитайте на досуге почему так :)
C++:
int main()
{
    cout<<int(10000/3520)<<"\n";
    cout<<int(10000/3729)<<"\n";
    cout<<int(10000/3951)<<"\n";
    cout<<int(10000/4186)<<"\n";
    cout<<int(10000/4435)<<"\n";
    cout<<int(10000/4699)<<"\n";
    cout<<int(10000/4978)<<"\n";
    return 0;
}
Код:
2
2
2
2
2
2
2
 

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
@Геннадий П, Я в курсе, что в данных дефайнах значения получаются одинаковые, int, а не float всё таки. Я говорил лишь про то, что я не проверял, насколько данные ноты различаются на слух при воспроизведении через стандартную tone.
 

bort707

★★★★★★✩
21 Сен 2020
2,949
885
Я в курсе, что в данных дефайнах значения получаются одинаковые, ......я не проверял, насколько данные ноты различаются на слух при воспроизведении через стандартную tone.
у кого как, но у меня в голове эти фразы никак не совмещаются :)
Если вы понимаете, что численно эти дефайны одинаковы, то как эти ноты могут звучать по разному??
 

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
@bort707, 🙄
Вы видели оригинальный pitches.h? В нём нет “10000/на что-то там”. Там указаны частоты, без всяких модификаций. Мне эти модификации нужны были для сокращений вычислений в реалтайме, данными погрешностями вычислений при приведении к целочисленному типу я пренебрёг.

Так вот. При использовании стандартной pitches, при воспроизведении посредством стандартной функцией tone, я не знаю и не проверял, насколько данные ноты отличаются на звук.
 
  • Лойс +1
Реакции: bort707

Bruzzer

★★★✩✩✩✩
23 Май 2020
368
112
@i3epg,
Вы же писали для себя? Вам самому было бы полезно узнать ограничения вашей программы. Какие ноты она может воспроизводить с приемлемым качеством.
 

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
@Bruzzer, писал для себя. При воспроизведении тех мелодий, что нужны были, каких то режущих слух эффектов обнаружено не было, а если и были, то для меня не критичные. Поставленную задачу программа выполняла, а большего и не требовалось.
Ну и собственно нигде и не утверждается, что эта библиотека не имеет недостатков.
Но критика общественности побуждает сесть за дальнейшее допиливание. :)
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
368
112
@i3epg,
Если будете допиливать, советую посмотреть как сделано в полной библиотеке tone, Там есть возможность указать не только частоту, но и длительность звучания https://github.com/bhagman/Tone
Сейчас ваша программа работает в вашем конкретном случае, умещается в одном маленьком файле, и это хорошо. Но для широкого применения в ней много недостатков. Частота звука для высоких частот задается с большой погрешностью, прерывание вызывается довольно часто, размер переменных выбран не оптимально.

Дополнено позже - частоту контроллера можно узнать из F_CPU
 
Изменено:

i3epg

✩✩✩✩✩✩✩
9 Окт 2021
34
5
Красноярск
@Bruzzer, моя либа предназначена для проигрывания мелодии, а не одной ноты. Задается массив с последовательностью нот, вызывается функция play и всё. Музыка играет, основная программа делает что нужно, не отвлекаясь больше на воспроизведение мелодии.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
368
112
@i3epg,
Это понятно.
Проигрывание мелодии - это последовательное проигрывание разных нот с разной длительностью.
Ваш метод проигрывания ноты отличается от библиотеки по ссылке, и имеет несколько недостатков. Я советовал посмотреть как сделано в tone.
 

Jerej

✩✩✩✩✩✩✩
2 Окт 2022
16
2
Оформи код соответствующим тэгом
Наконец-то получилось создать мелодию для проигрывания в фоновом режиме, используя millis() и tone().
Оказывается можно так просто озвучить любое событие в программе, не зависая не всяких delay().
Нужно создать пару массивов – для нот и длительностей (можно в PROGMEM области), да троечку глобальных переменных: таймер, счётчик и флаг запуска. Всё!
Пишем функцию и засовываем её имя в луп!
Привожу пример:
C++:
void music () {
   if (flag_music) {
      if (count < LENGTH && millis() – tmr > duration[count]) {
         tone (PIN_TONE, note[count++]);
         tmr = millis();
      }
      if (count_music >= LENGTH) {
         noTone (PIN_TONE);
         flag_music =0;
         count =0;
      }
   }
}
Осталось поднять флаг по условию в самом лупе!
Может кому и пригодится, для замены противного писка буззера!
 
Изменено: