]>
description | A music player with actions bound to keys |
owner | Gitolite user |
last change | Mon, 8 Nov 2021 16:42:58 +0000 (17:42 +0100) |
URL | ssh://gitolite@git.immae.eu/perso/Immae/Projets/Python/MusicSampler.git |
https://git.immae.eu/perso/Immae/Projets/Python/MusicSampler.git |
Music Sampler is a music player which associates each key on the keyboard to a set of actions to run.
(See next section for Windows installation)
libav-tools
(debian):sudo apt-get install libav-tools
If you use the compiled version of Music Sampler (cf. below for a download link), you need nothing else.
module | minimum version | note |
---|---|---|
Cython | 0.24 | to compile Kivy |
Kivy | 1.9.1 | some features require to build/install with flag USE_SDL2=1 |
Markdown | 2.6.6 | for documentation only |
pydub | 0.16.4 | |
Pygame | 1.9.2.dev1 | used by Kivy |
Pygments | 2.1.3 | for documentation only |
sounddevice | 0.3.3 | |
transitions | 0.4.1 | |
PyYAML | 3.11 |
The project is also available via pip
:
pip install music_sampler
The program makes use of fonts "Symbola" and "Ubuntu" (Regular / Bold), that
must be available on your system, as well as the portaudio
library:
sudo apt-get install ttf-ancient-fonts ttf-ubuntu-font-family portaudio
To compile Kivy with the SDL2 library, you need some packages:
sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
Following processed worked to install music sampler in a Windows machine:
In a command shell (cmd.exe
), run:
pip install music_sampler
pip install docutils pygments pypiwin32 PySDL2 kivy.deps.sdl2 kivy.deps.glew
Install ffmpeg (64bit, static)
and put the content of folder bin
in the same folder as music and configs.
Write a run.bat
file with:
@echo off
music_sampler
Run this run.bat
when you need it.
A compiled version can be created with pyinstaller
:
pyinstaller music_sampler.spec
music_sampler
can also be found
in the same folder
(beware, it might not be up-to-date, please run the program with -V
to see
its corresponding version)The whole job consists in preparing all the transitions in the configuration
file config.yml
.
The program should then be run in the folder in which the configuration file lies (see below for an advanced use). A window with a keyboard appears. The orange circle in the upper-right corner of the keyboard becomes green one every music is loaded (or red in case of problem). A key is semi-transparent and crossed when it is not usable at the moment: either because a music handled by this key is not loaded yet (it may take some time when the program launches), or because it has an action running.
An example configuration file is given with some keys and transitions. The structure of the file (explained more in details below) should be easy to understand just by looking at it.
Music Sampler
won't rerun the actions associated to that key if they are not already
finished.All the options below are optional; usually, running the program in the correct folder is enough. Most of the parameters can be defined also in the config file. The command line parameters always take precedence.
-h, --help
: shows a list of available options-c CONFIG, --config CONFIG
: gives the configuration file to load (by
default, config.yml
in the current folder).-p MUSIC_PATH, --music-path MUSIC_PATH
: gives the path to find the musics
(by default, the current folder)--no-debug, --debug
: show debug informations in the terminal (disabled by
default)-V, --version
: show current version and exit (only for the compiled
version)-L, --language
: change application language. Current languages: fr, en
(default 'fr')--focus-warning, --no-focus-warning
: show / don't show warning when focus gets
lost (default is to show it)The following options are reserved for a more advanced use of Music Sampler, or in case of problem with the standard configuration:
--no-builtin-mixing, --builtin-mixing
: make the sound mixing locally. By
default, Music Sampler will let the system do it and open one channel per
music loaded. Use it only if the system cannot handle it.-l LATENCY, --latency LATENCY
: "low", "high" or a number of seconds
(default "high")-b BLOCKSIZE, --blocksize BLOCKSIZE
: Number of frames for each mixing
step. 0 (default) lets the program choose.-f FRAME_RATE, --frame-rate FRAME_RATE
: default 44100Hz-x CHANNELS, --channels CHANNELS
: Number of channels per music (default
2, for stereo)-s SAMPLE_WIDTH, --sample-width SAMPLE_WIDTH
: number of bytes per frame
(default 2).--device DEVICE
: select another sound device.--list-devices
: list available sound devices.--load-all-musics
: load all the music when starting (default True)-- ARGS
: arguments for Kivy library.Warning: the format of the configuration file is still a work in progress and may change without ensuring backward compatibility
The file config.yml
uses yaml syntax. Categories and sub-categories are
handled by space indentations (no tabs). Symbol #
may be used for comments.
In case of error in the configuration file, an error message will show up. Depending on its severity, Music Sampler may try to continue (ignoring corresponding problems) or abort.
The file contains several sections:
config:
...
aliases:
...
music_properties:
...
key_properties:
...
keys:
...
config
The config section lets you store configuration parameters that you would
normally use in the command line parameters. The '-' in the long parameter name
should be replaced by '_' (e.g. '--music-path' -> 'music_path'). For toggles
(debug
, focus_warning
, builtin_mixing
) use the version without 'no-' and
specify true
or false
as value. Note that command line arguments always take
precedence.
music_properties
This section lets you define global properties for the musics.
"music1.mp3":
name: My favorite music
gain: 1.4
Music "music1.mp3" is named "My favorite music". She is loaded at 140% of its normal volume.
"music2.mp3":
gain: 0.7
Music "music2.mp3" is loaded at 70% of its normal volume.
name: My music
User-friendly name of the music, used in the interface
instead of the filename.
gain: x
Loads the music with that initial gain x. This lets you equalize all
your music at desired level, independently of the volume afterwards.
key_properties
: drawing and properties of keysThis section lets you describe the drawing of the key: color, description. By default, a key assigned to one or more actions is shown in green
'ESC':
description:
-
- STOP!
color: [255, 0, 0]
repeat_delay: 2
The "esc" key is red, and text "STOP!" is shown on the second line. The key is protected for 2 seconds after each stroke.
description
: the text on the key. Each item is shown on a line (no automatic
line break). First line is shown just next to the "key" name and is in bold.
On a standard screen, you may have about 3 lines visible (including the first
one)color: [r, g, b]
: the key color. r, g and b are the proportions respectively
of red, green and blue, and each value must be between 0 and 255repeat_delay: x
(default 0) : protection delay. Once all its actions are
done, the key will remain disabled (semi-transparent and crossed) for that
amount of time (in seconds).actions: list
: List of actions to run with the key.common
key propertyA special entry common
has its properties applying to all the keys. They can
be overriden individually.
keys
: actions related to keysThis section lets you describe for each key, the list of actions associated to
it. Note that except for wait
and some particular cases (see below), all the
actions are almost instantaneous.
This section is deprecated and replaced by an actions
key containing a list
in key_properties
section for each key.
'a':
- play:
file: "music1.mp3"
volume: 70
start_at: 10
- wait:
duration: 5
- stop:
file: "music1.mp3"
fade_out: 2
Runs music "music1.mp3" at 70% of its maximum volume, at 10 seconds from the start, then stops the music 5 seconds later with a 2 seconds fade out.
'b':
- stop:
file: "music1.mp3"
fade_out: 5
wait: false
- play:
file: "music2.mp3"
fade_in: 5
Make a cross fade of 5 seconds between "music1.mp3" and "music2.mp3"
'c':
- stop:
file: "music1.mp3"
fade_out: 5
wait: true
- wait:
duration: 2
- play:
file: "music2.mp3"
- seek:
file: "music2.mp3"
delta: false
value: 60
Stops music "music1.mp3" with a 5 seconds fade out, waits for the end of the fade out, plus 2 seconds, and then runs "music2.mp3" skipping the first minute.
'd':
- volume:
file: "music1.mp3"
value: 50
- play:
file: "noise.mp3"
loop: 1
- wait:
file: "noise.mp3"
- volume:
file: "music1.mp3"
value: 100
Lower volume of "music1.mp3" while "noise.mp3" is played above it (twice). Then the volume of the music comes back to normal.
'e':
- pause:
file: "music1.mp3"
- wait:
duration: 10
- unpause:
file: "music1.mp3"
- seek:
file: "music1.mp3"
delta: true
value: 5
Pauses "music1.mp3" for 10 seconds and reruns it afterward, seeking to 5 seconds later.
comment
: does nothing, but shows a comment in the action windowsmessage: "some text"
the message to showplay
: start a music. Music Sampler only runs a music once (if you want to
have it playing several time concurrently, duplicate it or make symbolic
link). Parameters:file: "music.mp3"
gives the played music (relative path).fade_in: x
(optional) runs the music with x seconds fade in.volume: x
(optional, default 100) sets the volume of the music.loop: x
(optional, default 0) music should be repeated x times. Indicate
-1 for infinite loop. Note: x is the number of repetitions, thus the music
is actually played x+1 times.start_at: x
(optional, default 0) start music skipping the first x
seconds.restart_if_running: true/false
(optional, default false) if the music is
already running, stop it and restart it.stop
: stops a given music. Parameters:file: "music.mp3"
(optional) gives the music to stop. If no music is
given, stops all of them.fade_out: x
(optional) stops music with a x seconds fade out.wait: true/false
(optional, default: false) when stopping with a fade
out, wait for the fade to finish before continuing to the next actions. If
the music stops naturally before the en of the fade out, the wait stops
there too. When several musics are stopped in fade out, the wait
only
waits for the last one in the playlist (which can finish naturally before
the others).set_wait_id: name
(optional, useless when wait
is false) sets an id
name
to the wait (see interrupt_wait
). Any valid string may be used.volume
: change the volume of a given music. Parameters:file: "music.mp3"
(optional) which music to change. If no music is
given, the global volume is changed.delta: true/false
(optional, default false) add/remove to the volume
instead of setting an absolute value.value: x
if delta is false, sets the volume to x%. Note that this factor
is applied to the music already loaded (with the initial gain). If delta
is true, adds or remove the percentage to the current volume.fade: x
(optional) the volume change is applied with a x seconds fade.pause
: pause a music. Parameters:file: "music.mp3"
(optional) gives the music to pause. If no music is
given, it applies to all playing musics.unpause
: unpause a music. Parameters:file: "music.mp3"
(optional) gives the msuic to unpause. If no music is
given, it applies to all paused musics.wait
: wait for some time or for an event. Parameters:file: "music.mp3"
(optional) wait for the end of music "music.mp3"duration: x
(optional) wait x seconds. If file
and duration
are
given, wait the end of the music PLUS the duration
.set_wait_id: name
(optional) gives an id to the wait event (see
interrupt_wait
). The id can be any valid string.
Note again that this action is one of the only action that is not almost
instantaneous. Use it wherever you need to make some time adjustments for other
actions.seek
: seek to a specific position in a music. Parameters:file: "music.mp3"
(optional) gives the music to seek. If no music is
given, applies to all playing musics.delta: true/false
(optional, default false) If delta
is true, the time
seek is relative. Otherwise, it is absolute.value: x
If delta
is true, then moves the music forward or backward by
x seconds. If delta is false, the music goes to that position. If the
music is fading (fade in or volume fade), the effect is immediately
interrupted. If the music is fading out, the "seek" is ignored. In case of
loop
, a relative seek may jump to previous or next loop if possible,
while an absolute seek will jump to a position in the current loop.stop_all_actions:
Interrupts all the running and pending actions. Note that
a started music (even with a loop
option) is the result of an action that is
already finished and thus will keep playing (see stop
for that). Parameters:other_only: true/false
(optional, default false): if other_only
is
true, the interruption is valid for all keys except the one that ran the
action. When false, it is thus useless to add actions after that one.interrupt_wait
: stop a wait event (normal wait
or fade out wait). The keys
that were waiting will move to the next actions. Parameters:wait_id: name
(optional) gives the id of the wait
to interrupt
(defined with set_wait_id
, see actions wait
and stop
). If not given,
interrupts all wait events.pause_wait
: pauses a wait event (only for a wait with duration). The key
that were waiting will keep waiting until the wait
is unpaused. Parameters:wait_id: name
(optional) gives the id of the wait
to pause. If not
given, pauses all compatible wait events.unpause_wait
: unpauses a paused wait event (only a wait with duration). The
countdown will resume for the corresponding keys. Parameters:wait_id: name
(optional) gives the id of the wait
to unpause. If not
given, unpauses all compatible wait events.reset_wait
: resets a wait counter (only a wait with duration). If the wait
was paused, it will stay paused and start at the beginning once it is
unpaused. Parameters:wait_id: name
(optional) gives the id of the wait
to reset. If not
given, resets all compatible wait events.run_command
: Run a command. Parameters:command: my_command
: Gives the command to run.wait: true/false
(optional, default false) if true, waits for the
command to finish (this wait is not interruptible by interrupt_wait)load_music/unload_music
: load/unload a music from memory. Useful
with load_all_musics
option onlyaliases
: define aliasesIt is possible to define some aliases for the parameters. Those aliases are internal to the configuration file. To give a nice name to a music, see "music_properties".
The aliases syntax is the following:
aliases:
alias1:
param: value
alias2:
param1: value1
param2: value2
You can then use in other places of the configuration file a special argument
include: alias1
or include: [alias1, alias2]
instead of param: value
. In
the case of several aliases that have identical elements, only the last one is
kept. In all cases, a value defined outside of an include takes precedence. See
below examples.
aliases:
music1:
file: "path/to/my/favourite/music.mp3"
keys:
'a':
play:
include: music1
music1
is now an alias for file: "path/to/my/favourite/music.mp3"
. You can
use include: music1
at any place where you would have written file:
"path/to/my/favourite/music.mp3"
. Aliases cannot be used in section
"music_properties".
aliases:
blue:
color: [0, 0, 255]
keys_properties:
'a':
description:
-
- blue key
include: blue
blue
is an alias for color [0, 0, 255]
. Wherever you need to specify color:
[0, 0, 255]
, you may write include: blue
instead.
aliases:
long_time:
duration: 42
keys:
'b':
wait:
include: long_time
play:
file: "music1.mp3"
long_time
is an alias for a 42 seconds duration. Instead of duration: 42
,
you may use include: long_time
.
You'll find below a list of possible problems, and a possible solution. If you find some other problems, please contact the author.
It is usually a syntax error in the config file. In that case, the terminal should give some informations.
It may be a latency problems (with slow computers). Try to adapt it to a higher value (~0.1 seconds)
The system cannot mix the musics by itself. You may have a look at the device
list (--list-devices
) and choose another. You may also try the integrated
mixer, but the result may not be very fluid (you will certainly need to adjust
blocksize and latency parameters if you do that)
If your system uses PulseAudio, it may be a configuration problem for the ALSA
plugin. In that case, try to put the following configuration in
/etc/asound.conf
and restart your system. This is an empirical solution that
seems to have worked, there is no garanty that it will!
pcm.!default {
type pulse
fallback "sysdefault"
hint {
show on
description "Default ALSA Output (currently PulseAudio Sound Server)"
}
}
ctl.!default {
type pulse
fallback "sysdefault"
}
Exception in thread Thread-1:
Traceback (most recent call last):
File "threading.py", line 914, in _bootstrap_inner
File "threading.py", line 862, in run
File "kivy/input/providers/mtdev.py", line 219, in _thread_run
File "kivy/lib/mtdev.py", line 131, in __init__
PermissionError: [Errno 13] Permission denied: '/dev/input/event6'
This is a device permission error. It can be safely ignored.
The musics in the examples come from Jamendo. The complete version of those musics are available for free for a non-commercial use:
The crocodile noise comes from Universal-Soundbank.
This program was developped originaly to help handling music for shows of the circus company Les pieds jaloux. With no available sound manager, the artists sometimes had to run from the scene to make the sound transitions, making as little interaction as possible with the computed (one key).
Music Sampler est un lecteur de musique qui permet de pré-programmer des transitions musicales, qui peuvent ensuite être lancées à l'aide d'un simple appui sur une touche.
(Voir la section suivante pour Windows)
libav-tools
(debian) :sudo apt-get install libav-tools
Si vous utilisez la version compilée de Music Sampler (cf. plus bas pour un lien de téléchargement), il n'y a rien d'autre à installer.
module | version minimale | commentaire |
---|---|---|
Cython | 0.24 | pour compiler Kivy |
Kivy | 1.9.1 | certaines fonctionnalités nécessitent de compiler/installer avec USE_SDL2=1 |
Markdown | 2.6.6 | pour la documentation uniquement |
pydub | 0.16.4 | |
Pygame | 1.9.2.dev1 | utilisée par Kivy |
Pygments | 2.1.3 | pour la documentation uniquement |
sounddevice | 0.3.3 | |
transitions | 0.4.1 | |
PyYAML | 3.11 |
Le projet est également disponible via pip
:
pip install music_sampler
Le programme utilise les polices Symbola
et Ubuntu
(Regular / Bold), qui
doivent être disponibles, et la librairie portaudio
:
sudo apt-get install ttf-ancient-fonts ttf-ubuntu-font-family portaudio
Pour compiler kivy avec la librairie SDL2, il faut certains paquets installés:
sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
Le processus suivant a permis d’installer music sampler sous windows:
Dans une invite de commande (cmd.exe
), lancer:
pip install music_sampler
pip install docutils pygments pypiwin32 PySDL2 kivy.deps.sdl2 kivy.deps.glew
Télécharger ffmpeg (64bit, static)
et mettre le contenu du dossier bin
dans le dossier avec les musiques
Écrire un fichier run.bat
avec:
@echo off
music_sampler
Lancer run.bat
pour démarrer le programme.
Une version compilée peut être créée avec pyinstaller:
pyinstaller music_sampler.spec
music_sampler
peut également être téléchargée
dans le même
dossier
(attention, elle n'est pas toujours forcément à jour, lancer le programme avec
-V
pour voir la version compilée)Tout le travail consiste à préparer les transitions dans le fichier de
configuration config.yml
.
Lancer ensuite le programme dans le dossier où se situe le fichier de configuration (voir plus bas pour une utilisation avancée). Une fenêtre représentant un clavier apparaît. Le rond orange dans le coin du clavier devient vert lorsque tout est chargé, ou rouge en cas de problème. Une touche grisée et barrée représente une touche non-utilisable pour le moment : soit parce que la musique est en cours de chargement (au lancement du programme, cela peut prendre un peu de temps sur certaines machines), soit parce qu'il y a une action en cours.
Un exemple de fichier de configuration est fourni, avec un certain nombre de touches et de transitions programmées (pour les trois musiques fournies), la syntaxe du fichier (expliquée plus bas) se comprend aisément en le regardant. De plus, certaines touches (par exemple 'ÉCHAP' pour tout arrêter) peuvent être gardées d'une fois sur l'autre.
Toutes les options au lancement sont facultatives ; la plupart du temps lancer
le programme dans le bon dossier suffit. La plupart d'entre elles peuvent être
définies également dans le fichier de config (à part --config
bien sûr). Les
arguments en ligne de commande ont toujours la priorité.
-h, --help
: affiche une liste des options disponibles.-c CONFIG, --config CONFIG
: précise le fichier de configuration à charger
(par défaut, config.yml qui se trouve dans le dossier où est lancé
music_sampler).-p MUSIC_PATH, --music-path MUSIC_PATH
: précise le chemin des musiques
(par défaut, le dossier courant).--no-debug, --debug
: Affiche les informations de déboggage (désactivé par
défaut)-V, --version
: affiche la version courante et quitte (utilisable
uniquement pour la version compilée).-L, --language
: change la langue de l'application. Actuellement: fr, en
(par défaut 'fr')--focus-warning, --no-focus-warning
: Afficher / Ne pas afficher
d'avertissement lorsque l'application perd le focus (activé par défaut).Les options suivantes sont plutôt réservées à un usage avancé de music_sampler, ou en cas de problème avec la configuration standard :
--no-builtin-mixing, --builtin-mixing
Effectue en interne le mixage des
sons. Par défaut, music_sampler confie le mixage au système : n'activer
cette option que si le système n'y parvient pas.-l LATENCY, --latency LATENCY
: latence. Préciser "low", "high" ou un
nombre de secondes (par défaut, "high")-b BLOCKSIZE, --blocksize BLOCKSIZE
: taille des blocs. Nombre de frames
pour chaque étape du mixeur. 0 (par défaut) signifie que le programme
choisit lui-même le nombre qui lui convient.-f FRAME_RATE, --frame-rate FRAME_RATE
: fréquence d'échantillonnage pour
jouer les musiques. Par défaut : 44100-x CHANNELS, --channels CHANNELS
: nombre de canaux par musique (2 par
défaut, pour une écoute stéréo)-s SAMPLE_WIDTH, --sample-width SAMPLE_WIDTH
: largeur d'échantillonnage
(nombre d'octets pour chaque frame). Par défaut : 2.--device DEVICE
: sélectionne le périphérique de son.--list-devices
: Affiche la liste des périphériques de son disponibles.--load-all-musics
: Charger toutes les musiques au démarrage (défaut: True)-- ARGS
: Arguments à passer à la librairie Kivy.ATTENTION : le format du fichier de configuration est susceptible d'évoluer, sans garantie de rétrocompatibilité.
Le fichier config.yml utilise la syntaxe yaml. Les catégories et sous-catégories
sont gérées par l'indentation par des espaces (mais PAS par des tabulations !).
le #
est un symbole de commentaire : tout ce qui suit ce symbole sur une ligne
est ignoré.
En cas d'erreur dans le fichier de configuration, un message d'erreur s'affiche dans le terminal. Selon la "gravité" de l'erreur, music_sampler se lance en ignorant les actions erronées (en colorant éventuellement la touche en noir), ou ne se lance pas du tout.
Le fichier contient plusieurs sections :
config:
...
aliases:
...
music_properties:
...
key_properties:
...
keys:
...
config
La section config permet d'enregistrer les paramètres habituellement donnés en
ligne de commande. Les '-' dans le nom du paramètre long doivent être remplacés
par des '_' (par exemple '--music-path' -> 'music_path'). Pour les switches
(debug
, focus_warning
, builtin_mixing
), utilisez la version sans le 'no-'
et spécifiez true
/ false
en valeur. Notez que les arguments donnés en ligne
de commande sont toujours prioritaires sur les valeurs du fichier.
music_properties
: propriétés des musiquesCette section sert à définir des propriétés globales des musiques.
"music1.mp3":
name: My favorite music
gain: 1.4
La musique "music1.mp3" est désignée par le nom "My favorite music". Elle est chargée à 140% de son volume normal.
"music2.mp3":
gain: 0.7
La musique "music2.mp3" est chargée à 70% de son volume normal.
name: My music
La musique sera désignée (dans les actions, dans le
terminal) comme "My music" au lieu du chemin du fichier. Par exemple le cadre
des actions affichera "starting « My music » at volume 100%". Attention, cela
ne fait pas office d'alias dans le fichier de configuration (voir la section
aliases). gain: x
Charge la musique avec un gain de x (multiplicatif). Utiliser la
commande "volume" pour changer ponctuellement le volume (0 à 100%) au cours de
l'écoute.key_properties
: affichage et propriétés des touchesCette section sert à décrire l'affichage à l'écran des touches : couleur et texte. Par défaut, une touche "attribuée" à une ou plusieurs actions s'affiche en vert.
'ESC':
description:
-
- STOP !
color: [255, 0, 0]
repeat_delay: 2
La touche échap est de couleur rouge, et le texte "STOP !" est affiché sur la deuxième ligne. Si on appuie deux fois sur la même touche à moins de deux secondes d'intervalle, le second appui est ignoré.
description
: le texte qui s'affiche, à côté du "nom" de la touche. Il faut
mettre un tiret pour une ligne de texte (pas de retour à la ligne
automatique). La première ligne correspond à celle de la lettre associée à la
touche, aussi il vaut mieux souvent la laisser vide, ou ne mettre que très peu
de texte (voir l'exemple ci-dessus). Sur un écran de taille raisonnable, on
peut compter 3 lignes (incluant la première) pour une touche "standard".color: [r, g, b]
: la couleur de la touche. r, g et b sont les proportions
de rouge, vert et bleu, et doivent être des entiers entre 0 et 255.repeat_delay: x
(par défaut : 0) : délai de "sécurité" en cas d'appuis
successifs sur la touche. La touche est désactivée (grisée et barrée) pendant
toute la durée des actions puis le délai de x secondes.actions: liste
: Liste des actions à effectuer en appuyant sur la touche.common
Une entrée spéciale common
s'applique à toutes les touches. Les propriétés
définies dans cette entrée peuvent être modifiées individuellement.
keys
: actions sur les touchesCette section sert à décrire, pour chaque touche, la liste des actions
successives. Notez que la plupart des actions (hors wait
et quelques cas
particuliers, voir plus bas) sont quasi-instantanées.
Cette section est obsolète et remplacée par une clé actions
contenant une
liste dans la section key_properties
pour chaque touche.
'a':
- play:
file: "music1.mp3"
volume: 70
start_at: 10
- wait:
duration: 5
- stop:
file: "music1.mp3"
fade_out: 2
Lance la musique "music1.mp3" à 70% de son volume max, à 10 secondes du début, puis au bout de 5 secondes coupe la musique avec un fondu de 2 secondes.
'b':
- stop:
file: "music1.mp3"
fade_out: 5
wait: false
- play:
file: "music2.mp3"
fade_in: 5
Effectue un fondu enchaîné de 5 secondes entre "music1.mp3" et "music2.mp3"
'c':
- stop:
file: "music1.mp3"
fade_out: 5
wait: true
- wait:
duration: 2
- play:
file: "music2.mp3"
- seek:
file: "music2.mp3"
delta: false
value: 60
Coupe la musique "music1.mp3" avec un fondu de 5 secondes, attend la fin du fondu, puis attend encore deux secondes et lance la musique "music2.mp3", au temps d'une minute.
'd':
- volume:
file: "music1.mp3"
value: 50
- play:
file: "noise.mp3"
loop: 1
- wait:
file: "noise.mp3"
- volume:
file: "music1.mp3"
value: 100
Baisse le volume de "music1.mp3" pendant que le son "noise.mp3" est joué par dessus (deux fois). Le volume revient à la normale une fois que les deux écoutes du son "noise" sont terminées.
'e':
- pause:
file: "music1.mp3"
- wait:
duration: 10
- unpause:
file: "music1.mp3"
- seek:
file: "music1.mp3"
delta: true
value: 5
Met en pause la musique "music1.mp3" pour 10 secondes et la relance après, en avançant de 5 secondes dans la musique.
comment
: ne fait aucune action, mais affiche un message dans la zone des actionsmessage: "some text"
le message à afficherplay
: joue une musique. music_sampler ne joue qu'une musique à la fois : si
la musique demandée est déjà en train d'être jouée, elle n'est pas relancée ou
jouée "par dessus". Paramètres :file: "music.mp3"
précise la musique jouée (chemin relatif).fade_in: x
(facultatif) lance la musique avec un fondu au départ de x
secondes.volume: x
(facultatif, défaut : 100) la musique doit être jouée à x% de
son volume max.loop: x
(facultatif, défaut : 0) la musique doit être répétée x fois.
Indiquer -1 pour la répéter indéfiniment. Attention, x est le nombre de
répétitions, donc pour lire trois fois la musique, mettre loop: 2
.start_at: x
(facultatif, défaut : 0) la musique démarre à x secondes du
début.restart_if_running: true/false
(facultatif, défaut : false) la musique
est éventuellement stoppée et redémarrée si nécessairestop
: arrête une musique donnée. Paramètres :file: "music.mp3"
(facultatif) précise la musique à stopper. Si aucune
musique n'est précisée, le stop
s'applique à toutes les musiques.fade_out: x
(facultatif) stoppe la musique avec un fondu de x secondes.wait: true/false
(facultatif, par défaut : false) dans le cas d'un
fondu, attendre la durée du fondu pour faire les actions suivantes. Si la
musique s'arrêtait naturellement avant la fin du fondu, l'attente se
termine lorsque la musique se termine naturellement. Lorsque plusieurs
musiques sont stoppées en fondu, le wait
n'attend que la dernière
musique de la playlist (qui peut se terminer naturellement avant les
autres).set_wait_id: name
(facultatif, inutile lorsque wait
est à false) donne
l'identifiant name
à l'attente de fin du fondu (voir interrupt_wait
).
L'identifiant peut être n'importe quelle chaîne de caractère.volume
: change le volume d'une musique donnée. Paramètres :file: "music.mp3"
(facultatif) précise la musique. Si aucune musique
n'est précisée, la modification s'applique au volume global.delta: true/false
(facultatif, par défaut : false) le volume doit il
être précisé en absolu (false), ou en relatif (true), voir plus bas.value: x
Si delta est à false, met le volume à x% du volume max (x doit
être entre 0 et 100). Ce facteur est appliqué à la musique déjà chargée en
mémoire (voir section "propriétés"), donc le 100% fait référence au volume
de chargement.
Si delta est à true, applique un modificateur de x% au volume (x doit être un
entier signé). Notez qu'une action "+10%" relative ne correspond pas à un
pourcentage du volume actuel, mais du volume "de référence" 100%. Ainsi,
effectuer +10% et -10% en relatif revient bien à 100%.fade: x
(facultatif) le changement de volume est appliqué en fondu sur x
secondes. Il n'y a pas d'attente de la fin du fondu pour lancer les
actions suivantes : au besoin, rajouter un wait
à la main.pause
: met en pause une musique. Paramètres :file: "music.mp3"
(facultatif) précise la musique à mettre en pause. Si
non précisé, s'applique à toutes les musiques.unpause
: relance une musique mise en pause (là où elle en était).
Paramètres :file: "music.mp3"
(facultatif) précise la musique à relancer. Si non
précisé, s'applique à toutes les musiques.wait
: attend un temps donné. Paramètres :file: "music.mp3"
(facultatif) attend la fin de la musique "music.mp3"duration: x
(facultatif) attend x secondes. Si file
et duration
sont
précisés, l'attente dure jusqu'à la fin de la musique PUIS la durée donnée
par duration
.set_wait_id: name
(facultatif) donne l'identifiant name
à l'attente
(voir interrupt_wait
). L'identifiant peut être n'importe quelle chaîne
de caractère.
Notez une fois encore que wait
est quasiment la seule action qui attend
d'avoir terminé pour lancer la commande suivante, toutes les autres sont lancées
successivement mais sans attendre (donc presque simultanément) : ne pas hésiter
à rajouter des commandes d'attente partout où c'est nécessaire.seek
: permet d'aller à un endroit précis dans une musique. Paramètres :file: "music.mp3"
(facultatif) précise la musique. Si aucune musique
n'est précisée, l'action s'applique à toutes les musiques.delta: true/false
(facultatif, défaut : false) Si delta
est true, le
temps est relatif. Si delta est false, le temps est absolu, voir plus bas.value: x
Si delta
est true, alors fait avancer de x secondes dans la
musique (reculer si x est négatif). Si delta est false, alors la lecture
se place à x secondes à partir du début. Si la musique est en train de
faire un fondu (au départ, ou changement de volume), le fondu se "termine
automatiquement" : et la musique est immédiatement au volume final voulu.
Si la musique est en train de se terminer en fondu, le "seek" est ignoré
(un fondu de fin considère la musique comme déjà terminée). En cas de
loop
, si le déplacement est relatif la musique peut éventuellement
passer à la répétition suivante / précédente; sinon, le déplacement se
fait dans la répétition courante.stop_all_actions:
Interrompt toutes les actions en cours et à faire. Notez
qu'une musique lancée (y compris avec une option loop
) est considérée comme
une action "déjà terminée", et ne sera donc pas interrompue (utiliser stop
sans arguments pour stopper toutes les musiques en écoute). Paramètre :other_only: true/false
(facultatif, défaut : false) : si other_only
est true, la commande interrompt uniquement les actions des autres
touches. Sinon, cette commande interrompt également les actions de la
touche actuelle ; dans ce cas il est inutile de mettre des actions à la
suite de celle-ci puisqu'elles seront systématiquement interrompues.interrupt_wait
: interrompt l'attente (de wait
ou fin d'un fondu avec
attente) et passe directement à l'action suivante. Paramètre :wait_id: name
(facultatif) précise l'identifiant du wait
à stopper
(défini par set_wait_id
, voir les actions wait
et stop
). Si absent,
interrompt toutes les attentes.pause_wait
: met une attente en pause (uniquement pour une attente ayant une
durée définie). La touche qui attend cet événement ne continuera pas tant que
l'attente n'est pas reprise. Paramètres :wait_id: name
(facultatif) précise l'identifiant du wait
à mettre en
pause. Si absent, met en pause toutes les attentes compatibles.unpause_wait
: reprend une attente en pause (uniquement pour une attente
ayant une durée définie). Le compte à rebours reprendra pour la touche
correspondante en train d'attendre. Paramètres:wait_id: name
(facultatif) précise l'identifiant du wait
à reprendre.
Si absent, reprend toutes les attentes compatibles.reset_wait
: réinitialise une attente (uniquement pour une attente ayant une
durée définie). Si l'attente est en pause, le compte à rebours ne recommencera
au début que lorsque l'attente sera reprise. Paramètres:wait_id: name
(facultatif) précise l'identifiant du wait
à
réinitialiser. Si absent, réinitialise toutes les attentes compatibles.run_command
: lance une commande. Paramètres :command: my_command
: précise la commande à lancer.wait: true/false
(facultatif, défaut : false) : si wait
est true,
attend que la commande ait fini de s'exécuter.load_music/unload_music
: charger/décharger une musique en mémoire.
Uniquement utile en combinaison avec l’option load_all_musics
.aliases
: définir des aliasIl est possible de définir des alias pour les différents paramètres. Ces alias sont internes au fichier de configuration ; pour afficher un "joli" nom d'une musique, voir plutôt "music_properties".
La syntaxe est la suivante:
aliases:
alias1:
param: value
alias2:
param1: value1
param2: value2
On utilise ensuite, dans le fichier de configuration, include: alias1
ou
include: [alias1, alias2]
à la place de param: value
. Dans le cas de
plusieurs aliases inclus contenant des éléments identiques, seul le dernier est
pris en compte. Dans tous les cas, les alias ne sont pas prioritaires par
rapport aux éventuels paramètres définis là où ils sont inclus. Voir les
exemples ci-dessous.
aliases:
music1:
file: "path/to/my/favourite/music.mp3"
keys:
'a':
play:
include: music1
music1
est désormais un alias pour "path/to/my/favourite/music.mp3"
. À
chaque fois qu'on veut écrire file: "path/to/my/favourite/music.mp3"
, on peut
écrire à la place include: music1
. Attention, dans la section
"music_properties", les alias ne fonctionnent pas, et il faut écrire le nom du
fichier complet.
aliases:
blue:
color: [0, 0, 255]
keys_properties:
'a':
description:
-
- blue key
include: blue
blue
est un alias pour la couleur [0, 0, 255]
. À chaque fois qu'on veut
écrire color: [0, 0, 255]
, on peut écrire include: blue
à la place.
aliases:
long_time:
duration: 42
keys:
'b':
wait:
include: long_time
play:
file: "music1.mp3"
long_time
est un alias pour la durée 42 secondes. Au lieu d'écrire duration:
42
, on peut écrire include: long_time
.
Sont listés ci-dessous une liste de problèmes rencontrés, avec des solutions proposées. Si vous en découvrez d'autre, contactez l'auteur pour les ajouter à la liste.
Il s'agit généralement d'une erreur de syntaxe dans le fichier de config. Dans ce cas, le terminal doit afficher quelques détails sur l'erreur en question (au moins la ligne correspondante).
Il peut s'agir d'un problème de latence (avec certains ordinateurs un peu lents). Essayez de changer la latence (par exemple, 0.1 seconde)
Le système n'arrive pas à mixer les musiques par lui-même. Vous pouvez essayer
de regarder la liste des périphériques de son (--list-devices
) puis en
sélectionner un autre si disponible. Vous pouvez aussi essayer le mixeur intégré
à music_sampler, mais les résultats ne sont pas toujours très fluides (ne pas
hésiter à jouer avec les paramètres avancés comme latency et blocksize).
Si votre système utilise PulseAudio, il peut s'agir d'un problème de
configuration du plugin ALSA. Dans ce cas, essayez de mettre la configuration
suivante dans /etc/asound.conf
, puis redémarrer la machine (solution empirique
qui semble avoir fonctionné, sans garantie !):
pcm.!default {
type pulse
fallback "sysdefault"
hint {
show on
description "Default ALSA Output (currently PulseAudio Sound Server)"
}
}
ctl.!default {
type pulse
fallback "sysdefault"
}
Exception in thread Thread-1:
Traceback (most recent call last):
File "threading.py", line 914, in _bootstrap_inner
File "threading.py", line 862, in run
File "kivy/input/providers/mtdev.py", line 219, in _thread_run
File "kivy/lib/mtdev.py", line 131, in __init__
PermissionError: [Errno 13] Permission denied: '/dev/input/event6'
C'est une erreur de permission d'accès à un périphérique, généré par la librairie kivy. Elle peut être ignorée et n'aura pas d'incidence.
Les extraits de musiques proposés en exemples proviennent de Jamendo. Les musiques (complètes) sont disponibles en libre téléchargement pour un usage non commercial :
Le bruit de crocodile provient de Universal-Soundbank.
Cet outil a été développé à l'origine pour faciliter la gestion du son pour les spectacles de la compagnie circassienne Les pieds jaloux. N'ayant pas d'ingénieur son, les artistes eux-mêmes peuvent alors gérer leur musique lorsqu'ils ne sont pas sur scène : d'où la nécessité de préparer les transitions à l'avance et, au moment de la représentation, de réduire l'interaction avec la machine au minimum (une touche).
3 years ago | 1.6.0 | | commit | shortlog | log | ||
3 years ago | 1.3.1 | | commit | shortlog | log | ||
5 years ago | 1.5.0 | | commit | shortlog | log | ||
7 years ago | 1.4.0 | | commit | shortlog | log | ||
8 years ago | 1.3.0 | | commit | shortlog | log | ||
8 years ago | 1.2.3 | | commit | shortlog | log | ||
8 years ago | 1.2.2 | | commit | shortlog | log | ||
8 years ago | 1.2.1 | | commit | shortlog | log | ||
8 years ago | 1.2.0 | | commit | shortlog | log | ||
8 years ago | 1.1.0 | | commit | shortlog | log | ||
8 years ago | 1.0.2 | | commit | shortlog | log | ||
8 years ago | 1.0.1 | | commit | shortlog | log | ||
8 years ago | 1.0.0 | | commit | shortlog | log |
3 years ago | master | shortlog | log | tree |