Newsgroup: it.comp.programmare
Titolo: libraria file wav

ciao a tutti.
in questi giorni sto tentando di lavorare con l'audio per scrivere una 
banale drummachine (in win32).
pero' sto impazzendo con conversioni di formato (8/16/32bit) e di 
samplerate (sto lavorando con ACM e forse ci sono riuscito, ma la marea 
di 
problemi non mi permette di capirlo).
io praticamente vorrei lavorare sempre nello stesso formato 
(preferibilmente 32bit float, a 44.1khz), quindi devo convertire ogni WAV 
che apro in 44100, per avere le operazioni di mixing + comode (dato che 
devo implementare un engine x il mixing dell'audio)
esiste una libreria che fa queste conversioni?che mi apre un qualsiasi 
file 
WAV e io lo posso subito leggere come un float* a 44100sample/sec senza 
dovermi sbattere troppo?, o magari qualche sorgente che mi aiuti un 
pochino, una documentazione, una guida,qualcosa... :)
grazie
-- 
C1A0, [:k:n:r:e:b:]
 
"Quando l'ultimo albero sarà tagliato, l'ultimo fiume
 inquinato, l'ultimo pesce pescato, scoprirete che il
 denaro non si può mangiare".

 ha scritto nel messaggio
news:Xns917CA6D...@nntp.localhost...


 Qual è il problema? Il formato lo conosci?
si, lo conosco.
sto utilizzando una classe WAVE trovata non so dove associata a una 
RIFFFile.
l'ho guardata per benino come funziona.
sono riuscito a far funzionare ACM per convertire il samplerate.
ilproblema sorge quendo devo aprire i file stereo (a 16bit, 44100).
con i mono tutto funziona.
quando apro uno stereo, ho provato a debuggare e ho visto che in questo 
pezzo di codice fread ritorna 30464:
bool WaveFile::ReadSamples(short* samples, size_t count)
{
//...cut
	if (fread(samples, 2, count * GetNumChannels(), GetFile()) != 1) {
		error = "Couldn't read samples";
		return false;
	}
	return true;
}
lo short* che passo a ::ReadSamples è allocato, ed abbastanza grande da 
contenere i dati.
il file esiste ed è possibile leggerlo, quindi il puntatore FILE* 
restituito da GetFile() è valido, perchè la classe, nella funzione ::Open() 
lo apre, e legge l'header con le sue varie cose (samplerate, canali etc, e 
sono corretti).
non è un problema di quel file, perchè ho fatto una miriade di prove, ed ho 
visto che solo con i file stereo non va.
qualche idea?


 ha scritto nel messaggio
news:Xns917CBD9...@nntp.localhost...

io uso spesso questa classe ma non mi ha mai dato problemi,con file ti tutti
i tipi.
uso vc 6.0
ciao.

 tutti i tipi.
anche io uso VC++6.0!
cosa significa quel valore di ritorno di fread()?
cosa usi per fare l'upsampling?
-- 
ciao :: xaero
Data is not information, and information is not knowledge: knowledge
is not understanding, and understanding is not wisdom. (Philip Adams)

 tutti i tipi.
merd... le tue parole mi hanno rassicurato, mi ero quasi convinto che il 
problema era altrove, ma ci ho riprovato da zero, eliminando tutto... e non 
va:
{
	WaveFile w;
	short *s;
	if(w.OpenRead(argv[1]) == false) goto show_err;
	s = new short[w.GetNumSamples() * w.GetNumChannels()];
	if(w.ReadSamples(s, w.GetNumSamples()) == false) goto show_err;
	delete[] s;
	goto end_test;
show_err:
	cout << "ERROR: " << w.GetError() << endl;
	return -1;
end_test:
	cout << "OK" << endl;
	return 0;
}
mi puoi dire dove hai scaricato i sorgenti, oppure mandarmeli direttamente? 
ho l'impressione che ci sia qualche casino remoto che ho rimosso dalla mia 
mente ma non dai sorgenti :))


 formato float per i WAV e di 32 bit.
infatti non esistono wav 32bit. quello è il formato che voglio utilizzare per 
il mixing, gli effetti e tutto quanto. poi file di input e output li 
leggo/scrivo a 16bit.
perla riproduzione uso PortAudio che accetta anche questo formato.
