{"id":32649526,"url":"https://github.com/atisharma/bellini","last_synced_at":"2026-03-04T13:03:07.395Z","repository":{"id":63201248,"uuid":"292683306","full_name":"atisharma/bellini","owner":"atisharma","description":"A music spectrum analyser and visualisation program for squeezelite","archived":false,"fork":false,"pushed_at":"2023-01-30T22:42:25.000Z","size":1244,"stargazers_count":9,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2023-03-26T01:59:30.664Z","etag":null,"topics":["audio","logitechmediaserver","raspberry-pi","squeezelite"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/atisharma.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2020-09-03T21:25:53.000Z","updated_at":"2023-01-24T10:01:34.000Z","dependencies_parsed_at":"2023-01-31T19:31:32.874Z","dependency_job_id":null,"html_url":"https://github.com/atisharma/bellini","commit_stats":null,"previous_names":[],"tags_count":null,"template":null,"template_full_name":null,"purl":"pkg:github/atisharma/bellini","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atisharma%2Fbellini","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atisharma%2Fbellini/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atisharma%2Fbellini/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atisharma%2Fbellini/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/atisharma","download_url":"https://codeload.github.com/atisharma/bellini/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/atisharma%2Fbellini/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":281946313,"owners_count":26587973,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-31T02:00:07.401Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["audio","logitechmediaserver","raspberry-pi","squeezelite"],"created_at":"2025-10-31T06:55:30.973Z","updated_at":"2025-10-31T06:55:49.389Z","avatar_url":"https://github.com/atisharma.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"Bellini\n=========\n\nBellini is a fork of [CAVA](https://github.com/karlstav/cava/) initially intended to provide more a 'scientifically correct' spectrum analyser.\nIt has grown to cover other visualisations also.\nThe input infrastructure, config file handling is inherited from cava, so credit goes to the author(s) of that project.\n\nWith the FFT, bellini primary goal is accuracy and correctness while also looking aesthetically pleasing.\n\nSince the aims are somewhat different from cava, and achieving those aims involved changing a substantial amount of the core code, I forked the project.\nMy hope is that some of the ideas developed here will make their way back upstream over time.\n\nBellini inherits CAVA's input support, so might work with Pulseaudio, fifo (mpd), sndio, alsa and squeezelite. It's been successfully tested on squeezelite and ASLA loopback.\n\nI use it on a Raspberry Pi 4B with the semi-official Bullseye 64-bit image and either a [Pimoroni Hyperpixel 4.0](https://shop.pimoroni.com/products/hyperpixel-4) LCD screen in landscape orientation, or a waveshare 5.5\" OLED screen, and get a smooth 60fps for the FFT vis, using about 50% on one thread, and about 10-15% on the other.\nOn my desktop it also works very well with negligible CPU usage.\nCPU usage could probably be improved by further optimisation.\n\nHere is a preview video of an older version (before the oscilloscope vis). It's smoother in real life, because of the interaction with the phone's video frame rate.\n\n[![Here is a preview.](https://img.youtube.com/vi/KULyD5bTMlQ/0.jpg)](https://youtu.be/KULyD5bTMlQ \"bellini preview\")\n\n## Features\n\n### Visualisations\n- an audio spectrum analyser (FFT) for Linux (config option `vis=fft`)\n- raw PCM (waveform) visualisation (left \u0026 right channel vs time) (config option `vis=pcm`)\n- raw PCM (waveform) polar plot visualisation (left \u0026 right channel vs angle) (config option `vis=pol`)\n- An oscilloscope visualisation (left vs right channel) suitable for listening to and viewing [oscilloscope music](https://www.oscilloscopemusic.com) (config option `vis=osc`)\n- an old-fashioned DIN / Type 1 [Peak Programme Meter](https://en.wikipedia.org/wiki/Peak_programme_meter) (`vis=ppm`)\n- a Julia set visualisation (config option `vis=jul`)\n\n\n### features of the FFT/spectrum visualisation\n- an accurate two-channel amplitude spectrum on log-log plot \n- windowing of the data (Hann window by default; Blackman-Nuttall and rectangular also implemented with a code recompilation)\n- amplitude spectrum axes marked off at 20dB intervals (amplitude) and powers of 10 / octaves (frequency)\n- noise floor truncation (basically the lower axis limit on the amplitude spectrum plot)\n\n\n### Other features\n- fast SDL2 output\n- a natty clock\n- reloading of the config file if it's been modified\n- cute left/right merged colour schemes with phosphor-looking defaults\n\n\n## Installation and configuration\n\nInstallation and compilation should be almost exactly the same as for CAVA. Please refer to those instructions.\nYou also need freetype (which you probably already have) and `SDL2_ttf`. On Debian and Void, `ft2build.h` is found in `/usr/include/freetype2/` -- on other distributions you may have to change `Makefile.am` to specify, until I work out how to use automake properly.\n\nThe config file should configure the following options:\n\n```\n[general]\n# noise floor is dB from measured peak amplitude\nnoise_floor = -100\ntext_font = /home/pi/bellini/fonts/digital-7/digital-7.ttf\naudio_font = /home/pi/bellini/fonts/Gill Sans Pro/GillSansMTPro-Condensed.otf\n# decay rate for the fading of the display (\u003c 1.0)\nalpha = 0.95\n# vis = ppm\n# vis = pcm\nvis = fft\n\n[output]\n# it's best to restart after modifying output rotation or size\nrotate = 0\nwidth = 960\nheight = 540\nfullscreen = false\n\n[input]\n# only tested with squeezelite/shmem and ALSA loopback\nmethod = shmem\nsource = /squeezelite-dc:a6:32:c0:5c:0d\n\n[color]\n# hex colors for the following only:\nplot_l = \"#56FF00\"\nplot_r = \"#007BFF\"\nax_2 =   \"#FF2100\"\nax =     \"#468800\"\ntext =   \"#FF2100\"\naudio =  \"#888888\"\n```\n\nThe font option must be the full (not relative) path of the font file (look under /usr/share/fonts/).\nThe fonts I'm using in this example aren't free so you will need to replace them with your choices.\n\nOutput is via SDL. This causes some weirdness using framebuffer output on a Raspberry Pi 4 with a Hyperpixel 4 on raspbian 64bit so I have reverted to running it under wayland in that situation.\n\n\nCapturing audio\n---------------\n\nAudio input should be the same as for CAVA. Please refer to those instructions.\n\n\nTroubleshooting \u0026 FAQ\n---------------------\n\n\n### I'd like to change XYZ option\n\nMost important stuff is in the config file.\nSome assumptions are hard-coded (e.g. the upper/lower cutoff frequencies of the FFT). Changing these involves at least editing some header file and recompiling, and may break the code. Some of these may be broken out to the config file in the future.\n\n\n### Bugs\n\n- Input other than squeezelite's shmem and ASLA is untested and may be broken.\n- The pause detection currently only works with squeezelite\n- Code quality is a bit hacky in places. There are many things that need cleaning up, dead code etc.\n- Double free on exit, hanging pointers, etc.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatisharma%2Fbellini","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fatisharma%2Fbellini","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fatisharma%2Fbellini/lists"}