13.3 Sound-Out

# Sound-Out

Bisher haben wir in diesem Abschnitt behandelt, wie wir mehrere Audio-Streams in Sonic Pi einbinden können - entweder durch den `:sound_in`-Synth oder über das mächtige ` live_audio`-System. Über die Arbeit mit mehreren Audio-Streams aus Eingangssignalen hinaus, kann Sonic Pi ebenso mehrere Audio-Streams als Ausgangssignal ausgeben. Dies wird über den `:sound_out`-Effekt erreicht.

## Ausgabe-Kontexte

Lass uns kurz rekapitulieren, wie Sonic Pis Synths und Effekte ihr Audio-Signal an ihren gegenwärtigen Effekt-Kontext übergeben. Stell dir zum Beispiel Folgendes vor:

```
with_fx :reverb do    # C
  with_fx :echo do    # B
    sample :bd_haus   # A
  end
end
```

Der einfachste Weg, um zu verstehen, was mit dem Audio-Stream passiert, ist beim innersten Audio-Kontext zu starten und uns langsam den Weg nach draußen entlang zu arbeiten. In diesem Fall ist der innerste Kontext mit `A` bezeichnet und ist das `:bd_haus`-Sample, das getriggert wird. Der Audio-Stream hiervon geht direkt in den Kontext `B`, welches der `:echo`-Effekt ist. Dieser fügt Echo dem eingehenden Audio-Stream hinzu und gibt es an seinen Kontext weiter - das ist `C` - der `:reverb`-Effekt. Dieser fügt dann Hall dem eingehenden Audio-Stream hinzu und gibt ihn an seinen Kontext weiter, welcher die oberste Ebene ist - der linke und rechte Lautsprecher (was in deinem Audio-Interface Ausgang 1 und Ausgang 2 entspricht). Der Klang fließt nach draußen den ganzen Weg hindurch als Stereo-Signal.

## Sound-Out-Effekte

Das oben genannte Verhalten trifft auf alle Synths zu (einschließlich `live_audio`) und auf den Großteil der Effekte, mit Ausnahme von `:sound_out`. Der `:sound_out`-Effekt tut zwei Dinge. Erstens gibt er seinen Audio-Stream wie oben beschrieben an seinen äußeren Kontext weiter. Zum Zweiten gibt er ihn *auch* an einen Ausgang deines Audio-Interface oder deiner Sound-Karte aus. Sehen wir uns das an:

```
with_fx :reverb do      # C
  with_fx :sound_out, output: 3 do # B
    sample :bd_haus     # A
  end
end
```

In diesem Besipiel gibt unser `bd_haus`-Sample sein Audio an seinen äußeren Kontext, welches der `:sound_out`-Effekt ist. Dieser seinerseits gibt sein Audio an seinen externen Kontext, den `:reverb`-Effekt weiter (wie erwartet). Allerdings gibt er *auch* einen Mono-Mix an den Ausgang 3 des Audio-Interface oder der Sound-Karte des Systems. Der Audio-Stream, wie er innerhalb von `:sound_out` generiert wird hat also zwei Ziele, den `:reverb`-Effekt und den Audio-Ausgang 3.

## Mono- und Stereoausgabe

Wie wir gesehen haben, gibt der `:sound_out`-Effekt standardmäßig einen Mono-Mix des Stereo-Streams an einen bestimmten Kanal aus, zusätzlich dazu, dass er ihn (wie erwartet) an seinen äußeren Kontext weiter gibt. Wenn ein Mono-Mix nicht gerade das ist, was du nach draußen geben willst, hast du eine Reihe von Optionen. Zum Ersten, bei Verwendung der `mode:`-Option kannst du wählen nur den linken oder den rechten Kanal des Stereo-Streams an das Audio-Interface auszugeben. Oder du kannst den `:sound_out_stereo`-Effekt verwenden, um zwei aufeinanderfolgende Ausgänge des Audio-Interface zu verwenden. Wirf einen Blick in die Dokumentation der Funktion für weitere Informationen und Beispiele.

## Direct-Out

Wie wir auch gesehen haben, ist es das standardmäßige Verhalten von `:sound_out` und `:sound_out_stereo` Audio sowohl an ihren äußeren Kontext (wie für alle Effekte typisch) *als auch* an den von dir bestimmten Audio-Ausgang deiner Sound-Karte zu schicken. Trotzdem wirst du gelegentlich vielleicht wünschen einen Audio-Stream *ausschließlich* an den Ausgang deiner Sound-Karte zu schicken und nicht an den äußeren Kontext (und daher deinen Audio-Stream auch nicht gemischt durch die Standard-Ausgänge 1 und 2 geschickt zu bekommen). Das ist möglich, indem du die Standard-Effekt-Option `amp:` benutzt, die den Audio-Stream bearbeitet, *nachdem* der Effekt den Audio-Stream bearbeitet hat:

```
with_fx :sound_out, output: 3, amp: 0 do # B
  sample :loop_amen                      # A
end
```

Im obigen Beispiel, wird das `:loop_amen`-Sample an seinen äußeren Kontext geschickt, den `:sound_out`-Effekt. Dieser sendet einen Mono-Mix and den Sound-Karten-Ausgang 3 und multipliziert danach den Audio-Stream mit 0, was diesen essentiell stumm schaltet. Dieses stummgeschaltete Signal wird anschließend an den äußeren Kontext des `:sound_out`-Effektes geschickt, welches der Standard-Ausgang ist. Daher werden bei diesem Code die Standard-Ausgangskanäle kein hörbares Signal erhalten, und an Ausgang 3 wird ein Mono-Mix des Amen-Drum-Break geschickt.
