{"id":50782698,"url":"https://github.com/da0101/prompt2midi","last_synced_at":"2026-06-12T05:01:24.503Z","repository":{"id":360077269,"uuid":"1006270619","full_name":"da0101/prompt2midi","owner":"da0101","description":"Generate MIDI patterns from natural language prompts using ChatGPT and Python. Connects seamlessly with Ableton Live via a custom AU plugin.","archived":false,"fork":false,"pushed_at":"2026-05-24T21:23:55.000Z","size":90524,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"develop","last_synced_at":"2026-05-24T23:24:03.750Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Python","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/da0101.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":".github/CODEOWNERS","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":"AGENTS.md","dco":null,"cla":null}},"created_at":"2025-06-21T21:56:42.000Z","updated_at":"2026-05-06T00:48:40.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/da0101/prompt2midi","commit_stats":null,"previous_names":["da0101/prompt2midi"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/da0101/prompt2midi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/da0101%2Fprompt2midi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/da0101%2Fprompt2midi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/da0101%2Fprompt2midi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/da0101%2Fprompt2midi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/da0101","download_url":"https://codeload.github.com/da0101/prompt2midi/tar.gz/refs/heads/develop","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/da0101%2Fprompt2midi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34229624,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-12T02:00:06.859Z","response_time":109,"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":[],"created_at":"2026-06-12T05:01:23.305Z","updated_at":"2026-06-12T05:01:24.478Z","avatar_url":"https://github.com/da0101.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# prompt2midi\n\nLocal-first AI co-producer for Ableton Live.\n\nprompt2midi analyzes a reference track, turns the musical evidence into producer-readable structure, generates editable MIDI, creates an original inspired loop package, and prepares a Suno-ready prompt. The core path is designed to run locally: JUCE is the Ableton-facing client, Node owns the job API, and Python owns audio analysis and generation helpers.\n\nThe product goal is not to copy songs. It is a pre-production tool for making new material from reference traits: tempo, key, groove, drum feel, bass movement, arrangement energy, and production language.\n\nprompt2midi is open source. Producers, artists, engineers, researchers, and tool builders are welcome to contribute.\n\nThere are two main ways to use it:\n\n- **DAW inspiration starter:** generate editable ideas, MIDI, arrangement notes, and prompts that a producer can continue shaping in Ableton, Logic, FL Studio, Bitwig, or any other DAW.\n- **Pre-SUNO tool:** turn an inspired idea/reference into a cleaner prompt, structure guide, and optional proxy package that an artist can finish in SUNO or continue developing locally.\n\n## Current Status\n\nThe repo already contains a working local vertical slice:\n\n- JUCE plugin UI for WAV/MP3 selection, prompt entry, job polling, result display, and prompt copy.\n- Local Node backend on `127.0.0.1:47321`.\n- Python WAV analysis with BPM, key, energy, loudness, spectral features, genre/groove hints, chords, structure, stems, transcription, composition, and optional audio generation.\n- Deterministic inspired-loop generator that writes `bass.mid`, `drums.mid`, `chords.mid`, `melody.mid`, `full_loop.mid`, `summary.json`, and `prompt.txt`.\n- Optional model paths for Basic Pitch, Demucs, CLAP genre detection, Gemini Suno prompt generation, ACE-Step, and MusicGen.\n\nThis is still an MVP/research codebase. Some outputs are production useful, but model transcription, stem splitting, and MIDI mapping are still weak in places and should be treated as editable evidence, not finished arrangements. Improving stem separation, source-aware MIDI mapping, and full JUCE AU/VST integration are the next major production-readiness features.\n\n## Branch Flow\n\n- `develop` is the default integration branch for daily work.\n- Feature branches start from `develop` and merge back into `develop`.\n- `main` is release-only. When `develop` is ready to ship, merge `develop` into `main` and create a version tag.\n- Do not open normal feature PRs directly into `main`.\n\n## Why It Exists\n\nProducers often know what they like about a reference record but cannot quickly turn that into reusable production material. prompt2midi closes that gap:\n\n1. Drop in a reference track.\n2. Extract musical facts and evidence.\n3. Generate original MIDI parts that match the useful traits, not the exact song.\n4. Generate a clear AI-music prompt for SUNO or similar tools.\n5. Optionally render a local reference-inspired sample before uploading anything elsewhere.\n6. Finish the idea either inside a DAW or inside SUNO.\n\nWhen a generation service rejects direct artist/song prompts, the correct workflow is not to bypass the filter. prompt2midi uses the reference to identify neutral production traits, then creates new musical assets and a prompt that avoids artist imitation, copied hooks, lyrics, and vocal likeness.\n\nExample framing:\n\n- Avoid: `make a Michael Jackson song` or `copy the bassline from this record`.\n- Prefer: `1980s pop-funk feel, tight dance groove, bright chord stabs, syncopated bass movement, crisp drums, original melody, no copied lyrics, no vocal imitation`.\n\nThe tool is designed to reduce copying risk by creating original material and by describing musical traits instead of requesting a clone. It does not guarantee legal clearance, does not replace rights review, and should not be used to bypass copyright or platform policies.\n\n## Architecture\n\nprompt2midi is a local-first desktop production system. The plugin is only the DAW-facing client; the local backend owns job orchestration; Python owns audio intelligence and generation helpers; optional model services improve output quality without becoming required for the core workflow.\n\n```mermaid\nflowchart TD\n  Producer[\"Producer in Ableton Live\"] --\u003e Plugin[\"JUCE plugin UI\u003cbr/\u003efile/prompt input, progress, result display\"]\n  Plugin --\u003e|POST /analyze| Node[\"Local Node backend\u003cbr/\u003e127.0.0.1:47321\"]\n  Node --\u003e Jobs[\"Job store + progress events\u003cbr/\u003equeued/running/succeeded/failed\"]\n  Node --\u003e Decode[\"Input validation + FFmpeg MP3 decode\u003cbr/\u003eWAV passed to Python\"]\n  Decode --\u003e Python[\"Python analysis package\u003cbr/\u003eanalysis/analyze.py\"]\n  Python --\u003e Core[\"Core facts\u003cbr/\u003eBPM, key, loudness, energy, spectral features\"]\n  Python --\u003e Deep[\"Optional deeper analysis\u003cbr/\u003echords, drums, structure, stems, transcription\"]\n  Python --\u003e Compose[\"Original composition package\u003cbr/\u003ebass/drums/chords/melody/full_loop MIDI\"]\n  Python --\u003e Arrange[\"Arrangement Lock / full-track proxy\u003cbr/\u003emaps, reports, guide MIDI, proxy audio\"]\n  Compose --\u003e Exports[\"Local exports\u003cbr/\u003eMIDI, summary.json, prompt.txt\"]\n  Arrange --\u003e Exports\n  Python --\u003e Node\n  Node --\u003e Prompt[\"Prompt layer\u003cbr/\u003edeterministic local prompt + optional Gemini SUNO prompt\"]\n  Node --\u003e Result[\"Aggregated result JSON\u003cbr/\u003eanalysis, warnings, assets, prompts, paths\"]\n  Result --\u003e Plugin\n  Plugin --\u003e DAW[\"Producer actions\u003cbr/\u003eaudition, copy prompt, import MIDI, package for SUNO\"]\n\n  ACE[\"Optional local ACE-Step API\u003cbr/\u003e127.0.0.1:8001\"] -. audio candidates .-\u003e Arrange\n  Models[\"Optional local engines\u003cbr/\u003eBasic Pitch, Demucs, CLAP, MusicGen, All-In-One Docker\"] -. evidence .-\u003e Deep\n  Gemini[\"Optional cloud Gemini\u003cbr/\u003eGEMINI_API_KEY\"] -. SUNO prompt .-\u003e Prompt\n```\n\n```text\nAbleton / JUCE plugin\n        |\n        | POST /analyze\n        v\nLocal Node backend\n        |\n        | validates input, decodes MP3, creates job, calls Python\n        v\nPython analysis engine\n        |\n        | returns structured JSON, MIDI paths, composition package, optional audio sample\n        v\nNode aggregation\n        |\n        | deterministic producer prompt, optional Gemini Suno prompt\n        v\nJUCE result display\n```\n\n### Runtime Flow\n\n1. The producer selects a WAV/MP3 reference and/or enters a direction in the plugin.\n2. The JUCE client posts the request to the localhost Node backend and keeps the audio thread pass-through.\n3. Node validates local paths, decodes MP3 to WAV when needed, creates a job, and publishes progress events.\n4. Python analyzes the WAV, writes structured JSON, MIDI evidence, composition assets, and optional arrangement/proxy artifacts.\n5. Node aggregates the Python result with producer-facing prompt text and optional Gemini SUNO text.\n6. The plugin polls status/result and displays confidence-aware output paths, warnings, and copy/export actions.\n\n### Component Responsibilities\n\n| Layer | Files | Responsibility |\n|---|---|---|\n| JUCE plugin | `Source/PluginEditor.*`, `Source/PluginProcessor.*`, `Source/LocalApiClient.h` | UI only: choose/drop reference, send local job, poll status, show results. Audio processing stays pass-through. |\n| Node backend | `backend/server.js`, `backend/lib/*` | Local API, job state, input validation, MP3 decode, Python invocation, prompt aggregation, error normalization. |\n| Python analysis | `analysis/analyze.py`, `analysis/core/*`, `analysis/detectors/*` | Extract structured musical facts from WAV audio. Optional libraries improve results, but fallback paths keep the core running. |\n| MIDI/transcription | `analysis/midi/*` | Write MIDI, run Basic Pitch, run Demucs, expose provenance and limitations for every MIDI asset. |\n| Composition | `analysis/composition/*` | Generate a new original loop package from analysis hints. This is the main product output. |\n| Prompting | `backend/lib/promptGenerator.js`, `backend/lib/geminiPromptGenerator.js` | Turn structured facts into producer-facing copy and Suno prompts. Gemini is optional. |\n| Audio generation | `analysis/generation/*` | Optional local sample generation using ACE-Step first, then AudioCraft/MusicGen fallback paths. |\n| Tooling scripts | `scripts/pipelines/*`, `scripts/setup/*`, `scripts/packaging/*`, `scripts/services/*`, `scripts/dev/*` | Local CLI runners, setup commands, package builders, service launchers, and developer refresh tools. |\n| Requirements/docs | `requirements/*`, `docs/pipelines/*`, `docs/backend/*`, `docs/qa/*` | Optional engine dependency pins and topic-grouped operational docs. |\n\n## End-to-End Flow\n\n### 1. User Input\n\nThe plugin accepts:\n\n- A local `.wav` / `.wave` / `.mp3` reference file.\n- A text direction.\n- Or prompt-only mode when no audio file is supplied.\n\nThe plugin posts JSON to the local backend:\n\n```json\n{\n  \"audioPath\": \"/absolute/path/to/reference.mp3\",\n  \"prompt\": \"same groove, change the bass notes a little, replace the main stab\"\n}\n```\n\n### 2. Node Job Orchestration\n\n`backend/server.js` exposes:\n\n- `GET /health`\n- `POST /analyze`\n- `GET /status?id=\u003cjob_id\u003e`\n- `GET /result?id=\u003cjob_id\u003e`\n\nNode creates a job immediately so the plugin remains responsive. It validates absolute audio paths, rejects unsupported formats, enforces a size limit, and decodes MP3 input through `ffmpeg` into `tmp/jobs/\u003cjob_id\u003e/decoded-input.wav`.\n\nNode then starts `python -m analysis.analyze` as a child process and records pipeline events so the UI can show progress.\n\n### 3. Python Feature Analysis\n\nThe Python engine reads PCM WAV and returns structured JSON. The dependency-free base path extracts:\n\n- duration, sample rate, channel count\n- energy curve\n- loudness\n- zero-crossing rate and peak amplitude\n- approximate BPM\n- approximate key\n- warnings when confidence is low\n\nOptional `librosa`/`scipy` paths improve:\n\n- BPM estimation\n- key estimation\n- chord progression detection\n- arrangement/section analysis\n- groove descriptors\n\nOptional CLAP genre detection uses `laion/larger_clap_music` through `transformers` when available.\n\n### 4. Stem and MIDI Evidence\n\nEvery MIDI file is labeled by source and confidence. This area is intentionally conservative: stem splitting and MIDI mapping exist, but they are not yet production-grade. They are useful for evidence, sketching, and direction, but the next feature work should improve source separation, note assignment, timing cleanup, and DAW-ready mapping.\n\n| Asset | How it is made | Meaning |\n|---|---|---|\n| `reference-sketch.mid` | Deterministic pattern from estimated BPM/key | Generated sketch, not transcription. |\n| `model-transcription.mid` | Basic Pitch on full mix | Model transcription candidate; needs ear correction. |\n| `source-bass-transcription.mid` | Demucs bass stem + Basic Pitch | Stem-aware bass candidate; still may contain bleed. |\n| `source-drum-groove.mid` | Demucs drums stem + onset detection | Quantized drum groove estimate. |\n| `model-bass-transcription.mid` | Pitch-filtered Basic Pitch notes from full mix | Fallback bass candidate, not source-separated. |\n| `bass-transcription.mid` | Monophonic low-frequency tracking | Legacy heuristic fallback. |\n\nRecommended evidence exports are copied to:\n\n```text\ntmp/jobs/\u003cjob_id\u003e/exports/\n```\n\nThe code intentionally distinguishes generated MIDI from transcription evidence. This matters because only source-aware paths should be described as source-aware.\n\nCurrent limitations:\n\n- Demucs-style stem splitting can bleed bass, drums, vocals, and harmonic material into each other.\n- Full-mix model transcription often produces extra notes and wrong instrument ownership.\n- Bass, drum, chord, and melody mappings still need stronger source-aware cleanup before they should be considered arrangement-ready.\n- All extracted MIDI should be auditioned and edited in Ableton before being used as final material.\n\nNext work:\n\n- Improve stem-aware bass, drum, chord, and melody extraction.\n- Improve mapping from analysis evidence into separate DAW tracks.\n- Tighten quantization, note filtering, register selection, and confidence labels.\n- Complete JUCE integration for real AU/VST plugin workflows, including more polished import/export behavior.\n\n### 5. Reference Transformation\n\n`analysis/reference/reference_groove.py` fingerprints the reference for:\n\n- kick accents\n- bass accents\n- hat/percussion accents\n- swing\n- low-end weight\n- bass note tendencies\n- club energy\n\n`analysis/reference/reference_transform.py` converts the user's direction into controls such as:\n\n- preserve groove similarity\n- keep bass rhythm but vary notes\n- replace a stab/timbre role\n- keep kick and hat feel while using new samples\n\nThis is the bridge between \"I like this song\" and \"make a new production with similar traits.\"\n\n### 6. Original Composition Package\n\n`analysis/composition/composition.py` generates the main product output:\n\n```text\ntmp/jobs/\u003cjob_id\u003e/exports/\n  midi/\n    bass.mid\n    drums.mid\n    chords.mid\n    melody.mid\n    full_loop.mid\n  summary.json\n  prompt.txt\n```\n\nThe generator is deterministic in structure but randomized in musical choices. It uses BPM, key, detected chords, drum pattern evidence, genre/style hints, and user direction to choose one of several composition modes:\n\n- house\n- techno\n- synth wave\n- hip hop\n- ambient\n\n`full_loop.mid` is MIDI format type 1 so a DAW can import separate tracks.\n\n### 7. Suno Prompt Package\n\nThere are two prompt paths:\n\n1. Python stub prompt from `analysis/composition/composition.py`, always local.\n2. Optional Gemini prompt from `backend/lib/geminiPromptGenerator.js` when `GEMINI_API_KEY` is present.\n\nThe Gemini path uses `gemini-2.0-flash` by default and writes a single Suno paragraph from structured analysis and composition data. If Gemini is disabled, missing, times out, or fails, the job still succeeds with the local stub prompt.\n\nThe prompt contract ends with a protective instruction:\n\n```text\nInstrumental, no vocals. Inspired by the reference groove and production style, not a cover and not a copy.\n```\n\n### 8. Optional Local Audio Sample\n\n`analysis/generation/audio_generation.py` can prepare a 30-second local sample before the user uploads anything to Suno.\n\nProvider order:\n\n1. ACE-Step local API, enabled by `PROMPT2MIDI_ENABLE_ACE_STEP=1`.\n2. AudioCraft MusicGen, enabled by `PROMPT2MIDI_ENABLE_AUDIOCRAFT=1`.\n3. Transformers MusicGen Melody, enabled by `PROMPT2MIDI_ENABLE_MUSICGEN=1`.\n\nACE-Step uses a local API at `127.0.0.1:8001` by default and model settings around:\n\n- `acestep-v15-turbo`\n- `acestep-5Hz-lm-0.6B`\n- MLX backend by default on macOS\n\nThe sample is scored for duration, loudness, pulse consistency, clipping, harshness, and reference groove similarity. The score helps pick the best candidate, but listening is still required.\n\n## Models and Engines\n\n| Engine | Required? | Purpose | Setup |\n|---|---:|---|---|\n| Python stdlib WAV analyzer | Yes | Base BPM/key/energy/loudness/spectral analysis | Built in |\n| `ffmpeg` | For MP3 | Decode MP3 to WAV and export reference sections | Install separately or set `PROMPT2MIDI_FFMPEG` |\n| `librosa` / `scipy` | Optional | Better BPM/key, chords, structure, drums, groove | Python environment |\n| CLAP `laion/larger_clap_music` | Optional | Zero-shot genre tags | Python ML deps |\n| Basic Pitch | Optional | Model MIDI transcription | `npm run setup:transcription` |\n| Demucs `htdemucs` | Optional | Bass/drum/other/vocal stems | `npm run setup:stems` |\n| Gemini `gemini-2.0-flash` | Optional cloud | Higher quality Suno prompt | `GEMINI_API_KEY=...` |\n| ACE-Step 1.5 | Optional local service | Reference-guided audio samples | `npm run setup:ace-step`, then `npm run ace-step:start` |\n| AudioCraft MusicGen | Optional local | Fallback sample generation | `npm run setup:musicgen` |\n| Transformers MusicGen Melody | Optional local | Legacy fallback sample generation | Set `PROMPT2MIDI_ENABLE_MUSICGEN=1` with deps installed |\n\n## Legal and Platform-Safety Position\n\nprompt2midi is built around reference-inspired transformation, not cloning.\n\nIt should:\n\n- Analyze traits instead of copying a recording.\n- Generate new MIDI instead of exporting copyrighted melodies as final output.\n- Use neutral production language instead of artist-name prompting.\n- Avoid vocals, lyrics, artist likeness, copied hooks, and exact bass/melody sequences.\n- Keep every extracted/transcribed artifact labeled as evidence, not guaranteed clearance.\n\nIt should not:\n\n- Promise that any output is free of legal issues.\n- Claim to bypass Suno copyright filters.\n- Recreate a protected song, master recording, vocal likeness, lyric, or signature hook.\n- Tell users that a generated sample is automatically safe to upload commercially.\n\nUse references you own, created, licensed, or are otherwise allowed to analyze. Treat the generated Suno prompt and local sample as a safer creative starting point, not legal advice.\n\n## Contributing\n\nThis is an open-source project and contributions are welcome. Useful areas include:\n\n- stronger stem separation and source-aware MIDI mapping\n- better AU/VST/JUCE host integration\n- Ableton, Logic, and other DAW workflow testing\n- prompt packaging for SUNO and other music tools\n- audio-analysis fixtures and regression tests\n- documentation, examples, setup scripts, and UX polish\n\nBranch from `develop`, keep changes local-first, and label extracted MIDI honestly when confidence is limited.\n\n## Running Locally\n\nInstall Node dependencies:\n\n```bash\nnpm install\n```\n\nStart the backend:\n\n```bash\nnpm start\n```\n\nRun the developer loop with backend logs:\n\n```bash\nnpm run dev:refresh\n```\n\nInstall optional engines:\n\n```bash\nnpm run setup:transcription\nnpm run setup:stems\nnpm run setup:ace-step\nnpm run setup:musicgen\n```\n\nStart ACE-Step when using local sample generation:\n\n```bash\nnpm run ace-step:start\n```\n\nUseful environment flags:\n\n```bash\nPROMPT2MIDI_DISABLE_MODEL=1\nPROMPT2MIDI_DISABLE_STEMS=1\nPROMPT2MIDI_DISABLE_SUNO=1\nPROMPT2MIDI_DISABLE_LIBROSA=1\nPROMPT2MIDI_DISABLE_GENRE=1\nPROMPT2MIDI_DISABLE_CHORDS=1\nPROMPT2MIDI_DISABLE_STRUCTURE=1\nPROMPT2MIDI_DISABLE_DRUMS=1\nPROMPT2MIDI_ENABLE_ACE_STEP=1\nPROMPT2MIDI_ENABLE_AUDIOCRAFT=1\nPROMPT2MIDI_ENABLE_MUSICGEN=1\nGEMINI_API_KEY=...\n```\n\n## API Example\n\n```bash\ncurl -s -X POST http://127.0.0.1:47321/analyze \\\n  -H 'Content-Type: application/json' \\\n  -d '{\"audioPath\":\"/absolute/path/to/reference.wav\",\"prompt\":\"keep the groove, vary the bass notes, replace the stab sound\"}'\n```\n\nPoll status:\n\n```bash\ncurl -s 'http://127.0.0.1:47321/status?id=\u003cjob_id\u003e'\n```\n\nFetch result:\n\n```bash\ncurl -s 'http://127.0.0.1:47321/result?id=\u003cjob_id\u003e'\n```\n\n## Testing\n\nRun Python tests:\n\n```bash\npython3 -m unittest analysis.tests.test_feature_extraction\npython3 -m unittest analysis.tests.test_composition\n```\n\nRun Node tests:\n\n```bash\nnpm test\n```\n\nCompile-check Python:\n\n```bash\npython3 -m compileall analysis\n```\n\n## Important Invariants\n\n- Keep the core workflow local-first.\n- Do not run long jobs, subprocesses, network calls, or file-heavy analysis in JUCE `processBlock`.\n- Node owns orchestration and aggregation.\n- Python returns structured analysis JSON and file paths.\n- Generated MIDI is product output; extracted MIDI is evidence.\n- Optional engines must degrade to warnings, not hard job failure.\n- Producer-facing copy must describe confidence and limitations honestly.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fda0101%2Fprompt2midi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fda0101%2Fprompt2midi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fda0101%2Fprompt2midi/lists"}