wav-files kanäle zusammenfügen + pitchen

Muhaha

Mitglied
Hi, ich will verschiedene Dinge mit wav-Files machen.

1. Aus zwei Kanälen einen machen.
Die Daten hab ich in zwei short-Arrays. Ist das richtig, wenn ich jetzt einfach den Durchschnitt der beiden Werte nehme die in den Arrays an der selben Stelle stehen und das Ergebnis in eine neues schreibe? Bei mir kratzt erzeugte Sound dann manchmal.
Java:
short[] a = loadSound("a.wav"), b = loadSound("b.wav");
short[] c = new short[a.length];
for (int i = 0; i < a.length; i++) {
	c[i] = ((int) a[i] + b[i]) / 2;
}

2. Wie verändere ich am besten den Pitch? (nicht durch Frequenz verändern im File, da der gepitchte sound mit einem anderen zusammengefügt werden soll)
 
Zuletzt bearbeitet von einem Moderator:
"Mal eben" eine Frequenz (in einer wav-Datei) ändern, wird wohl kaum gehen, da dort wahrscheinlich im Zeitbereich gearbeitet wird (und nicht im Frequenzbereich). Aber selbst dann: Im Frequenzbereich quasi unabhängig vom Zeitbereich zu ändern, dürfte relativ schwierig sein. (Wenn man z.B. im Zeitbereich entlang der Zeitachse staucht, verschiebt man das Frequenzspektrum nach oben, und der Sprecher klingt dann wie auf Helium. 😀) Schau dir mal Rubber Band Audio Time Stretcher Library an.

Falls das völlig an deinen Vorstellungen vorbeigeht, solltest du vielleicht konkreter sagen, was du vorhast.

Ark

EDIT: Was das Abmischen betrifft, probier mal folgenden Code:
Java:
short[] a = loadSound("a.wav"), b = loadSound("b.wav");
short[] c = new short[a.length];
for (int i = 0; i < a.length; i++) {
	int x = ((int) a[i] + b[i]) / 2;
	c[i] = x < Short.MIN_VALUE ? Short.MIN_VALUE : x > Short.MAX_VALUE ? Short.MAX_VALUE : (short)x;
}
Ungetestet, wie immer. 😀

Ark

EDIT2: Hm, eigentlich sollte die Max/Min-Prüfung überflüssig sein, überlege ich mir gerade …
 
Zuletzt bearbeitet:
Zum Mischen hatte ich auch erst gedacht, dass man da was mit min/max verwenden müßte
result = (short)Math.min(Short.MAX_VALUE, Math.max(Short.MIN_VALUE, a+b);
aber dann versucht mir Bildlich vorzustellen, was rauskommt, wenn man eine "Sinus-Rechteckskurve" und eine "Cosinus-Rechteckskurve" (der gleichen Frequenz) so mischt: Das wäre eine Nullinie - kann das Stimmen? ???:L (Es ist (ohne LSD 😀 ) manchmal schwer, sich vorzustellen, wie sich ein Kurvenverlauf anhört)
 
Overflows (wenn sie denn hier tatsaechlich ein Problem sind) kannst du vermeiden mit solchem Code:
Code:
c[i] = a[i]/2 + b[i]/2
 
aber dann versucht mir Bildlich vorzustellen, was rauskommt, wenn man eine "Sinus-Rechteckskurve" und eine "Cosinus-Rechteckskurve" (der gleichen Frequenz) so mischt: Das wäre eine Nullinie

Naja, wäre ja technisch gesehen auch ganz richtig so! Wenn man irgendwas phasenverkehrt wieder 50/50 ins Ausgangsmaterial mischt, isses weg. Wenn das nicht so wär, dann wär das ein Zeichen dafür, dass der Algorithmus nicht sauber arbeitet.
Aber solche "reinen" Kurven (Sinus-, Rechteck-, Sägezahn-) ohne jede Modulation hat man ja eigentlich nur in Testfällen. Bei irgendwelchen Liedern oder aufgenommenen Sounds passiert das ja nicht mal eben ausversehen 🙂
 
Den Durchschnitt bilden klingt vielleicht zunaechst mal logisch, ist aber imho ziemlicher Unfug. Damit mischst du ja letztendlich zwei Streams mit halber Lautstaerke. Das ist normalerweise nicht das was man will.

Probier mal das von Marco13. Da gibts zwar Knackser und Knistern, da wo es zum Ueberlauf kommt und einfach abgeschnitten wird, sollte aber insgesamt besser klingen als Durchschnitt-Bilden. Die Fehler kannst du nur mit irgendwechen Filtern abmildern oder mit komplizierten Rekonstruktionsalgorithmen wieder ausgleichen.
 
Den Durchschnitt bilden klingt vielleicht zunaechst mal logisch, ist aber imho ziemlicher Unfug. Damit mischst du ja letztendlich zwei Streams mit halber Lautstaerke. Das ist normalerweise nicht das was man will.
Das kommt wohl auf den Anwendungsfall an. Falls "aus zwei Kanälen einen machen" so viel heißt wie "aus zwei Stereo-Kanälen einen Mono-Kanal machen", ist das mit dem Durchschnitt schon ganz richtig. Wenn es aber darum geht, aus mehreren Klangquellen den finalen Klang für den Audioausgang zu berechnen (bei dem dann alles gleichzeitig erklingen soll), ist natürlich dein bzw. Marcos Ansatz der richtige.

Da müsste sich mal der TO dazu äußern, was er denn nun braucht. Mal davon abgesehen, glaube ich momentan nicht (mehr), dass die Störgeräusche vom Mischen kommen. Zwecks Debugging sollte man mal c = a bzw. c = b setzen. Wenn die Störungen schon da auftauchen, sind wir hier an der falschen Baustelle.

Ark
 

Zurück
Oben