Hello all,
Currently i am running liquidsoap 1.0.1 on debian 7 64-bit.
My basic script is running just fine, playing out some 90S Dance Tracks
for testing stuff etc.
I used the complete case analysis script found on the liquidsoap
homepage as a starting reference.
I am fine with the audiosettings for the most part and am especially
glad that i can use the calf multiband-compressor thanks to kxstudio and
falkTX.
This saves me 5% of cpu load for the multibandcompression alone.
Being 100% visually impaired and getting more and more dissatisfied with
the growing inaccessibility of gui-driven radio automation software i am
all the more happy to have liquidsoap available for my needs.
I am a total beginner in liquidsoap and not yet fully into the inner
workings and the possibilities of this programming language. So
naturally i would be stuck at some point and this is where i'd be asking
for help right now.
Knowing that there is a sidechain-compressor available in my
ladspa-plugincollection i wonder if i could build some talkover-effect
found on several dj-mixers, so that whenever i connect my microphone
over a harbor input the music will be ducked whenever i speak. This is
good for playing out the usual trance-dj-sessions. So all i had to do is
to feed my microphone harbor-input into my sidechain compressor and
because the 2 streams from my playlist are mixed together, the
microphone is able to influence the volume of the playing music.
Is there any break in the music-stream when the mic-harbor-input
connects and disconnects, since i might not be available all the time,
and would like to leave the stream doing it's job on it's own.
But i don't know how to go about it. The next problem is the 10 seconds
bufferdelay from the stream to the end listener which makes realtime
monitoring nearly impractical, since my linux-box is colocated in berlin
and i'm residing in esslingen close to stuttgart most of the time. Maybe
some lowlatency speex-output for testing and nearly-realtime monitoring
except for a 1 to 2 seconds delay, which would be acceptable to me.
Does anybody know about the meaning of the ladspa-compressor-parameters?
It seems to me the treshold-parameter isn't expressed in decibel. Anyway
i even have a hard time understanding some of my multiband-compressors
parameters because of this.
Any Ideas? This would be really great.
I will attach my script below as a quick reference for you to know where
i am at right now.
Sensible data has been exchanged with meaningless parameters. Passwort
etc...
Thanks and best Regards, Attila.


#!/usr/bin/liquidsoap

# Lines starting with # are comments, they are ignored.

# Put the log file in some directory where
# you have permission to write.
set("log.file.path","/tmp/<script>.log")
# Print log messages to the console,
# can also be done by passing the -v option to liquidsoap.
set("log.stdout", false)
# Use the telnet server for requests
set("server.telnet", true)


# A bunch of files and playlists,
# supposedly all located in the same base dir.

default = single("/home/mp3/fallback/default.ogg")

day     = playlist("/home/mp3/day/")
night   = playlist("/home/mp3/night/")
jingles = playlist("/home/mp3/jingles/")

# clock   = single("/home/mp3/fallback/clock.ogg")
# start   = single("/home/mp3/fallback/start.ogg")
# stop    = single("/home/mp3/fallback/stop.ogg")

# Play user requests if there are any,
# otherwise one of our playlists,
# and the default file if anything goes wrong.
radio = fallback([ request.queue(id="request"),
                    switch([({ 6h-22h }, day),
                            ({ 22h-6h }, night)]),
                    default])

# Metadata rewriting to show Station Infos and no Artist/title-infos.
radio =
  rewrite_metadata([
                  ("artist", "meinprivatesradio"),
                  ("album", ""),
                  ("date", ""),
                  ("genre", "diverse"),
                  ("title","Wir spielen, was Ihr hoeren wollt!"),
                    ("comment","http://www.meinprivatesradio.de";)],
                  strip=true,radio)

# smart crossfading
# first generate our custom Fading Function
def my_fade
(~start_next=3.,~fade_in=3.,~fade_out=3.,~width=1.,~conservative=true,s)
mf_high = 20.
mf_medium = 32.
mf_margin = 4.
fade.out = fade.out(duration=fade_out)
fade.in = fade.in(duration=fade_in)

add = fun (from,to) ->
add(normalize=false,
[ to,from ])

log = log(label="my_fade")
def transition (a, b, ma, mb, sa, sb)
if

(a + mf_high >= 0. and b + mf_high >= 0.) or

(a + mf_medium >= 0. and b + mf_medium >= 0. and abs(a - b) <= mf_margin)

then

log("No transition, just sequencing.")

sequence([sa, sb])

elsif

a + mf_medium <= 0. and b + mf_medium >= 0. and abs(a - b) <= mf_margin

then

log("Using transition 1: crossed.")

add(fade.out(sa),fade.in(sb))
elsif

b >= a + mf_margin and a <= mf_high

then

log("Using transition 2: crossed, fade-out.")

add(fade.out(sa),sb)
elsif

a >= b + mf_margin and b <= mf_high

then

log("Using transition 3: crossed, fade-in.")

add(sa,fade.in(sb))
else

log("Using transition 4: crossed, fade-in, fade-out.")

add(fade.out(sa),fade.in(sb))

end

end
smart_cross(transition,width=width,duration=start_next,conservative=conservative,s)
end

# process this function within our stream
radio = my_fade(radio)
# Add the normal jingles
radio = random(weights=[1,5],[ jingles, radio ])
# And the clock jingle
# radio = add([radio, switch([({0m0s},clock)])])

# Add the ability to relay live shows
full =
  fallback(track_sensitive=false,
           [input.harbor("live",port=9001,password="dukommsthiernetrein"),
            radio])


## Audio processing
# Tap Equalizer to pump up and brighten up the sound
full = ladspa.tap_equalizer (
band_1_gain = 2.0,
band_6_gain = 2.0,
band_7_gain = 3.0,
full)

# old custom Function for Multiband-compression.
# will be phased out, for it's extraordinarily cpu-intensive.
# Instead we'll be using the falkTX/calf githup repo's ladspa libraries
so we have the calf multiband-compressor available.
# Shouldn't be so demanding on cpu resources and gives more clean and
understandable Code.
# the old one sounded crappy anyway.
#def multicomp(s)
  # 3-band crossover
#  low = filter.iir.eq.low(frequency = 130.)
#  mh = filter.iir.eq.high(frequency = 70.)
#  mid = filter.iir.eq.low(frequency = 7400.)
#  high = filter.iir.eq.high(frequency = 350.)

  # Add back
#  add(normalize = false,
#      [ compress(attack = 10., release = 20., threshold = -12.,
#                 ratio = 2., gain = 2.0, knee = 0.3,
#                 low(s)),
#        compress(attack = 10., release = 20., threshold = -28.,
#                 ratio = 5., gain = 4.0, knee = 1.3,
#                 mid(mh(s))),
#        compress(attack = 5., release = 10., threshold = -22.,
#                 ratio = 5., gain = 5.0, knee = 0.3,
#                 high(s))
#      ])
# end

# Use bandpass filter to narrow signal to 30-15000 Hz for FM broadcast
full = filter.iir.butterworth.bandpass(
  frequency1 = 30.0,
  frequency2 = 15000.0,
  order = 4,
  full
)

# apply our custom multiband compressor
#  full = multicomp(full)

# Gate to stop Background noise during quiet times
full = ladspa.gate(
full,
threshold = -50.0,
attack = 0.15,
)


# maybe it's gonna get grovier with the ladspa bassenhancer
# commented out until i know how to use it properly.
#  full = ladspa.bassenhancer(full,
#     amount=5.,floor_active=true,
#     input=1.,output=1.,)

# apply the Calf Multiband Compressor
# puh, lot's of parameters to tweak!
full = ladspa.multibandcompressor(
bypass=false,
input=1.,
output=1.,
split_1_2=140.,
split_2_3=1500.,
split_3_4=7000.,
s1=-0.25,
s2=-0.136,
s3=-0.148,
q1=0.90,
q2=0.90,
q3=0.90,

threshold_1=0.211,
ratio_1=6.5,
attack_1=50.,
release_1=100.,
makeup_1=2.,
knee_1=1.,
detection_1=1,
bypass_1=false,

threshold_2=0.300,
ratio_2=2.5,
attack_2=70.,
release_2=150.,
makeup_2=1.,
knee_2=3.,
detection_2=1,
bypass_2=false,

threshold_3=0.260,
ratio_3=2.5,
attack_3=70.,
release_3=150.,
makeup_3=1.,
knee_3=3.,
detection_3=1,
bypass_3=false,

threshold_4=0.145,
ratio_4=1.9,
attack_4=10.,
release_4=20.,
makeup_4=1.9,
knee_4=2.,
detection_4=1,
bypass_4=false,
full
)

# Overall Compressor -LS's single band compressor using a harder ratio,
fast attack and mainly RMS based calc.
full = compress(
  full,
  attack = 1.0,
  gain = 2.0,
  knee = 1.0,
  ratio = 5.0,
  release = 2.0,
  threshold = -3.0,
  rms_window = 0.9
)

# Limiter - scaling limiter with good artifact rejection
full = ladspa.tap_limiter(
  full,
  limit_level = -1.5
)

# Final Hard Limiter - keeps level from causing over mod. in worst case.
EXTREMELY peak based calc.
full = limit(
  full,
  threshold = -0.1,
  attack = 2.0,
  release = 25.0,
  rms_window = 0.02
)

# Output the full stream in OGG and MP3
# mp3-stream will not be affected by dsp for listening tests.
output.icecast(%mp3,
  host="localhost",port=23456,password="dukommsthiernetrein",
  mount="radio",radio)
output.icecast(%vorbis,
  host="localhost",port=23456,password="dukommsthiernetrein",
  mount="radio.ogg",full)



------------------------------------------------------------------------------
Dive into the World of Parallel Programming. The Go Parallel Website,
sponsored by Intel and developed in partnership with Slashdot Media, is your
hub for all things parallel software development, from weekly thought
leadership blogs to news, videos, case studies, tutorials and more. Take a
look and join the conversation now. http://goparallel.sourceforge.net/
_______________________________________________
Savonet-users mailing list
Savonet-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/savonet-users

Reply via email to