{"id":44228806,"url":"https://github.com/rainbow-carrots/subsnake","last_synced_at":"2026-04-16T02:01:11.075Z","repository":{"id":329847686,"uuid":"1120798125","full_name":"rainbow-carrots/subsnake","owner":"rainbow-carrots","description":"experimental subtractive polysynth","archived":false,"fork":false,"pushed_at":"2026-04-16T00:14:44.000Z","size":5090,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-04-16T00:28:46.230Z","etag":null,"topics":["adsr-envelope","audio","blit","dsp","njit","oscilloscope","polyblep","python","state-variable-filter","subtractive-synthesis","synthesizer","virtual-analog"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"other","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rainbow-carrots.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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-12-22T00:41:15.000Z","updated_at":"2026-04-16T00:13:27.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/rainbow-carrots/subsnake","commit_stats":null,"previous_names":["ramonauble/subsnake","rainbow-carrots/subsnake"],"tags_count":32,"template":false,"template_full_name":null,"purl":"pkg:github/rainbow-carrots/subsnake","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainbow-carrots%2Fsubsnake","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainbow-carrots%2Fsubsnake/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainbow-carrots%2Fsubsnake/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainbow-carrots%2Fsubsnake/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rainbow-carrots","download_url":"https://codeload.github.com/rainbow-carrots/subsnake/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rainbow-carrots%2Fsubsnake/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31867712,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-15T15:24:51.572Z","status":"online","status_checked_at":"2026-04-16T02:00:06.042Z","response_time":69,"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":["adsr-envelope","audio","blit","dsp","njit","oscilloscope","polyblep","python","state-variable-filter","subtractive-synthesis","synthesizer","virtual-analog"],"created_at":"2026-02-10T06:03:28.661Z","updated_at":"2026-04-16T02:01:11.057Z","avatar_url":"https://github.com/rainbow-carrots.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# subsnake\n\nsubsnake is a polyphonic virtual analog subtractive synthesizer, written in python.\n\n![](./subsnake/images/subsnake_dark.png)\n\n\n### what's it do?\nwell, i'm glad you asked.\n* it has 16 voices of polyphony\n* it supports midi (input)\n* it can save \u0026 load patches\n* it can record, overdub, play, loop, \u0026 save audio\n\n\n### what's in a voice?\n* 3 sine, triangle, sawtooth, or pulse oscillators with pitch, detune, level \u0026 width controls | 2 algorithms ([BLIT](https://ccrma.stanford.edu/~stilti/papers/blit.pdf), [polyBLEP](https://mac.kaist.ac.kr/pubs/ValimakiPeknenNam-jasa2012.pdf))\n* 1 state-variable filter with resonance, saturation \u0026 drive | 2 types (canonical Chamberlin, ZDF-solved Chamberlin)\n* 2 ADSR envelopes - one for amplitude, one for filter frequency (with bipolar depth control) | .004-4s per stage\n* 4 modulators - 2 LFOs, 2 AR envelopes, with dedicated assignable attenuverters for every parameter\n    * LFO shapes: sine, triangle, ramp, sawtooth, square, sample \u0026 hold\n        * 0.01-10Hz w/ controllable phase shift\n    * env. modes: attack-release, attack-hold-release, loop (attack-release)\n        * .01-1s per stage\n\nthere's also a stereo tape delay effect on the master bus (voice output + recorder), and a stereo audio recorder/looper with continuous overdubbing.\n\n\n### what's the midi like?\n* it supports device \u0026 channel selection, with note-on velocity (linear curve)\n* cc's can be added \u0026 removed, and freely assigned to control any parameter\n    * parameter updates are reflected visually, so the sliders \u0026 displays remain in sync with cc's\n* gate on/off events use sample-accurate timing (works well with sequencers)\n\n\n### how's the modulation?\n* every parameter has a dedicated bipolar modulation control (the small knobs left of each slider)\n* *right clicking* a knob changes the assigned modulator (and color)\n    * none (disconnected) -\u003e lfo1 -\u003e lfo2 -\u003e menv1 -\u003e menv2 -\u003e back to none\n* *left clicking* a knob and dragging up/down will increase/decrease the modulation amount\n* *double clicking* any knob will reset the modulation amount to 0.0 (centered)\n\n\n### is there anything else?\n* to reset a parameter, *double click* the parameter display (to the right of each slider)\n* the keys A-' are mapped chromatically and can trigger note events (fixed velocity)\n    * you can shift the pc keyboard octave range up/down using the +/- keys\n* to switch between oscillator types (BLIT/polyBLEP), *right click* the oscillator title box\n* to switch between filter types (Chamberlin/ZDF), *right click* the filter title box\n* the filter \u0026 oscillator type selections are saved with the patch (\u0026 restored on load)\n* the width parameter will have a different effect, depending on the selected shape:\n    * sine: crossfades between silence at both extremes (center is full volume)\n    * triangle: morphs the waveform from a sawtooth (w≈0.0), through a triangle (w=0.5), to a ramp (w≈1.0)\n    * saw: crossfades between a saw \u0026 a second (free-running) saw at twice the fundamental (center is full fundamental)\n    * pulse: bog-standard through-zero PWM\n* each oscillator is paired with a stereo panner, allowing for precise placement (or modulation) across the stereo field\n* filter key tracking \u0026 oscillator drift can be configured (per patch) via the synth settings menu\n* the stereo delay can be made into a pitch-shifting delay (or pseudo-chorus) by modulating the time parameter with an LFO\n\n\n\n### how can i play it?\n* [v0.4.0](https://github.com/rainbow-carrots/subsnake/releases/tag/v0.4.0) is the latest build\n* click on the version that corresponds to your platform to download the zip, extract, \u0026 run! if it doesn't open:\n    * __on linux__: right click the file, go to *Properties* -\u003e *Permissions*, and make sure \"Allow executing file as program\" is checked \n    * __on macos__: you'll need to [authorize the app](https://support.apple.com/guide/mac-help/open-a-mac-app-from-an-unknown-developer-mh40616/mac) when running it for the first time. go to *System Settings* -\u003e *Privacy \u0026 Security*, scroll down to the bottom, and choose *Open anyway* (under *Security*)\n    * __on windows__: click *More info* on the smartscreen popup and choose *Run anyway* \n* **note**: on first load, it may take 1-2 minutes for the initial numba compilation step to complete.\n* **note**: this project is in active development. though I test every build prior to release, you may still encounter bugs.\n\n\n### what else is planned?\n* save \u0026 auto-restore midi settings (channel, cc's, parameter mappings)\n* recorder settings panel:\n    * adjustable loop start/end points\n    * input level control (currently fixed)\n    * playback speed control\n* synth settings panel:\n    * pc keyboard velocity control\n    * voice stacking \u0026 spread settings\n* oscillators:\n    * [LP-BLIT](https://www.dafx.de/paper-archive/2017/papers/DAFx17_paper_59.pdf) implementation\n    * VOSIM implementation\n    * anti-aliased wavetable oscillator\n* modulators:\n    * shape-dependent secondary control (currently sets phase only)\n        * phase for sine, saw \u0026 ramp\n        * width for square \u0026 triangle\n        * slew for sample \u0026 hold\n    * third LFO \u0026 modulation envelope\n    * make LFOs anti-aliased (for audio-rate mod.)\n    * additional LFO modes:\n        * reset phase on gate\n        * key pitch tracking (w/ ratio)\n    * increase max. LFO rate to audio range\n    * add audio oscillators as mod sources\n* effects:\n    * stereo delay\n        * add ping pong \u0026 dampening parameters\n    * stereo chorus\n    * algorithmic reverb\n    * combine effects into single stack\n* mixer:\n    * noise submodule\n* isorhythmic pattern generator/sequencer\n* Lissajous display mode for scope\n* more patches :3","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frainbow-carrots%2Fsubsnake","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frainbow-carrots%2Fsubsnake","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frainbow-carrots%2Fsubsnake/lists"}