midi-synth — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited midi-synth (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Synthesize MIDI/MusicXML to audio and generate Strudel live-coding patterns. Uses analysis data for ghost-note cleaning, correct tempo, and key-aware filtering.
Both scripts auto-detect *_analysis.json files from audio-to-midi for tempo, key, and dynamics.
to_strudel.py generates Strudel code for strudel.ccrender.py produces WAV/MP3# Basic (auto-detects analysis JSON next to input)
py -3.12 scripts/to_strudel.py "song.mid"
# From MusicXML
py -3.12 scripts/to_strudel.py "song.musicxml"
# Explicit analysis file
py -3.12 scripts/to_strudel.py "song.mid" --analysis "song_analysis.json"
# Stricter ghost-note filtering
py -3.12 scripts/to_strudel.py "song.mid" --min-velocity 60 --min-duration 0.1
# Open in browser
py -3.12 scripts/to_strudel.py "song.mid" --open| Flag | Default | Effect |
|---|---|---|
--analysis | auto-detect | Path to analysis JSON for tempo/key |
--bars | 4 | Pattern length in bars |
--resolution | 16 | Grid: 4/8/16/32 |
--min-velocity | 40 | Remove notes below this velocity (0-127) |
--min-duration | 0.05 | Remove notes shorter than this (seconds) |
--no-key-filter | off | Disable key-based ghost note filtering |
--tempo | from analysis | Override tempo BPM |
--open | off | Open in strudel.cc in browser |
Note durations are encoded with @N notation (e.g., c3@4 = held for 4 steps).
# Basic (auto-detects analysis, cleans ghost notes)
py -3.12 scripts/render.py "song.mid" --mp3
# From MusicXML
py -3.12 scripts/render.py "song.musicxml" --mp3
# With SoundFont
py -3.12 scripts/render.py "song.mid" --soundfont "GeneralUser_GS.sf2" --mp3
# Aggressive cleaning
py -3.12 scripts/render.py "song.mid" --min-velocity 60 --min-duration 0.1
# Skip cleaning entirely
py -3.12 scripts/render.py "song.mid" --no-clean
# Modifications
py -3.12 scripts/render.py "song.mid" --tempo 2.0 --transpose 3 --instrument 0| Flag | Default | Effect |
|---|---|---|
--analysis | auto-detect | Analysis JSON for tempo/key-based cleaning |
--min-velocity | 40 | Ghost note velocity threshold |
--min-duration | 0.05 | Ghost note duration threshold (seconds) |
--no-clean | off | Skip ghost note removal |
--no-key-filter | off | Disable key-based filtering |
--soundfont | auto-detect | .sf2 SoundFont path |
--tempo | 1.0 | Tempo scale factor |
--transpose | 0 | Semitones up/down |
--instrument | original | Override GM program (0-127) |
--mp3 | off | Also produce MP3 |
Three filter layers (applied in order):
--min-velocity (default: 40)--min-duration (default: 50ms)The key filter only removes notes that are BOTH out-of-key AND below medium velocity, preserving intentional chromatic passages.
Auto-installed: pretty_midi, numpy, soundfile. For MusicXML input: music21 (installed by audio-to-midi skill). Optional: pyfluidsynth + .sf2 SoundFont for high-quality rendering. Runtime: Python 3.12 (py -3.12).
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.