Hi, On 12/12/06, Marcin Gozdalik <[EMAIL PROTECTED]> wrote:
I think Liquidsoap is the best open-source software available now and hope that those features will make it even better.
First, thanks for the compliments. You certainly know how to motivate a bunch of open-source hackers :p Then, I'm afraid you'll be a bit disappointed because we don't have yet most of what you ask for. Let's detail that:
1) dynamic cross-fade: using information stored somewhere in the file (mp3tags? file name in some special format?) the length of cross-fade and the point where it begins is configurable. E.g. DJ sets that on file A cross-fade should begin 5 seconds before the file end and should last 3 seconds (so the last 2 seconds of file A are simply not played)?
First, cross fading is still experimental, mostly because the remaining time estimation is not at all good currently. I'd like to fix that soon but I only have limited spare time, and other tasks have higher priority for the project, e.g. bugs or portable audio output. But there is no design limitation, and this will be done at some point. Then, implementing dynamic cross-fade would turn cross-fading operators into monsters with hairy parameters, but it's doable too. This is always the same question: what's the good tradeoff between simplicity and expressivity ? at which point should one write a dedicated operator in OCaml ? We could discuss that in more details when simple cross-fading works fine, see what parameters you really need and so on.
2) external compander: there is a normalize option in the configuration, but our DJ feels that hand-tuned parameters to "sox compand" operator are superior. Is it possible to automatically pass everything through a given filter (like compander?)
You're considering an operator which would use an external program as a filter... again, that's doable. But that's tricky, and I wouldn't trust any implementation without serious tests. A more reasonable thing would be to implement a compander in liquidsoap. I've not much knowledge and not much time to do this, but I believe this doesn't require much understanding of OCaml (just copy our filter operators), so it could be an easy contribution ;)
3) (my question, for compatibility with my other tools): is it possible to write (e.g. to a FIFO) something whenever played track changes? E.g. to write song artist and song title? It allows me to dynamically update Web-page with information what is currently played
That is done. We have an on_metadata() operator which calls a function (and thus possibly an external script) on every new metadata packet (hence every new track).
4) how is it possible (I'm sure it is) to program a given schedule (i.e. not playing from the clock, but a fixed schedule?) 5) extending scheduler, so that it e.g. doesn't play a song by the same artist twice during the same hour. 6) so called-sweepers: associating a given file with other files and playing them simultaneously: assume we have a jingle saying "hi, this is beynoce, you're listening to the best student radio!", and we associate it with every Beyonce track, so that every time the track is played the jingle is mixed with it.
Here I face again the expressivity/simplicity question. With request.dynamic() you can use an external script to schedule your tracks. This allows you to use your database, your constraints, etc. One the other hand I could be tempted to hack a sweeper operator in the spirit of say_metadata: instead of appending the result of "say:..." you prepend the result of another arbitrary request. That's a bit more difficult but a natural generalization. How to conclude ? Thanks for finding us, stay tuned, and believe in us: the design makes liquidsoap able to do all what you need. It's mostly a matter of time, and external contributions would make time shorter... Cheers. -- David
