{"id":42844081,"url":"https://github.com/transcriptaze/midiasm","last_synced_at":"2026-01-30T11:55:09.050Z","repository":{"id":60413101,"uuid":"222044019","full_name":"transcriptaze/midiasm","owner":"transcriptaze","description":"MIDI assembler/disassembler","archived":false,"fork":false,"pushed_at":"2024-11-13T01:47:16.000Z","size":4727,"stargazers_count":7,"open_issues_count":3,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2024-11-13T02:32:28.520Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/transcriptaze.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","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":"2019-11-16T03:57:16.000Z","updated_at":"2024-11-13T01:47:19.000Z","dependencies_parsed_at":"2024-06-20T00:14:23.476Z","dependency_job_id":"d534c658-508a-4b7e-a387-8e6fd3fbecc6","html_url":"https://github.com/transcriptaze/midiasm","commit_stats":{"total_commits":438,"total_committers":3,"mean_commits":146.0,"dds":0.4155251141552512,"last_synced_commit":"4f25a41d582dc9f1fb14b39e1347da4ed5ae41b2"},"previous_names":["twystd/midiasm"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/transcriptaze/midiasm","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fmidiasm","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fmidiasm/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fmidiasm/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fmidiasm/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/transcriptaze","download_url":"https://codeload.github.com/transcriptaze/midiasm/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/transcriptaze%2Fmidiasm/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28912143,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-30T08:15:08.179Z","status":"ssl_error","status_checked_at":"2026-01-30T08:14:31.507Z","response_time":66,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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-01-30T11:55:08.968Z","updated_at":"2026-01-30T11:55:09.042Z","avatar_url":"https://github.com/transcriptaze.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"![build](https://github.com/transcriptaze/midiasm/workflows/build/badge.svg)\n\n# midiasm\n\nMIDI assembler/disassembler to convert between standard MIDI files and a text/JSON equivalent.\n\n## Raison d'être\n\nA Go reimplementation of Jeff Glatt's long defunct Windows-only MIDIASM (last seen archived at [MIDI Technical Fanatic's Brainwashing Center](http://midi.teragonaudio.com)). Because sometimes it's easier to just programmatically deal with\ntext or JSON.\n\n## Installation\n\nExecutables for all the supported operating systems are packaged in the [releases](https://github.com/transcriptaze/midiasm/releases). Installation is straightforward - download the archive and extract it to a directory of your choice. \n\n`midiasm help` will list the available commands and associated options (documented below).\n\n### Building from source\n\nRequired tools:\n- [Go 1.23+](https://go.dev)\n- _make_ (optional but recommended)\n\nTo build using the included Makefile:\n\n```\ngit clone https://github.com/transcriptaze/midiasm.git\ncd midiasm\nmake build\n```\n\nWithout using `make`:\n```\ngit clone https://github.com/transcriptaze/midiasm.git\ncd midiasm\ngo build -trimpath -o bin/ ./...\n```\n\nThe above commands build the `midiasm` executable to the `bin` directory.\n\n\n#### Dependencies\n\n_None_\n\n## midiasm\n\nUsage: ```midiasm \u003ccommand\u003e \u003coptions\u003e```\n\nSupported commands:\n\n- `help`\n- `version`\n- [`disassemble`](#disassemble)\n- [`assemble`](#assemble)\n- [`export`](#export)\n- [`notes`](#notes)\n- [`click`](#click)\n- [`transpose`](#transpose)\n- [`tsv`](#tsv)\n\nDefaults to `disassemble` if the command is not provided.\n\n### `disassemble`\n\nDisassembles a MIDI file and displays the tracks in a human readable format.\n\nCommand line:\n\n` midiasm [--debug] [--verbose] [--C4] [--split] [--out \u003cfile\u003e] \u003cMIDI file\u003e`\n\n```\n  --out \u003cfile\u003e  Writes the disassembly to a file. Default is to write to stdout.\n  --split       Writes each track to a separate file. Default is `false`.\n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n\n  midiasm --debug --verbose --out one-time.txt one-time.mid\n```\n\n### `assemble`\n\nAssembles a MIDI file from a text or JSON source.\n\nCommand line:\n\n` midiasm assemble [--debug] [--verbose] [--C4] [--out \u003cMIDI file\u003e] \u003cfile\u003e`\n\n```\n  --out \u003cfile\u003e  Output MIDI file. Defaults to the input file with a .midi extension.\n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n\n  midiasm assemble --debug --verbose --out one-time.mid one-time.json\n```\n\n### `export`\n\nExtracts the MIDI information as JSON for use with other tools (e.g. _jq_).\n\nCommand line:\n\n` midiasm export [--debug] [--verbose] [--C4] [--out \u003cfile\u003e] \u003cMIDI file\u003e`\n\n```\n  --out \u003cfile\u003e     Writes the JSON to a file. Default is to write to stdout.\n  --json           Formats the output as JSON - the default is human readable text.\n  --transpose \u003cN\u003e  Transposes the notes up or down by N semitones.\n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n\n  midiasm notes --debug --verbose --out one-time.json one-time.mid\n```\n\n\n### `notes`\n\nExtracts the _NoteOn_ and _NoteOff_ events to generate a list of notes with start times and durations.\n\nCommand line:\n\n` midiasm notes [--debug] [--verbose] [--C4] [--out \u003cfile\u003e] \u003cMIDI file\u003e`\n\n```\n  --out \u003cfile\u003e  Writes the notes to a file. Default is to write to stdout.\n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n\n  midiasm notes --debug --verbose --out one-time.notes one-time.mid\n```\n\n### `click`\n\nExtracts the _beats_ from the MIDI file in a format that can be used to create a click track.\n\nCommand line:\n\n` midiasm click [--debug] [--verbose] [--C4] [--out \u003cfile\u003e] \u003cMIDI file\u003e`\n\n```\n  --out \u003cfile\u003e  Writes the click track to a file. Default is to write to stdout.\n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n  \n  midiasm click --debug --verbose --out one-time.click one-time.mid\n```\n\n### `transpose`\n\nTransposes the key of the notes (and key signature) and writes it back as MIDI file.\n\nCommand line:\n\n` midiasm transpose [--debug] [--verbose] [--C4] --semitones \u003csteps\u003e --out \u003cfile\u003e \u003cMIDI file\u003e`\n\n```\n  --semitones \u003cN\u003e  Number of semitones to transpose up or down. Defaults to 0.\n  --out \u003cfile\u003e     (required) Destination file for the transposed MIDI. \n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n  \n  midiasm transpose --debug --verbose --semitones +5 --out one-time+5.mid one-time.mid\n```\n\n### `tsv`\n\nExtracts the MIDI information as a TSV or fixed width file for use with other tools (e.g. [miller](https://github.com/johnkerl/miller))\n\nCommand line:\n\n` midiasm tsv [--debug] [--verbose] [--C4] [--out \u003cfile\u003e] \u003cMIDI file\u003e`\n\n```\n  --out \u003cfile\u003e   Output filepath. Default is to write to stdout.\n  --delimiter    Column delimiter for TSV files. Defaults to TAB.\n  --tabular      Formats the outputs as fixed width columns\n\n  Options:\n\n  --C4       Uses C4 as middle C (Yamaha convention). Defaults to C3.\n  --debug    Displays internal information while processing a MIDI file. Defaults to false\n  --verbose  Enables 'verbose' logging. Defaults to false\n\n  Example:\n\n  midiasm tsv --debug --verbose --out one-time.tsv one-time.mid\n```\n\n## Tools\n\n1. [jq](https://jqlang.github.io/jq)\n2. [miller](https://github.com/johnkerl/miller)\n\n\n## References\n\n1. [The Complete MIDI 1.0 Detailed Specification](https://www.midi.org/specifications/item/the-midi-1-0-specification)\n2. [Somascape - MIDI Files Specification](http://www.somascape.org/midi/tech/mfile.html)\n3. [(archive) MIDI Technical Fanatic's Brainwashing Center](http://midi.teragonaudio.com)\n4. [StackExchange::Music Transposing key signatures - how to do so quickly?](https://music.stackexchange.com/questions/110078/transposing-key-signatures-how-to-do-so-quickly)\n5. [An Introduction to MIDI](https://www.midi.org/articles/an-intro-to-midi)\n6. [Roland: Midi Guidebook](https://ia902502.us.archive.org/3/items/manuallib-id-2725326/2725326_text.pdf)\n7. [Timing in MIDI files](https://sites.uci.edu/camp2014/2014/05/19/timing-in-midi-files)\n\n\n## Alternatives\n1.  [mido](https://github.com/mido/mido)\n2.  [midicsv](https://www.fourmilab.ch/webtools/midicsv)\n3.  [Werkmeister](https://werckme.github.io/werckmeister)\n4.  [pymidi](https://pypi.org/project/py-midi)\n5.  [DryWetMIDI](https://github.com/melanchall/drywetmidi)\n6.  [Online MIDI Editor](http://midi.mathewvp.com)\n7.  [go-midi](https://github.com/moutend/go-midi)\n8.  [midiutil](https://pypi.org/project/MIDIUtil)\n9.  [music21](https://web.mit.edu/music21)\n10. [fq](https://github.com/wader/fq)\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranscriptaze%2Fmidiasm","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftranscriptaze%2Fmidiasm","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftranscriptaze%2Fmidiasm/lists"}