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