WAV bestanden Java
Geplaatst: ma 21 dec 2015, 22:42
Ik ben bezig met het maken van geluid in Java. Het WAV formaat werkt het makkelijkste en met 8bit mono (44.1kHz) geluid gaat alles goed en krijg ik heel zuiver klinkende golven. Nu probeer ik mijn code om te schrijven naar 16bit stereo(44.1kHz) maar ik krijg geen zuiver geluid. Bij een square golf krijg ik gewoon een stil bestand en bij een sinus golf klinkt het heel irritant (de frequentie klopt wel ongeveer). Hier een stukje van mijn code waarin het probleem waarschijnlijk zit:
Uitleg bij de code:
In de WaveForm klasse zitten tabellen van vaak gebruikte golven, in elke tabel zitten er 131072 gehele getallen tussen 0 en 2^16-1. Deze heb ik allemaal eens geprint en dat zag er goed uit (vergeleken met de 8bit tabellen). De methode createFile van de WAV klasse neemt een stuk data, plakt de juiste header ervoor en slaat het bestand daarna op. De methode intToByteArray returned de binaire voorstelling van de input in een koppel bytes, little-endian gerangschikt. Die methode wordt ook gebruikt tijdens het maken van de header en klopt dus sowieso.
Het probleem moet dus in de twee for loops zitten denk ik. Iemand een idee waar het foutloopt?
Code: Selecteer alles
public static void main(String[] args) {
WaveForm.loadAllWaveforms();
String name="sine";
WAV.createFile(sineWave(100), "C:\\wave\\"+name+".wav");
}
public static byte[] sineWave(int f){
byte [] data=new byte[(int)(176400)];
double pos=0;
double freq=f;
//left channel
for(int i=0;i<data.length;i+=4){
byte[] ba=intToByteArray(WaveForm.sine[(int)pos%131072]);
data[i]=ba[0];
data[i+1]=ba[1];
pos+=freq*(double)131072/(double)44100;
}
//right channel
for(int i=2;i<data.length;i+=4){
byte[] ba=intToByteArray(WaveForm.sine[(int)pos%131072]);
data[i]=ba[0];
data[i+1]=ba[1];
pos+=freq*(double)131072/(double)44100;
}
return data;
}
In de WaveForm klasse zitten tabellen van vaak gebruikte golven, in elke tabel zitten er 131072 gehele getallen tussen 0 en 2^16-1. Deze heb ik allemaal eens geprint en dat zag er goed uit (vergeleken met de 8bit tabellen). De methode createFile van de WAV klasse neemt een stuk data, plakt de juiste header ervoor en slaat het bestand daarna op. De methode intToByteArray returned de binaire voorstelling van de input in een koppel bytes, little-endian gerangschikt. Die methode wordt ook gebruikt tijdens het maken van de header en klopt dus sowieso.
Het probleem moet dus in de twee for loops zitten denk ik. Iemand een idee waar het foutloopt?