Lautstärkeregelung unter Linux
Verfasst: 14.08.2015, 12:29
Hallo,
ich habe mir ein kleines Script geschrieben, das über die Tastatur reagiert und die Parameterdatei von [url=http://frank_l.bitbucket.org/stereoutils/player.html]VOLRACE[/url] füllt.
Dabei ist zu beachten, dass nur der erste Parameter dieser Datei geschrieben wird. Es funktioniert also nur die Lautstärkeregelung und nicht der RACE-Algorithmus!
Das Script reagiert auf "+" und "-", sowie "m" für Mute. Es arbeitet komplett in Dezibel, die Lautstärkeänderungen werden also linear wahrgenommen. Die oberen und unteren Limits können festgelegt werden, sowie der Standardwert beim Starten des Scripts. Letzteres ist sinnvoll, um einen definierten Wert beim Einschalten zu erhalten.
Man könnte das Ganze nun mit einer Funk-Tastatur oder mit einer Fernbedienung steuern. Das sollte kein Problem sein.
Die Ausgabe bei Änderungen auf der Konsole ist bezogen auf 0 dB. Das entspricht dem Verstärkungsfaktor 1,0. Lauter als 1,0 geht natürlich auch, ist aber nur sinnvoll, wenn man eine sehr leise Aufnahme hat, die garantiert nicht clippt.
Beispielausgabe:
Ich habe VOLRACE hinter Brutefir eingebunden. Die ganze Signalverarbeitung wird in 64 Bit Gleitkommazahlen durchgeführt. Genauer geht eine digitale Lautstärkeregelung also kaum.
Das Script macht mir das Leben schon viel leichter. Vielleicht ist es ja auch für den einen oder anderen interessant.
Gruß
Nils
ich habe mir ein kleines Script geschrieben, das über die Tastatur reagiert und die Parameterdatei von [url=http://frank_l.bitbucket.org/stereoutils/player.html]VOLRACE[/url] füllt.
Dabei ist zu beachten, dass nur der erste Parameter dieser Datei geschrieben wird. Es funktioniert also nur die Lautstärkeregelung und nicht der RACE-Algorithmus!
Das Script reagiert auf "+" und "-", sowie "m" für Mute. Es arbeitet komplett in Dezibel, die Lautstärkeänderungen werden also linear wahrgenommen. Die oberen und unteren Limits können festgelegt werden, sowie der Standardwert beim Starten des Scripts. Letzteres ist sinnvoll, um einen definierten Wert beim Einschalten zu erhalten.
Man könnte das Ganze nun mit einer Funk-Tastatur oder mit einer Fernbedienung steuern. Das sollte kein Problem sein.
Die Ausgabe bei Änderungen auf der Konsole ist bezogen auf 0 dB. Das entspricht dem Verstärkungsfaktor 1,0. Lauter als 1,0 geht natürlich auch, ist aber nur sinnvoll, wenn man eine sehr leise Aufnahme hat, die garantiert nicht clippt.
Beispielausgabe:
...
-30.0 dB
-28.0 dB
-26.0 dB
Mute
-26.0 dB
...
Code: Alles auswählen
#!/bin/bash
# user variables
volFile=/tmp/volume
stepSize=2 # in dB
upperLimit=0 # in dB
lowerLimit=-100 # in dB
defaultVal=-30 # in dB
# converts a given dB value into a amplification factor
function ConvertdBToFactor {
local result=$(echo "scale=20;e(l(10) * $1 / 20)" | bc -l | awk '{printf "%.20f", $1}')
echo "${result}"
}
# intern variables
oldVal=0
oldValMute=""
newVal=$(ConvertdBToFactor $defaultVal)
factor=$(ConvertdBToFactor $stepSize)
upperBound=$(ConvertdBToFactor $upperLimit)
lowerBound=$(ConvertdBToFactor $lowerLimit)
# ouputs new value to console and to volume file
function Output {
if [ $(echo "scale=20;${newVal} == 0" | bc) -eq 1 ]; then
echo "Mute"
else
echo "scale=20;20 * l(${newVal}) / l(10)" | bc -l | awk '{printf "%.1f dB\n", $1}'
fi
echo "${newVal}" > $volFile
}
# set default value
Output
# main loop for key input
while true
do
read -s -n 1 key
case $key in
'-') oldVal=$(cat $volFile)
newVal=$(echo "scale=20;if(${oldVal} / ${factor} < ${lowerBound}) ${lowerBound} else ${oldVal} / ${factor}" | bc | awk '{printf "%.20f", $1}')
Output
;;
'+') oldVal=$(cat $volFile)
newVal=$(echo "scale=20;if(${oldVal} * ${factor} > ${upperBound}) ${upperBound} else ${oldVal} * ${factor}" | bc | awk '{printf "%.20f", $1}')
Output
;;
'm') if [ -z "$oldValMute" ]; then
oldValMute=$(cat $volFile)
newVal=0
else
newVal=$oldValMute
oldValMute=""
fi
Output
;;
esac
done
Das Script macht mir das Leben schon viel leichter. Vielleicht ist es ja auch für den einen oder anderen interessant.
Gruß
Nils