Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza
Motorola edge 70 porta il concetto di smartphone ultrasottile su un terreno più concreto e accessibile: abbina uno spessore sotto i 6 mm a una batteria di capacità relativamente elevata, un display pOLED da 6,7 pollici e un comparto fotografico triplo da 50 MP. Non punta ai record di potenza, ma si configura come alternativa più pragmatica rispetto ai modelli sottili più costosi di Samsung e Apple
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026
Sono molte le novità che ASUS ha scelto di presentare al CES 2026 di Las Vegas, partendo da una gamma di soluzioni NUC con varie opzioni di processore passando sino agli schermi gaming con tecnologia OLED. Il tutto senza dimenticare le periferiche di input della gamma ROG e le soluzioni legate alla connettività domestica
Le novità ASUS per il 2026 nel settore dei PC desktop
Le novità ASUS per il 2026 nel settore dei PC desktop
Molte le novità anticipate da ASUS per il 2026 al CES di Las Vegas: da schede madri per processori AMD Ryzen top di gamma a chassis e ventole, passando per i kit di raffreddamento all in one integrati sino a una nuova scheda video GeForce RTX 5090. In sottofondo il tema dell'intelligenza artificiale con una workstation molto potente per installazioni non in datacenter
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-10-2006, 14:29   #1
max246
Senior Member
 
Iscritto dal: May 2005
Messaggi: 340
[Libreria] Audio

Sapete una libreria audio per C che mi consente di creare un suono dandogli dei dati ( lunghezza , ampiezza , ecc ) ???

Pf aiutatemi
max246 è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2006, 15:44   #2
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da max246
Sapete una libreria audio per C che mi consente di creare un suono dandogli dei dati ( lunghezza , ampiezza , ecc ) ???
Personalmente non so se ne esistono di librerie che fanno quello che chiedi.

Partiamo dall'inizio: tu cosa devi fare di preciso??? Devi "sintetizzare" un'onda sinusoidale conoscendone la sua frequenza e ampiezza??
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2006, 16:02   #3
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da max246
Sapete una libreria audio per C che mi consente di creare un suono dandogli dei dati ( lunghezza , ampiezza , ecc ) ???

Pf aiutatemi
OpenAL?

EDIT: mmmh, forse non fa al caso tuo, se la necessità è solo quella di generare un suono.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 09-10-2006 alle 16:11.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2006, 17:05   #4
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da max246
Sapete una libreria audio per C che mi consente di creare un suono dandogli dei dati ( lunghezza , ampiezza , ecc ) ???

Pf aiutatemi
Scaricati questa:

questo è il progetto free [tool di sviluppo visual studio net 2003]:
http://www.twork.it/public/oki/guetbook.asp
questo è l'help online
http://www.twork.it/public/oki/oki.htm

è la mia libreria del sound, o meglio, per creare il proprio engine del sound, fatta sopratutto per i videogame, ma è utile per fare qualsiasi cosa. Da come scrivi penso ti sia utile anche per quello che vuoi fare tu.

Devi aver installate le directx
Il codice è free (per scopi non commerciali)

E' anche incluso nella firma.

Questo è l'articolo messo su codeproject:
http://www.codeproject.com/useritems/Oki.asp
In inglese
okay è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2006, 18:20   #5
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Il problema della riproduzione di una onda sonora (dati i suoi parametri) si può suddividere in due parti:
- calcolo dei campioni audio
- invio dei campioni ad un dispositivo audio per la riproduzione

Il primo punto lo si risolve con delle semplici operazioni matematiche. Il secondo punto lo si risolve utilizzando delle apposite librerie o API di sistema per riprodurre campioni audio.

Vediamo il primo punto in dettaglio. Per calcolare i campioni si può usare la nota funzione trigonometrica del seno:

f(x) = A * sin (omega * x + phi)

dove omega è 2*pi*f ovvero la pulsazione.

(nel post non si riesce a mettere i simboli speciali, ma si dovrebbe capire)

Visto che non sono un matematico, traduciamo questa cruda formula in un codice "C": nell'esempio verranno generati i primi 1000 campioni a 16 bit di un'onda sinusoidale di frequenza 440 Hz (il "La") usando una frequenza di campionamento di 44100 Hz.

Codice:
#include <math.h>

...

double freq = 440;
double sampling = 44100;
double omega;
unsigned short campione;
int x;

omega = 2 * M_PI * freq / sampling;

for (x=0; x<1000; x++)
{
    campione = (unsigned short) 32768 + 32767 * sin (omega * x);

    ....
}
L'ampiezza dell'onda, nell'esempio, è la massima possibile su 16 bit.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 09-10-2006, 19:41   #6
okay
Senior Member
 
Iscritto dal: Feb 2002
Messaggi: 906
Quote:
Originariamente inviato da max246
Sapete una libreria audio per C che mi consente di creare un suono dandogli dei dati ( lunghezza , ampiezza , ecc ) ???

Pf aiutatemi
con questo puoi aiutarti, nei calcoli, la lib serve per generare audio.
Se vuoi generare un onda puoi fare i calcoli aiutandoti con questa chiamata:

frequenza vale per default 22050
hz settalo a 100
lVolumeSound va da 0 a -10000
lBalance va da -10000 a 10000 0 il sound è riprodotto al centro delle casse


long TUO_maxRPM=18000; //fino a 200000 frequency xp

SoundPlay_Sound(n, true, lVolumeSound, ((frequenza*
hz)/(long)TUO_maxRPM), lBalance);

ora con lVolumeSound, frequenza*
hz, lBalance con questi valori, modificabili da te puoi ottenere i dati da usare nel tuo grafico per generare le onde (inoltre con le chiamate 3D sound puoi generare altri tipi di onde tipo il passaggio da una cassa all'altra o il sound che sale o scende su uno specifico altoparlante ).

Tutto questo usando la lib che ti genera i sounds (in quanto la funzione chiamata (come quella sopra l'ho fatta void e non ritorna nessun valore)).

Se invece hai programmato routine con il sound fatto da te allora usa ciò che ti ha detto andbin.

Ultima modifica di okay : 09-10-2006 alle 19:50.
okay è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2006, 01:01   #7
tomminno
Senior Member
 
Iscritto dal: Oct 2005
Messaggi: 3306
Quote:
Originariamente inviato da andbin
Codice:
#include <math.h>

...

double freq = 440;
double sampling = 44100;
double omega;
unsigned short campione;
int x;

omega = 2 * M_PI * freq / sampling;

for (x=0; x<1000; x++)
{
    campione = (unsigned short) 32768 + 32767 * sin (omega * x);

    ....
}
L'ampiezza dell'onda, nell'esempio, è la massima possibile su 16 bit.
Manca un pò di dithering per mascherare il rumore che crei troncando un double in uno short e qui comincia il difficile, ci si accontenta di una TPDF o si vuole arrivare ad un noise shaping?
Sempre che lo scopo sia di lavorare con l'audio, se invece ci si accontenta di una banale riproduzione un semplicissimo cast va più che bene.
tomminno è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2006, 12:57   #8
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Riprendendo il discorso fatto da andbin, normalmente per emettere un suono ti basta riempire un buffer contenente i valori campionati dell'onda da riprodurre (i campioni appunto) ed inviare tale buffer al driver della scheda audio.
Facendo l'esempio di linux, il cui classico driver OSS prevede l'uso del device /dev/dsp come un normale file su cui fare una "write" (o una read), ti basterà fare questo (l'algoritmo è simile a quello postato da andbin, ma con qualche importante correzione per generare un'onda sinusoidale senza distorsioni):

Codice:
#define SAMPLE_RATE 48000
int fd_out;
...
void write_sine (void)
{
  short buf[SAMPLE_RATE];
  unsigned short ampiezza;
  double frequenza = 220; /* Nota: La */
  double omega;          /* Pulsazione */
  int x;

  omega = 2 * M_PI * frequenza / SAMPLE_RATE;
  ampiezza = 20000;

for (x = 0; x < SAMPLE_RATE ; x++)
{
    buf[x] = (short)(ampiezza * (sin (omega * x)));

}

  if (write (fd_out, buf, sizeof (buf)) != sizeof (buf))
    {
      perror ("Errore in scrittura sul dispositivo");
      exit (-1);
    }
}
Come puoi notare, calcolo i campioni di un seno a frequenza 220 Hz (ricordiamo che la funzione sin() calcola valori con argomento in radianti) e ne metto i valori in un buffer, il quale poi viene scritto semplicemente sul dispositivo.
Nel caso di linux, usando il driver OSS (ALSA è compatibile al 100% con questo driver), basta aprire il dispositivo /dev/dsp con una classica open:

Codice:
fd_out = open ("/dev/dsp", O_WRONLY, 0);
controllare il device con chiamate "ioctl()" sul file descriptor (ne bastano un paio per impostare numero di canali e bit di campionamento), e poi scrivere con una write (come visto nell'estratto di codice precedente) sul file descriptor aperto, proprio come fosse un normale file.

Nel caso di Windows, i passaggi sono gli stessi per campionare l'onda, poi per scrivere il buffer sulla scheda audio devi ottenerne l'handle, appoggiandoti all'API che astrae il driver, ma sostanzialmente l'output è simile al caso linux (le funzioni per aprire un device come la scheda audio penso le trovi su MSDN).

EDIT: Ho calcolato i campioni uno ad uno con la funzione sin(), ma normalmente, per ragioni di efficienza, si usa una "wave table", ossia un buffer con valori precalcolati di un'onda ad una data frequenza, e si riempe il buffer di destinazione leggendo la wave table ed inserendo nel buffer di destinazione tali valori (in base al sampling rate ovviamente).
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 10-10-2006 alle 13:02.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2006, 14:06   #9
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Il codice che ho postato io non è certamente perfetto. Avrei dovuto ad esempio mettere le parentesi
campione = (unsigned short) (32768 + 32767 * sin (omega * x));
anche se non era comunque questo il problema maggiore e non avrebbe cambiato il calcolo.

Non sono esperto (magari ....) della teoria dei segnali. Comunque è risaputo che la quantizzazione di un segnale porta inevitabilmente ad avere un errore di quantizzazione. Si ha cioè una distorsione del segnale.

Il segnale generato dal mio programma quindi non è più composto solo da una unica frequenza fondamentale di 440 Hz ma contiene anche delle armoniche superiori dovute all'errore di quantizzazione.

Le soluzioni per ridurre l'errore di quantizzazione, ci sono. Un metodo ad esempio è il dithering, accennato da tomminno. Se ben ricordo (ma dovrei documentarmi meglio) consiste nell'aggiungere al segnale un rumore casuale, tale per cui sulla media si riesce a correggere, in parte, l'errore (se non è corretto, non sparatemi ).

Comunque, qui si va nella parte un po' più complessa della teoria dei segnali ... e che purtroppo non conosco molto bene o affatto.


Quote:
Originariamente inviato da -fidel-
ma con qualche importante correzione per generare un'onda sinusoidale senza distorsioni
E .... quali sarebbero 'ste correzioni??
L'errore di quantizzazione non lo risolvi cambiando nomi alle variabili o aggiungendo qualche parentesi al mio codice.
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2006, 15:45   #10
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da andbin
E .... quali sarebbero 'ste correzioni??
L'errore di quantizzazione non lo risolvi cambiando nomi alle variabili o aggiungendo qualche parentesi al mio codice.
Non parlavo di errori di quantizzazione Semplicemente nel codice da te postato, oltre alle parentesi di cui accenavi prima, l'ampiezza della forma d'onda era troppo elevata (generava disturbi), l'onda era traslata sull'asse y così da non permettere anche valori negativi (senza una particolare ragione, a meno di usare unsigned short int come campione... - tra l'altro traslare troppo "verso l'alto" la forma d'onda genera un disturbo), e fondamentalmente non hai previsto un buffer dove mettere i campioni, dal momento che mandare i singoli campioni al dispositivo non genera l'effetto desiderato.
Ovviamente ho provato il tuo codice, ma il segnale generato non era continuo, bensì molto distorto.

EDIT: E' importante che il buffer che contiene i campioni debba essere grande quanto il sampling scelto, per evitare che i gruppi di campioni nel tempo T non siano tra loro "allineati".

EDIT: Seguendo sempre il codice postato prima, si possono fare interessanti esperimenti. Ad esempio, se non si predispone un buffer per i campioni di dimensioni almeno doppie della frequenza dell'onda, si potrà apprezzare il cosiddetto fenomeno di aliasing (dal momento che in questo modo risulta che la frequenza di campionamento non è almeno il doppio della banda del segnale - per quanto la banda di un segnale sinusoidale è formato da due impulsi - e si viola quindi il criterio di Nyqist del campionamento per segnali a banda limitata). Provate ad esempio a settare la frequenza a 880 e SAMPLE_RATE a 300: l'aliasing sarà ben udibile.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 10-10-2006 alle 16:17.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2006, 16:13   #11
andbin
Senior Member
 
L'Avatar di andbin
 
Iscritto dal: Nov 2005
Città: TO
Messaggi: 5206
Quote:
Originariamente inviato da -fidel-
Semplicemente nel codice da te postato, oltre alle parentesi di cui accenavi prima, l'ampiezza della forma d'onda era troppo elevata (generava disturbi), l'onda era traslata sull'asse y così da non permettere anche valori negativi
Vero, ma il mio era un semplice esempio. In quel momento (quando l'ho scritto) non mi ricordavo nemmeno se i valori PCM i driver audio, in genere, li vogliono segnati o non segnati. Poi proprio adesso sono andato a vedere su MSDN e in effetti il formato dei dati è "segnato".

Quote:
Originariamente inviato da -fidel-
e fondamentalmente non hai previsto un buffer dove mettere i campioni, dal momento che mandare i singoli campioni al dispositivo non genera l'effetto desiderato.
Perché era un esempio.

Quote:
Originariamente inviato da -fidel-
Ovviamente ho provato il tuo codice, ma il segnale generato non era continuo, bensì molto distorto.
Beh, non so come l'hai provato ma comunque appena avrò un attimo di tempo proverò su Windows con le funzioni waveOutXXX per riprodurre 'sta benedetta sinusoide.

Quote:
Originariamente inviato da -fidel-
EDIT: E' importante che il buffer che contiene i campioni debba essere grande quanto il sampling scelto, per evitare che i gruppi di campioni nel tempo T non siano tra loro "allineati".
Beh, no alt. Dipende da come usi il buffer e da come procedi con i calcoli!

Nel mio sorgente c'è una variabile 'x' che indica il campione da generare.
Se la frequenza di campionamento è 44100 e tu usi un buffer di 44100 campioni mi sta bene ma se poi finito il buffer ricominci rimettendo la x a 0, no!
In pratica la 'x' deve sempre andare avanti. L'indice nel buffer può, ovviamente, ripartire da 0. Ma in quel caso non ci fregherebbe nulla che il buffer sia grande quanto il sampling scelto!!
__________________
Andrea, SCJP 5 (91%) - SCWCD 5 (94%)
andbin è offline   Rispondi citando il messaggio o parte di esso
Old 10-10-2006, 16:24   #12
-fidel-
Senior Member
 
L'Avatar di -fidel-
 
Iscritto dal: Jan 2006
Messaggi: 2722
Quote:
Originariamente inviato da andbin
Perché era un esempio.
Non per fare polemica, ma il buffer è molto importante, altrimenti il dispositivo non ha un riferimento temporale per il segnale. Altrimenti il sample rate a cosa lo riferisci?

Quote:
Originariamente inviato da andbin
Beh, non so come l'hai provato ma comunque appena avrò un attimo di tempo proverò su Windows con le funzioni waveOutXXX per riprodurre 'sta benedetta sinusoide.
Provato su linux con un semplice programma C, se sei interessato lo posto volentieri (tra l'altro può essere preso come un semplice esempio per usare il sistema sonoro OSS su linux - per quanto è scoraggiato dal moment che occupa il device mentre la maggior parte dei programmi usa ALSA per emettere suoni su più canali).

Quote:
Originariamente inviato da andbin
Beh, no alt. Dipende da come usi il buffer e da come procedi con i calcoli!

Nel mio sorgente c'è una variabile 'x' che indica il campione da generare.
Se la frequenza di campionamento è 44100 e tu usi un buffer di 44100 campioni mi sta bene ma se poi finito il buffer ricominci rimettendo la x a 0, no!
In pratica la 'x' deve sempre andare avanti. L'indice nel buffer può, ovviamente, ripartire da 0. Ma in quel caso non ci fregherebbe nulla che il buffer sia grande quanto il sampling scelto!!
No attenzione! Il buffer è molto importante, come detto prima. Infatti vai a riferire il sampling proprio sul buffer, prorpio per dare un riferimento temporale alla scheda audio. I campioni audio infatti si mandano alla scheda con dei buffer, non inviando singoli campioni (il che non avrebbe appunto senso). Non è importante il valore di x in sè, bensi il suo valore riferito al buffer (che per la scheda audio rappresenta il riferimento temporale del segnale).

EDIT: mi sembra importante indicare che, mandando direttamente i campioni alla scheda (un buffer uguale a 1 insomma) non si sente alcun suono, per i motivi detti prima. La prova sul tuo codice che mi chiedevi prima l'ho fatta sempre con il programma C di cui parlavo, ma sempre considerando un buffer.
__________________

- Spesso gli errori sono solo i passi intermedi che portano al fallimento totale.
- A volte penso che la prova piu' sicura che esiste da qualche parte una forma di vita intelligente e' il fatto che non ha mai tentato di mettersi in contatto con noi. -- Bill Watterson

Ultima modifica di -fidel- : 10-10-2006 alle 16:29.
-fidel- è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Motorola edge 70: lo smartphone ultrasottile che non rinuncia a batteria e concretezza Motorola edge 70: lo smartphone ultrasottile che...
Display, mini PC, periferiche e networking: le novità ASUS al CES 2026 Display, mini PC, periferiche e networking: le n...
Le novità ASUS per il 2026 nel settore dei PC desktop Le novità ASUS per il 2026 nel settore de...
Le novità MSI del 2026 per i videogiocatori Le novità MSI del 2026 per i videogiocato...
I nuovi schermi QD-OLED di quinta generazione di MSI, per i gamers I nuovi schermi QD-OLED di quinta generazione di...
Il nuovo Snapdragon 8 Elite Gen 6 sar&ag...
Nintendo Switch 2: risultati sotto le at...
Weekend con tante sorprese su Amazon: to...
HONOR non si ferma più: il 2025 &...
Speciale best seller: EUREKA J15 Evo Ult...
Roborock Q10 X5+ da 10.000 Pa a 199€ &eg...
E-mail reset password di Instagram: la c...
La NASA ha discusso le problematiche del...
Il razzo spaziale NASA SLS e la capsula ...
Stazione Spaziale Internazionale: Crew-1...
Samsung Galaxy S26 Ultra: la ricarica de...
Apple ha un nuovo partner per la sua App...
Trenitalia introduce il prezzo dinamico ...
OnePlus non si ferma più: c'&egra...
DAZN sconta il piano Full per 6 mesi, se...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 14:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v