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.