Lautstärkeregelung unter Linux

Antworten
FoLLgoTT
Aktiver Hörer
Beiträge: 554
Registriert: 20.01.2011, 14:05
Wohnort: Hannover
Kontaktdaten:

Lautstärkeregelung unter Linux

Beitrag von FoLLgoTT »

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:
...
-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
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
Bild
frankl
Aktiver Hörer
Beiträge: 486
Registriert: 20.01.2013, 01:43
Wohnort: Aachen

Beitrag von frankl »

Hallo Nils,

"zufälligerweise" mache ich meine Lautstärkeregelung auch mit volrace, benutze aber auch die RACE Funktionalität.

Ich mache das so ähnlich, wie Du oben vorschlägst, allerdings in mein python Skript eingebaut, das ich zum Abspielen eines Albums aufrufe. Ich benutze + oder p/- oder m, um 1 dB lauter/leiser zu stellen, P/M um 6 dB lauter/leiser zu stellen und SPACE für Mute/Unmute. Außerdem noch weitere Tasten, um genauso leicht auch die RACE Parameter ändern zu können.

Ich habe das mit in das Abspielprogramm eingebaut, weil ich zusätzlich bei Beenden eines Albums die volrace Parameter in eine Cache-Datei schreibe, und die gleichen Werte dann wieder setzte, wenn ich das gleiche Album das nächste Mal aufrufe. Auf diese Weise benötige ich die Lautstärkeeinstellung eigentlich gar nicht so oft.

Viele Grüße,
Frank
Bild
Daihedz
Aktiver Hörer
Beiträge: 793
Registriert: 25.06.2010, 15:09

Beitrag von Daihedz »

Hallo in die Linuxer-Runde

Frank hat einen neuen Parameter in volrace (wie schon in resample-soxr vorhanden) eingebaut:

--replay-gain=floatval

Damit lässt sich ein fixer Wert vorgeben, um welchen das Signal abgeschwächt oder verstärkt wird, z.B. zur Vermeidung von intersample-clipping (und falls dieser Parameter nicht gesetzt wird, dann rechnet volrace genau wie bis anhin, d.h. mit einem fiktiven Faktor von replay-gain=1). Im Verbund mit dem Parameter

--param-file=fname

was eine dynamische Veränderung des Pegels während dem Abspielen ermöglicht, lässt sich so ein wirklich universelles Lautstärkemanagement aufbauen. Das immer mit bestmöglichster Präzision.

Ein laut aufgedrehtes Dankeschön an Frank!

Begeisterte Grüsse
Simon
Bild
Antworten