]> git.immae.eu Git - perso/Immae/Projets/Python/MusicSampler.git/blame - documentation_en.md
Fix default value in config.yml
[perso/Immae/Projets/Python/MusicSampler.git] / documentation_en.md
CommitLineData
faed2fa8
IB
1[TOC]
2
3# Music Sampler
4
5## Description
6
7Music Sampler is a music player which associates each key on the keyboard to a
8set of actions to run.
9
10## Dependencies and installation
11
12- You need ffmpeg installed. For that, you can use package `libav-tools` (debian):
13
14 sudo apt-get install libav-tools
15
16If you use the compiled version of Music Sampler (cf. below for a download
17link), you need nothing else.
18
19- To use sources, the following modules are required:
20
21| module | minimum version | note |
22| ----------- | ---------------- | ------------------------------------------------------------- |
23| Cython | 0.24 | to compile Kivy |
24| Kivy | 1.9.1 | some features require to build/install with flag `USE_SDL2=1` |
25| Markdown | 2.6.6 | for documentation only |
26| pydub | 0.16.4 | |
27| Pygame | 1.9.2.dev1 | used by Kivy |
28| Pygments | 2.1.3 | for documentation only |
29| sounddevice | 0.3.3 | |
30| transitions | 0.4.1 | |
31| PyYAML | 3.11 | |
32
33The project is also available via `pip`:
34
35 pip install music_sampler
36
37The program makes use of fonts "Symbola" and "Ubuntu" (Regular / Bold), that
38must be available on your system, as well as the `portaudio` library:
39
40 sudo apt-get install ttf-ancient-fonts ttf-ubuntu-font-family portaudio
41
16847231 42To compile Kivy with the SDL2 library, you need some packages:
faed2fa8
IB
43
44 sudo apt-get install libsdl2-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-ttf-dev
45
46cf [Installation
47Kivy](https://kivy.org/docs/installation/installation-linux.html)
48
49## Compiled version
50
51A compiled version can be created with `pyinstaller`:
52
53 :::bash
54 pyinstaller music_sampler.spec
55
56## Downloads
57
58- An example configuration together with some music examples can be found on
59 [owncloud](https://outils.immae.eu/owncloud/index.php/s/kSrIe15G1AiZ9YF)
60- A precompiled version of `music_sampler` can also be found
61 [in the same folder](https://outils.immae.eu/owncloud/index.php/s/kSrIe15G1AiZ9YF/download?path=%2F&files=music_sampler)
62 (beware, it might not be up-to-date, please run the program with `-V` to see
63 its corresponding version)
64
65## Usage
66
67The whole job consists in preparing all the transitions in the configuration
68file `config.yml`.
69
70The program should then be run in the folder in which the configuration file
71lies (see below for an advanced use). A window with a keyboard appears. The
72orange circle in the upper-right corner of the keyboard becomes green one every
73music is loaded (or red in case of problem). A key is semi-transparent and
74crossed when it is not usable at the moment: either because a music handled by
75this key is not loaded yet (it may take some time when the program launches), or
76because it has an action running.
77
78An example configuration file is given with some keys and transitions. The
79structure of the file (explained more in details below) should be easy to
80understand just by looking at it.
81
82### Possible actions
83
84 - Clic on a key: shows the associated actions in the bottom-left block of the
85 app.
86 - Key stroke: if available, runs the actions associated to this key. When a
87 key has currently running actions, his surround is black. Note that an
88 action like "play a music" is almost instantaneous as it is considered
89 "done" as soon as the music started playing.
90 To prevent accidents in case of repeated stroke on a key, `Music Sampler`
91 won't rerun the actions associated to that key if they are not already
92 finished.
93 - Ctrl+C or Ctrl+Q: leaves the program.
94 - Ctrl+R: reloads the configuration file
95
96### Options available at launch
97
98All the options below are optional; usually, running the program in the correct
16847231
IB
99folder is enough. Most of the parameters can be defined also in the config file.
100The command line parameters always take precedence.
faed2fa8
IB
101
102 * `-h, --help`: shows a list of available options
103 * `-c CONFIG, --config CONFIG`: gives the configuration file to load (by
104 default, `config.yml` in the current folder).
105 * `-p MUSIC_PATH, --music-path MUSIC_PATH`: gives the path to find the musics
106 (by default, the current folder)
16847231
IB
107 * `--no-debug, --debug`: show debug informations in the terminal (disabled by
108 default)
faed2fa8
IB
109 * `-V, --version`: show current version and exit (only for the compiled
110 version)
111 * `-L, --language`: change application language. Current languages: fr, en
112 (default 'fr')
16847231
IB
113 * `--focus-warning, --no-focus-warning`: show / don't show warning when focus gets
114 lost (default is to show it)
faed2fa8
IB
115
116The following options are reserved for a more advanced use of Music Sampler, or
117in case of problem with the standard configuration:
118
16847231
IB
119 * `--no-builtin-mixing, --builtin-mixing`: make the sound mixing locally. By
120 default, Music Sampler will let the system do it and open one channel per
121 music loaded. Use it only if the system cannot handle it.
faed2fa8
IB
122 * `-l LATENCY, --latency LATENCY`: "low", "high" or a number of seconds
123 (default "high")
124 * `-b BLOCKSIZE, --blocksize BLOCKSIZE`: Number of frames for each mixing
125 step. 0 (default) lets the program choose.
126 * `-f FRAME_RATE, --frame-rate FRAME_RATE`: default 44100Hz
127 * `-x CHANNELS, --channels CHANNELS` : Number of channels per music (default
128 2, for stereo)
129 * `-s SAMPLE_WIDTH, --sample-width SAMPLE_WIDTH`: number of bytes per frame
130 (default 2).
131 * `--device DEVICE` : select another sound device.
132 * `--list-devices` : list available sound devices.
133 * `-- ARGS` : arguments for Kivy library.
134
135## Configure keys
136
137**Warning: the format of the configuration file is still a work in progress and
138may change without ensuring backward compatibility**
139
140The file `config.yml` uses yaml syntax. Categories and sub-categories are
141handled by space indentations (no tabs). Symbol `#` may be used for comments.
142
143In case of error in the configuration file, an error message will show up.
144Depending on its severity, Music Sampler may try to continue (ignoring
145corresponding problems) or abort.
146
147The file contains several sections:
148
149 :::yaml
16847231
IB
150 config:
151 ...
152
faed2fa8
IB
153 aliases:
154 ...
155
156 music_properties:
157 ...
158
159 key_properties:
160 ...
161
162 keys:
163 ...
164
16847231
IB
165### `config`
166
167The config section lets you store configuration parameters that you would
168normally use in the command line parameters. The '-' in the long parameter name
169should be replaced by '_' (e.g. '--music-path' -> 'music_path'). For toggles
170(`debug`, `focus_warning`, `builtin_mixing`) use the version without 'no-' and
171specify `true` or `false` as value. Note that command line arguments always take
172precedence.
faed2fa8
IB
173
174### `music_properties`
175
176This section lets you define global properties for the musics.
177
178#### Examples
179
180 :::yaml
181 "music1.mp3":
182 name: My favorite music
183 gain: 1.4
184Music "music1.mp3" is named "My favorite music". She is loaded at 140% of its
185normal volume.
186
187 :::yaml
188 "music2.mp3":
189 gain: 0.7
190
191Music "music2.mp3" is loaded at 70% of its normal volume.
192
193#### List of available options
194- `name: My music` User-friendly name of the music, used in the interface
195 instead of the filename.
196
197- `gain: x` Loads the music with that initial gain x. This lets you equalize all
198 your music at desired level, independently of the volume afterwards.
199
200### `key_properties`: drawing and properties of keys
201
202This section lets you describe the drawing of the key: color, description. By
203default, a key assigned to one or more actions is shown in green
204
205#### Examples
206
207 :::yaml
208 'ESC':
209 description:
210 -
211 - STOP!
212 color: [255, 0, 0]
213 repeat_delay: 2
214
215The "esc" key is red, and text "STOP!" is shown on the second line. The key is
216protected for 2 seconds after each stroke.
217
218#### List of availale options
219- `description`: the text on the key. Each item is shown on a line (no automatic
220 line break). First line is shown just next to the "key" name and is in bold.
221 On a standard screen, you may have about 3 lines visible (including the first
222 one)
223- `color: [r, g, b]`: the key color. r, g and b are the proportions respectively
224 of red, green and blue, and each value must be between 0 and 255
225- `repeat_delay: x` (default 0) : protection delay. Once all its actions are
226 done, the key will remain disabled (semi-transparent and crossed) for that
227 amount of time (in seconds).
228
229### `keys` : actions related to keys
230
231This section lets you describe for each key, the list of actions associated to
232it. Note that except for `wait` and some particular cases (see below), all the
233actions are almost instantaneous.
234
235
236#### Examples
237
238 :::yaml
239 'a':
240 - play:
241 file: "music1.mp3"
242 volume: 70
243 start_at: 10
244 - wait:
245 duration: 5
246 - stop:
247 file: "music1.mp3"
248 fade_out: 2
249
250Runs music "music1.mp3" at 70% of its maximum volume, at 10 seconds from the
251start, then stops the music 5 seconds later with a 2 seconds fade out.
252
253 :::yaml
254 'b':
255 - stop:
256 file: "music1.mp3"
257 fade_out: 5
258 wait: false
259 - play:
260 file: "music2.mp3"
261 fade_in: 5
262
263Make a cross fade of 5 seconds between "music1.mp3" and "music2.mp3"
264
265 :::yaml
266 'c':
267 - stop:
268 file: "music1.mp3"
269 fade_out: 5
270 wait: true
271 - wait:
272 duration: 2
273 - play:
274 file: "music2.mp3"
275 - seek:
276 file: "music2.mp3"
277 delta: false
278 value: 60
279Stops music "music1.mp3" with a 5 seconds fade out, waits for the end of the
280fade out, plus 2 seconds, and then runs "music2.mp3" skipping the first minute.
281
282 :::yaml
283 'd':
284 - volume:
285 file: "music1.mp3"
286 value: 50
287 - play:
288 file: "noise.mp3"
289 loop: 1
290 - wait:
291 file: "noise.mp3"
292 - volume:
293 file: "music1.mp3"
294 value: 100
295
296Lower volume of "music1.mp3" while "noise.mp3" is played above it (twice). Then
297the volume of the music comes back to normal.
298
299 :::yaml
300 'e':
301 - pause:
302 file: "music1.mp3"
303 - wait:
304 duration: 10
305 - unpause:
306 file: "music1.mp3"
307 - seek:
308 file: "music1.mp3"
309 delta: true
310 value: 5
311
312Pauses "music1.mp3" for 10 seconds and reruns it afterward, seeking to 5 seconds
313later.
314
315#### List of all the actions:
316- `play` : start a music. Music Sampler only runs a music once (if you want to
317 have it playing several time concurrently, duplicate it or make symbolic
318 link). Parameters:
319 * `file: "music.mp3"` gives the played music (relative path).
320 * `fade_in: x` (optional) runs the music with x seconds fade in.
321 * `volume: x` (optional, default 100) sets the volume of the music.
322 * `loop: x` (optional, default 0) music should be repeated x times. Indicate
323 -1 for infinite loop. Note: x is the number of repetitions, thus the music
324 is actually played x+1 times.
325 * `start_at: x` (optional, default 0) start music skipping the first x
326 seconds.
327 * `restart_if_running: true/false` (optional, default false) if the music is
328 already running, stop it and restart it.
329- `stop` : stops a given music. Parameters:
330 * `file: "music.mp3"` (optional) gives the music to stop. If no music is
331 given, stops all of them.
332 * `fade_out: x` (optional) stops music with a x seconds fade out.
333 * `wait: true/false` (optional, default: false) when stopping with a fade
334 out, wait for the fade to finish before continuing to the next actions. If
335 the music stops naturally before the en of the fade out, the wait stops
336 there too. When several musics are stopped in fade out, the `wait` only
337 waits for the last one in the playlist (which can finish naturally before
338 the others).
339 * `set_wait_id: name` (optional, useless when `wait` is false) sets an id
340 `name` to the wait (see `interrupt_wait`). Any valid string may be used.
341- `volume` : change the volume of a given music. Parameters:
342 * `file: "music.mp3"` (optional) which music to change. If no music is
343 given, the global volume is changed.
344 * `delta: true/false` (optional, default false) add/remove to the volume
345 instead of setting an absolute value.
346 * `value: x` if delta is false, sets the volume to x%. Note that this factor
347 is applied to the music already loaded (with the initial gain). If delta
348 is true, adds or remove the percentage to the current volume.
349 * `fade: x` (optional) the volume change is applied with a x seconds fade.
350- `pause` : pause a music. Parameters:
351 * `file: "music.mp3"` (optional) gives the music to pause. If no music is
352 given, it applies to all playing musics.
353- `unpause` : unpause a music. Parameters:
354 * `file: "music.mp3"` (optional) gives the msuic to unpause. If no music is
355 given, it applies to all paused musics.
356- `wait` : wait for some time or for an event. Parameters:
357 * `file: "music.mp3"` (optional) wait for the end of music "music.mp3"
358 * `duration: x` (optional) wait x seconds. If `file` and `duration` are
359 given, wait the end of the music PLUS the `duration`.
360 * `set_wait_id: name` (optional) gives an id to the wait event (see
361 `interrupt_wait`). The id can be any valid string.
362Note again that this action is one of the only action that is not almost
363instantaneous. Use it wherever you need to make some time adjustments for other
364actions.
365- `seek` : seek to a specific position in a music. Parameters:
366 * `file: "music.mp3"` (optional) gives the music to seek. If no music is
367 given, applies to all playing musics.
368 * `delta: true/false` (optional, default false) If `delta` is true, the time
369 seek is relative. Otherwise, it is absolute.
370 * `value: x` If `delta` is true, then moves the music forward or backward by
371 x seconds. If delta is false, the music goes to that position. If the
372 music is fading (fade in or volume fade), the effect is immediately
373 interrupted. If the music is fading out, the "seek" is ignored. In case of
374 `loop`, a relative seek may jump to previous or next loop if possible,
375 while an absolute seek will jump to a position in the current loop.
376- `stop_all_actions:` Interrupts all the running and pending actions. Note that
377 a started music (even with a `loop` option) is the result of an action that is
378 already finished and thus will keep playing (see `stop` for that). Parameters:
379 * `other_only: true/false` (optional, default false): if `other_only` is
380 true, the interruption is valid for all keys except the one that ran the
381 action. When false, it is thus useless to add actions after that one.
382- `interrupt_wait`: stop a wait event (normal `wait` or fade out wait). The keys
383 that were waiting will move to the next actions. Parameters:
384 * `wait_id: name` : gives the id of the `wait` to interrupt (defined with
385 `set_wait_id`, see actions `wait` and `stop`). To interrupt several waits,
386 use the same action several times.
387- `run_command` : Run a command. Parameters:
388 * `command: my_command` : Gives the command to run.
389 * `wait: true/false` (optional, default false) if true, waits for the
390 command to finish (this wait is not interruptible by interrupt_wait)
391
392### `aliases` : define aliases
393
394It is possible to define some aliases for the parameters. Those aliases are
395internal to the configuration file. To give a nice name to a music, see
396"music_properties".
397
398The aliases syntax is the following:
399
400 :::yaml
401 aliases:
402 alias1:
403 param: value
404 alias2:
405 param1: value1
406 param2: value2
407
408You can then use in other places of the configuration file a special argument
409`include: alias1` or `include: [alias1, alias2]` instead of `param: value`. In
410the case of several aliases that have identical elements, only the last one is
411kept. In all cases, a value defined outside of an include takes precedence. See
412below examples.
413
414#### Examples
415
416 :::yaml
417 aliases:
418 music1:
419 file: "path/to/my/favourite/music.mp3"
420
421 keys:
422 'a':
423 play:
424 include: music1
425
426`music1` is now an alias for `file: "path/to/my/favourite/music.mp3"`. You can
427use `include: music1` at any place where you would have written `file:
428"path/to/my/favourite/music.mp3"`. Aliases cannot be used in section
429"music_properties".
430
431 :::yaml
432 aliases:
433 blue:
434 color: [0, 0, 255]
435
436 keys_properties:
437 'a':
438 description:
439 -
440 - blue key
441 include: blue
442
443`blue` is an alias for color `[0, 0, 255]`. Wherever you need to specify `color:
444[0, 0, 255]`, you may write `include: blue` instead.
445
446 :::yaml
447 aliases:
448 long_time:
449 duration: 42
450
451 keys:
452 'b':
453 wait:
454 include: long_time
455 play:
456 file: "music1.mp3"
457
458`long_time` is an alias for a 42 seconds duration. Instead of `duration: 42`,
459you may use `include: long_time`.
460
461## Troubleshooting
462
463You'll find below a list of possible problems, and a possible solution. If you
464find some other problems, please contact the author.
465
466* The program starts and stops immediately.
467
468It is usually a syntax error in the config file. In that case, the terminal
469should give some informations.
470
471* The music sizzles
472
473It may be a latency problems (with slow computers). Try to adapt it to a higher
474value (~0.1 seconds)
475
476* Impossible to play more than one music at a time.
477
478The system cannot mix the musics by itself. You may have a look at the device
479list (`--list-devices`) and choose another. You may also try the integrated
480mixer, but the result may not be very fluid (you will certainly need to adjust
481blocksize and latency parameters if you do that)
482
483If your system uses PulseAudio, it may be a configuration problem for the ALSA
484plugin. In that case, try to put the following configuration in
485`/etc/asound.conf` and restart your system. This is an empirical solution that
486seems to have worked, there is no garanty that it will!
487
488 pcm.!default {
489 type pulse
490 fallback "sysdefault"
491 hint {
492 show on
493 description "Default ALSA Output (currently PulseAudio Sound Server)"
494 }
495 }
496
497 ctl.!default {
498 type pulse
499 fallback "sysdefault"
500 }
501
502* The terminal shows an error:
503
504 Exception in thread Thread-1:
505 Traceback (most recent call last):
506 File "threading.py", line 914, in _bootstrap_inner
507 File "threading.py", line 862, in run
508 File "kivy/input/providers/mtdev.py", line 219, in _thread_run
509 File "kivy/lib/mtdev.py", line 131, in __init__
510 PermissionError: [Errno 13] Permission denied: '/dev/input/event6'
511
512This is a device permission error. It can be safely ignored.
513
514* For other problems or bug, please see [Bug
515 Tracker](https://git.immae.eu/mantisbt/view_all_bug_page.php?project_id=1&sort=status%2Clast_updated&dir=ASC%2CDESC)
516
517## About
518
519The musics in the examples come from [Jamendo](https://jamendo.com). The
520complete version of those musics are available for free for a non-commercial
521use:
522
523[Short Blues](https://www.jamendo.com/track/340173/short-blues)
524
525[To the Fantasy war](https://www.jamendo.com/track/778560/to-the-fantasy-war)
526
527The crocodile noise comes from
528[Universal-Soundbank](http://www.universal-soundbank.com/).
529
530This program was developped originaly to help handling music for shows of the
531circus company [Les pieds jaloux](http://piedsjaloux.fr/). With no available
532sound manager, the artists sometimes had to run from the scene to make the sound
533transitions, making as little interaction as possible with the computed (one
534key).