Package: chime
chimePython sound notifications made easy.Table of contentsTable of contentsMotivationInstallationBasic usageThemingIPython/Jupyter magicException notificationsCommand-line usagePlatform supportI can't hear anything 🙉Setting a default themeCommand-line argumentsAdding a new themeThings to doAcknowledgementsLicenseMotivationI made this because I wanted a simple auditory cue system to tell me when a long-running number crunching script had finished. I didn't want to have to fiddle with the command-line, and also wanted a cross-platform solution. Thus was bornchime!InstallationpipinstallchimeThis library hasno dependencies. The IPython/Jupyter functionality is only imported if you've installed theipythonlibrary. It should work for any Python version above or equal to 3.6.Basic usagechimeputs four functions at your disposal:>>>importchime>>>chime.success()>>>chime.warning()>>>chime.error()>>>chime.info()Calling any of the above functions will play a sound. Note that the sounds are played in asynchronous processes, and are thus non-blocking. Each function should take around 2ms to execute, regardless of the sound length. You're free to use each sound notification in any way you see fit. I'm not your mama.ThemingThe sounds that are played depend on which theme is being used.>>>chime.theme()# return the current theme'chime'Several themes are available:>>>chime.themes()['big-sur','chime','mario','material','pokemon','sonic','zelda']The theme can be changed by passing a theme name to thethemefunction:>>>chime.theme('zelda')A couple of things to note:You can listen to the sounds interactively viathis soundboard, which is made withStreamlit.A random theme will be picked each time you play a sound if you set the theme to'random'.IPython/Jupyter magicLoad the extension as so:%load_extchimeYou can wrap a line:%chimeprint("I'm a line")You can also wrap an entire cell:%%chimeprint("I'm a cell")The magic command will callchime.successwhen the line/cell finishes successfully. Otherwise,chime.erroris called whenever an exception is raised.Exception notificationsIf you runchime.notify_exceptions, thenchime.errorwill be called whenever an exception is raised.chime.notify_exceptions()raiseValueError("I'm going to make some noise")Command-line usageYou can runchimefrom the command-line:$chimeBy default, this will play the success sound. You can also choose which sound to play, like so:$chimeinfoYou can also choose which theme to use:$chimeinfo--themezeldaIf you're using bash, then you can usechimeto notify you when a program finishes:$echo"Hello world!";chimeThis will play the sound regardless of the fact that the first command succeeded or not. If you're running on Windows, then you can run the following equivalent:>echo"Hello world!"&chimePlatform supportUnder the hood,chimeruns a command in the shell to play a.wavfile. The command-line program that is used depends on theplatformthat you're using. Platform information is available in thesys.platformvariableas well as theplatformmodulefrom the standard library. Currently, the supported platforms are:DarwinLinuxWindowsAUserWarningis raised if you run achimesound on an unsupported platform. Feel free to get in touch or issue a pull request if you want to add support for a specific platform. Likewise, don't hesitate if you're encountering trouble with one of the above platforms. I won't bite.I can't hear anything 🙉Did you check if you turned your sound on? Just kidding. 😜This library is designed to be non-invasive. By default, sounds are played asynchronously in unchecked processes. Therefore, if something goes wrong, the process dies silently. If you can't hear anything and you think that the issue is coming fromchime, then set thesyncparameter when you play a sound:>>>chime.info(sync=True)This will play the sound synchronously and issue a warning if something goes wrong, which should allow you to debug the issue. You can also raise an exception instead of sending a warning by setting theraise_errorparameter:>>>chime.info(sync=True,raise_error=True)Note that settingraise_errorwon't do anything ifsyncis set toFalse.Setting a default themeTo change the default theme a configuration file may be created in~/.config/chime/chime.confon Unix or%APPDATA%\chime\chime.inion Windows.For example, to change the default theme to'zelda', the configuration file would contain:[chime]theme=zeldaCommand-line argumentsChime works by running commands in the CLI. For instance,aplayis used on Linux systems, whileafplayis used on Darwin systems. Arguments can be specified by setting theRUN_ARGSvariable. For example, here's how to select a specific sound card, assuming a Linux system usingaplay:>>>chime.RUN_ARGS="--device sysdefault:CARD=PCH"You can also specify this as a default configuration in the configuration file:[chime]cli_args='--device sysdefault:CARD=PCH'At present, it isn't possible to pass CLI arguments on Windows, due to a limitation of thewinsoundmodule.Adding a new themeI have toyed with the idea of allowing users to add their own theme(s), but at the moment I rather keep things minimal. However, I'm happy to integrate new themes into the library. You can propose a new theme byopening a pull requestthat adds the necessary .wav files to thethemesdirectory. A theme is made up of four files:success.wav,warning.wav,error.wav, andinfo.wav. That's all you need to do: the theme will picked up be automatically once the necessary files are provided.Be creative! 👩‍🎨Things to doSome mechanism to automatically callchime.warningwhen a warning occurs.Make it work with a remote machine. For instance a Jupyter Notebook hosted on a remote machine.More themes!AcknowledgementsSpecial thanks toMichael Vlahfor being a gentleman by giving up the "chime" name on PyPI.Thanks to u/Pajke on reddit for helping me debug Windows support.Thanks toDavid Chenfor adding Linux support by suggesting the use ofaplay.Thanks toVincent Warmerdamfor suggesting a command-line interface.Calmcode made avideo introduction to chime❤️Thanks toPaulo S. Costafor contributing in many different ways.Thanks tod34d_m8for adding OpenBSD support.LicenseAs you would probably expect, this isMIT licensed.