Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 37 additions & 22 deletions boards/drivers/include/buzzer.h
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
/*###########################################################
# Copyright (c) 2023-2024. BNU-HKBU UIC RoboMaster #
# Copyright (c) 2026-2027. BNU-HKBU UIC RoboMaster #
# #
# This program is free software: you can redistribute it #
# and/or modify it under the terms of the GNU General #
Expand Down Expand Up @@ -33,29 +33,44 @@ namespace driver {
* @note there are three octaves in total
*/
enum class BuzzerNote {
Do1L = 262, ///*261.63Hz*/ 3822us
Re2L = 294, ///*293.66Hz*/ 3405us
Mi3L = 330, ///*329.63Hz*/ 3034us
Fa4L = 349, ///*349.23Hz*/ 2863us
So5L = 392, ///*392.00Hz*/ 2551us
La6L = 440, ///*440.00Hz*/ 2272us
Si7L = 494, ///*493.88Hz*/ 2052us
Do1L = 262, // C4: 261.63 Hz, 3822 us
Do1SharpL = 277, // C#4: 277.18 Hz, 3608 us
Re2L = 294, // D4: 293.66 Hz, 3405 us
Re2SharpL = 311, // D#4: 311.13 Hz, 3214 us
Mi3L = 330, // E4: 329.63 Hz, 3034 us
Fa4L = 349, // F4: 349.23 Hz, 2863 us
Fa4SharpL = 370, // F#4: 369.99 Hz, 2703 us
So5L = 392, // G4: 392.00 Hz, 2551 us
So5SharpL = 415, // G#4: 415.30 Hz, 2408 us
La6L = 440, // A4: 440.00 Hz, 2273 us
La6SharpL = 466, // A#4: 466.16 Hz, 2145 us
Si7L = 494, // B4: 493.88 Hz, 2025 us

Do1M = 523, ///*523.25Hz*/ 1911us
Re2M = 587, ///*587.33Hz*/ 1703us
Mi3M = 659, ///*659.26Hz*/ 1517us
Fa4M = 698, ///*698.46Hz*/ 1432us
So5M = 784, ///*784.00Hz*/ 1276us
La6M = 880, ///*880.00Hz*/ 1136us
Si7M = 988, ///*987.77Hz*/ 1012us
Do1M = 523, // C5: 523.25 Hz, 1911 us
Do1SharpM = 554, // C#5: 554.37 Hz, 1804 us
Re2M = 587, // D5: 587.33 Hz, 1703 us
Re2SharpM = 622, // D#5: 622.25 Hz, 1607 us
Mi3M = 659, // E5: 659.26 Hz, 1517 us
Fa4M = 698, // F5: 698.46 Hz, 1432 us
Fa4SharpM = 740, // F#5: 739.99 Hz, 1351 us
So5M = 784, // G5: 783.99 Hz, 1276 us
So5SharpM = 831, // G#5: 830.61 Hz, 1204 us
La6M = 880, // A5: 880.00 Hz, 1136 us
La6SharpM = 932, // A#5: 932.33 Hz, 1073 us
Si7M = 988, // B5: 987.77 Hz, 1012 us

Do1H = 1047, ///*1046.50Hz*/ 956us
Re2H = 1175, ///*1174.66Hz*/ 851us
Mi3H = 1319, ///*1318.51Hz*/ 758us
Fa4H = 1397, ///*1396.91Hz*/ 716us
So5H = 1568, ///*1567.98Hz*/ 638us
La6H = 1760, ///*1760.00Hz*/ 568us
Si7H = 1976, ///*1975.53Hz*/ 506us
Do1H = 1047, // C6: 1046.50 Hz, 956 us
Do1SharpH = 1109, // C#6: 1108.73 Hz, 902 us
Re2H = 1175, // D6: 1174.66 Hz, 851 us
Re2SharpH = 1245, // D#6: 1244.51 Hz, 804 us
Mi3H = 1319, // E6: 1318.51 Hz, 758 us
Fa4H = 1397, // F6: 1396.91 Hz, 716 us
Fa4SharpH = 1480, // F#6: 1479.98 Hz, 676 us
So5H = 1568, // G6: 1567.98 Hz, 638 us
So5SharpH = 1661, // G#6: 1661.22 Hz, 602 us
La6H = 1760, // A6: 1760.00 Hz, 568 us
La6SharpH = 1865, // A#6: 1864.66 Hz, 536 us
Si7H = 1976, // B6: 1975.53 Hz, 506 us

Silent = 0,
Finish = -1,
Expand Down
288 changes: 288 additions & 0 deletions boards/drivers/include/buzzer_songs.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,288 @@
/*###########################################################
# Copyright (c) 2026-2027. BNU-HKBU UIC RoboMaster #
# #
# This program is free software: you can redistribute it #
# and/or modify it under the terms of the GNU General #
# Public License as published by the Free Software #
# Foundation, either version 3 of the License, or (at #
# your option) any later version. #
# #
# This program is distributed in the hope that it will be #
# useful, but WITHOUT ANY WARRANTY; without even #
# the implied warranty of MERCHANTABILITY or FITNESS #
# FOR A PARTICULAR PURPOSE. See the GNU General #
# Public License for more details. #
# #
# You should have received a copy of the GNU General #
# Public License along with this program. If not, see #
# <https://www.gnu.org/licenses/>. #
###########################################################*/

#pragma once

#include "buzzer.h"

namespace driver {
namespace songs {

// Shared melodies and status tones. All delays are in milliseconds.
// End each sequence with Finish so Buzzer::SingSong stops at its boundary.
inline constexpr BuzzerNoteDelayed Mario[] =
{{BuzzerNote::Mi3M, 80},
{BuzzerNote::Silent, 80},
{BuzzerNote::Mi3M, 80},
{BuzzerNote::Silent, 240},
{BuzzerNote::Mi3M, 80},
{BuzzerNote::Silent, 240},
{BuzzerNote::Do1M, 80},
{BuzzerNote::Silent, 80},
{BuzzerNote::Mi3M, 80},
{BuzzerNote::Silent, 240},
{BuzzerNote::So5M, 80},
{BuzzerNote::Silent, 560},
{BuzzerNote::So5L, 80},
{BuzzerNote::Silent, 0},
{BuzzerNote::Finish, 0}};

inline constexpr BuzzerNoteDelayed War_Cant_of_Mars[] = {
{BuzzerNote::So5M, 400}, {BuzzerNote::So5M, 200}, {BuzzerNote::So5M, 200}, {BuzzerNote::So5M, 400},
{BuzzerNote::Fa4M, 200}, {BuzzerNote::Mi3M, 400}, {BuzzerNote::So5M, 200}, {BuzzerNote::Do1H, 400},
{BuzzerNote::Re2H, 200}, {BuzzerNote::Mi3H, 400}, {BuzzerNote::Mi3H, 200}, {BuzzerNote::Mi3H, 400},
{BuzzerNote::Re2H, 200}, {BuzzerNote::Do1H, 400}, {BuzzerNote::Do1H, 400}, {BuzzerNote::Si7M, 200},
{BuzzerNote::La6M, 400}, {BuzzerNote::La6M, 200}, {BuzzerNote::La6M, 400}, {BuzzerNote::Si7M, 200},
{BuzzerNote::Do1H, 400}, {BuzzerNote::Si7M, 200}, {BuzzerNote::Do1H, 400}, {BuzzerNote::La6M, 200},
{BuzzerNote::So5M, 400}, {BuzzerNote::La6M, 200}, {BuzzerNote::So5M, 400}, {BuzzerNote::Mi3M, 200},
{BuzzerNote::So5M, 800}, {BuzzerNote::So5M, 400}, {BuzzerNote::So5M, 200}, {BuzzerNote::So5M, 400},
{BuzzerNote::So5M, 200}, {BuzzerNote::So5M, 400}, {BuzzerNote::Fa4M, 200}, {BuzzerNote::Mi3M, 400},
{BuzzerNote::So5M, 200}, {BuzzerNote::Do1H, 400}, {BuzzerNote::Re2H, 200}, {BuzzerNote::Mi3H, 400},
{BuzzerNote::Mi3H, 200}, {BuzzerNote::Mi3H, 400}, {BuzzerNote::Re2H, 200}, {BuzzerNote::Do1H, 800},
{BuzzerNote::Do1H, 800}, {BuzzerNote::Re2H, 800}, {BuzzerNote::Re2H, 800}, {BuzzerNote::Do1H, 800},
{BuzzerNote::Si7M, 800}, {BuzzerNote::Do1H, 1600}, {BuzzerNote::Silent, 400}, {BuzzerNote::Silent, 400},
{BuzzerNote::So5M, 800}, {BuzzerNote::Fa4M, 400}, {BuzzerNote::Mi3M, 400}, {BuzzerNote::So5M, 200},
{BuzzerNote::Do1H, 400}, {BuzzerNote::Re2H, 200}, {BuzzerNote::Mi3H, 1200}, {BuzzerNote::Do1H, 800},
{BuzzerNote::Silent, 400}, {BuzzerNote::La6M, 800}, {BuzzerNote::Si7M, 400}, {BuzzerNote::Do1H, 400},
{BuzzerNote::Si7M, 200}, {BuzzerNote::Do1H, 400}, {BuzzerNote::La6M, 200}, {BuzzerNote::So5M, 1600},
{BuzzerNote::Mi3M, 800}, {BuzzerNote::Silent, 400}, {BuzzerNote::So5M, 800}, {BuzzerNote::Fa4M, 400},
{BuzzerNote::Mi3M, 400}, {BuzzerNote::So5M, 200}, {BuzzerNote::Do1H, 400}, {BuzzerNote::Re2H, 200},
{BuzzerNote::Mi3H, 1600}, {BuzzerNote::Do1H, 800}, {BuzzerNote::Do1H, 800}, {BuzzerNote::Re2H, 800},
{BuzzerNote::Re2H, 800}, {BuzzerNote::Do1H, 800}, {BuzzerNote::Si7M, 800}, {BuzzerNote::Do1H, 1600},
{BuzzerNote::Silent, 0}, {BuzzerNote::Finish, 0},
};

inline constexpr BuzzerNoteDelayed DJI[] =
{{BuzzerNote::Do1M, 300}, {BuzzerNote::Re2M, 300}, {BuzzerNote::So5M, 600}, {BuzzerNote::Finish, 0}};

inline constexpr BuzzerNoteDelayed SingCaliStart[] =
{{BuzzerNote::Mi3M, 100}, {BuzzerNote::Re2M, 100}, {BuzzerNote::Mi3M, 100}, {BuzzerNote::Finish, 0}};

inline constexpr BuzzerNoteDelayed SingCaliDone[] =
{{BuzzerNote::Re2M, 100}, {BuzzerNote::Mi3M, 100}, {BuzzerNote::Re2M, 100}, {BuzzerNote::Finish, 0}};

// Two Tigers.
inline constexpr BuzzerNoteDelayed Laohu[] =
{{BuzzerNote::Do1M, 500}, {BuzzerNote::Re2M, 500}, {BuzzerNote::Mi3M, 500}, {BuzzerNote::Do1M, 450},
{BuzzerNote::Silent, 50}, {BuzzerNote::Do1M, 500}, {BuzzerNote::Re2M, 500}, {BuzzerNote::Mi3M, 500},
{BuzzerNote::Do1M, 450}, {BuzzerNote::Silent, 50}, {BuzzerNote::Mi3M, 500}, {BuzzerNote::Fa4M, 500},
{BuzzerNote::So5M, 500}, {BuzzerNote::Silent, 500}, {BuzzerNote::Mi3M, 500}, {BuzzerNote::Fa4M, 500},
{BuzzerNote::So5M, 500}, {BuzzerNote::Silent, 500}, {BuzzerNote::So5M, 250}, {BuzzerNote::La6M, 250},
{BuzzerNote::So5M, 250}, {BuzzerNote::Fa4M, 250}, {BuzzerNote::Mi3M, 500}, {BuzzerNote::Do1M, 500},
{BuzzerNote::So5M, 250}, {BuzzerNote::La6M, 250}, {BuzzerNote::So5M, 250}, {BuzzerNote::Fa4M, 250},
{BuzzerNote::Mi3M, 500}, {BuzzerNote::Do1M, 500}, {BuzzerNote::Re2M, 500}, {BuzzerNote::Si7L, 500},
{BuzzerNote::Do1M, 500}, {BuzzerNote::Silent, 500}, {BuzzerNote::Re2M, 500}, {BuzzerNote::Si7L, 500},
{BuzzerNote::Do1M, 500}, {BuzzerNote::Silent, 500}, {BuzzerNote::Finish, 0}};

// Never Gonna Give You Up - Rick Astley.
// 114 BPM; delays in milliseconds. Each pitched note sounds for 90% of its slot.
inline constexpr BuzzerNoteDelayed NeverGonnaGiveYouUp[] = {
// Intro
{BuzzerNote::Re2M, 710},
{BuzzerNote::Silent, 79}, // D5, -4
{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::La6L, 473},
{BuzzerNote::Silent, 53}, // A4, 4

{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::Fa4SharpM, 710},
{BuzzerNote::Silent, 79}, // FS5, -4
{BuzzerNote::La6M, 117},
{BuzzerNote::Silent, 14}, // A5, 16
{BuzzerNote::So5M, 117},
{BuzzerNote::Silent, 14}, // G5, 16
{BuzzerNote::Fa4SharpM, 236},
{BuzzerNote::Silent, 27}, // FS5, 8

{BuzzerNote::Re2M, 710},
{BuzzerNote::Silent, 79}, // D5, -4
{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::La6L, 946},
{BuzzerNote::Silent, 106}, // A4, 2

{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 236},
{BuzzerNote::Silent, 27}, // D5, 8
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16

{BuzzerNote::Re2M, 710},
{BuzzerNote::Silent, 79}, // D5, -4
{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::La6L, 473},
{BuzzerNote::Silent, 53}, // A4, 4

{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::Fa4SharpM, 710},
{BuzzerNote::Silent, 79}, // FS5, -4
{BuzzerNote::La6M, 117},
{BuzzerNote::Silent, 14}, // A5, 16
{BuzzerNote::So5M, 117},
{BuzzerNote::Silent, 14}, // G5, 16
{BuzzerNote::Fa4SharpM, 236},
{BuzzerNote::Silent, 27}, // FS5, 8

{BuzzerNote::Re2M, 710},
{BuzzerNote::Silent, 79}, // D5, -4
{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::La6L, 946},
{BuzzerNote::Silent, 106}, // A4, 2

// Chorus
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16

{BuzzerNote::Fa4SharpM, 354},
{BuzzerNote::Silent, 40}, // FS5, -8
{BuzzerNote::Fa4SharpM, 354},
{BuzzerNote::Silent, 40}, // FS5, -8
{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16

{BuzzerNote::Mi3M, 354},
{BuzzerNote::Silent, 40}, // E5, -8
{BuzzerNote::Mi3M, 354},
{BuzzerNote::Silent, 40}, // E5, -8
{BuzzerNote::Re2M, 354},
{BuzzerNote::Silent, 40}, // D5, -8
{BuzzerNote::Do1SharpM, 117},
{BuzzerNote::Silent, 14}, // CS5, 16
{BuzzerNote::Si7L, 354},
{BuzzerNote::Silent, 40}, // B4, -8
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16

{BuzzerNote::Re2M, 473},
{BuzzerNote::Silent, 53}, // D5, 4
{BuzzerNote::Mi3M, 236},
{BuzzerNote::Silent, 27}, // E5, 8
{BuzzerNote::Do1SharpM, 354},
{BuzzerNote::Silent, 40}, // CS5, -8
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::La6L, 236},
{BuzzerNote::Silent, 27}, // A4, 8
{BuzzerNote::La6L, 236},
{BuzzerNote::Silent, 27}, // A4, 8
{BuzzerNote::La6L, 236},
{BuzzerNote::Silent, 27}, // A4, 8

{BuzzerNote::Mi3M, 473},
{BuzzerNote::Silent, 53}, // E5, 4
{BuzzerNote::Re2M, 946},
{BuzzerNote::Silent, 106}, // D5, 2
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16

{BuzzerNote::Fa4SharpM, 354},
{BuzzerNote::Silent, 40}, // FS5, -8
{BuzzerNote::Fa4SharpM, 354},
{BuzzerNote::Silent, 40}, // FS5, -8
{BuzzerNote::Mi3M, 710},
{BuzzerNote::Silent, 79}, // E5, -4
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16

{BuzzerNote::La6M, 473},
{BuzzerNote::Silent, 53}, // A5, 4
{BuzzerNote::Do1SharpM, 236},
{BuzzerNote::Silent, 27}, // CS5, 8
{BuzzerNote::Re2M, 354},
{BuzzerNote::Silent, 40}, // D5, -8
{BuzzerNote::Do1SharpM, 117},
{BuzzerNote::Silent, 14}, // CS5, 16
{BuzzerNote::Si7L, 236},
{BuzzerNote::Silent, 27}, // B4, 8
{BuzzerNote::La6L, 117},
{BuzzerNote::Silent, 14}, // A4, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::Re2M, 117},
{BuzzerNote::Silent, 14}, // D5, 16
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16

{BuzzerNote::Re2M, 473},
{BuzzerNote::Silent, 53}, // D5, 4
{BuzzerNote::Mi3M, 236},
{BuzzerNote::Silent, 27}, // E5, 8
{BuzzerNote::Do1SharpM, 354},
{BuzzerNote::Silent, 40}, // CS5, -8
{BuzzerNote::Si7L, 117},
{BuzzerNote::Silent, 14}, // B4, 16
{BuzzerNote::La6L, 473},
{BuzzerNote::Silent, 53}, // A4, 4
{BuzzerNote::La6L, 236},
{BuzzerNote::Silent, 27}, // A4, 8

{BuzzerNote::Mi3M, 473},
{BuzzerNote::Silent, 53}, // E5, 4
{BuzzerNote::Re2M, 946},
{BuzzerNote::Silent, 106}, // D5, 2
{BuzzerNote::Silent, 526}, // REST, 4

{BuzzerNote::Finish, 0},
};

} // namespace songs
} // namespace driver
4 changes: 4 additions & 0 deletions boards/drivers/src/buzzer.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ namespace driver {
}

void Buzzer::SingTone(const BuzzerNote& note) {
if (note == BuzzerNote::Silent) {
Off();
return;
}
if (note != BuzzerNote::Finish) {
pwm_.SetFrequency(static_cast<uint32_t>(note));
pwm_.SetPulseWidth(1000000 / static_cast<uint32_t>(note) / 2);
Expand Down
Loading
Loading