# cellphone
Phonetic sonification of a cellular automaton.
# 1 Listen
# 1.1 Live
Click button to play.
Total size 3.3 MiB gzipped, 5.2 MiB unzipped. Requires WASM, SharedArrayBuffer, Web Audio, etc, i.e. a modern web browser.
Tested with:
- Firefox ESR (Debian Bookworm)
- Chromium (Debian Bookworm)
- Fennec F-Droid (Android 7 F-Droid)
- Google Chrome (Android 7)
# 1.2 Stream
14 MiB / hour. Requires streaming server to be online, an internet connection and an MP3 streaming client.
Tested with:
- mpv (Debian Bookworm)
- VLC (Android 7 F-Droid)
# 1.3 Recording
14 MiB, 1 hour. 32kbps 16kHz mono.
# 2 Source
git clone https://code.mathr.co.uk/cellphone.git# 3 Build
# 3.1 Linux
Dependencies can be installed via package manager (e.g. Debian):
sudo apt install build-essential make libsdl2-dev, libsndfile-dev flite1-devRequires support for C11 threads.h.
make# 3.2 Windows
For cross-compilation from Debian. Dependencies (sdl2, sndfile, flite) can be installed via build-scripts or similar.
Requires support for C11 threads.h. Not yet supported by
gcc-mingw as found in Debian Bookworm. Not yet supported by llvm-mingw
based on clang-15. Workaround: use Web version.
make SYSTEM=x86_64-w64-mingw32# 3.3 Web
For cross-compilation from Debian. Dependencies (flite) can be installed via build-scripts or similar.
Requires support for C11 threads.h. Requires
emsdk activated in your shell.
make SYSTEM=emscripten# 4 Run
# 4.1 Linux and Windows
./bin/cellphone [seed [api]]Seed (a number) controls the pseudo-random number generator. Same seeds generate same output.
API controls the sound generation backend. Valid values are:
sdl2uses default SDL2 audio API (e.g. ALSA on Linux, WebAudio on Web, …).ossuses OSS (/dev/dspon Linux and similar systems).wavuses libsndfile to (over)writecellphone.wav.
With the WAV backend you will want to stop the program quickly to avoid filling your hard drive. For example:
timeout 1 ./bin/cellphone `date +%s` wav# 4.2 Web
You need to serve (possibly also gzipped versions of):
www/index.html
www/cellphone.js
www/cellphone.worker.js
www/cellphone.wasm
www/cellphone.tar.gz
Serve the source code corresponding to the compiled code to comply with the license terms.
You need to set some Cross-Origin-*-Policy headers in
the web server configuration to enable SharedArrayBuffer
etc in modern web browsers (these APIs are requied for Emscripten’s
multithreading). Configuration for Nginx:
location /cellphone/ {
add_header Cross-Origin-Opener-Policy 'same-origin';
add_header Cross-Origin-Embedder-Policy 'require-corp';
}
# 5 Stream
Tested streaming from a Raspberry Pi 3, where it uses about 20MiB RAM and 3.5% CPU.
Requires ALSA loopback kernel module:
modprobe snd-aloop
echo snd-aloop >> /etc/modulesThis will be hw:2 or similar at first, but after reboot
the soundcard identifier may change: on my system it became
hw:0.
Create a system user to run the stream source. Make sure it is in the audio group.
adduser cellphone
adduser cellphone audioChoose an unused subdevice ID (by default 8 are available) and
configure ~/.asoundrc following
cellphone/etc/asoundrc, as hw:x,0,y where
x is the snd-aloop card (0 on my Pi after reboot), 0 is the
device, and y is the subdevice ID (0-7). Set the same card
x and subdevice ID y in
cellphone/etc/darkice.cfg following
cellphone/etc/darkice.cfg.sample, but set the device to 1
like hw:x,1,y.
Set your own streaming server details in
cellphone/etc/darkice.cfg, not forgetting the password.
Remember to run
chmod 600 cellphone/etc/darkice.cfgfor security, so that other users can’t see the credentials.
If your cellphone/ directory is not directly under the
home directory, configure the directory in
cellphone/bin/cellphone-stream.
Run make to build the audio generator program
cellphone/bin/cellphone. See the build instructions above
for dependencies.
To start streaming, run cellphone/bin/cellphone-stream.
You need the darkice audio streamer.
If you made an own user, you can stop streaming with
killall -u cellphoneThis terminates all processes running as that user.
You can start streaming automatically on boot by adding to the user’s crontab:
crontab -e
@reboot /home/cellphone/cellphone/bin/cellphone-stream# 6 Legal
cellphone is licensed AGPL-3.0-only:
cellphone -- phonetic sonification of a cellular automaton
Copyright (C) 2023 Claude Heiland-Allen
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Affero General Public License as
published by the Free Software Foundation, version 3 of the
License.
This program 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 Affero General Public License for more details.
You should have received a copy of the GNU Affero General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
All cellphone builds depend on flite, which
is licensed permissively (BSD-style). See COPYING in the
root of the flite repository:
- https://github.com/festvox/flite
- https://github.com/festvox/flite/blob/6c9f20dc915b17f5619340069889db0aa007fcdc/COPYING
All cellphone builds depend on sdl2, which
is licensed permissively (zlib License).
cellphone Linux and Windows builds depend on
libsndfile, which is licensed copyleft (GNU Lesser General
Public License 2.1, LGPL-2.1). See COPYING in the root of
the libsndfile repository:
- https://github.com/libsndfile/libsndfile
- https://github.com/libsndfile/libsndfile/blob/e486f20fd4b1c7490cde84f22635e1c267ae882b/COPYING
cellphone Web builds depend on emscripten
runtime, which is licensed permissively (MIT License). See the licensing
page on the emscripten website: