# sampled sound mixen



## stev.glasow (15. Apr 2007)

Hi ich würde gerne mehrere sampled streams(Mikrofon, wavs, mp3s, etc) mixen(also zu einem stream zusammenfügen) und diesen stream dann selber weiterverarbeiten.
Auf http://java.sun.com/docs/books/tutorial/sound/index.html steht unteranderem folgendes:



> The Java Sound API does not assume a specific audio hardware configuration; it is designed to allow different sorts of audio components to be installed on a system and accessed by the API. The Java Sound API supports common functionality such as input and output from a sound card (for example, for recording and playback of sound files) as well as mixing of multiple streams of audio. Here is one example of a typical audio architecture:
> 
> 
> 
> ...



An sich ist das ja genau das was ich will und wenn der Mixer das einfach nur an ein Ausgabegerät weiterleiten soll ist das auch kein Problem nur bekomme ich es nicht hin das der Mixer das nicht an ein Ausgabegerät weiterleitet sondern in einen Stream schreibt den ich weiter verarbeiten möchte - ich finde da einfach keinen Ansatz weil die Mixer irgendwie alle an geräte gebunden sind. 
Kann es sein das ich da irgendwas grundsätzlich missverstanden habe?


----------



## stev.glasow (17. Apr 2007)

So ... ich hab jetzt folgende Klasse dafür verwendet http://www.jsresources.org/examples/MixingFloatAudioInputStream.java.html und die ersten Tests mit Mirco und ein paar wav-files sind auch zufriedenstellend ( http://www.java-forum.org/stevg/floattest.wav ) nur würde mich doch intessieren ob das nicht doch irgendwie über die Mixer der java sound api geht.
wär cool wenn nicht doch noch einer irgendwie was dazu sagen könnte.
uscha uscha uscha


----------



## stev.glasow (18. Apr 2007)

öhj mann eh
voll dat scheiß forum hier :bloed: keiner antwortet misch  :cry:


----------



## Wildcard (18. Apr 2007)

stevg hat gesagt.:
			
		

> öhj mann eh
> voll dat scheiß forum hier :bloed: keiner antwortet misch  :cry:


Geh doch in ein anderes  :bae: 
Deine Hausaufgaben erledigen wir dir nicht  :wink:


----------



## stev.glasow (18. Apr 2007)

pff, assi - java is doch scheiße eh. seh da echt nicht durch so ohne abi  :?


----------



## pothead (13. Feb 2008)

abi für java????? lol
Learning by doing and never give up!.....that's all


----------



## The_S (13. Feb 2008)

pothead hat gesagt.:
			
		

> abi für java????? lol
> Learning by doing and never give up!.....that's all



Du weißt, dass stevg der Admin dieses Forums ist? Und du weißt auch, dass dieser Dialog auf höchst ironischer Ebene geführt wurde?


----------



## schalentier (13. Feb 2008)

pothead hat gesagt.:
			
		

> abi für java????? lol
> Learning by doing and never give up!.....that's all



You made my day!!


----------



## pothead (29. Feb 2008)

Hobbit_Im_Blutrausch hat gesagt.:
			
		

> pothead hat gesagt.:
> 
> 
> 
> ...



ach, deswegen hab ich mich kaputt gelacht über den Kommentar "java ohne abi blick ich nicht" :idea:  

nee, nee, sachen gibts... :wink:


----------



## tuxedo (29. Feb 2008)

Back to topic ...

Mich interessiert das auch. Bin aber nocht nicht dahinter gekommen ob man an den "gemischten" Stream nochmal dran kommt, oder ob's dann schon in den Eingeweiden des Systems Richtung Wiedergabehardware verschwunden ist....

- Alex


----------



## quippy (3. Mrz 2008)

stevg hat gesagt.:
			
		

> An sich ist das ja genau das was ich will und wenn der Mixer das einfach nur an ein Ausgabegerät weiterleiten soll ist das auch kein Problem nur bekomme ich es nicht hin das der Mixer das nicht an ein Ausgabegerät weiterleitet sondern in einen Stream schreibt den ich weiter verarbeiten möchte - ich finde da einfach keinen Ansatz weil die Mixer irgendwie alle an geräte gebunden sind.
> Kann es sein das ich da irgendwas grundsätzlich missverstanden habe?



Mmmh, so wie ich das sehe, besteht die Aufgabe nun darin, aus verschiedenen Quellen Samples einzulesen, diese dann zu addieren, kurz zu clippen, falls notwendig, und den fertigen Stream wieder in eine Datei schreiben...
Dabei sollte noch normiert werden (so daß das Ergebnis z.B: 16Bit Stereo 44100Hz little Endian oder so ist) Das können teilweise die einlesenden Streams erledigen. 

Das würde ich persönlich nicht über die vorhandenen Mixer erledigen, sondern einen eigenen Software-Mixer schreiben, der die Quellen entsprechend ihrer Art (also Datei, Line-In, Microphon, etc) einliest, so daß jeweils ein entsprechender Byte-Buffer vorhanden ist, diesen dann per addition zusammenführen und wieder wegschreiben.

Hier gibt's einiges hilfreiches dazu im Beispielcode.

Alternativ kannst Du Dir ja mal den Sourcecode von meinem Modplayer ansehen - allerdings ist das nicht zwingend zum lernen geeignet...


----------



## tuxedo (3. Mrz 2008)

quippy hat gesagt.:
			
		

> Das würde ich persönlich nicht über die vorhandenen Mixer erledigen, sondern einen eigenen Software-Mixer schreiben...



Das musst du mir erklären. Warum soll ich sowas selbst schreiben wenn's das schon gibt? Zumal ich mir vorstellen könnte, dass das "selbst mixen" (mal abgesehen davon dass man den code selbst schreiben muss) aufwendiger ist, als das ganze vom bestehenden Mixer mixen zu lassen.

Wieso also das Rad neu erfinden? Wo wäre da der Vorteil?

- Alex


----------



## Rock Lobster (4. Mrz 2008)

Die bestehenden Klassen sind aber zum Teil irgendwie höchst eigenartig und werden ja von Sun auch nicht weiterentwickelt. 

Ich hab mir daher den ganzen Sound-Mist auch selbst zusammengebastelt, dabei konvertiere ich übrigens erstmal alle Samples in Floats, da ich somit ein einheitliches Format habe (egal ob das vorher 8, 16 oder 24 Bit waren) und damit ich später alles, was ich damit vorhabe, mit Floats berechnen kann (z.B. Mixen, Balancing, Effekte, etc).

Hört sich anfangs etwas zu aufwendig an, aber das revidiert sich wieder schnell, weil man nicht zigmal vom einen ins andere Format konvertieren muß oder ständig checken muß, ob es sich nun um 8 oder 16 bit handelt usw. usf.

Und gerade bei Lautstärke-Änderungen usw. ist es von Vorteil das alles auf Float-Basis zu haben. Erst wenn die gesamte Arbeit erledigt ist, wird's dann wieder in das Ausgabeformat konvertiert.


----------



## quippy (4. Mrz 2008)

alex0801 hat gesagt.:
			
		

> quippy hat gesagt.:
> 
> 
> 
> ...



Weil es das eben _so_ IMHO nicht gibt. Du kannst zwar den Mixer bitten, da was für Dich zu tun, aber die Kontrolle gibst Du vollständig ab. Ferner leitest Du im Endeffekt alles durch zig Anpassung-Lines, damit alles im gewünschten und normierten Format ankommt, dann zusammenaddiert wird und irgendwo wieder 'rauskommt.

Ich wüßte jetzt selbst nicht, wie man einen Mixer dazu bringt, aus mehreren Eingangsquellen (die auch noch MP3-codiert sind) Samples einzulesen, zu verbacken, und wieder dahin zu schreiben, wo Du's hinhaben willst.

Aber wenn Du meinst, damit das Rad neu zu erfinden, dann mußt Du das ja nicht so machen. Wäre dann toll, wenn Du uns an der Lösung teilhaben ließest.

Im Endeffekt macht der Mixer auch nix anderes und das Coding dazu ist echt simpel und vor allem trotz allem auch performant.

Von Floats würde ich aus Perfomancegründen allerdings Abstand nehmen. Statt dessen machen sich Integers besser. Man kann auch dort Nachkommastellen berücksichtigen, wenn man genaues Mixing braucht.

z.B. über 


```
private static final int SHIFTS = 8;

(....)

int sampleValue = line.readSample()<<SHIFTS;
(....) Voodo machen mit Genauigkeit, z.B. Volume oder so (...)

int finishedSample = sampleValue>>SHIFTS;
```


----------



## tuxedo (4. Mrz 2008)

@Quippy

Naja, mein Post galt unter der Annahme dass es eine Möglichkeit gibt den vorhandenen Mixer am "Ausgang" anzuzapfen. Wenn's da keine "JRE/JDK eigene" Lösung gibt bleibt einem natürlich nix anderes übrig es selbst zu machen. Logisch.

Vielleicht findet sich noch jemand der das geschafft hat?!

- Alex


----------



## Rock Lobster (4. Mrz 2008)

@ quippy:

Ein einziges Mal alles nach float umrechnen und hinterher wieder zurückrechnen ist kein Problem, und die Berechnungen mit den Floats sind letztendlich auch kein Problem, weil die meisten Rechner heutzutage eine FPU haben. Ich stimme Dir zu, wenn Du sagen würdest, daß man nicht alle mit doubles machen soll, weil die 3x so lang benötigen, aber bei floats wie gesagt kein Problem, und die Ergebnisse sind hinterher nunmal schön genau.

Deine Lösung ist zwar auch nicht übel, aber da die Samples in Byte-Form vorliegen (bei 16 Bit zudem immer Byte-Paare), mußt Du erstmal alles in Integers umrechnen. Und ob Du nun Integers oder Floats nimmst, dürfte wohl kaum einen Unterschied machen was die Dauer der Umrechnung angeht.


----------

