Per Halloween facciamo suonare al router l’attacco della Toccata e Fuga di Bach. È uno scherzo, ma è anche il modo più divertente per imparare un pezzo di scripting RouterOS: una nota è solo una frequenza, una melodia è un ciclo, e un allarme che si sente è a una riga di distanza. Alla fine trovi lo script pronto da incollare.

Prima di tutto: il tuo router ha l’altoparlante?
Non tutti i dispositivi MikroTik hanno il buzzer, il piccolo altoparlante interno. La documentazione non dà un elenco di quali famiglie ce l’hanno: dice soltanto “supportato solo sui dispositivi con beeper, controlla la pagina del prodotto”. L’unico modo sicuro è provarlo. Incolla nel terminale questo — due note:
:beep frequency=1000 length=200ms; :delay 300ms; :beep frequency=1500 length=200ms
Se senti din-don, ci sei. Se non senti niente, il tuo modello non ha il buzzer (capita su molti switch della serie CRS, e ovviamente sui CHR virtuali): il comando viene accettato lo stesso, ma resta muto. Nel nostro laboratorio, per esempio, un CCR1009 suona, un CRS418 no.
(Nota: l’opzione /system routerboard settings silent-boot zittisce i bip all’avvio, ma non il comando beep: sono cose diverse.)
Una nota è una frequenza: :beep
Il comando è semplice: una frequenza in hertz e una durata.
:beep frequency=440 length=500ms
440 Hz è il La (nel codice lo scriveremo A, lo standard internazionale — fra poco il perché), la nota con cui si accordano gli strumenti. Da qui parte tutto. Se i : e le parentesi [ ] ti sono nuovi, trovi le basi dello scripting nella scheda Scripting su MikroTik: cos’è e i comandi base.
Dalla nota alla frequenza
La musica occidentale divide l’ottava in dodici semitoni, e ogni semitono moltiplica la frequenza per lo stesso fattore: la dodicesima radice di due, circa 1,0595. Partendo dall’A (il La) a 440 Hz, ogni semitono in su si moltiplica per quel numero, ogni ottava in su raddoppia.
Un attimo sui nomi. Nel codice uso i nomi internazionali delle note — C D E F G A B — non Do Re Mi. È lo standard che usano i computer e la musica anglosassone, e qui serve perché lo script deve restare uguale in ogni lingua: una sola versione, non una per l’italiano e una per l’inglese. Se sei abituato al solfeggio, la corrispondenza è semplice:
C = Do D = Re E = Mi F = Fa G = Sol A = La B = Si
Il numero accanto alla lettera è l’ottava: C4 è il Do della quarta ottava, cioè il Do centrale del pianoforte; A4 è il La a 440 Hz. Salendo di un’ottava il numero cresce di uno e la frequenza raddoppia (C5 sta un’ottava sopra C4: 523 ≈ 2×262). Ecco la tabella delle note che useremo, nello standard internazionale:
C4=262 D4=294 E4=330 F4=349 G4=392 A4=440 B4=494
C5=523 D5=587 E5=659 F5=698 G5=784 A5=880 B5=988 C6=1047
Con queste frequenze puoi scrivere qualunque melodia semplice.
Durate e pause
La durata è il parametro length. Per il silenzio fra una nota e l’altra — e per le pause vere — si usa :delay, che non fa nulla per il tempo indicato:
:beep frequency=392 length=300ms # G
:delay 350ms # short gap
:beep frequency=523 length=300ms # C, higher
Una pausa musicale è semplicemente un :delay senza :beep prima. Tienilo a mente: più avanti, nel lettore automatico, la pausa la scriveremo come una riga a frequenza 0 — ma sotto sotto resta sempre questo :delay senza suono.
Il lettore di melodie
Scrivere decine di :beep a mano è noioso. Meglio mettere la melodia in una lista di coppie frequenza · durata e farla scorrere con un ciclo — è lo stesso :foreach e lo stesso uso degli array che vedi nella scheda KB. Una frequenza a zero vale “pausa”.
# player: each item is {frequency_Hz ; duration}; freq 0 = rest
:local song {
{392;250ms};{523;250ms};{659;500ms};{0;150ms};{659;250ms};{587;600ms}
}
:foreach n in=$song do={
:local f ($n->0); :local d ($n->1)
:if ($f > 0) do={ :beep frequency=$f length=$d }
:delay ($d + 40ms)
}
La pausa, nel lettore, è una riga a frequenza 0. L’idea sarebbe “una nota a frequenza zero”, cioè silenzio — un :delay. Attenzione però: :beep frequency=0 RouterOS non lo accetta, dà errore. Per questo lo 0 qui è solo un segnaposto, e il controllo :if ($f > 0) fa due cose insieme: salta il suono e evita l’errore, lasciando solo il :delay. La teniamo come riga {freq;durata} dentro l’array invece di uscire dal ciclo e infilare un :delay a parte per ogni pausa: così ogni elemento ha la stessa forma e la melodia resta una lista sola. Il ciclo legge ogni coppia, suona la nota (saltando le righe a 0), aspetta la durata più un piccolo stacco perché le note non si attacchino, e passa. Cambia le coppie e hai una canzone nuova.
Livello 2: melodie leggibili col resolver
Scrivere 880 al posto di “La” funziona, ma la melodia diventa illeggibile. Si fa di meglio con un dizionario: un array con le chiavi, che mappa il nome della nota alla sua frequenza. In RouterOS si scrive {"a4"=440; "c5"=523; …} e si legge con $HZ->"a4". È il “resolver”: gli dai un nome, ti dà gli hertz. È lo stesso tipo di array associativo delle basi di scripting.
:local HZ {"c4"=262;"cs4"=277;"d4"=294;"e4"=330;"f4"=349;"g4"=392;"a4"=440;"b4"=494;
"c5"=523;"cs5"=554;"d5"=587;"e5"=659;"f5"=698;"g5"=784;"a5"=880;"b5"=988;"c6"=1047;"p"=0}
Uso i nomi internazionali (a = La, 440 Hz; cs = c sharp, cioè do diesis, un semitono sopra). Ora la melodia si scrive con le note e il lettore le risolve al volo; "p" resta la pausa (vale 0):
:local song {
{"g4";250ms};{"c5";250ms};{"e5";500ms};{"p";150ms};{"e5";250ms};{"d5";600ms}
}
:foreach n in=$song do={
:local f ($HZ->($n->0)); :local d ($n->1)
:if ($f > 0) do={ :beep frequency=$f length=$d }
:delay ($d + 40ms)
}
La differenza rispetto a prima è una riga sola: $HZ->($n->0) traduce il nome in frequenza. Adesso la melodia si legge.
Allarmi che si sentono: Netwatch in musica
Qui diventa utile. Netwatch sorveglia un indirizzo e lancia uno script quando cade (down-script) e quando torna (up-script). Puoi dargli due melodie diverse: così, senza guardare lo schermo, senti cosa è successo. In ufficio, per esempio: la linea primaria cade e entra il backup → parte una musichetta di avviso; la primaria torna → una più allegra.
/tool netwatch add host=8.8.8.8 interval=10s \
down-script=":beep frequency=392 length=400ms; :delay 500ms; :beep frequency=262 length=700ms" \
up-script=":beep frequency=523 length=250ms; :delay 150ms; :beep frequency=659 length=250ms; :delay 150ms; :beep frequency=784 length=400ms"
La “caduta” scende (Sol → Do grave, due note cupe), il “ritorno” sale (Do → Mi → Sol, allegro). Puoi mettere nel down-script anche una melodia più lunga e riconoscibile (sempre di pubblico dominio): l’effetto “sala macchine” è garantito. Resta inteso che per gli allarmi seri servono log, email o Telegram: la musichetta è il tocco simpatico in più, non il sistema di monitoraggio.
Buon Halloween: la Toccata e Fuga
Ed eccolo, il regalo di stagione: l’attacco della Toccata e Fuga in Re minore BWV 565 di Bach (pubblico dominio) — chiamiamolo, nello spirito dei «trascrizione per fiati e violino», un adattamento per router e system integrator. Segue l’andamento dello spartito, ridotto a una voce sola: il buzzer è monofonico, i grandi accordi non può farli. Incollalo nel terminale di un router col buzzer e alza il volume della stanza.
# Toccata and Fugue in D minor BWV 565 — arrangement for routers and system integrators
# One voice for the monophonic buzzer: not a music lesson, just to recall Bach. Needs a buzzer (e.g. CCR1009).
:local HZ {"cs4"=277;"d4"=294;"e4"=330;"f4"=349;"g4"=392;"a4"=440;"cs5"=554;"d5"=587;"e5"=659;"f5"=698;"g5"=784;"a5"=880;"p"=0}
:local song {
{"a5";140ms};{"g5";140ms};{"a5";400ms};{"p";150ms};
{"g5";130ms};{"f5";130ms};{"e5";130ms};{"d5";130ms};{"cs5";400ms};{"d5";750ms};{"p";450ms};
{"a4";140ms};{"g4";140ms};{"a4";400ms};{"p";300ms};
{"e4";400ms};{"f4";300ms};{"cs4";600ms};{"d4";1200ms}
}
:foreach n in=$song do={
:local f ($HZ->($n->0)); :local d ($n->1)
:if ($f > 0) do={ :beep frequency=$f length=$d }
:delay ($d + 40ms)
}
Non vuole essere una lezione di musica — per quella ci sono posti migliori — ma solo far ricordare al buzzer il pezzo di Bach: l’orecchio fine ci troverà da ridire, a noi basta riconoscerla. E per la versione natalizia, con lo stesso lettore cambi le coppie e diventa Jingle Bells: ma quello è un altro scherzo, fra due mesi.
Provato in laboratorio sul buzzer di un CCR1009 con RouterOS 7.24.5 (stable): comando :beep, lettore ad array con :foreach, melodia della Toccata e di Jingle Bells. Il comando esiste solo sui dispositivi con beeper (la doc rimanda alla pagina del prodotto); i brani citati sono di pubblico dominio.
Domande frequenti
Ho incollato lo script ma non suona niente.
Quasi certamente il tuo modello non ha il buzzer (molti CRS, tutti i CHR). Prova il comando “due note” in cima: se resta muto, è così. Il comando non dà errore comunque.
Come fermo una melodia lunga mentre suona?
Gli script si interrompono dai job in corso: /system script job print e poi remove del job. Per le prove, tieni le melodie corte.
Posso usarlo come allarme vero?
Come tocco in più sì (Netwatch down/up), ma non come unico sistema: per un allarme affidabile usa log, email o Telegram. Il buzzer non lo senti da un’altra stanza.
Le frequenze devono essere precise?
Per riconoscere una melodia bastano i valori della tabella. Il buzzer è un altoparlantino: non aspettarti un pianoforte, ma le note si distinguono bene.



