{"id":16340357,"url":"https://github.com/soenkehahn/looper","last_synced_at":"2025-10-26T00:30:25.709Z","repository":{"id":54168629,"uuid":"102565500","full_name":"soenkehahn/looper","owner":"soenkehahn","description":"tool for fast and easy experimentation with audio programming","archived":false,"fork":false,"pushed_at":"2025-01-27T17:18:19.000Z","size":718,"stargazers_count":8,"open_issues_count":1,"forks_count":0,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-01-31T12:48:57.817Z","etag":null,"topics":["audio","livecoding"],"latest_commit_sha":null,"homepage":"","language":"Haskell","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/soenkehahn.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-09-06T05:14:00.000Z","updated_at":"2023-05-11T02:38:23.000Z","dependencies_parsed_at":"2022-08-13T08:10:41.417Z","dependency_job_id":null,"html_url":"https://github.com/soenkehahn/looper","commit_stats":null,"previous_names":[],"tags_count":4,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soenkehahn%2Flooper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soenkehahn%2Flooper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soenkehahn%2Flooper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/soenkehahn%2Flooper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/soenkehahn","download_url":"https://codeload.github.com/soenkehahn/looper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238229940,"owners_count":19437723,"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","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","livecoding"],"created_at":"2024-10-10T23:56:35.432Z","updated_at":"2025-10-26T00:30:20.411Z","avatar_url":"https://github.com/soenkehahn.png","language":"Haskell","readme":"`looper` is a tool that allows you to easily experiment with a simple form of\nlivecoding for audio generaton. It plays back snippets of audio in a gapless,\ninfinite loop. These snippets are meant to be generated by a program that can be\nmodified. `looper` then picks up the changes to the program, re-runs it, and\nswitches to the newly generated audio snippet in the next loop.\n\n## how it works\n\nCreate an executable in a programming language of your choice that outputs\nfloating point numbers to `stdout`. These will be interpreted by `looper` as a\nsequence of audio samples in mono, in 44100 Hertz between -1.0 to +1.0. Here's\nan example python program `noise.py` that generates one second of noise:\n\n```python\n#!/usr/bin/env python\n\nimport random\n\nfor i in range(0, 44100):\n    print((random.random() * 2.0) - 1.0)\n```\n\nThe file has to have the executable flag set (with e.g. `chmod +x noise.py`).\nThen run `looper`, passing in the executable file as an argument:\n\n```bash\nlooper noise.py\n```\n\nThis will run `noise.py`, collect the samples from its `stdout` and play them\nback through your audio device in an infinite loop. Once you change and save the\nprogram, `looper` will rerun it and switch to playing the new loop.\n\nYou can use this for a simple, experimental form of livecoding by modifying the\nprogram over and over again and listening to the results.\n\n## Installation\n\n`looper` runs on linux and mac.\n\n### Linux\n\nThere's pre-built binaries for linux [here](https://github.com/soenkehahn/looper/releases).\n\nYou will need to install some runtime dependencies to run `looper`. On ubuntu you can do:\n\n```bash\nsudo apt install libportaudio2 libsndfile1 libgmp10\n```\n\n### Building from source\n\nThese are instructions that work on ubuntu-19.10.\n\nFirst, you need to install some looper dependencies and `curl`:\n\n```bash\nsudo apt-get update\nsudo apt-get install --yes curl libsndfile1-dev portaudio19-dev\n```\n\n`looper` is written in Haskell and you need to install the Haskell build tool\n[stack](https://haskellstack.org/) to build and install it. Here's how you can\nget `stack`:\n\n```bash\ncurl -sSL https://get.haskellstack.org/ | sh\n```\n\nThen you need to clone the `looper` repo:\n\n```bash\ngit clone https://github.com/soenkehahn/looper\ncd looper\n```\n\nAnd install looper with:\n\n```bash\nstack install\n```\n\n`stack` installs executables into `$HOME/.local/bin`. So you need to make sure that that's\nadded to your `$PATH`. If you're using `bash` you could do that with:\n\n```bash\necho 'export PATH=\"$HOME/.local/bin:$PATH\"' \u003e\u003e $HOME/.bashrc\n```\n\nYou need to restart bash for this to take effect.\n\nNow you can check that looper is installed with e.g.:\n\n```bash\nlooper --help\n```\n\n## Examples\n\n- There are a few small examples in the `./examples` folder.\n- I (Sönke) have toyed around with `looper` here: [loops](https://github.com/soenkehahn/loops).\n\nIf you have created anything with `looper` that is available publicly, we should add it to this list. :)\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoenkehahn%2Flooper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsoenkehahn%2Flooper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsoenkehahn%2Flooper/lists"}