summaryrefslogtreecommitdiff
path: root/portmidi/README.md
diff options
context:
space:
mode:
Diffstat (limited to 'portmidi/README.md')
-rw-r--r--portmidi/README.md128
1 files changed, 128 insertions, 0 deletions
diff --git a/portmidi/README.md b/portmidi/README.md
new file mode 100644
index 0000000..3f0463c
--- /dev/null
+++ b/portmidi/README.md
@@ -0,0 +1,128 @@
+# PortMidi - Cross-Platform MIDI IO
+
+This is the canonical release of PortMidi.
+
+See other repositories within [PortMidi](https://github.com/PortMidi)
+for related code and bindings (although currently, not much is here).
+
+## [Full C API documentation is here.](https://portmidi.github.io/portmidi_docs/)
+
+## Compiling and Using PortMidi
+
+Use CMake (or ccmake) to create a Makefile for Linux/BSD or a
+project file for Xcode or MS Visual Studio. Use make or an IDE to compile:
+```
+sudo apt install libasound2-dev # on Linux, you need ALSA
+cd portmidi # start in the top-level portmidi directory
+ccmake . # set any options interactively, type c to configure
+ # type g to generate a Makefile or IDE project
+ # type q to quit
+ # (alternatively, run the CMake GUI and use
+ # Configure and Generate buttons to build IDE project)
+make # compile sources and build PortMidi library
+ # (alternatively, open project file with your IDE)
+sudo make install # if you want to install to your system
+```
+
+## Installation
+
+My advice is to build PortMidi and statically link it to your
+application. This gives you more control over versions. However,
+installing PortMidi to your system is preferred by some, and the
+following should do it:
+```
+cmake .
+make
+sudo make install
+```
+
+## Language Bindings
+
+Here is a guide to some other projects using PortMidi. There is not
+much coordination, so let us know if there are better or alternative
+bindings for these and other languages:
+
+- Python: Various libraries and packages exist; search and ye shall
+ find. If you wouldn't like to do research, check out [mido](https://mido.readthedocs.io/en/stable/)
+- [SML](https://github.com/jh-midi/portmidi-sml2)
+- [OCaml](https://ocaml.org/p/portmidi/0.1)
+- [Haskell](https://hackage.haskell.org/package/PortMidi)
+- [Erlang](https://hexdocs.pm/portmidi/PortMidi.html)
+- [Julia](https://github.com/SteffenPL/PortMidi.jl)
+- [C#](https://github.com/net-core-audio/portmidi)
+- [Rust](https://musitdev.github.io/portmidi-rs/)
+- [Go](https://github.com/rakyll/portmidi)
+- [Odin](https://pkg.odin-lang.org/vendor/portmidi/)
+- [Serpent](https://sourceforge.net/projects/serpent/) - a real-time
+ Python-like language has PortMidi built-in, a MIDI-timestamp-aware
+ scheduler, and GUI support for device selection.
+- [Pd (Pure Data)](https://puredata.info/) uses PortMidi.
+
+
+## What's New?
+
+(Not so new, but significant:) Support for the **PmDefaults** program,
+which enabled a graphical interface to select default MIDI devices,
+has been removed for lack of interest. This allowed us to also remove
+C code to read and parse Java preference files on various systems,
+simplifying the library. **PmDefaults** allowed simple command-line
+programs to use `Pm_DefaultInputDeviceID()` and
+`Pm_DefaultOutputDeviceID()` rather than creating device selection
+interfaces. Now, you should either pass devices on the command line or
+create your own selection interface when building a GUI
+application. (See pm_tests for examples.) `Pm_DefaultInputDeviceID()`
+and `Pm_DefaultOutputDeviceID()` now return a valid device if
+possible, but they may not actually reflect any user preference.
+
+Haiku support in a minimal implementation. See TODO's in source.
+
+sndio is also minimally supported, allowing basic PortMidi functions
+in OpenBSD, FreeBSD, and NetBSD by setting USE_SNDIO for CMake, but
+not delayed/timestamped output and virtual devices.
+
+# Other Repositories
+
+PortMidi used to be part of the PortMedia suite, but this repo has
+been reduced to mostly just C/C++ code for PortMidi. You will find
+some other repositories in this PortMidi project set up for language
+bindings (volunteers and contributors are invited!). Other code
+removed from previous releases of PortMedia include:
+
+## PortSMF
+
+A Standard MIDI File (SMF) (and more) library is in the [portsmf
+repository](https://github.com/rbdannenberg/portsmf).
+
+PortSMF is a library for reading/writing/editing Standard MIDI
+Files. It is actually much more, with a general representation of
+events and updates with properties consisting of attributes and typed
+values. Familiar properties of pitch, time, duration, and channel are
+built into events and updates to make them faster to access and more
+compact.
+
+To my knowledge, PortSMF has the most complete and useful handling of
+MIDI tempo tracks. E.g., you can edit notes according to either beat
+or time, and you can edit tempo tracks, for example, flattening the
+tempo while preserving the beat alignment, preserving the real time
+while changing the tempo or stretching the tempo over some interval.
+
+In addition to Standard MIDI Files, PortSMF supports an ASCII
+representation called Allegro. PortSMF and Allegro are used for
+Audacity Note Tracks.
+
+## scorealign
+
+Scorealign used to be part of the PortMedia suite. It is now at the
+[scorealign repository](https://github.com/rbdannenberg/scorealign).
+
+Scorealign aligns audio-to-audio, audio-to-MIDI or MIDI-to-MIDI using
+dynamic time warping (DTW) of a computed chromagram
+representation. There are some added smoothing tricks to improve
+performance. This library is written in C and runs substantially
+faster than most other implementations, especially those written in
+MATLAB, due to the core DTW algorithm. Users should be warned that
+while chromagrams are robust features for alignment, they achieve
+robustness by operating at fairly high granularity, e.g., durations of
+around 100ms, which limits time precision. Other more recent
+algorithms can doubtless do better, but be cautious of claims, since
+it all depends on what assumptions you can make about the music.