From 93b4b600ac3c6ddbe67852e43737d3e81e40c7b2 Mon Sep 17 00:00:00 2001 From: Thomas Fillon Date: Tue, 23 Dec 2014 17:28:46 +0100 Subject: [PATCH] Update NEWS and README --- NEWS.rst | 167 +-------------------- README.rst | 434 ++++------------------------------------------------- 2 files changed, 29 insertions(+), 572 deletions(-) diff --git a/NEWS.rst b/NEWS.rst index 7cff7b4..3f25b4b 100644 --- a/NEWS.rst +++ b/NEWS.rst @@ -1,169 +1,6 @@ News ===== -0.6 +0.1 - * WARNING! some processor ids have changed. Please see the full list below. - * NEW analyzers: IRIT Monopoly (see Processors) - * NEW graphers: IRIT Start/Session segmentation - * Add extensible buffering thanks to pytables (NEW dependency) - * Add typed parameters in processors and server thanks to traits (NEW dependency) - * Add a graph model to the pipe thanks to networkx (NEW dependency) - * Add test sample generators based on GStreamer - * Add a background image option for rendering analyzers - * Add on-the-fly filtering decorators - * Add a Docker development image and a Dockerfile - * Add a Vagrant development box - * Update the Debian package installation procedure - * Results are now stored in pipe.results as as dictionnary of AnalyzerResults - * Update various processors - * Prevent duplication of processor in the pipe (i.e. processors sharing the same class and parameters). This also fix #60. - * Update of Travis CI scripts https://travis-ci.org/yomguy/TimeSide/ - -0.5.6 - - * Bugfix release - * Fix analyzer instanciation as parent for some graphers - * Store analyzer's results in pipe.results by uuid instead of id (fix #24) - -0.5.5 - - * All processor folders (decoder, analyzer, grapher, encoder) are now real plugin repositories : you can just drop processors in it and play! - * TimeSide can be installed without Aubio, Yaafe nor Vamp : it should be easier to install on old distributions for which those librairies are difficult or impossible to compile - * Encoder : add an Opus encoder - * Experimental : add a django web server with a REST API (see "Web server") - * AubioPitch: prevent NaN in result by converting them to zero - * Yaafe analyzer: simplify adaptation of process frames from TimeSide to Yaafe - * LimsiSad: add a default value for parameter sad_model - * Fix various NaN and Inf and PEP8 issues also many PyFlake warnings - * Full `Travis integration `_ with tests and test coverage through `coveralls.io `_ - * Thanks to all contributors! - * WARNING: some of the processor paths used in your app could have moved between 0.5.4 and 0.5.5. Check them with timeside.core.processors(). Note that it is now advised to use the timeside.core.get_processor() method to instantiate the processors with their respective id as argument. - * UPGRADING from the sources: please remove all .pyc files from your repository. - -0.5.4 - - * Encoder : transcoded streams where broken. Now fixed with some smart thread controls. - * Analyzer : update VAMP plugin example in sandbox - * Analyzer : new *experimental* plugin : Limsi Speech Activity Detection Systems (limsi_sad) - * Decoder : process any media in streaming mode giving its URL - * Install : fix some setup requirements - -0.5.3 - - * Make Analyzer rendering more generic and easy to implement - * Analyzer : implement rendering capability for event and segment + add some more analyzer graphers - * Analyzer : refactoring the results rendering method. + Capability to use matplotlib in environnement with no display - * Decoder : Add a Live decoder to get data from the soundcard - * Decoder : add support for 96kHz sampling rate - * Encoder: live AudioSink encoder, encoder that plays the audio stream through the soundcard - * Grapher : add a generic Class to display Analyzers through their 'render' method. Add the new grapher file - * Grapher : add a generic Class to display Analyzers through their 'render' method. For now, it only support FrameValueResult analyzer - * Core : add a condition to catch signal only if a LiveDecoder source is used - * Various bugfixes - -0.5.2 - - * Add a general launch script "timeside-launch" (see "Shell interface") - * Add some decorators to filter the inputs of processes (see analyzer.waveform for ex) - * Add a "stack" option to the FileDecoder to accumulate audio data allowing multipass processes - * Add beat confidence to aubio_temporal - * Add AAC encoder (gstreamer voaacenc plugin needed) - * Add UUIDs to the file URI and to all processors - * Add a Debian repository with all dependencies for i386 and amd64 architectures - * Fix buggy WebM encoder - * Fix buggy MP3 muxing - * Fix various minor bugs - -0.5.1 - - * Add *parent* processor list to Processor - * Simplify and optimize the grapher system - * Add Grapher abstract generic class - * Add a UUID property to Processor - * Add a SpectrogramLinear grapher - * Add WaveformTransparent grapher - * Fix some assignment issues regarding immutable type in for Analyzer Result - * Simplify analyzer results implementation by introducing a Factory and multiple classes and subclasses to handle the 8 different kinds of results - * Add doctests and improve the unit tests - * Add a OnsetDetectionFunction analyzer - * Update documentation - * Various cleanups - * Various bugfixes - -0.5.0 - - * Deep refactoring of the analyzer API to handle various new usecases, specifically audio feature extraction - * Add serializable global result container (NEW dependency to h5py, json, yaml) - * Add new audio feature extraction analyzers thanks to the Aubio library providing beat & BPM detection, pitch dectection and other cool stuff (NEW dependency on aubio) - * Add new audio feature extraction analyzers thanks to the Yaafe library (NEW dependency on yaafe) - * Add new IRIT speech detection analyzers (NEW dependency on scipy) - * EXPERIMENTAL : add new audio feature extraction thanks to the VAMP plugin library (NEW dependency on some vamp tools) - * Add new documentation : http://files.parisson.com/timeside/doc/ - * New Debian repository for instant install - * Various bugfixes - * Comptatible with Python >=2.7 - * WARNING : no longer compatible with Telemeta 1.4.5 - -0.4.5 - - * (re)fix Pillow support (#12) - * fix some python package rules - * add a Debian package directory (thanks to piem, in git repo only) - -0.4.4 - - * Only setup bugfixes - * Last compatible version with Python 2.6 - * Next version 0.5 will integrate serious new analyzer features (aubio, yaafe and more) - -0.4.3 - - * finally fix decoder leaks and de-synchronizations (thanks to piem) - * this also fixes bad variable encoder file lengths - * fix OGG and FLAC encoders (closes: #8) - * fix multi-channels streaming (closes: #13) - * add support for Pillow (closes: #12) - * temporally desactivate AAC and WebM encoders (need to add some limits for them) - * WARNING : we now need to add overwrite=True to encoder kwargs instances in order to overwrite the destination file, i.e. e=Mp3Encoder(path, overwrite=True) - -0.4.2 - - * many releases these days, but there are some patches which are really worth to be HOT released : we just need them in production.. - * finally fix FFT window border leaks in the streaming spectrum process for *really* better spectrograms and *smoother* spectral centroid waveforms - * *mv* gstutils to timeside.gstutils - * cleanup various processes - * Ogg, Aac and Flac encoders not really working now (some frames missing) :( Will be fixed in next release. - -0.4.1 - - * move UI static files from ui/ to static/timeside/ (for better django compatibility) - * upgrade js scripts from telemeta 1.4.4 - * upgrade SoundManager2 to v297a-20120916 - -0.4.0 - - * finally fixed an old decoder bug to prevent memory leaks during hard process (thanks to piem) - * add blocksize property to the processor API - * add many unit tests (check tests/alltests.py) - * re-add UI files (sorry, was missing in the last packages) - * various bugfixes - * encoders not all much tested on big files, please test! - * piem is now preparing some aubio analyzers :P - -0.3.3 - - * mostly a transitional developer and mantainer version, no new cool features - * but add "ts-waveforms" script for waveform batching - * fix some tests - * removed but download audio samples - * fix setup - * update README - -0.3.2 - - * move mainloop to its own thread to avoid memory hogging on large files - * add condition values to prepare running gst mainloop in a thread - * add experimental WebM encoder - * duration analysis goes to decoder.duration property - * bugfixes + * Extract Diadems analyzers from `TimeSide `_ diff --git a/README.rst b/README.rst index 905825e..a361d8e 100644 --- a/README.rst +++ b/README.rst @@ -2,10 +2,11 @@ TimeSide : open web audio processing framework ============================================== -|version| |downloads| |travis_master| |coveralls_master| +#|version| |downloads| +|travis_master| #|coveralls_master| -.. |travis_master| image:: https://secure.travis-ci.org/Parisson/TimeSide.png?branch=master - :target: https://travis-ci.org/Parisson/TimeSide/ +.. |travis_master| image:: https://secure.travis-ci.org/ANR-DIADEMS/timeside-diadems.png?branch=master + :target: https://travis-ci.org/ANR-DIADEMS/timeside-diadems/ .. |coveralls_master| image:: https://coveralls.io/repos/yomguy/TimeSide/badge.png?branch=master :target: https://coveralls.io/r/yomguy/TimeSide?branch=master @@ -18,421 +19,41 @@ TimeSide : open web audio processing framework :target: https://pypi.python.org/pypi/TimeSide/ :alt: Downloads +TimeSide-diadems is a set of plugins for `TimeSide `_ developped during the `DIADEMS project `_ project funded by `ANR `_, the French National Research Agency (CONTINT 2012 project : DIADEMS). + TimeSide is a set of python components enabling low and high level audio analysis, imaging, transcoding and streaming. Its high-level API is designed to enable complex processing on large datasets of audio and video assets of any format. Its simple plug-in architecture can be adapted to various use cases. TimeSide also includes a smart interactive HTML5 player which provides various streaming playback functions, formats selectors, fancy audio visualizations, segmentation and semantic labelling synchronized with audio events. It is embeddable in any web application. -Goals -====== - -* **Do** asynchronous and fast audio processing with Python, -* **Decode** audio frames from **any** audio or video media format into numpy arrays, -* **Analyze** audio content with some state-of-the-art audio feature extraction libraries like Aubio, Yaafe and VAMP as well as some pure python processors -* **Visualize** sounds with various fancy waveforms, spectrograms and other cool graphers, -* **Transcode** audio data in various media formats and stream them through web apps, -* **Organize**, **serialize** and **save** feature analysis data through various portable formats, -* **Playback** and **interact** **on demand** through a smart high-level HTML5 extensible player, -* **Index**, **tag** and **annotate** audio archives with semantic metadata (see `Telemeta `__ which embed TimeSide). - - -Funding and Support -=================== - -To fund the project and continue our fast development process, we need your explicit support. So if you use TimeSide in production or even in development, please let us know: - - * star or fork the project on `GitHub `_ - * tweet something to `@parisson_studio `_ or `@yomguy `_ - * drop us an email - -Thanks for your help! - -Architecture -============ - -The streaming architecture of TimeSide relies on 2 main parts: a processing engine including various plugin processors written in pure Python and a user interface providing some web based visualization and playback tools in pure HTML5. - -.. image:: http://vcs.parisson.com/gitweb/?p=timeside.git;a=blob_plain;f=doc/slides/img/timeside_schema.svg;hb=refs/heads/dev - :width: 800 px - -Dive in -======== - -To list all available plugins:: - - import timeside - timeside.core.list_processors() - -Define some processors:: - - from timeside.core import get_processor - decoder = get_processor('file_decoder')('sweep.wav') - grapher = get_processor('waveform_simple') - analyzer = get_processor('level') - encoder = get_processor('vorbis_encoder')('sweep.ogg') - -Then run the *magic* pipeline:: - - (decoder | grapher | analyzer | encoder).run() - -Render the grapher results:: - - grapher.render(output='waveform.png') - -Show the analyzer results:: - - print 'Level:', analyzer.results - -The encoded OGG file should also be there... - -For more extensive examples, please see the `full documentation `_. - - -News -===== - -0.6.1 - - * Fix various minor bugs - * Fix docker sandbox - * Auto build docker image (https://registry.hub.docker.com/u/parisson/timeside/) - -0.6 - - * WARNING! some processor ids have changed. Please see the full list below. - * NEW analyzers: IRIT Monopoly (see Processors) - * NEW graphers: IRIT Start/Session segmentation - * Add extensible buffering thanks to pytables (NEW dependency) - * Add typed parameters in processors and server thanks to traits (NEW dependency) - * Add a graph model to the pipe thanks to networkx (NEW dependency) - * Add test sample generators based on GStreamer - * Add a background image option for rendering analyzers - * Add on-the-fly filtering decorators - * Add a Docker development image and a Dockerfile - * Add a Vagrant development box - * Update the Debian package installation procedure - * Results are now stored in pipe.results as as dictionnary of AnalyzerResults - * Update various processors - * Prevent duplication of processor in the pipe (i.e. processors sharing the same class and parameters). This also fix #60. - * Update of Travis CI scripts https://travis-ci.org/Parisson/TimeSide/ - -0.5.6 - - * Bugfix release - * Fix analyzer instanciation as parent for some graphers - * Store analyzer's results in pipe.results by uuid instead of id (fix #24) - -For older news, please visit: https://github.com/Parisson/TimeSide/blob/master/NEWS.rst - -Processors -========== - -IEncoder --------- - - * **live_encoder** : Gstreamer-based Audio Sink - * **flac_encoder** : FLAC encoder based on Gstreamer - * **aac_encoder** : AAC encoder based on Gstreamer - * **mp3_encoder** : MP3 encoder based on Gstreamer - * **vorbis_encoder** : OGG Vorbis encoder based on Gstreamer - * **opus_encoder** : Opus encoder based on Gstreamer - * **wav_encoder** : WAV encoder based on Gstreamer - * **webm_encoder** : WebM encoder based on Gstreamer - -IDecoder --------- - - * **array_decoder** : Decoder taking Numpy array as input - * **file_decoder** : File Decoder based on Gstreamer - * **live_decoder** : Live source Decoder based on Gstreamer - -IGrapher --------- - - * **grapher_aubio_pitch** : Image representing Aubio Pitch - * **grapher_onset_detection_function** : Image representing Onset detection function - * **grapher_waveform** : Image representing Waveform from Analyzer - * **grapher_irit_speech_4hz_segments** : Image representing Irit 4Hz Speech Segmentation - * **grapher_irit_speech_4hz_segments_median** : Image representing Irit 4Hz Speech Segmentation with median filter - * **grapher_monopoly_segments** : Image representing Irit Monopoly Segmentation - * **grapher_limsi_sad_etape** : Image representing LIMSI SAD with ETAPE model - * **grapher_limsi_sad_maya** : Image representing LIMSI SAD with Mayan model - * **grapher_irit_startseg** : Image representing IRIT Start Noise - * **spectrogram_log** : Logarithmic scaled spectrogram (level vs. frequency vs. time). - * **spectrogram_lin** : Linear scaled spectrogram (level vs. frequency vs. time). - * **waveform_simple** : Simple monochrome waveform image. - * **waveform_centroid** : Waveform where peaks are colored relatively to the spectral centroids of each frame buffer. - * **waveform_contour_black** : Black amplitude contour waveform. - * **waveform_contour_white** : an white amplitude contour wavform. - * **waveform_transparent** : Transparent waveform. - -IAnalyzer ---------- - - * **mean_dc_shift** : Mean DC shift analyzer - * **level** : Audio level analyzer - * **aubio_melenergy** : Aubio Mel Energy analyzer - * **aubio_mfcc** : Aubio MFCC analyzer - * **aubio_pitch** : Aubio Pitch estimation analyzer - * **aubio_specdesc** : Aubio Spectral Descriptors collection analyzer - * **aubio_temporal** : Aubio Temporal analyzer - * **yaafe** : Yaafe feature extraction library interface analyzer - * **irit_monopoly** : Segmentor Monophony/Polyphony based on the analysis of yin confidence. - * **irit_startseg** : Segmentation of recording sessions into 'start' and 'session' segments - * **irit_speech_4hz** : Speech Segmentor based on the 4Hz energy modulation analysis. - * **irit_speech_entropy** : Speech Segmentor based on Entropy analysis. - * **limsi_sad** : Limsi Speech Activity Detection Systems - * **spectrogram_analyzer** : Spectrogram image builder with an extensible buffer based on tables - * **onset_detection_function** : Onset Detection Function analyzer - * **spectrogram_analyzer_buffer** : Spectrogram image builder with an extensible buffer based on tables - * **waveform_analyzer** : Waveform analyzer - -IEffect -------- - - * **fx_gain** : Gain effect processor - -API / Documentation -==================== - -* General : http://files.parisson.com/timeside/doc/ -* Tutorial : http://files.parisson.com/timeside/doc/tutorial/index.html -* API : http://files.parisson.com/timeside/doc/api/index.html -* Player / UI : https://github.com/Parisson/TimeSide/wiki/Ui-Guide (see also "Web player") -* Notebooks : http://nbviewer.ipython.org/github/thomasfillon/Timeside-demos/tree/master/ -* Usage : http://archives.crem-cnrs.fr/archives/items/CNRSMH_E_2004_017_001_01/ - -Install -======= - -The TimeSide engine is intended to work on all Linux and Unix like platforms. It depends on several other python modules and compiled libraries like GStreamer. - -Debian, Ubuntu ---------------- - -For Debian based distributions, we provide a safe repository giving additional dependencies that are not included in Debian yet. Please follow the instructions on `this page `_. - -Other Linux distributions --------------------------- - -On other Linux platforms, you need to install all dependencies listed in Dependencies finding all equivalent package names for your distribution. - -Then, use pip:: - - sudo pip install timeside - -OSX / Windows --------------- - -Native install is hard at the moment but you can either run our Vagrant or Docker images (see Development). - -Dependencies -------------- - -Needed: - - python (>=2.7) python-setuptools python-numpy python-scipy python-h5py python-matplotlib python-imaging - python-simplejson python-yaml python-mutagen libhdf5-serial-dev python-tables python-gst0.10 - gstreamer0.10-gnonlin gstreamer0.10-plugins-good gstreamer0.10-plugins-bad gstreamer0.10-plugins-ugly - -Optional: - - aubio (>=0.4.1) yaafe python-aubio python-yaafe vamp-examples - django (>=1.4) django-south djangorestframework django-extensions - -User Interfaces -=============== - -Python -------- - -Of course all the TimeSide are available in our beloved python envionment. -As IPython is really great for discovering objects with completion, writing notebooks, we strongly advise to install and use it:: - - sudo apt-get install ipython - ipython - >>> import timeside - - -Shell ------- - -Of course, TimeSide can be used in any python environment. But, a shell script is also provided to enable preset based and recursive processing through your command line interface:: - - timeside-launch -h - Usage: scripts/timeside-launch [options] -c file.conf file1.wav [file2.wav ...] - help: scripts/timeside-launch -h - - Options: - -h, --help show this help message and exit - -v, --verbose be verbose - -q, --quiet be quiet - -C , --conf= - configuration file - -s , --samplerate= - samplerate at which to run the pipeline - -c , --channels= - number of channels to run the pipeline with - -b , --blocksize= - blocksize at which to run the pipeline - -a , --analyzers= - analyzers in the pipeline - -g , --graphers= - graphers in the pipeline - -e , --encoders= - encoders in the pipeline - -R , --results-formats= - list of results output formats for the analyzers - results - -I , --images-formats= - list of graph output formats for the analyzers results - -o , --ouput-directory= - output directory - - -Find some preset examples in examples/presets/ - - -Web player ------------ - -TimeSide comes with a smart and pure **HTML5** audio player. - -Features: - * embed it in any audio web application - * stream, playback and download various audio formats on the fly - * synchronize sound with text, bitmap and vectorial events - * seek through various semantic, analytic and time synced data - * fully skinnable with CSS style - -Screenshot: - .. image:: https://raw.github.com/Parisson/TimeSide/master/doc/slides/img/timeside_player_01.png - -Examples of the player embeded in the Telemeta open web audio CMS: - * http://parisson.telemeta.org/archives/items/PRS_07_01_03/ - * http://archives.crem-cnrs.fr/items/CNRSMH_I_1956_002_001_01/ - -Development documentation: - * https://github.com/Parisson/TimeSide/wiki/Ui-Guide - -TODO list: - * zoom - * layers - - -Web server ------------ - -An EXPERIMENTAL web server based on Django has been added to the package from version 0.5.5. The goal is to provide a full REST API to TimeSide to enable new kinds of audio processing web services. - -A sandbox is provided in timeside/server/sandbox and you can initialize it and test it like this:: - - cd examples/sandbox - ./manage.py syncdb - ./manage.py migrate - ./manage.py runserver - -and browse http://localhost:8000/api/ - -At the moment, this server is NOT connected to the player using TimeSide alone. Please use Telemeta. - Development =========== |travis_dev| |coveralls_dev| -.. |travis_dev| image:: https://secure.travis-ci.org/Parisson/TimeSide.png?branch=dev - :target: https://travis-ci.org/Parisson/TimeSide/ +.. |travis_dev| image:: https://secure.travis-ci.org/ANR-DIADEMS/timeside-diadems.png?branch=dev + :target: https://travis-ci.org/ANR-DIADEMS/timeside-diadems/ .. |coveralls_dev| image:: https://coveralls.io/repos/yomguy/TimeSide/badge.png?branch=dev :target: https://coveralls.io/r/yomguy/TimeSide?branch=dev -Docker (recommended) --------------------- - -Docker is a great tool for developping and deploying processing environments! Our docker container includes all the necessary packages and environments for development and production with TimeSide. - -First, install Docker: https://docs.docker.com/installation/ - -Then, simply pull our dev image and run:: - - sudo docker pull parisson/timeside - sudo docker run parisson/timeside - -To get a shell:: - - sudo docker run -ti parisson/timeside bash - -More infos: https://registry.hub.docker.com/u/parisson/timeside/ - -To start the web server through the container:: - - sudo docker run -p 9000:80 parisson/timeside - -Finally browse http://localhost:9000/api/ - -To start a new development, it is advised to checkout the dev branch and build your own container:: - - sudo docker run -ti parisson/timeside bash - cd /opt/TimeSide - git checkout dev - - -VirtualBox and Vagrant (deprecated) ------------------------------------ - -We also provide a vagrant box to install a virtual Debian system including TimeSide and all other dependencies. -First, install Vagrant and VirtualVox:: - - sudo apt-get install vagrant virtualbox - -On other OS, we need to install the packages correponding to your system: - - * Vagrant: https://www.vagrantup.com/downloads.html - * VirtualBox: https://www.virtualbox.org/wiki/Downloads - -Then setup our image box like this in a terminal:: - - vagrant box add parisson/timeside-wheezy64 http://files.parisson.com/vagrant/timeside/parisson-timeside-wheezy64.box - vagrant init parisson/timeside-wheezy64 - vagrant up - vagrant ssh - -To stop the virtual box:: - - exit - vagrant halt - - -Native -------- - -First, install TimeSide (see Install). - -Then:: - - sudo apt-get build-dep python-timeside - sudo apt-get install git - git clone https://github.com/Parisson/TimeSide.git - cd TimeSide - git checkout dev - sudo pip install -e . - echo "export PYTHONPATH=$PYTHONPATH:`pwd`" >> ~/.bashrc - source ~/.bashrc - tests/run_all_tests - - -Sponsors and Partners -===================== +Partners +======== +* Science and Technology of Information and Communication + + * `IRIT `_ + * `LAM `_ + * `LABRI `_ + * `CNRS-LIMSI `_ +* Musicology and Ethnomusicology Research + * `LESC-CNRS `_ + * `CREM `_ + * `MNHN `_ +* Development * ``_ * `Parisson `_ - * `CNRS `_ (National Center of Science Research, France) - * `Huma-Num `_ (big data equipment for digital humanities, ex TGE Adonis) - * `CREM `_ (french National Center of Ethomusicology Research, France) - * `Université Pierre et Marie Curie `_ (UPMC Paris, France) - * `ANR `_ (CONTINT 2012 project : DIADEMS) - * `MNHN `_ : Museum National d'Histoire Naturelle (Paris, France) + Related projects @@ -440,29 +61,28 @@ Related projects * `Telemeta `__ : open web audio platform * `Sound archives `_ of the CNRS, CREM and the "Musée de l'Homme" in Paris, France. - * The `DIADEMS project `_ sponsored by the ANR. + Copyrights ========== * Copyright (c) 2006, 2014 Parisson Sarl * Copyright (c) 2006, 2014 Guillaume Pellerin -* Copyright (c) 2010, 2014 Paul Brossier * Copyright (c) 2013, 2014 Thomas Fillon * Copyright (c) 2013, 2014 Maxime Lecoz * Copyright (c) 2013, 2014 David Doukhan -* Copyright (c) 2006, 2010 Olivier Guilyardi - +* Copyright (c) 2014 Dominque Fourer +* Copyright (c) 2014 Jean-Luc Rouas License ======= -TimeSide is free software: you can redistribute it and/or modify +TimeSide-Diadems is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 2 of the License, or (at your option) any later version. -TimeSide is distributed in the hope that it will be useful, +TimeSide-Diadems is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. -- 2.39.5