{"id":13776116,"url":"https://github.com/thgrund/tidal-looper","last_synced_at":"2025-05-11T10:30:55.694Z","repository":{"id":54510521,"uuid":"291501202","full_name":"thgrund/tidal-looper","owner":"thgrund","description":"Different looper variants for SuperDirt to provide live sampling in TidalCycles.","archived":false,"fork":false,"pushed_at":"2025-05-06T13:15:28.000Z","size":24267,"stargazers_count":101,"open_issues_count":10,"forks_count":3,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-05-06T14:37:27.692Z","etag":null,"topics":["hydra","live-coding","looper","obs-studio","osc","supercollider","tidalcycles"],"latest_commit_sha":null,"homepage":"","language":"SuperCollider","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/thgrund.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-08-30T15:48:48.000Z","updated_at":"2025-05-06T13:15:32.000Z","dependencies_parsed_at":"2024-08-03T18:10:12.495Z","dependency_job_id":"57982c7e-e33f-4f53-8c16-bc8aa0cc51ba","html_url":"https://github.com/thgrund/tidal-looper","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgrund%2Ftidal-looper","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgrund%2Ftidal-looper/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgrund%2Ftidal-looper/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/thgrund%2Ftidal-looper/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/thgrund","download_url":"https://codeload.github.com/thgrund/tidal-looper/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":253551477,"owners_count":21926301,"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":["hydra","live-coding","looper","obs-studio","osc","supercollider","tidalcycles"],"created_at":"2024-08-03T18:00:16.857Z","updated_at":"2025-05-11T10:30:50.619Z","avatar_url":"https://github.com/thgrund.png","language":"SuperCollider","funding_links":[],"categories":["SuperCollider","Software"],"sub_categories":["SuperDirt extensions"],"readme":"# TidalLooper\nLooper for [SuperDirt](https://github.com/musikinformatik/SuperDirt) to provide live sampling in [TidalCycles](https://github.com/tidalcycles/Tidal).\n\n## SuperCollider Quark\n\nThe TidalCycles looper can now be installed as SuperCollider Quark. \nCurrently this has to be done manually by downloading this repository and then adding the folder in SuperCollider under `Language -\u003e Quarks -\u003e Install a folder`. \n\nThis procedure has the following reasons:\n\n- Easier to extend and customize. \n- There is a documentation in SuperCollider. \n- The looper can be loaded in the startup script when starting the server.\n- Different releases can be issued in the future (but this is not done yet).\n\n### How to use it\n\nTo start the TidalLooper you first have to create a SuperDirt instance and then initialize the TidalLooper.\n\n```\n~dirt = SuperDirt(2, s);\n~looper = TidalLooper(~dirt);\n```\n\nYou can adjust various parameters:\n```\n~looper.pLevel = 0.8;\n```\n\nIn SuperCollider you can also add the TidalLooper under `File -\u003e Open startup script` \nand have it available after every server start.\n\n```\n(\n    s.waitForBoot {\n        ~dirt = SuperDirt(2, s);\n        // More SuperDirt ...\n\n        // Initialize the TidalLooper\n        ~looper = TidalLooper(~dirt);\n\n        // You can adjust these parameter even in runtime\n        ~looper.rLevel = 1.5;\n        ~looper.pLevel = 0.8;\n        ~looper.linput = 15; // Set this to your main input port.\n        ~looper.lname = \"mybuffer\";\n    }\n)\n```\n\n## TidalCycles\n### Pre-Requirement\n\nFirst you should execute the following tidal code:\n\n```haskell\nlinput = pI \"linput\"\nlname = pS \"lname\"\n```\n\nNow you can use `linput` and `lname` as parameter.\n\n### How to use it\n\nThis basic operations which are explained below is shared by all looper modes. By default 8 buffers are created, and accessible under the name 'loop' (s) and a number from 0 .. 7 (n).\n\nThe simplest form for recording is\n\n```haskell\nonce $ s \"looper\" -- writes one cycle to the loop buffer and uses the input port 0 and the sample number 0\n```\n\nAfter recording you can listen back to the result with\n\n```haskell\nd1 $ s \"loop\"\n```\n\nIt is possible to set the length of the recording (this is equals to the length of the events) i.e\n\n```haskell\nd1 $ slow 2 $ s \"loop\"\n```\n\nUse n to choose a specific buffer, i.e. n \"2\" is equal to \"write to the second buffer under of the sample bank loop\".\n\n```haskell\nd1 $ s \"looper\" # n \"\u003c0 1 2 3 4 5 6 7\u003e\"\n```\n\nAnd each buffer is accessible with the n function\n\n```haskell\nd2 $ s \"loop\" # n \"[0,1,2,3,4,5,6,7]\"\n```\n\nYou can use each input port for recording. If you use i.e. Blackhole, than the output and input ports have the same results. This way you can write the orbit results (i.e. what came from d1) to a buffer.\n\n```haskell\nd1 $ s \"looper\" # linput 16\n```\n\nYou can specifiy the name of your loop sample bank\n\n``` haskell\nonce $ s \"looper\" # lname \"bubu\"\n\nd1 $ s \"bubu\"\n```\n\nTo reset all loop buffers just evaluate\n\n```haskell\nonce $ s \"freeLoops\"\n```\n\nTo persist all loop buffers of a specific buffer list just evaluate\n\n```haskell\nonce $ s \"persistLoops\" # lname \"bubu\"\n```\n\n**Note 1:** I prefer to use 'qtrigger 1' to ensure, that the recording starts from the beginning of the pattern.\nMaybe you want to use the looper with seqP, seqPLoop or wait.\n\n**Note 2:** If you want to use more samples under one name, than adjust the `numBuffers` in the `Looper.scd`.\n\n### Replace mode\n\nIn replace mode, each time the recording pattern is called, the specified buffer is recreated and any existing buffer is cleared. The basic looper `s $ \"looper\"` is actually the `\"rlooper\"` (for replace looper) and just a synonym. \n\nTo continuously play back and record a loop, the code could looks like this\n\n```haskell\nd1 $ qtrigger 1 $ stack [\n    s \"rlooper\" # n \"\u003c0 1 2 3\u003e\",\n    s \"loop\" # n \"[0,1,2,3]\",\n    s \"808 cp!3\"\n]\n```\n\nIf you record a loop of cycle length 1 and play it back at the same time, you will never hear a result, because the buffer is immediately rewritten at each cycle.\n\n**Note:** You can change the default looper mode by changing the variable `pLevel` in the `Looper.scd`.\n\n### Overdub mode\n\nLoop overdub - A  mode found in many looping devices where new material can be added on top of — overdubbed on — existing loop material. This allows you to layer additional parts into a loop to create a fuller sound or a more “layered” effect. (See https://www.sweetwater.com/insync/loop-overdub/)\n\nIn overdub mode, each time the recording pattern is called, the specified buffer is kept and the incoming audio signal is mixed to the existing one. This means that no new buffer is created if a recording has already been made for that buffer. To use the looper in overdub mode you just need to use `olooper` (for overdub looper) instead of `looper`.\n\nTo continuously play back and record a loop, the code could looks like this\n\n```haskell\nd1 $ qtrigger 1 $ stack [s \"olooper\",s \"loop\",s \"808 cp!3\"] \n```\n\n**Note 1:** The buffer length of a buffer is set when recording for the first time and cannot be changed afterwards (unless you clear the buffer with `s \"freeLoops\"`) .\n\n**Note 2:** In an older version the additional function `playAll` was needed to simulate an overdub mode. This is no longer necessary because a \"real\" overdub mode was implemented.\n\n\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthgrund%2Ftidal-looper","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fthgrund%2Ftidal-looper","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fthgrund%2Ftidal-looper/lists"}