Vi posto la classe che userò io. Niente di chè, è solo un bridge verso il comando beep. Nel caso non sia installato si può usare come alternativa il comando suggerito da Giulio, che però non è molto personalizzabile.
Note:
* Chiamando BeepExists() scoprirete se beep è installato sul vostro sistema. Nel caso non lo sia fatemi sapere per favore quale sistema usate e se sul vostro sistema è presente il comando suggerito da giulio.
* Se utilizzate sempre lo stesso tipo di beep, istanziate la classe in un punto solo del codice e definite lì tutti i parametri. Potete anche definire 2 o 3 tipi di beep, che potrebbero indicare errori più o meno gravi. Basta creare più di una istanza.
* Passare i parametri alla funzione Beep dovrebbe essere abbastanza inutile, ma siccome non si sa mai ho aggiunto la possibilità di farlo.
* Impostando length a 1000 il beep dura 1 secondo, che è molto, credetemi (la durata è espressa in millisecondi). Impostandolo a 60000 dura un minuto e voi impazzirete. Ve lo dico per precisare che se voi glielo fate fare, lui lo fa davvero... poi non date la colpa a me.
* Ripetere 2 o 3 beep molto brevi attira decisamente l'attenzione senza necessariamente dare troppo fastidio, soprattutto se la frequenza è bassa. Evitate i suoni troppo acuti. Consiglio frequenze tipo "256", che è la frequenza del do centrale del piano.
Il resto è tutto documentato, e comunque mi sono stufato di scrivere :-D
' Gambas class file
'
' P R I V A T E M E M B E R S
' =============================
' beep parameters
PRIVATE freq AS String ' frequency (-f int)
PRIVATE length AS String ' beep length (-l int)
PRIVATE reps AS String ' how many beeps (-r int)
PRIVATE interval AS String ' interval between beeps (-d int)
PRIVATE delay AS String ' dalays after the beeps (-D int)
'
' P U B L I C M E T H O D S
' ===========================
'-----
' Constructor. Sets params.
'
PUBLIC SUB _new(OPTIONAL strFreq AS String = "", strLength AS String = "", strReps AS String = "", strInterval AS String = "", strDelay AS String = "")
freq = strFreq
length = strLength
reps = strReps
interval = strInterval
delay = strDelay
END
'-----
' Beeps
'
PUBLIC FUNCTION Beep(OPTIONAL strFreq AS String = NULL, strLength AS String = NULL, strReps AS String = NULL, strInterval AS String = NULL, strDelay AS String = NULL)
' base command
DIM strCommand AS String
strCommand = "beep >/dev/null 2>&1"
' if params are not passed, get defaults
IF IsNull(strFreq) THEN strFreq = freq
IF IsNull(strLength) THEN strLength = length
IF IsNull(strReps) THEN strReps = reps
IF IsNull(strInterval) THEN strInterval = interval
IF IsNull(strDelay) THEN strDelay = delay
' set params
IF strFreq THEN strCommand &= " -f " & strFreq
IF strLength THEN strCommand &= " -l " & strLength
IF strReps THEN strCommand &= " -r " & strReps
IF strInterval THEN strCommand &= " -d " & strInterval
IF strDelay THEN strCommand &= " -D " & strDelay
' exec command
SHELL strCommand WAIT
END
'---
' Verify if beep is installed
'
' @return : Boolean : TRUE=yes, FALSE=no
'
STATIC PUBLIC FUNCTION BeepExists() AS Boolean
SHELL "which beep >/dev/null 2>&1" WAIT
IF Process.LastValue = 0 THEN
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
END
Ultima cosa!... un esempio d'uso:
DIM b AS NEW Bell
b.Beep("256", "300")
Oh, dimenticavo un'altra cosa. Quelli di voi che hanno avuto il privilegio di giocare con l'Olivetti Prodest, il Commodore 64 o altre bestie del genere...
SONO PREGATI DI FARE QUANTO SEGUE:
* copiare la classe che ho postato in un nuovo progetto
* utilizzarla in questo modo:
DIM b AS NEW Bell
b.Beep("256", "200")
b.Beep("128", "200")
b.Beep("189", "200")
b.Beep("250", "200")
Alla faccia di chi pensa che una funzione BEEP sia inutile! :evil:
Caro md, non ce l'avevo con te ma con i signori dell'hardware che vogliono privarci dell'altoparlantino.
Il pacchetto si chiama beep. Se per caso non c'è nei repo ufficiali (fammi sapere!) questo è il sito: http://www.johnath.com/beep/ Come vedi l'autore mette a disposizione i pacchetti rpm, quindi sei a cavallo.
Ti ringrazio per i complimenti ma non me li merito: è facile tenere pulita e ordinata una classe di poche righe, ma quando si tratta di progetti più grandi non sono sempre così ordinato :pint:
Posto comunque l'ultima versione della classe, dove ho aggiunto:
* possibilità di fare più beep con una singola istruzione, anche con tonalità, lunghezze e pause diverse: metodo Beeps()
* possibilità di creare effetti stile videogiochi anni 80... stile omino che cade nel precipizio, per capirci: metodo Slide()
* questi due metodi sono statici. per i Beep normali vale il consiglio che ho già dato: istanziate la classe una volta o due (se volete avere 2 tipi di segnali acustici) impostando lì tutti i parametri. Poi quando vi serve chiamate Beep() senza passare alcun parametro.
* come nella prima versione, chiamate BeepExists() per sapere se il programma c'è.
Ci sono alcune istruzioni inutilmente ripetute, purtroppo non ho potuto metterle in una sub, altrimenti Beeps() e Slide() non sarebbero state statiche.
Bando alle ciance:
' Gambas class file
'
' P R I V A T E M E M B E R S
' =============================
' beep parameters
PRIVATE freq AS String ' frequency (-f int)
PRIVATE length AS String ' beep length (-l int)
PRIVATE reps AS String ' how many beeps (-r int)
PRIVATE interval AS String ' interval between beeps (-d int)
PRIVATE delay AS String ' dalays after the beeps (-D int)
'
' P U B L I C M E T H O D S
' ===========================
'-----
' Constructor. Sets params.
'
PUBLIC SUB _new(OPTIONAL strFreq AS String = "", strLength AS String = "", strReps AS String = "", strInterval AS String = "", strDelay AS String = "")
freq = strFreq
length = strLength
reps = strReps
interval = strInterval
delay = strDelay
END
'-----
' Beeps
'
PUBLIC FUNCTION Beep(OPTIONAL strFreq AS String = NULL, strLength AS String = NULL, strReps AS String = NULL, strInterval AS String = NULL, strDelay AS String = NULL)
' base command
DIM strCommand AS String
strCommand = "beep >/dev/null 2>&1"
' if params are not passed, get defaults
IF IsNull(strFreq) THEN strFreq = freq
IF IsNull(strLength) THEN strLength = length
IF IsNull(strReps) THEN strReps = reps
IF IsNull(strInterval) THEN strInterval = interval
IF IsNull(strDelay) THEN strDelay = delay
' set params
IF strFreq THEN strCommand &= " -f " & strFreq
IF strLength THEN strCommand &= " -l " & strLength
IF strReps THEN strCommand &= " -r " & strReps
IF strInterval THEN strCommand &= " -d " & strInterval
IF strDelay THEN strCommand &= " -D " & strDelay
' exec command
SHELL strCommand WAIT
END
'-----
' Beeps more than once
'
' @NumberIfBeeps : Integer : number of beeps to produce (1 is permitted)
' @strFreq : String : frequency of the beep(s)
' @strLength : String : length of the beep(s) in milliseconds
' @strDelay : String : delay after the beep(s) in milliseconds
' (if there are more than 1 beep, it is an interval)
'
' strFreq, strLength and strDelay may be a single value or more value separated by ",".
' Spaces before/after the value are ignored. If 1 value is given and NumberOfBeeps is > 1,
' all beeps will have the given value for that param (it's a convenient syntax).
'
' This method is static, differently from Beep().
'
STATIC PUBLIC FUNCTION Beeps(NumberOfBeeps AS Integer, OPTIONAL strFreq AS String = "", strLength AS String = "", strDelay AS String = "")
' params of the beep commands
DIM arrFreq AS NEW String[NumberOfBeeps]
DIM arrLength AS NEW String[NumberOfBeeps]
DIM arrDelay AS NEW String[NumberOfBeeps]
DIM strCommand AS String ' beep command (recreated for each beep)
DIM i AS Integer ' index to traverse param arrays
' base command
strCommand = "beep >/dev/null 2>&1"
' make params arrays
IF InStr(strFreq, ",") THEN
' convert strIn into an array
arrFreq = Split(strFreq, ",")
ELSE
' all elems are equal
FOR i = 0 TO (NumberOfBeeps - 1)
arrFreq[i] = strFreq
NEXT
ENDIF
IF InStr(strLength, ",") THEN
' convert strIn into an array
arrLength = Split(strLength, ",")
ELSE
' all elems are equal
FOR i = 0 TO (NumberOfBeeps - 1)
arrLength[i] = strLength
NEXT
ENDIF
IF InStr(strDelay, ",") THEN
' convert strIn into an array
arrDelay = Split(strDelay, ",")
ELSE
' all elems are equal
FOR i = 0 TO (NumberOfBeeps - 1)
arrDelay[i] = strDelay
NEXT
ENDIF
' call commands
FOR i = 0 TO (NumberOfBeeps - 1)
' base command
strCommand = "beep >/dev/null 2>&1"
' add params, if specified
IF arrFreq[i] THEN strCommand &= " -f " & arrFreq[i]
IF arrLength[i] THEN strCommand &= " -l " & arrLength[i]
IF arrDelay[i] THEN strCommand &= " -D " & arrDelay[i]
' exec command
SHELL strCommand WAIT
NEXT
END
'---
' Emits a slide of beeps (80's style videogame effect).
'
' @freqStart : Variant : initial frequency
' @freqEnd : Variant : final frequency
' @freqStep : Variant : frequency step
' @length : Variant : duration of each frequency in milliseconds
'
STATIC PUBLIC SUB Slide(freqStart AS Variant, freqEnd AS Variant, freqStep AS Variant, length AS Variant)
DIM freq AS Integer ' frequency of each beep call
DIM strCommand AS String ' strCommand beep call
FOR freq = freqStart TO freqEnd STEP freqStep
strCommand = "beep >/dev/null 2>&1 -f " & freq & " -l " & length ' length is mandatory here
SHELL strCommand WAIT
NEXT
END
'---
' Verify if beep is installed
'
' @return : Boolean : TRUE=yes, FALSE=no
'
STATIC PUBLIC FUNCTION BeepExists() AS Boolean
SHELL "which beep >/dev/null 2>&1" WAIT
IF Process.LastValue = 0 THEN
RETURN TRUE
ELSE
RETURN FALSE
ENDIF
END
Esempi d'uso:
esempio 1, osservate la flessibilità di Beeps()
b.Beeps(4, "256, 128, 189, 256", "200")
esempio 2
b.Slide(400, 200, -5, 50)
b.Beeps(1, "60", "800")
esempio 3
b.Slide(100, 200, 5, 50)
b.Slide(140, 240, 5, 50)
b.Slide(180, 280, 5, 50)
b.Slide(300, 200, 5, 50)
b.Beeps(1, "50", "700")
esempio 4 (già sentito in 1000 giochi)
b.Beep("90", "150")
b.Beep("60", "400")
esempio 5: "utente, che cavolo stai facendo?"
b.Beep("300", "200", "3", "50")
Se utilizzate questa classe, fatemi avere commenti/suggerimenti/richieste, vanno bene anche gli insulti.
... tanto più che si può usare il comando beep come modello:
http://johnath.com/beep/
Un esempio più semplice sarebbe questo:
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <fcntl.h>
#include <sys/ioctl.h>
#include <linux/kd.h>
int main(void) {
int freq[] = { /* Do Re Mi Fa Sol La Si Do */
523, 587, 659, 698, 784, 880, 988, 1046 };
int i, fd, err;
fd = open("/dev/tty0", O_WRONLY);
for (i=0; i<8; i++)
{
err = ioctl(fd, KIOCSOUND, 1193180/freq[i]);
if (err == -1) {
printf("ERRORE: impossibile effettuare l'esecuzione del bip !");
return -1;
}
usleep(200000);
err = ioctl(fd, KIOCSOUND, 0); /*Stop*/
if (err == -1) {
printf("ERRORE: impossibile arrestare l'esecuzione del bip !");
return -1;
}
}
close(fd);
return 0;
}
Riferimenti:
http://johnath.com/beep/
https://tldp.org/LDP/lpg/node83.html