{"id":19397930,"url":"https://github.com/velipso/midimap","last_synced_at":"2026-04-18T05:33:40.759Z","repository":{"id":118882912,"uuid":"108601197","full_name":"velipso/midimap","owner":"velipso","description":"Command line tool for generating and mapping MIDI messages (OSX)","archived":false,"fork":false,"pushed_at":"2019-01-13T00:58:59.000Z","size":85,"stargazers_count":3,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-02-10T10:57:42.328Z","etag":null,"topics":["midi","osx"],"latest_commit_sha":null,"homepage":"","language":"Objective-C","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/velipso.png","metadata":{"files":{"readme":"README.md","changelog":null,"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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2017-10-27T22:25:31.000Z","updated_at":"2024-03-18T00:07:06.000Z","dependencies_parsed_at":"2025-11-18T05:01:41.133Z","dependency_job_id":null,"html_url":"https://github.com/velipso/midimap","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/velipso/midimap","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/velipso%2Fmidimap","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/velipso%2Fmidimap/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/velipso%2Fmidimap/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/velipso%2Fmidimap/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/velipso","download_url":"https://codeload.github.com/velipso/midimap/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/velipso%2Fmidimap/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31957611,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-18T00:39:45.007Z","status":"online","status_checked_at":"2026-04-18T02:00:07.018Z","response_time":103,"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":["midi","osx"],"created_at":"2024-11-10T11:03:41.778Z","updated_at":"2026-04-18T05:33:40.740Z","avatar_url":"https://github.com/velipso.png","language":"Objective-C","funding_links":[],"categories":[],"sub_categories":[],"readme":"midimap\n=======\n\nCommand line tool for generating and mapping MIDI messages for Mac OSX.\n\nExample Use Cases\n=================\n\n### Playing a chord when hitting a single button\n\n```\nOnNote Any NoteC3 Any\n  # if a C3 is hit, then send a C3+E3+G3\n  SendNote Channel NoteC3 Value\n  SendNote Channel NoteE3 Value\n  SendNote Channel NoteG3 Value\nEnd\n\nOnElse\n  # if anything else is hit, pass it along\n  SendCopy\nEnd\n```\n\n### Map a note to the sustain pedal\n\n```\nOnNote Any NoteC3 0\n  # if C3 is released, release the pedal\n  SendLowCC Channel ControlPedal 0\nEnd\n\nOnNote Any NoteC3 Positive\n  # if C3 is hit, hit the pedal\n  SendLowCC Channel ControlPedal 127\nEnd\n\nOnElse\n  # anything else, pass it along\n  SendCopy\nEnd\n```\n\n### Stop a device from sending Reset commands\n\n```\nOnReset Any\n  # do nothing\nEnd\n\nOnElse\n  # anything else, pass it along\n  SendCopy\nEnd\n```\n\n### Print out note velocities\n\n```\nOnNote Any Any Positive\n  # spy on all note hit events and print them\n  Print \"HIT:\" Note Value\n  SendCopy\nEnd\n\nOnElse\n  # anything else, pass it along\n  SendCopy\nEnd\n```\n\n### Convert pitch bend to CC parameter change\n\n```\nOnBend Any Any\n  # convert to ControlGeneral5\n  SendLowCC Channel ControlGeneral5 Value\nEnd\n\nOnElse\n  # anything else, pass it along\n  SendCopy\nEnd\n```\n\n### Convert mod wheel to pitch bend\n\n```\nOnHighCC Any ControlMod Any\n  # convert to pitch bend\n  SendBend Channel Value\nEnd\n\nOnElse\n  # anything else, pass it along\n  SendCopy\nEnd\n```\n\n### Send channel 1 notes to all other channels\n\n```\nOnNote 1 Any Any\n  SendCopy # send to channel 1\n  SendNote  2 Note Value\n  SendNote  3 Note Value\n  SendNote  4 Note Value\n  SendNote  5 Note Value\n  SendNote  6 Note Value\n  SendNote  7 Note Value\n  SendNote  8 Note Value\n  SendNote  9 Note Value\n  SendNote 10 Note Value\n  SendNote 11 Note Value\n  SendNote 12 Note Value\n  SendNote 13 Note Value\n  SendNote 14 Note Value\n  SendNote 15 Note Value\n  SendNote 16 Note Value\nEnd\n\nOnElse\n  # anything else, pass it along\n  SendCopy\nEnd\n```\n\nUsage\n=====\n\n```\nUsage:\n  midimap [--help] [-d] [-f] [-a @alias value]+ [-m \"Input Device\" \u003cmapfile\u003e]+\n\n  With no arguments specified, midimap will simply list the available sources\n  for MIDI input.\n\n  -d   Debug mode (verbose logging)\n  -f   Force low CC for all CC values; this is useful for devices that don't use\n       high CC at all, and treats all CC messages as low resolution\n  -a @alias value\n       Create an alias; aliases can be used for giving meaningful names to\n       numbers, controllers, or RPN parameters\n  -m \"Input Device\" \u003cmapfile\u003e\n       Listen for messages from \"Input Device\", and apply the rules outlined\n       in the \u003cmapfile\u003e for every message received\n  -h   Help\n  -v   Print version and exit\n\n  The program will output the results to a single virtual MIDI device, named\n  in the format of \"midimap\", \"midimap 2\", \"midimap 3\", etc, for each\n  copy of the program running.\n\nInput Devices:\n  The program will always list out the available input devices.  For example:\n    Source 1: \"Keyboard A\"\n    Source 2: \"Keyboard B\"\n    Source 3: No Name Available\n    Source 4: \"Pads\"\n    Source 5: \"Pads\"\n\n  Sources can be specified using the name:\n    midimap -m \"Keyboard A\" \u003cmapfile\u003e\n  Or the source index:\n    midimap -m 5 \u003cmapfile\u003e\n\nMap Files:\n  Map files consist of a list of event handlers and aliases.  If the handler's\n  criteria matches the message, the instructions in the handler are executed,\n  and no further handlers are executed.\n\n    Alias @TargetChannel 16\n\n    OnNote 1 NoteGb3 Any\n      # Change the Gb3 to a C4\n      Print \"Received:\" Channel Note Value\n      SendNote @TargetChannel NoteC4 Value\n    End\n\n  For this example, if the input device sends a Gb3 message at any velocity in\n  channel 1, the program will print the message, and send a C4 instead on\n  channel 16.\n\n  The OnNote line is what message to intercept, and the matching criteria\n  for the message.  Criteria can be a literal value, `Any` which matches\n  anything, or `Positive` for a number greater than zero.  Inside the handler,\n  the instructions are executed in order using raw values (\"Received:\", 16,\n  NoteC4) or values dependant on the original message (Channel, Note, Value).\n\n  Any line that begins with a `#` is ignored and considered a comment.\n\n  All event handlers end with `End`.\n\n  Event Handlers:\n    OnNote         \u003cChannel\u003e \u003cNote\u003e \u003cValue\u003e     Note is hit or released\n    OnBend         \u003cChannel\u003e \u003cValue\u003e            Pitch bend for entire channel\n    OnNotePressure \u003cChannel\u003e \u003cNote\u003e \u003cValue\u003e     Aftertouch applied to note\n    OnChanPressure \u003cChannel\u003e \u003cValue\u003e            Aftertouch for entire channel\n    OnPatch        \u003cChannel\u003e \u003cValue\u003e            Program change patch\n    OnLowCC        \u003cChannel\u003e \u003cControl\u003e \u003cValue\u003e  Low-res control change\n    OnHighCC       \u003cChannel\u003e \u003cControl\u003e \u003cValue\u003e  High-res control change\n    OnRPN          \u003cChannel\u003e \u003cRPN\u003e \u003cValue\u003e      Registered device parameter\n    OnNRPN         \u003cChannel\u003e \u003cNRPN\u003e \u003cValue\u003e     Custom device parameter\n    OnAllSoundOff  \u003cChannel\u003e                    All Sound Off message\n    OnAllNotesOff  \u003cChannel\u003e                    All Notes Off message\n    OnReset        \u003cChannel\u003e                    Reset All Controllers message\n    OnElse                                      Messages not matched\n\n  Parameters:\n    Channel   MIDI Channel (1-16)\n    Value     Data value associated with event (see details below)\n    Note      Note value (see details below)\n    Control   Control being modified (see table below)\n    RPN       Registered parameter being modified (see table below)\n    NRPN      Non-registered parameter being modified (0-16383)\n\n  \"Value\" is a number that depends on the event:\n    OnNote          Velocity the note was hit (0-127) Use 0 for note off\n    OnBend          Amount to bend (0-16383, center at 8192)\n    OnNotePressure  Aftertouch intensity (0-127)\n    OnChanPressure  Aftertouch intensity (0-127)\n    OnPatch         Patch being selected (0-127)\n    OnLowCC         Value for the control (0-127)\n    OnHighCC        Value for the control (0-16383)\n    OnRPN/OnNRPN    Value for the parameter (0-16383)\n\n  Notes:\n    Notes are represented in the format of:\n      `Note\u003cKey\u003e\u003cOctave\u003e`\n    Where Key can be one of the 12 keys, using flats:\n      Key = C, Db, D, Eb, E, F, Gb, G, Ab, A, Bb, B\n    And Octave can be one of the 11 octaves, starting at -2 (represented as N2):\n      Octave = N2, N1, 0, 1, 2, 3, 4, 5, 6, 7, 8\n\n    The last addressable MIDI note is NoteG8, so NoteAb8, NoteA8, NoteBb8 and\n    NoteB8 do not exist.\n\n    Therefore, the entire range is: NoteCN2, NoteDbN2, ... NoteF8, NoteG8.\n\n  Low-Resolution Controls (MIDI hex value in parenthesis for reference):\n    ControlPedal      (40)          ControlGeneral5    (50)\n    ControlPortamento (41)          ControlGeneral6    (51)\n    ControlSostenuto  (42)          ControlGeneral7    (52)\n    ControlSoftPedal  (43)          ControlGeneral8    (53)\n    ControlLegato     (44)          ControlPortamento2 (54)\n    ControlHold2      (45)          ControlUndefined1  (55)\n    ControlSound1     (46)          ControlUndefined2  (56)\n    ControlSound2     (47)          ControlUndefined3  (57)\n    ControlSound3     (48)          ControlVelocityLow (58)\n    ControlSound4     (49)          ControlUndefined4  (59)\n    ControlSound5     (4A)          ControlUndefined5  (5A)\n    ControlSound6     (4B)          ControlEffect1     (5B)\n    ControlSound7     (4C)          ControlEffect2     (5C)\n    ControlSound8     (4D)          ControlEffect3     (5D)\n    ControlSound9     (4E)          ControlEffect4     (5E)\n    ControlSound10    (4F)          ControlEffect5     (5F)\n    ControlReserved1  (66)          ControlReserved2   (67)\n    ControlReserved3  (68)          ControlReserved4   (69)\n    ControlReserved5  (6A)          ControlReserved6   (6B)\n    ControlReserved7  (6C)          ControlReserved8   (6D)\n    ControlReserved9  (6E)          ControlReserved10  (6F)\n    ControlReserved11 (70)          ControlReserved12  (71)\n    ControlReserved13 (72)          ControlReserved14  (73)\n    ControlReserved15 (74)          ControlReserved16  (75)\n    ControlReserved17 (76)          ControlReserved18  (77)\n\n  High-Resolution Controls (MIDI hex values in parenthesis for reference):\n    ControlBank           (00/20)   ControlGeneral1    (10/30)\n    ControlMod            (01/21)   ControlGeneral2    (11/31)\n    ControlBreath         (02/22)   ControlGeneral3    (12/32)\n    ControlUndefined6     (03/23)   ControlGeneral4    (13/33)\n    ControlFoot           (04/24)   ControlUndefined10 (14/34)\n    ControlPortamentoTime (05/25)   ControlUndefined11 (15/35)\n    ControlChannelVolume  (07/27)   ControlUndefined12 (16/36)\n    ControlBalance        (08/28)   ControlUndefined13 (17/37)\n    ControlUndefined7     (09/29)   ControlUndefined14 (18/38)\n    ControlPan            (0A/2A)   ControlUndefined15 (19/39)\n    ControlExpression     (0B/2B)   ControlUndefined16 (1A/3A)\n    ControlEffect6        (0C/2C)   ControlUndefined17 (1B/3B)\n    ControlEffect7        (0D/2D)   ControlUndefined18 (1C/3C)\n    ControlUndefined8     (0E/2E)   ControlUndefined19 (1D/3D)\n    ControlUndefined9     (0F/2F)   ControlUndefined20 (1E/3E)\n                                    ControlUndefined21 (1F/3F)\n\n  If -f mode is used, then high-resolution controllers are interpreted as\n  two separate low-resolution controllers.  These are identified by taking\n  the high-resolution controller name and adding MSB or LSB to the end.\n  For example:\n    ControlBank (00/20) becomes:  ControlBankMSB (00)  ControlBankLSB (20)\n    ControlMod  (01/21) becomes:  ControlModMSB  (01)  ControlModLSB  (21)\n    ...etc\n  The -f mode also disables RPN/NRPN conrols, and instead interprets the\n  CC messages as low-resolution controllers with the names:\n    ControlDataMSB       (06)       ControlDataLSB       (26)\n    ControlPNIncrement   (60)       ControlPNDecrement   (61)\n    ControlNRPNSelectLSB (62)       ControlNRPNSelectMSB (63)\n    ControlRPNSelectLSB  (64)       ControlRPNSelectMSB  (65)\n\n  Registered Parameters (MIDI hex values in parenthesis for reference):\n    RPNBendRange     (00/00)        RPNAzimuth          (3D/00)\n    RPNFineTuning    (00/01)        RPNElevation        (3D/01)\n    RPNCoarseTuning  (00/02)        RPNGain             (3D/02)\n    RPNTuningProgram (00/03)        RPNDistanceRatio    (3D/03)\n    RPNTuningBank    (00/04)        RPNMaxDistance      (3D/04)\n    RPNModRange      (00/05)        RPNGainAtMax        (3D/05)\n    RPNEmpty         (7F/7F)        RPNRefDistanceRatio (3D/06)\n                                    RPNPanSpread        (3D/07)\n                                    RPNRoll             (3D/08)\n\n  Aliases:\n    Any number, Note*, Control*, or RPN* keyword can be aliased to another\n    keyword starting with @.  For example, if your MIDI controller sends\n    ControlReserved1 when hitting the play button, you can alias it via:\n\n      Alias @PlayChannel  1\n      Alias @PlayButton   ControlReserved1\n\n    Then, it can be referenced anywhere else, like:\n\n      OnLowCC @PlayChannel @PlayButton Positive\n        # play was hit...\n      End\n\n    Aliases can also be defined from the command-line using -a:\n      midimap -a @PlayChannel 1 -a @PlayButton ControlReserved1 ...etc...\n\n  Commands:\n    Print \"Message\" \"Another\" ...                    Print values to console\n      (`Print RawData` will print the raw bytes received in hexadecimal)\n    SendCopy                                         Send a copy of the message\n    SendNote         \u003cChannel\u003e \u003cNote\u003e \u003cValue\u003e        Send a note message, etc\n      (Use 0 for Value to send note off)\n    SendBend         \u003cChannel\u003e \u003cValue\u003e\n    SendNotePressure \u003cChannel\u003e \u003cNote\u003e \u003cValue\u003e\n    SendChanPressure \u003cChannel\u003e \u003cValue\u003e\n    SendPatch        \u003cChannel\u003e \u003cValue\u003e\n    SendLowCC        \u003cChannel\u003e \u003cControl\u003e \u003cValue\u003e\n    SendHighCC       \u003cChannel\u003e \u003cControl\u003e \u003cValue\u003e\n    SendRPN          \u003cChannel\u003e \u003cRPN\u003e \u003cValue\u003e\n    SendNRPN         \u003cChannel\u003e \u003cNRPN\u003e \u003cValue\u003e\n    SendAllSoundOff  \u003cChannel\u003e\n    SendAllNotesOff  \u003cChannel\u003e\n    SendReset        \u003cChannel\u003e\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvelipso%2Fmidimap","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvelipso%2Fmidimap","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvelipso%2Fmidimap/lists"}