{"id":13418385,"url":"https://github.com/gbevin/SendMIDI","last_synced_at":"2025-03-15T03:31:08.046Z","repository":{"id":43756799,"uuid":"78890916","full_name":"gbevin/SendMIDI","owner":"gbevin","description":"Multi-platform command-line tool to send out MIDI messages","archived":false,"fork":false,"pushed_at":"2024-10-16T00:47:04.000Z","size":6263,"stargazers_count":697,"open_issues_count":6,"forks_count":51,"subscribers_count":45,"default_branch":"master","last_synced_at":"2024-10-17T13:32:52.852Z","etag":null,"topics":["command-line","command-line-tool","midi","midi-messages"],"latest_commit_sha":null,"homepage":"https://uwyn.com","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/gbevin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"COPYING.md","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":"2017-01-13T22:13:45.000Z","updated_at":"2024-10-16T16:00:11.000Z","dependencies_parsed_at":"2023-11-13T00:19:46.708Z","dependency_job_id":"0b59bbbd-3895-4983-adf5-66aa7c3bdfed","html_url":"https://github.com/gbevin/SendMIDI","commit_stats":null,"previous_names":[],"tags_count":21,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbevin%2FSendMIDI","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbevin%2FSendMIDI/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbevin%2FSendMIDI/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gbevin%2FSendMIDI/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gbevin","download_url":"https://codeload.github.com/gbevin/SendMIDI/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243681024,"owners_count":20330152,"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":["command-line","command-line-tool","midi","midi-messages"],"created_at":"2024-07-30T22:01:01.675Z","updated_at":"2025-03-15T03:31:08.040Z","avatar_url":"https://github.com/gbevin.png","language":"C++","funding_links":[],"categories":["C++","Midi","Software"],"sub_categories":["Audio utilities - MIDI Utilities"],"readme":"# SendMIDI\n\nSendMIDI is a multi-platform command-line tool makes it very easy to quickly send MIDI messages to MIDI devices from your computer.\n\nAll the heavy lifting is done by the wonderful JUCE library.\n\nThe project website is https://github.com/gbevin/SendMIDI\n\n## Community\n\nJoin the Forums: https://forum.uwyn.com\n\nChat on Discord: https://discord.gg/AZSyVn3K2U\n\n## Purpose\nThis tool is mainly intended for configuration or setup through Control Change, RPN and NRPN messages, but many other MIDI messages can be sent.\n\nHere's a tutorial video about both SendMIDI and ReceiveMIDI, including some tips and tricks of how to use the command-line on macOS:\n\n\u003ca href=\"https://www.youtube.com/watch?v=_o1kg0IbetY\" target=\"_blank\"\u003e\u003cimg src=\"https://i.ytimg.com/vi/_o1kg0IbetY/maxresdefault.jpg\" alt=\"Tutorial Video\" width=\"640\" border=\"0\" /\u003e\u003c/a\u003e\n\n## Download\n\nYou can download pre-built binaries from the release section:\nhttps://github.com/gbevin/SendMIDI/releases\n\nSince SendMIDI is free and open-source, you can also easily build it yourself. Just take a look into the Builds directory when you download the sources.\n\nIf you're using the macOS Homebrew package manager, you can install SendMIDI with:\n```\nbrew install gbevin/tools/sendmidi\n```\n\n## Usage\nTo use it, simply type \"sendmidi\" or \"sendmidi.exe\" on the command line and follow it with a series of commands that you want to execute. These commands have purposefully been chosen to be concise and easy to remember, so that it's extremely fast and intuitive to quickly shoot out a few MIDI messages.\n\nThese are all the supported commands:\n```\n  dev   name           Set the name of the MIDI output port\n  virt  (name)         Use virtual MIDI port with optional name (Linux/macOS)\n  list                 Lists the MIDI output ports\n  panic                Sends all possible Note Offs and relevant panic CCs\n  file  path           Loads commands from the specified program file\n  dec                  Interpret the next numbers as decimals by default\n  hex                  Interpret the next numbers as hexadecimals by default\n  ch    number         Set MIDI channel for the commands (1-16), defaults to 1\n  omc   number         Set octave for middle C, defaults to 3\n  on    note velocity  Send Note On with note (0-127) and velocity (0-127)\n  off   note velocity  Send Note Off with note (0-127) and velocity (0-127)\n  pp    note value     Send Poly Pressure with note (0-127) and value (0-127)\n  cc    number value   Send Control Change number (0-127) with value (0-127)\n  cc14  number value   Send 14-bit CC number (0-31) with value (0-16383)\n  pc    number         Send Program Change number (0-127)\n  cp    value          Send Channel Pressure value (0-127)\n  pb    value          Send Pitch Bend value (0-16383 or value/range)\n  rpn   number value   Send RPN number (0-16383) with value (0-16383)\n  nrpn  number value   Send NRPN number (0-16383) with value (0-16383)\n  clock bpm            Send 2 beats of MIDI Timing Clock for a BPM (1-999)\n  mc                   Send one MIDI Timing Clock\n  start                Start the current sequence playing\n  stop                 Stop the current sequence\n  cont                 Continue the current sequence\n  as                   Send Active Sensing\n  rst                  Send Reset\n  syx   bytes          Send SysEx from a series of bytes (no F0/F7 delimiters)\n  syf   path           Send SysEx from a .syx file\n  tc    type value     Send MIDI Time Code with type (0-7) and value (0-15)\n  spp   beats          Send Song Position Pointer with beat (0-16383)\n  ss    number         Send Song Select with song number (0-127)\n  tun                  Send Tune Request\n  mpe   zone range     Send MPE Configuration for zone (1-2) with range (0-15)\n  mpp   input          Configure MPE Profile initiator with MIDI input port name,\n        manager        a manager channel (1-15), and desired member channel\n        members        count (1-15, 0 to disable) (also uses MIDI output port)\n  mpetest              Send a sequence of MPE messages to test a receiver\n  raw   bytes          Send raw MIDI from a series of bytes\n  -h  or  --help       Print Help (this message) and exit\n  --version            Print version information and exit\n  --                   Read commands from standard input until it's closed\n```\n\nAlternatively, you can use the following long versions of the commands:\n```\n  device virtual decimal hexadecimal channel octave-middle-c note-on note-off\n  poly-pressure control-change control-change-14 program-change\n  channel-pressure pitch-bend midi-clock continue active-sensing reset\n  system-exclusive system-exclusive-file time-code song-position song-select\n  tune-request mpe-profile mpe-test raw-midi\n```\n\nBy default, numbers are interpreted in the decimal system, this can be changed to hexadecimal by sending the \"hex\" command.\nAdditionally, by suffixing a number with \"M\" or \"H\", it will be interpreted as a decimal or hexadecimal respectively.\n\nThe MIDI device name doesn't have to be an exact match.\nIf SendMIDI can't find the exact name that was specified, it will pick the first MIDI output port that contains the provided text, irrespective of case.\n\nWhere notes can be provided as arguments, they can also be written as note names, by default from C-2 to G8 which corresponds to note numbers 0 to 127. By setting the octave for middle C, the note name range can be changed. Sharps can be added by using the '#' symbol after the note letter, and flats by using the letter 'b'.\n\nIn between commands, timestamps can be added in the format: HH:MM:SS.MIL, standing for hours, minutes, seconds and milliseconds (for example: 08:10:17.056). All the digits need to be present, possibly requiring leading zeros. When a timestamp is detected, SendMIDI ensures that the time difference since the previous timestamp has elapsed.\n\nWhen a timestamp is prefixed with a plus sign, it's considered relative and will be processed as a time offset instead of an absolute time. For example +00:00:01.060 will execute the next command one second and 60 milliseconds later. For convenience, a relative timestamp can also be shortened to +SS.MIL (for example: +01.060).\n\n## Examples\n  \nHere are a few examples to get you started:\n\nList all the available MIDI output ports on your system\n\n```\nsendmidi list\n```\n\nSwitch the LinnStrument to User Firmware Mode by setting NRPN 245 to the value 1:\n\n```\nsendmidi dev \"LinnStrument MIDI\" nrpn 245 1\n```\n\nLight up LinnStrument column 5 on row 0 in red by setting CCs 20, 21, and 22 to the column, row and color:\n  \n```\nsendmidi dev \"LinnStrument MIDI\" cc 20 5 cc 21 0 cc 22 1\n```\n\nLoad the commands from a text file on your system and execute them, afterwards switch to the \"Network Session 1\" port and send it program change number 10:\n  \n```\nsendmidi file path/to/some/text/file dev \"Network Session 1\" pc 10\n```\n\nChange parameters on a Yamaha FS1R over SysEx:\n\n```\nsendmidi dev \"iConnectMIDI4+ DIN 1\" hex syx 43 10 5e 10 00 10 00 7f\n```\n\n## Text File Format\n\nThe text file that can be read through the \"file\" command can contain a list of commands and options, just like when you would have written them manually on the console (without the \"sendmidi\" executable). You can insert new lines instead of spaces and any line that starts with a hash (#) character is a comment.\n\nFor instance, this is a text file for one of the examples above:\n```\ndev \"LinnStrument MIDI\"\n# set column 5 on row 0 to the red color\ncc 20 5\ncc 21 0\ncc 22 1\n```\n\n## Building on Linux\n\nTo build SendMIDI on Linux you need a minimal set of packages installed beforehand, on Ubuntu this can be done with:\n\n```\nsudo apt install build-essential pkg-config libasound2-dev\n```\n\nAfter that, go to the `LinuxMakeFile` directory\n\n```\ncd Builds/LinuxMakeFile\n```\n\nand build the binary by typing `make`\n\n```\nmake\n```\n\nThe resulting binary will be in the `Build/LinuxMakeFile/build` directory and can be moved anywhere appropriate on your system, for instance into `/usr/local/bin`:\n\n```\nsudo mv build/sendmidi /usr/local/bin\n```\n\n## ReceiveMIDI compatibility\n\nThe input of the SendMIDI tool is compatible with the ReceiveMIDI tool, allowing you to play MIDI message sequences that were stored earlier. By using Unix-style pipes on the command-line, it's even possible to chain the receivemidi and sendmidi commands in order to forward MIDI messages.\n\nReceiveMIDI can be downloaded from https://github.com/gbevin/ReceiveMIDI\n\n## ShowMIDI\n\nIf you're looking for a beautiful GUI to effortlessly visualize MIDI activity without having to wade through log files, please take a look at my other tool ShowMIDI:\nhttps://github.com/gbevin/ShowMIDI\n\n\u003cp\u003e\u003ca href=\"https://github.com/gbevin/ShowMIDI\"\u003e\u003cimg src=\"https://raw.githubusercontent.com/gbevin/ShowMIDI/main/Design/showmidi-0.5.0.png\" width=\"480\" border=\"0\"/\u003e\u003c/a\u003e\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbevin%2FSendMIDI","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgbevin%2FSendMIDI","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgbevin%2FSendMIDI/lists"}