{"id":27309645,"url":"https://github.com/matdombrock/moonforge","last_synced_at":"2026-05-02T02:38:15.560Z","repository":{"id":282203376,"uuid":"947813490","full_name":"matdombrock/moonforge","owner":"matdombrock","description":"An experimental synthesizer that uses Lua scripts to generate sound.","archived":false,"fork":false,"pushed_at":"2025-04-01T09:03:26.000Z","size":1528,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-04-01T10:22:27.395Z","etag":null,"topics":["audio","c","live-coding","lua","music","portaudio","synthesizer"],"latest_commit_sha":null,"homepage":"","language":"C","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/matdombrock.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":"2025-03-13T09:39:53.000Z","updated_at":"2025-04-01T09:03:29.000Z","dependencies_parsed_at":null,"dependency_job_id":"38dfe6d0-fa57-4e07-9b6b-3a5b722469a7","html_url":"https://github.com/matdombrock/moonforge","commit_stats":null,"previous_names":["matdombrock/wavescript","matdombrock/moonforge"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matdombrock%2Fmoonforge","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matdombrock%2Fmoonforge/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matdombrock%2Fmoonforge/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/matdombrock%2Fmoonforge/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/matdombrock","download_url":"https://codeload.github.com/matdombrock/moonforge/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248524445,"owners_count":21118611,"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","c","live-coding","lua","music","portaudio","synthesizer"],"created_at":"2025-04-12T05:33:30.787Z","updated_at":"2026-05-02T02:38:15.551Z","avatar_url":"https://github.com/matdombrock.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ☾ M O O N F O R G E ☽\n![mf_logo](doc/mf.png)\n\nMoonForge is a minimalist modular synthesis lab written in C. It's scripted via it's built-in Lua interpreter using the [MF Lua API](doc/API.md). \n\nWhile MoonForge can be used as a semi-traditional synthesizer and tracker, it's built for experimental, evolving, generative audio soundscapes and procedural compositions. \n\n**Features \u0026 Goals**\n\n✅ Fully controlled by Lua\n\n✅ Simple API\n\n✅ Wavetable sythesis engine\n\n✅ Dynamic FX chain / routing\n\n✅ Proceduaral / generative audio\n\n✅ Music tracker\n\n✅ Data sonification\n\n⛔ 2D wavetables\n\n⛔ MIDI support (live playing)\n\n✅ Designed for embedded linux\n\n✅ Automatic built-in recording\n\n✅ Fun toy for audio nerds\n\n**Available FX**\n\n✅ All effects are written in C and controlled by Lua.\n\n✅ Lowpass\n\n✅ Delay\n\n⛔ Highpass\n\n⛔ Reverb\n\n⛔ Waveshaping distortion\n\n⛔ Bitcrusher\n\n⛔ Downsample\n\nNote: MoonForge is not in any way a scientific instrument and generally is not intended to be used as such. Lua is only able to affect the audio data at block boundaries and thus is not capable of particularly precise, low-level DSP. \n\n## Lua Scripting\nAll Lua scripts must contain a `Loop(tick)` function. The `tick` value represents the current iteration of the main loop. \n\nA basic script might look like this:\n```lua\n-- Setup\namp_set(1, 1) -- Set the amp of the first osc to 1\nlocal base_freq = 440 -- Base frequency in Hz\nlocal lfo_range = 229 -- LFO range in Hz\nlocal lfo_time = 1000 -- Speed of the LFO in ticks\n-- Main loop\n-- Runs at about 1 KHz (1000 times per second)\nfunction Loop(tick)\n    local lfo = math.sin(tick / lfo_time) * 0.5 + 0.5 -- Sine wave normalized to 0-\u003e1\n    freq_set(1, base_freq + lfo * lfo_range) -- Set the frequncy of the first osc using the LFO\nend\n```\n\nFor scripting examples see the [examples](examples) directory.\n\n## Lua API\nSee the [MF Lua API Docs](doc/API.md) for core API functions.\n\n## Higher Level Libraries\nThis project also includes [`mflib.lua`](lua_include/mflib.lua) which contains wrapper functions around the core API which make it easier to work with. \n\nThe `mflib.lua` library is written in pure Lua, so anything it does can be done manually. Users are encouraged to write their own wrapper libraries (for fun). \n\n## Build \u0026 Package\n### Requirements:\n- [Portaudio](https://www.portaudio.com/)\n- [Lua](https://www.lua.org/)\n- [A unix system](https://btxx.org/public/images/unix.gif)\n- A C compiler for your OS\n\n### Windows?\n[No.](https://c.tenor.com/5N9derc9UcgAAAAC/no-bugs-bunny.gif)\n\n### Build\n```bash\n./pkg.sh\n```\n\nFinal packaged build files will be in `./dist`.\n\n## Run\n\n### Run Syntax:\n```bash\n./mf \u003cpath/to/file.lua\u003e\n```\n\n### Run Example:\n```bash\n./mf examples/test.lua\n```\n\n### Recording\nMoonForge has built-in support for recording to WAV format. When a track is ended with the `exit()` API call a recording of your audio will be saved to your current directory. \n\nThe default max recording length is 240 seconds. When this limit is reached, the current recording will be written and a new one will start automatically. \n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatdombrock%2Fmoonforge","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmatdombrock%2Fmoonforge","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmatdombrock%2Fmoonforge/lists"}