{"id":29031983,"url":"https://github.com/cnvogelg/amiditools","last_synced_at":"2026-05-18T03:35:57.704Z","repository":{"id":138277843,"uuid":"263428794","full_name":"cnvogelg/amiditools","owner":"cnvogelg","description":"My collection of tools for MIDI running on AmigaOS3 and on your Python3 platform","archived":false,"fork":false,"pushed_at":"2021-07-14T19:10:27.000Z","size":263,"stargazers_count":3,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-08-09T17:26:48.876Z","etag":null,"topics":["amiga","amigaos3","camd","midi","python3","rtmidi"],"latest_commit_sha":null,"homepage":"","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/cnvogelg.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}},"created_at":"2020-05-12T19:12:44.000Z","updated_at":"2023-12-31T12:25:28.000Z","dependencies_parsed_at":null,"dependency_job_id":"2d279d1c-70b4-4ce7-b8bb-295a781faa9d","html_url":"https://github.com/cnvogelg/amiditools","commit_stats":null,"previous_names":[],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cnvogelg/amiditools","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnvogelg%2Famiditools","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnvogelg%2Famiditools/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnvogelg%2Famiditools/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnvogelg%2Famiditools/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cnvogelg","download_url":"https://codeload.github.com/cnvogelg/amiditools/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cnvogelg%2Famiditools/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":33163785,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-17T22:39:12.733Z","status":"online","status_checked_at":"2026-05-18T02:00:06.436Z","response_time":71,"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":["amiga","amigaos3","camd","midi","python3","rtmidi"],"created_at":"2025-06-26T10:30:22.081Z","updated_at":"2026-05-18T03:35:57.698Z","avatar_url":"https://github.com/cnvogelg.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# amiditools\n\nMy collection of tools for MIDI processing focusing on classic m68k Amiga\nmachine running AmigaOS 3.x with the CAMD MIDI library. Enriched by some host\ntools running on Python \u003e3.6.\n\n## Overview\n\n### CAMD MIDI Drivers\n\n* [`udp`](#udp-driver) - A network MIDI driver with custom protocol\n* [`echo`](#echo-driver) - A simple (test) driver that echoes all MIDI data\n\n### CAMD MIDI Tools\n\n* [`midi-info`](#midi-info) - Show CAMD drivers and more\n* [`midi-send`](#midi-send) - Send MIDI data via command line\n* [`midi-recv`](#midi-recv) - Receive MIDI data on command line\n* [`midi-echo`](#midi-echo) - Echo incoming MIDI traffic\n* [`midi-perf`](#midi-perf) - MIDI performance measurement\n\n### CAMD Addons\n\n* [BarsnPipes Tools](#barnspipes-tools) - BarsnPipes Tools to access the new\n  CAMD MIDI drivers\n\n### Host MIDI Tools\n\n* [`midi-udp-bridge`](#midi-udp-bridge) - Endpoint for `udp` MIDI driver\n* [`midi-udp-echo`](#midi-udp-echo) - Test endpoint for `udp` MIDI driver\n* [`midi-perf`](#midi-perf-host) - MIDI performance measurement\n\n\n## Installation\n\n### CAMD Library\n\nYou need a recent version of the CAMD libraries installed on your Amiga system\nin order to use the drivers or tools on this page.\n\nI'd suggest to use CAMD.library 40.4 or 40.5 available on\n[aminet](http://aminet.net/mus/midi/camd40.lha). Just copy the `camd.library`\nto your `LIBS:` directory.\n\nMidi drivers for CAMD are found in the `devs:midi` directory. Just create\nthe folder manually if its missing.\n\nTo use a MIDI interface attached to the serial port of your Amiga you have\nto install the [mmp](http://aminet.net/driver/other/mmp.lha) driver.\nJust copy the driver file `mmp` found in the archive to your `devs:midi`\ndirectory and you are done!\n\n### Install CAMD Drivers\n\nThe CAMD drivers shipped with the tools follow the naming scheme `midi-drv-*`.\nIn order to install them on your Amiga system you have to strip the\n`midi-drv-` prefix and copy the files to the `devs:midi` directory.\n\nExample:\n\n    copy midi-drv-udp devs:midi/udp\n\nA restart of the Amiga is required to activate the new drivers.\nUse the [`midi-info`](#midi-info) tool to check its availability.\n\n### Host Tools Installation\n\nAll the tools here running on your Mac or PC are written in `Python 3`\n(Python \u003e=3.6 required).\n\nFor MIDI handling they use the\n[`python-rtmidi`](https://pypi.org/project/python-rtmidi/)\npackage. Simply install it with:\n\n    pip3 install python-rtmidi\n\nThen you can run the host tool scripts directly in place of the release\ndirectory.\n\nHowever, also a `.whl` Python install archive is shipped. You can install\nit with:\n\n    pip3 install amiditools-*.whl\n\n\n## CAMD MIDI Drivers\n\n### `echo` Driver\n\nThe echo driver is a very simple driver without any options.\nIt offers 8 input and output endpoints named:\n\n * Inputs `echo.in.0` ... `echo.in.7`\n * Output `echo.out.0` ... `echo.out.7`\n\nAll MIDI data sent to an output is echoed to the corresponding input.\n\n    midi-send --\u003e echo.out.0 --\u003e echo.in.0 --\u003e midi-recv\n\n#### Usage Example\n\n * Open an Amiga shell and launch [`midi-recv`](#midi-recv):\n\n        midi-recv dev echo.in.0\n\n * Now open another shell and send some MIDI messages with\n   [`midi-send`](#midi-send):\n\n        midi-send dev echo.out.0 on c2 127\n        midi-send dev echo.out.0 off c2 0\n\n * You see that the MIDI messages are forwarded from output 0 to input 0\n\n### `udp` Driver\n\nThis driver allows to send MIDI data across an network link provided by\nan Amiga network stack (like AmiTCP or Roadshow). It uses simple UDP packets\nto transfer MIDI messages (including SysEx) and offers up to 8 individual\nin and out ports:\n\n * Inputs `udp.in.0` ... `udp.in.7`\n * Output `udp.out.0` ... `udp.out.7`\n\nA client application called [`midi-udp-bridge`](#midi-udp-bridge) on your PC\nor Mac will receive the MIDI message and forward them to a local MIDI port\nthere.\n\nAll MIDI data sent to the output `udp.out.x` will be sent to the bridge\nhost output port and the input `udp.in.x` will receive all data sent to\nthe input port of the host bridge (option `-p IN:OUT`):\n\n    midi-send --\u003e udp.out.x --\u003e network --\u003e midi-udp-bridge --\u003e OUT midi port\n    midi-recv \u003c-- udp.in.x \u003c-- network \u003c-- midi-udp-bridge \u003c-- IN midi port\n\nNote: Do not confuse this protocol with the well known [RTP\nMIDI](https://john-lazzaro.github.io/rtpmidi/) or also called Apple MIDI. Our\nprotocol is a lot simpler but needs a special host program to send/receive\ndata to/from this driver.\n\nNote2: This protocol currently does no error correction. I.e. if your network\nis crowded or lots of MIDI traffic is transferred then some MIDI messages\nmight get lost. You have been warned :)\n\n#### Activation\n\nFirst of all make sure that your Amiga network stack is already setup and\nall network devices are configured correctly.\n\nUse a tool like [`midi-info`](#midi-info) to load the CAMD library and\ntherefore activate the UDP driver.\n\nWhen the driver is loaded on first launch of the `camd.library` then it\nopens a UDP server socket and waits for an incoming client.\n\nThe client is created then on the host Mac or PC side with the\n[`midi-udp-bridge`](#midi-udp-bridge) tool.\n\n#### Configuration\n\nBy default the driver is configured to work with settings that match most\ntypical use cases, including emulator and real Amiga setups.\n\nHowever, sometimes adjustments are needed. You write a config file with the\nrequired parameters. The driver looks for the configuration file in\n`ENV:midi/udp.config`.\n\nCreate this file and write all configuration options (that are `ReadArgs()`-\nlike) into the first line of the file!\n\nThe following options are supported:\n\n* `HOST_NAME \u003chostname|ipaddr\u003e`\n\n   Set the host name or IPv4 address that will be used to open the UDP server\n   socket.\n\n   By default its `0.0.0.0` and binds to all network interfaces.\n\n* `PORT \u003cnumber\u003e`\n\n    Change the port number the UDP server will use on the Amiga.\n\n    By default its `6820`.\n\n* `SYSEX_SIZE \u003cbytes\u003e`\n\n    Currently the `udp` driver can only send SysEx messages with up to\n    2048 Bytes (2 KiB). If you need to transfer larger SysEx messages\n    then increase this byte value.\n\n    Please note that currently all SysEx messages have to fit into a single\n    UDP packet. So the limit lies around 64 KiB per single message.\n\nAn Example config might look like:\n\n    HOST_NAME my_amiga PORT 1234 SYSEX_SIZE 32768\n\nCopy the config file to `ENVARC:midi/udp.config` to persist it for later use.\n\n### Usage Example\n\n * Make sure the `udp` driver is running and call [`midi-info`](#midi-info)\n * Now on your Mac/PC call [`midi-udp-bridge`](#midi-udp-bridge) and\n   assign a distinct MIDI in and out port (I use virtual ports on Mac here):\n\n        midi-udp-bridge -p \"Amiga In:Amiga Out\" -v\n\n * If all worked out well then the connection is established and reported back\n   by the bridge\n * On your Mac/PC run [`receivemidi`](https://github.com/gbevin/ReceiveMIDI)\n   to see the incoming traffic on port \"Amiga Out\"\n\n        receivemidi dev \"Amiga Out\"\n\n * Now send some MIDI messages from your Amiga shell:\n\n        midi-send dev udp.out.0 on c2 127\n        midi-send dev udp.out.0 off c2 0\n\n * You should see the messages on your Mac/PC on port \"Amiga Out\".\n * One direction already works! Now test the other one:\n * On your Amiga shell run:\n\n        midi-recv dev udp.in.0\n\n * On your Mac/PC send MIDI data with\n   [`sendmidi`](https://github.com/gbevin/SendMIDI):\n\n        sendmidi dev \"Amiga In\" on c2 127\n        sendmidi dev \"Amiga In\" off c2 0\n\n * You should see the messages on your Amiga shell\n * Both directions work! Job done :)\n\n\n## CAMD MIDI Tools\n\nAll tools are command line tools and need to be executed in a shell/CLI.\n\n### `midi-info`\n\nThis tool simply shows all available drivers with their registered clusters\n(aka ports).\n\nUse the tool to quickly verify that new drivers are installed correctly.\n\nA nice side effect of this tool is: When launched as the first command after\na reboot it initializes the `camd.library` and activates all drivers.\nE.g. the `udp` driver starts listening for a UDP client.\n\nNote: As long as the library is not expunged, it will not reload the driver\nlist. Therefore you might need an Amiga reset to activate new drivers.\n\n### `midi-send`\n\nThis tool is an almost 100% clone of the famous [`SendMIDI`\ntool](https://github.com/gbevin/SendMIDI) by Geert Bevin.\n\nYou can send all kinds of MIDI message on the command line.\n\nSee the [`SendMIDI` README](https://github.com/gbevin/SendMIDI#readme) for\na detailed description of the options.\n\nExample: Send a NoteOn/NoteOff for C-2 with velocity 127\n\n    midi-send dev echo.in.0 on c-2 127\n    midi-send dev echo.in.0 off c-2 0\n\n#### Notable Differences to SendMIDI\n\n* `dev` - uses CAMD cluster names, e.g. `echo.in.0`\n * no `virt` - no virtual device on Amiga\n * no `list` - use [`midi-info`](#midi-info) instead\n * no `mpe*` - not implemented yet\n * no long names of commands\n * added `SMS=SYSEXMAXSIZE` to select maximum size of SysEx messages in bytes\n   (default: 2048)\n * added `V=VERBOSE` to show more output\n\n### `midi-recv`\n\nThis tool is an almost 100% clone of the famous [`ReceiveMIDI`\ntool](https://github.com/gbevin/ReceiveMIDI) by Geert Bevin.\n\nIt will show all incoming MIDI messages in your shell.\nUntil you leave the tool by pressing `CTRL+C`.\n\nSee the [`ReceiveMIDI` README](https://github.com/gbevin/ReceiveMIDI#readme)\nfor a detailed description of the options.\n\nExample: show incoming traffic on `echo.out.0`\n\n    midi-recv dev echo.out.0\n\n### Notable Differences to ReceiveMIDI\n\n* `dev` - uses CAMD cluster names, e.g. `echo.in.0`\n * no `virt` - no virtual device on Amiga\n * no `pass` - no implemented yet\n * no `list` - use [`midi-info`](#midi-info) instead\n * no `js*`- no javascript support\n * added `SMS=SYSEXMAXSIZE` to select maximum size of SysEx messages in bytes\n   (default: 2048)\n * added `V=VERBOSE` to show more output\n\n### `midi-echo`\n\nA tool that echoes all MIDI data received on one port and writes it to\nanother one.\n\nStop the tool by pressing `CTRL+C`.\n\nUsage:\n\n    midi-echo  IN/A input OUT/A output\n               SMS/SYSEXMAXSIZE/K/N sysex_max_size\n               V/VERBOSE/S\n\nOptions:\n\n * `SMS=SYSEXMAXSIZE` sets the maximum size of SysEx messages in bytes.\n   Default value is 2048 bytes.\n * `V=VERBOSE` be more verbose when running the tool\n\nExample:\n\n    midi-echo IN udp.in.0 OUT udp.out.1\n\n### `midi-perf`\n\nA tool to measure the performance of a MIDI driver.\n\nIt sends out bursts of MIDI data to the given ouput device port and tries to\nreceives the same messages on the given input devices. The latency is\ncalculated and missing messages are detected.\n\nYou have to create a loop back setup to make this tool work. You can either\nuse the [`echo`](#echo-driver) driver directly (as it loops directly) or use\nthe [`udp`](#udp-driver) driver in combination with a\n[`midi-udp-echo](#midi-udp-echo) host client to loop back MIDI messages over\nUDP.\n\nThe tool continously sends out a given number of samples in a loop and waits\nfor the incoming echoed samples.\n\nCurrently, each sample pair is a NoteOn and NoteOff event with increasing\nnote value.\n\nUsage:\n\n    midi-perf  OUTDEV/A  output  INDEV/A  input\n               SMS/SYSEXMAXSIZE/K/N sysex_max_size\n               V/VERBOSE/S\n               LP=LOOPDELAY/K/N loop_delay\n               SD=SAMPLEDELAY/K/N sample_delay\n               NUM/K/N number_of_samples\n\nOptions:\n\n * `SMS=SYSEXMAXSIZE` sets the maximum size of SysEx messages in bytes.\n   Default value is 2048 bytes.\n * `V=VERBOSE` be more verbose when running the tool\n * `LP=LOOPDELAY` how many seconds to wait before another sample loop is sent.\n   Default is 1 second.\n * `SD=SAMPLEDELAY` how many microseconds to wait between each test sample.\n   Default is 1000 microseconds.\n * `NUM` number of sample MIDI messages sent in a loop. Default is 256.\n\nExample:\n\n    midi-perf udp.out.0 udp.in.0\n    midi-perf echo.out.0 echo.in.0\n\n## CAMD Addons\n\n### Bars n Pipes Tools\n\nTo access the new CAMD drivers presented here with the [BarsnPipes Sequencer]\n(http://bnp.hansfaust.de) on the Amiga a \"ptool\" plugin is available for each\nof the drivers and input/output clusters/ports combinations.\n\nJust add the ptools to your BarnsPipes installation and activate them.\nSee the BnP manual for details.\n\nThe tools are named `camd_\u003cdriver\u003e_in|out_\u003cport\u003e.ptool`.\n\n## Host Tools\n\n### `midi-udp-bridge`\n\nThis tool is the endpoint of the [`udp`](#udp-driver) MIDI driver. Launch it\non your Mac/PC. It will bridge the incoming MIDI traffic to existing (or\nvirtual) MIDI ports on your system.\n\nCurrently, a single client is supported that maps all the input/output\nports of the `udp` driver to local MIDI ports.\n\n#### Options\n\n    usage: midi-udp-bridge [-h] [-p PORTS [PORTS ...]] [-l] [-v] [-d] [-s SERVER] [-c CLIENT]\n\n    transfer Midi data between Midi UDP and a local Midi port\n\n    optional arguments:\n    -h, --help            show this help message and exit\n    -p PORTS [PORTS ...], --ports PORTS [PORTS ...]\n                            Define midi port pair: midi_in:midi_out[+] Repeat for multiple ports.\n    -l, --list-ports      List all input and output ports\n    -v, --verbose         verbose output\n    -d, --debug           enabled debug output\n    -s SERVER, --server SERVER\n                            host addr of UDP server. default=localhost:6820\n    -c CLIENT, --client CLIENT\n                            host addr of UDP client. default=localhost:6821\n\nUse `-s` and `-c` switches to configure the hostname of the server (Amiga) and\nthe client (your Mac/PC) respectively. The syntax for both is `hostname:port`.\n\nExamples for address specification:\n\n * `192.168.2.1:6820`\n * `my_amiga:1234`\n\nUse `-l` to show a list of existing MIDI in and out ports on your system.\n\nUse `-v` or even `-d` to increase the verbosity when running the tool.\n\n#### MIDI Port Mapping\n\nThe only required option is `-p` for the ports definition. Here you assign a\nMIDI in and out port pair of your system to the ports of the Amiga UDP driver\nseparated by a colon (`:`).\n\nThe first port definition pair is assigned to udp port 0, the next one to port\n1 and so on. Up to 8 ports can be defined this way.\n\nYou can either state the name of the interface (see `-l` command for a list)\nor its enumerated number.\n\nIf you do not need a in and out port you can simply omit one direction.\nIf only an output port is given then do not forget the leading colon!\n\nIf you want to create a new *virtual* MIDI port (only supported on Linux\nor macos) then append a plus `+` sign to your definition. Both the in and\nout port are then virtual ports.\n\nExamples for port specification:\n\n * `-p \"Amiga In:Amiga Out\"` - define udp port 0 and connect to the existing\n    in port called `Amiga In` and out port `Amiga Out`. Use shell quoting to\n    protect the spaces in the interface names.\n * `-p 0:0 1:1` - define udp port 0 and 1 by referencing the interfaces by\n    number. Use first in and out interface for port 0 and second pair for\n    port 1.\n * `-p :0` - only define the udp output port and omit the input port.\n * `-p MyIn:MyOut+` - the trailing plus creates new virtual interfaces in\n    your system with the given names (if your system supports this).\n\n#### Run the Tool\n\nSo a minimal example to run the tool is:\n\n    python3 midi-udp-bridge -p 0:0 -d\n\nUse the debug output `-d` to see the inner working of the bridge.\n\n### `midi-udp-echo`\n\nThis is a diagnosis tool: it simply returns all incoming MIDI messages back\nto port 0 (`udp.in.0`).\n\nLaunch it with:\n\n    python3 midi-udp-echo\n\nIt will wait for incoming MIDI messages and return them.\n\n### `midi-perf` Host\n\nA MIDI performance measurment tool running on your host.\n\nA MIDI port pair is required that performs loop back of all messages.\n\n#### Options\n\n    usage: midi-perf [-h] [-p PORT] [-l] [-v] [-d]\n\n    benchmark Midi performance by sending/receiving a set of messages.\n\n    optional arguments:\n    -h, --help            show this help message and exit\n    -p PORT, --port PORT  Define midi port pair: midi_in:midi_out[+] Make sure out echoes in data!\n    -l, --list-ports      List all input and output ports\n    -v, --verbose         verbose output\n    -d, --debug           enabled debug output\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnvogelg%2Famiditools","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcnvogelg%2Famiditools","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcnvogelg%2Famiditools/lists"}