{"id":21163676,"url":"https://github.com/mortenson/midi-tape","last_synced_at":"2025-10-13T22:39:35.709Z","repository":{"id":48423692,"uuid":"353706760","full_name":"mortenson/midi-tape","owner":"mortenson","description":"Tape mode style recording for external MIDI devices.","archived":false,"fork":false,"pushed_at":"2022-06-06T20:49:25.000Z","size":308,"stargazers_count":14,"open_issues_count":3,"forks_count":2,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-09T16:47:23.091Z","etag":null,"topics":["external","hardware","midi","webmidi"],"latest_commit_sha":null,"homepage":"https://mortenson.coffee/midi-tape","language":"JavaScript","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/mortenson.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null},"funding":{"github":"mortenson"}},"created_at":"2021-04-01T13:18:17.000Z","updated_at":"2024-02-12T21:12:58.000Z","dependencies_parsed_at":"2022-09-18T22:20:21.713Z","dependency_job_id":null,"html_url":"https://github.com/mortenson/midi-tape","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mortenson/midi-tape","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mortenson%2Fmidi-tape","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mortenson%2Fmidi-tape/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mortenson%2Fmidi-tape/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mortenson%2Fmidi-tape/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mortenson","download_url":"https://codeload.github.com/mortenson/midi-tape/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mortenson%2Fmidi-tape/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279017146,"owners_count":26085984,"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","status":"online","status_checked_at":"2025-10-13T02:00:06.723Z","response_time":61,"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":["external","hardware","midi","webmidi"],"created_at":"2024-11-20T13:59:27.743Z","updated_at":"2025-10-13T22:39:35.689Z","avatar_url":"https://github.com/mortenson.png","language":"JavaScript","funding_links":["https://github.com/sponsors/mortenson"],"categories":[],"sub_categories":[],"readme":"# midi-tape\n\nA tape mode style recorder for external MIDI devices, created using Web MIDI.\n\nI made this as an alternative to using a DAW, for situations where you want to\ncontrol a few external MIDI devices to make quick songs.\n\n## User guide\n\nmidi-tape is a 4-track tape mode style recorder that takes input from one MIDI\ndevice (ex: a MIDI keyboard), and outputs that recording to other MIDI devices\nand channels.\n\nYou can use this to create songs in a more linear, free-form way than with a\ntraditional DAW or MIDI sequencer.\n\nWeb MIDI isn't supported in many browsers, so please use the latest Chrome and\ndo not switch tabs while recording.\n\n### Controls\n\nAll user input is done through the keyboard to make usage with a smaller\nexternal device (ex: remapped numpad) possible.\n\n- `p` - Play/pause\n- `P (shift+p)` - Stop\n- `r` - Toggle recording\n- `R (shift+r)` - Toggle replace recording\n- `m` - Toggle metronome\n- `m + up/down` - Change beats per minute\n- `m + left/right` - Change beats per bar\n- `M (shift+m)` - Toggle count-in\n- `1-9/0` - Change track\n- `1-9/0 + up/down` - Change output device\n- `1-9/0 + left/right` - Change output channel\n- `1-9/0 + delete` - Delete track\n- `i + up/down` - Change input device\n- `up/down` - Change track\n- `left/right` - Move tape\n- `shift + left/right` - Move tape to next/previous bar\n- `t` - Add/clear start point\n- `y` - Add/clear end point\n- `backspace/delete` - Deletes everything between start/end points\n- `shift + backspace/delete` - Deletes pitch bends and control changes between\nstart/end points\n- `v` - Pastes the current track's data between start/end points to current\npoint\n- `V (shift+v)` - Pastes all track data between start/end points to current point\n- `i + p` - Plays and tells the input device to play. Useful for recording drum\nmachines\n- `u` - Undo (for track deletion, note deletion, recording sessions, and paste)\n- `U (shift+u)` - Redo\n- `q` - Toggle quantization\n- `q + up/down` - Change quantization level\n- `q + left/right` - Change quantization strength\n\nIf you need more than 10 tracks, use the \"o\" key instead of the numerical keys:\n\n- `O (shift+o)` - Add a track\n- `o + delete` - Delete current track\n- `o + up/down` - Change output device\n- `o + left/right` - Change output channel\n- `o + p` - Play and solo current track\n\n### The timeline\n\nThe timeline displays all notes, pitch bends, and control changes for each\ntrack.\n\nNotes in the current track are green, pitch bends are purple, and control\nchanges are cyan. When recording, the current track's content will turn red.\n\nThe start point, if placed, is turquoise, and the end point if placed is\nyellow. You can use start/end points to work on loops in your song - when the\nend point is reached, the tape will automatically loop back to the start\npoint. When you're happy with your loop, you can paste it to the next bar(s).\nIf not you can delete it to start over.\n\nPer the above control guide, you move around the timeline using arrow keys, and\ncan hold shift to jump from bar to bar. Most of your time with midi-tape will\nbe spent moving on the timeline, changing start/end points, and changing\ntracks.\n\n### Saving/loading\n\nBy default the current tape is saved to persistent browser storage often to\nprevent data loss between sessions.\n\nTo save your work long-term, click the \"Save\" button at the bottom of the\nscreen. This will save the tape as JSON, which you can then load back into\nmidi-tape when needed.\n\n### Using dummy devices\n\nTo avoid errors and allow for easier testing of the tool, dummy/fake input and\noutput devices are provided for you. The \"Dummy Synth\" uses Tone.js and\nsupports polyphony and pitch changes. The \"Dummy Keyboard\" allow you to play\na C major scale using the keys a, s, d, f, g, h, and j. The k and l keys move\nthe octave up and down.\n\nNote that these are not meant to be useful for real recording scenarios, so\ntheir functionality will always be limited.\n\n### Monitoring and recording audio\n\nSince it can be a bit difficult to monitor the output of your synths while\nlistening to midi-tape's metronome, you can click \"Monitor Audio\" and have your\nbrowser's default input played through the default output. This is also useful\nfor quick jam sessions without opening a DAW or using something like JACK.\n\nWhile monitoring, you can click \"Record Audio\", which will lock keyboard\ncontrols, go to the start of the tape, and play it through while recording\neverything that's monitored. Once finished, .webm file will be downloaded. I\nwould have preferred .wav, but the browser APIs for this are pretty limited.\n\nOnce downloaded, you can convert the .webm file with a command like:\n```\nffmpeg -i ~/Downloads/midi-tape.webm -vn ~/Downloads/midi-tape.mp3\n```\n\n### Exporting a MIDI file\n\nIf you're finished recording but want to edit some of the MIDI manually, you\ncan click \"Export MIDI\" to download your tape as a .mid file.\n\nNote that this is a one-way operation, you cannot import MIDI files as parsing\nthem accurately given midi-tape's limited feature set could result in data\nloss.\n\n### Notes\n\n- Your input device's MIDI channel is ignored, to keep the idea that one track is\none MIDI output device + one channel.\n- A MIDI clock is sent to all outputs every quarter note.\n- Since it's JavaScript, the BPM is likely always a little off.\n- The tape runs at a resolution of 24 PPQ. Higher PPQ values make the tape run\ninconsistently.\n- Replacing is destructive (just like a real tape) - use it wisely!\n- You will have to manage MIDI input delays yourself - for Linux, try\ninstalling a package like Ubuntu's `linux-lowlatency`. For Windows, try using\nASIO4All Driver.\n\n## Development\n\nmidi-tape is built using vanilla JavaScript, and is intended to be used in\nmodern browsers with Web MIDI support (basically latest Chrome).\n\nI built this over a weekend, and would like to maintain it minimally going\nforward. Please do not refactor the entire codebase, and instead add small\nsensible features if needed.\n\nTo start a local dev server, run `npm start`.\n\nTo format code, run `npm run prettier`.\n\nTo update copies of vendor libraries, run `npm run build-assets`.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmortenson%2Fmidi-tape","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmortenson%2Fmidi-tape","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmortenson%2Fmidi-tape/lists"}