diff --git a/Marlin/src/MarlinCore.cpp b/Marlin/src/MarlinCore.cpp
index d2a9f395b70..aaa8e0b4b4e 100644
--- a/Marlin/src/MarlinCore.cpp
+++ b/Marlin/src/MarlinCore.cpp
@@ -1660,6 +1660,11 @@ void setup() {
 
   marlin_state = MF_RUNNING;
 
+  #if ENABLED(SPEAKER) && defined(STARTUP_TUNE)
+    constexpr uint16_t tune[] = STARTUP_TUNE;
+    for (uint8_t i = 0; i < COUNT(tune); i += 2) BUZZ(tune[i + 1], tune[i]);
+  #endif
+
   SETUP_LOG("setup() completed.");
 
   TERN_(MARLIN_TEST_BUILD, runStartupTests());
diff --git a/Marlin/src/gcode/lcd/M300.cpp b/Marlin/src/gcode/lcd/M300.cpp
index 76d4b96b242..7ee811f0bdc 100644
--- a/Marlin/src/gcode/lcd/M300.cpp
+++ b/Marlin/src/gcode/lcd/M300.cpp
@@ -30,10 +30,13 @@
 #include "../../libs/buzzer.h"  // Buzzer, if possible
 
 /**
- * M300: Play beep sound S<frequency Hz> P<duration ms>
+ * M300: Play a Tone / Add a tone to the queue
+ *
+ *  S<frequency> - (Hz) The frequency of the tone. 0 for silence.
+ *  P<duration>  - (ms) The duration of the tone.
  */
 void GcodeSuite::M300() {
-  uint16_t const frequency = parser.ushortval('S', 260);
+  const uint16_t frequency = parser.ushortval('S', 260);
   uint16_t duration = parser.ushortval('P', 1000);
 
   // Limits the tone duration to 0-5 seconds.