Newsgroup: it.comp.programmare
Titolo: comandare la scheda audio

Vorrei fare un programma che produca dei suoni.
Come faccio a pilotare la scheda audio?
Grazie per l'attenzione.

Come faccio a pilotare la scheda audio?
Dipende dal sistema operativo e dal linguaggio che vuoi usare.
Puo' essere qualcosa di cosi' semplice come
	audio = fopen("/dev/dsp","w");
	fwrite(audio, init, sizeof(init), 1);
	for (tempo=0; tempo < secondi; tempo++)
	{
		for (cicli=0; cicli < frequenza; cicli++)
		{
			fwrite(audio, onda, sizeof(onda), frequenza);
		}
	}
	fclose(audio);
oppure magari
	// Un programma che parla
	$parola = strtok($frase, " \n$PUNTEGGIATURA");
	while ($parola)
	{
		$file = "/var/sounds/parole/$parola.au";
		if (!file_exists($file))
			$file="/var/sounds/parole/beeeep.au";
		thruput($file, "/dev/dsp");
		$parola = strtok(" \n$PUNTEGGIATURA");
	}
	// fine programma ;-)
oppure qualcosa di cosi' bestiale come 3.5 Mb di controlli Visual Basic
piu' nove runtimes, E i drivers della scheda audio :-)
Leonardo
".signature": bad command or file name

 wrote in message
p8o3nsgbm2sa5fpj4...@4ax.com...

Vorrei farlo in C con il compilatore DJGPP per Windows98.
Se ad esempio voglio un segnale a 150Hz e con ampiezza 50 dB
come debbo manipolare questi dati per inviarli alla scheda audio?
Grazie ancora per l'attenzione

come debbo manipolare questi dati per inviarli alla scheda audio?
In Windows 98, ti conviene prima creare un file .WAV, e poi spedirlo
senza tante storie alla scheda audio (il WAV lo puoi creare in RAM).
Le info su come creare un Wav non ce le ho sotto mano. Ma uno header
WAV e' semplicissimo, sono una 32ina di byte seguiti da un flusso di
- poniamo - coppie di valori a 16 bits (left e right).
Quindi:
typedef struct
{
	DWORD	Signature;	/* "RIFF" */
	WORD	boh1;		/* 0x0864 */
	WORD	zero1;
	DWORD	Format;
	DWORD	SubFmt;
	DWORD	BitsPerSample;	/* Chissa', forse e' vero */
	WORD	Bandersnatch;	/* Frumious, this one */
	WORD	Channels;	
	DWORD	Frequency;
	DWORD	Jubjub;		/* Hic sunt leones */
	WORD	boh2;
	WORD	boh3;
	DWORD	DataSign;	/* "data" */
	DWORD	QuantaRobba;
} WAVEHEADER;
WAVEHEADER WavHdr;
	FILE *fp;
	WavHdr.Signature= "RIFF"; // Oppure 0x46464952, su INTEL
				  // 0x52494646 su Motorola
	WavHdr.boh1	= 0x0864; // Invertire per i Motorola
	WavHdr.zero1	= 0x0000;
	WavHdr.Format	= "WAVE";	
	WavHdr.SubFmt	= "fmt ";
	WavHdr.BitsPerSample = 16;
	WavHdr.Bandersnatch  = 1;
	WavHdr.Channels	     = 2;
	WavHdr.Frequency     = 44100;
	WavHdr.Jubjub	     = 176400;
	WavHdr.boh2	= 4;
	WavHdr.boh3	= 16; /* Forse e' questo, BitsPerSample :-) */	
	WavHdr.DataSign = "data"; // ...o "déita"?
	WavHdr.Quantarobba = (Secondi*Frequency*Channels*BitsPerSample)
				 / 8 // E questo conto e' bene farlo in
				     // float, o sai che casino?
 
 
	fp = fopen("C:\\PIPPO.WAV","wb");
	fwrite(fp, WavHdr, sizeof(WavHdr), 1);
	for (i=0; i < samples; i++)
	{
		// Ricordando che dopo 44100 campioni il seno deve
		// avere fatto FREQ giri completi, per ottenere un
		// bel "la" naturale deve essere i tale che, per i
		// uguale a 44100, l'argomento del seno e' 440*2PI
		// radianti. Quindi:
		// 	RSCALE = FREQ*2PI/Frequency
		// (Frequency = frequenza di campionamento)
		SampleRightAmplitude = \
			OffsetRight + sin(i*FREQ*RSCALE);
		SampleLeftAmplitude  = // lasciato per esercizio
		fwrite(fp, &SampleLeftAmplitude, 2, 1);
		fwrite(fp, &SampleRightAmplitude, 2, 1);
	}
	fclose(fp);
	PlaySound("C:\\PIPPO.WAV");
Leonardo
P.S. Se funziona saro' il primo ad esserne stupito 8-)


 wrote in message
f5k9nsg30klr0hc1g...@4ax.com...

Grazie mille per l'aiuto, vado subito a provarlo.
Un' altra domanda: per gestire i colori della scheda video posso usare la
stessa logica?
Visto che i colori sono delle onde a certe frequenze, come posso trattare
questi per
poterli dare  "in pasto" alla scheda video?
Grazie ancora per l'attenzione.

 ".signature": bad command or file name
Grazie ancora per l'attenzione.

questi per poterli dare  "in pasto" alla scheda video?
EEEHHHH?!?
Paris, te ti sei fumato l'impossibile :-)
La scheda video si programma in tutt'altra maniera. Tipicamente hai a
disposizione delle funzioni primitive (setcolor, drawline, eccetera),
e usi quelle. Che dipendono dal sistema operativo.
Sotto DOS per dire ti fai un puntatore MK_FP(0xA000,0x0000), entri in
modo MCGA (int(0x10,0x13)), e se scrivi un byte all'indirizzo del tuo
puntatore piu' 320*y+x, ti compare un pixel alle coordinate (x,y) sul
monitor.
Sotto Linux puoi usare il frame buffer, o le svgalibs, o X.
Sotto Windows devi aprire un device context per lo schermo, e da li',
con molta calma ;-), iniziare a disegnare.
Ho idea che tu voglia scrivere un programma... come si chiamano? Quei
cosi che sincronizzano luci e suoni, e _non_ vanno usati se si soffre
di epilessia... 8-)
Leonardo


 wrote in message
sdafns45bt0852cml...@4ax.com...

Veramente vorrei sviluppare un programma che
mostri il legame tra il modello matematico dei fenomeni ondulatori
e la reale esperienza fisica, percepita attraverso l'udito e la vista.
L'utente dovrebbe avere la facoltà di impostare una qualsiasi
funzione(segnale)
che una volta trasformato con Fourier (DFT) sia una somma di sinusoidi
che si "manifestino" attraverso luci o suoni, in relazione alla loro
frequenza.
Grazie ancora per le informazioni.