Autore Topic: Fare BIIIIIP  (Letto 4370 volte)

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Fare BIIIIIP
« il: 11 Ottobre 2008, 20:34:43 »
Volevo far fare biiiip al mio computer. Ho provato con:

SHELL chr(7)

che sarebbe il carattere ASCII corrispondente alla campanella di sistema, ma non funziona. So che potrei usare il comando di sistema beep(), ma volevo evitarlo perchè se no md si arrabbia.  :-( Esiste una sub che faccia biiiip?

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Fare BIIIIIP
« Risposta #1 il: 11 Ottobre 2008, 23:40:15 »
se non erro esiste il comando BEEP o forse mi confondo con visual basic...

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #2 il: 12 Ottobre 2008, 00:19:17 »
Anche a me sembra di ricordare che Visual Basic aveva una sub beep, come del resto l'avevano diverse implementazioni BASIC... Ah, quanti ricordi, l'Amiga 500...

REM bip... bip-bip!
BEEP
SLEEP 1
BEEP
BEEP

Ehm, scusa, non volevo essere patetico. Comunque a quanto pare Gambas non ha BEEP, oppure è un metodo di una classe, ma non so quale...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Fare BIIIIIP
« Risposta #3 il: 12 Ottobre 2008, 12:13:32 »
Infatti mi arrabbio!!! GRRRRRRRRR   :evil:

Eheheheh, scherzo....

In Visual Basic esisteva la funzione BEEP, del resto retaggio del vecchio Basic, proveniente da sistemi in cui non esisteva altro che l'altoparlantino del computer per poter comunicare a livello sonoro.

In Gambas non esiste questo comando, e nessun altro simile.

L'unica cosa che puoi fare è implementare una funzioncina che comunichi con la scheda audio, se presente... La libreria gb.sdl.sound può essere la soluzione, ma l'unico metodo Play suona solo un file esistente; potresti crearne uno che fà BEEEEEEP ! :-)

Devo poi dire che negli ultimi pc stanno eliminando l'altoparlante interno, che ormai non usa quasi più nessuno; alcuni hanno addirittura un piccolo buzzer...

Il carattere 7 (esistente ancora nella tabella ASCII) viene filtrato dal sistema desktop.

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #4 il: 12 Ottobre 2008, 14:18:35 »
Come sarebbe a dire che stanno eliminando la campanella???? ...e come sarebbe a dire che non la usa più nessuno???? ...io uso GNU/Linux solo perchè c'è il comando beep e nella tabella ascii ho ritagliato solo il carattere 7!  :lol: Tutti i miei programmi Perl e PHP CLI fanno biiiip!!!..  :si:

Forse i produttori di hardware non sanno che io uso ancora la campanella e disprezzo le casse e uso un ambiente desktop solo perchè eliminarlo è troppo complicato e scrivo le mail da riga di comando e non uso l'amiga 500 solo perchè non ho trovato nessun negozio disponibile a ripararlo...

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Fare BIIIIIP
« Risposta #5 il: 12 Ottobre 2008, 15:02:50 »
Non ti arrabbiare! :-)

Dico solo che i sistemi, oltre a divenire sempre più potenti (parlo di hardware), stanno anche perdendo alcune caratteristiche che erano considerate essenziali molto tempo fà...

Ad ogni modo, il carattere 7 (BELL) nella tabella ASCII c'è sempre, e nessuno si sogna di eliminarlo, perchè comunque fà parte di uno standard universale, come del resto i caratteri 13 (Return) e 10 (line feed) e così via (almeno fino al 127). Guai se questi venissero eliminati o soppiantati da qualcos'altro, vorrebbe dire la distruzione delle basi dell'informatica.

Ma, a parte le ideologie, sò benissimo che altri linguaggi hanno la possibilità di bippare, ho anche io qualche domestichezza con un bel pò di questi linguaggi...
Probabilmente il team di Gambas non ha ritenuto importante inserirlo in libreria, o forse è passato nel dimenticato, non sò...
Ora faccio qualche prova anche io, e vediamo se riesco a tirare fuori qualcosa, poi magari la inserisco nei Download...

A presto!

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Fare BIIIIIP
« Risposta #6 il: 12 Ottobre 2008, 16:12:20 »
Potreste segnalarlo direttamente agli sviluppatori di GambAS...
non penso che poi per loro possa essere così oneroso applicare un semplice comando BEEP()

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #7 il: 12 Ottobre 2008, 17:41:02 »
Oneroso no di sicuro, più che altro spero che non lo reputino inutile.

Se capissi qualcosa di C++ proverei a scrivere un componente. In teoria non dovrebbe essere difficile, tanto più che si può usare il comando beep come modello:

http://johnath.com/beep/

MD, più ci penso e più mi sembra stupido: i produttori per inserire l'altoparlantino spenderanno 20 centesimi per ogni pezzo! Ricordo che l'altoparlantino del mio primo pc (386 ibm compatibile tower-case con DOS 3.0 credo) l'avevo smontato per vedere come era fatto, ed ero rimasto deluso perchè era troppo semplice... poi l'ho rimontato, ma da quel momento ha iniziato a gracchiare, era fastidiosissimo, perciò ero costretto a togliere l'audio ai videogiochi...

Offline Ceskho

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 3.778
  • Vi Veri Veniversum Vivus Vici
    • Mostra profilo
    • Pagina Personale
Re: Fare BIIIIIP
« Risposta #8 il: 12 Ottobre 2008, 18:07:42 »
Beh però devi pur ammettere che l'utilità del beep non è certamente vitale....

toglierlo o non toglierlo sinceramente a me non fa alcuna differenza...l'unico problea è che poi per avvisarti di eventuali errori sono costretti a caricare un file audio...il che si può benissimo evitare....però sui nuovi computer non credo la cosa faccia poi così tanta differenza...

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #9 il: 12 Ottobre 2008, 18:21:53 »
Pazzesco!.. ho provato a fare un'applicazione da riga di comando che stampasse  Chr(7) e non funziona neanche così!!

Offline giulio

  • Maestro Gambero
  • ****
  • Post: 280
    • Mostra profilo
Re: Fare BIIIIIP
« Risposta #10 il: 12 Ottobre 2008, 20:15:20 »
Secondo me, la soluzione migliore è quella proposta da md: un file audio che riproduca un beep. E' la soluzione migliore perché non devi preoccuparti delle dipendenze se vuoi distribuire il programma. Per esempio sul mio sistema, se non carico il modulo del kernel "pcspkr", i vari

echo -e "\a"

e

printf "\a"

non fanno il beep. Se ti vuoi appoggiare a un piccolo tool esterno, installato su tutte le distro che usano il server X, puoi fare:

SHELL "xkbbell" WAIT

Ciao.

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #11 il: 12 Ottobre 2008, 22:46:05 »
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


Codice: [Seleziona]

' 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:

Codice: [Seleziona]

DIM b AS NEW Bell
b.Beep("256", "300")

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #12 il: 12 Ottobre 2008, 22:51:31 »
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:

Codice: [Seleziona]

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:

Offline md9327

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.840
    • Mostra profilo
Re: Fare BIIIIIP
« Risposta #13 il: 13 Ottobre 2008, 13:26:53 »
Sicuramente non mi riferivo alla inutilità del beep, ma solo al fatto che ormai, visto che ormai tutti i sistemi hanno una scheda audio, l'altoparlante si usa molto poco.

A parte questo, la tua classe è molto interessante, e può essere utile.

Devo dire pure che il codice, come l'hai scritto, è molto ben fatto e pulito, e quindi ti faccio i miei complimenti.

Riguardo al comando beep, sul mio Fedora purtroppo non esiste, a meno di non installarlo (ma non sò neppure se esiste il pacchetto)...

Offline ccc

  • Gambero
  • **
  • Post: 97
    • Mostra profilo
    • http://santecaserio.altervista.org/
Re: Fare BIIIIIP
« Risposta #14 il: 13 Ottobre 2008, 14:44:20 »
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:

Codice: [Seleziona]

' 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()

Codice: [Seleziona]

b.Beeps(4, "256, 128, 189, 256", "200")


esempio 2

Codice: [Seleziona]

b.Slide(400, 200, -5, 50)
b.Beeps(1, "60", "800")


esempio 3

Codice: [Seleziona]

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)

Codice: [Seleziona]

b.Beep("90", "150")
   b.Beep("60", "400")


esempio 5: "utente, che cavolo stai facendo?"

Codice: [Seleziona]

b.Beep("300", "200", "3", "50")


Se utilizzate questa classe, fatemi avere commenti/suggerimenti/richieste, vanno bene anche gli insulti.