Upgrading to GitLab 12.1.0.

Commit 5f485b6c authored by bret curtis's avatar bret curtis

Imported Upstream version 0.4.0

parent 75cbc619
......@@ -22,5 +22,8 @@ Thumbs.db
.project
.settings/
# CLion
.idea/
# config files
include/config.h
......@@ -5,6 +5,9 @@ compiler:
env:
- BUILD_TYPE=Debug
- BUILD_TYPE=Release
matrix:
allow_failures:
- compiler: clang
branches:
only:
- master
......@@ -13,7 +16,9 @@ before_install:
- pwd
- git submodule update --init --recursive
- echo "yes" | sudo add-apt-repository "deb http://archive.ubuntu.com/ubuntu `lsb_release -sc` main universe restricted multiverse"
- echo "yes" | sudo apt-add-repository ppa:psi29a/precise
- sudo apt-get update -qq
- sudo apt-get install -qq cmake
- sudo apt-get install -qq libgtest-dev google-mock
- sudo apt-get install -qq libasound2-dev libopenal-dev
- sudo mkdir /usr/src/gtest/build
......@@ -33,11 +38,6 @@ script:
#after_script:
# - ./runtests
notifications:
recipients:
- psi29a+travis.ci@gmail.com
email:
on_success: change
on_failure: always
irc:
channels:
- "chat.freenode.net#wildmidi"
......
# ########## Project setup ##########
PROJECT(wildmidi C)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
CMAKE_MINIMUM_REQUIRED(VERSION 2.8.11)
# WildMIDI Version
SET(VERSION_MAJOR 0)
SET(VERSION_MINOR 3)
SET(VERSION_RELEASE 8)
SET(VERSION_MINOR 4)
SET(VERSION_RELEASE 0)
SET(WILDMIDI_VERSION "${VERSION_MAJOR}.${VERSION_MINOR}.${VERSION_RELEASE}")
# Lib Versions
SET(SOVERSION 1)
SET(VERSION 1.1.2)
SET(SOVERSION 2)
SET(VERSION 2.0.0)
# Find Macros
SET(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake)
......@@ -37,7 +37,9 @@ OPTION(WANT_STATIC "Build static library in addition to dynamic library" OF
CMAKE_DEPENDENT_OPTION(WANT_PLAYERSTATIC "Build a statically linked WildMIDI player" ON "WANT_STATIC" OFF)
OPTION(WANT_ALSA "Include ALSA (Advanced Linux Sound Architecture) support" OFF)
OPTION(WANT_OSS "Include OSS (Open Sound System) support" OFF)
#OPTION(WANT_COREAUDIO "Include CoreAudio support (Driver support for Mac OS X" OFF)
OPTION(WANT_OPENAL "Include OpenAL suport (Cross Platform) support" OFF)
OPTION(WANT_DEVTEST "Build WildMIDI DevTest file to check files" OFF)
IF(UNIX AND NOT APPLE)
SET(WILDMIDI_CFG "/etc/wildmidi/wildmidi.cfg" CACHE STRING "default config location")
ELSE()
......@@ -110,6 +112,9 @@ CHECK_C_SOURCE_COMPILES("static __inline__ int static_foo() {return 0;}
CHECK_C_SOURCE_COMPILES("static __inline int static_foo() {return 0;}
int main(void) {return 0;}" HAVE_C___INLINE)
CHECK_INCLUDE_FILE(stdint.h HAVE_STDINT_H)
CHECK_INCLUDE_FILE(inttypes.h HAVE_INTTYPES_H)
TEST_BIG_ENDIAN(WORDS_BIGENDIAN)
SET(AUDIODRV_ALSA)
......@@ -132,10 +137,6 @@ IF(UNIX AND NOT APPLE)
ENDIF()
SET(AUDIODRV_ALSA 1)
SET(AUDIO_LIBRARY ${ALSA_LIBRARY})
# FIXME: we need to add ALSA_INCLUDE_DIR only to the wildmidi
# target in src/CMakeLists.txt using TARGET_INCLUDE_DIRECTORIES()
# but that requires cmake-2.8.11 or newer
INCLUDE_DIRECTORIES(${ALSA_INCLUDE_DIR})
ELSEIF(WANT_OSS)
IF(NOT OSS_FOUND)
......@@ -151,20 +152,12 @@ IF(UNIX AND NOT APPLE)
ENDIF()
SET(AUDIODRV_OPENAL 1)
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
# FIXME: we need to add OPENAL_INCLUDE_DIR only to the wildmidi
# target in src/CMakeLists.txt using TARGET_INCLUDE_DIRECTORIES()
# but that requires cmake-2.8.11 or newer
INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
ELSE() # Try to auto-detect
IF(ALSA_FOUND)
SET(AUDIO_LIBRARY ${ALSA_LIBRARY})
SET(AUDIODRV_ALSA 1)
# FIXME: we need to add ALSA_INCLUDE_DIR only to the wildmidi
# target in src/CMakeLists.txt using TARGET_INCLUDE_DIRECTORIES()
# but that requires cmake-2.8.11 or newer
INCLUDE_DIRECTORIES(${ALSA_INCLUDE_DIR})
ELSEIF(OSS_FOUND)
# no special header paths
......@@ -174,10 +167,6 @@ IF(UNIX AND NOT APPLE)
ELSEIF(OPENAL_FOUND)
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
SET(AUDIODRV_OPENAL 1)
# FIXME: we need to add OPENAL_INCLUDE_DIR only to the wildmidi
# target in src/CMakeLists.txt using TARGET_INCLUDE_DIRECTORIES()
# but that requires cmake-2.8.11 or newer
INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
ELSE()
MESSAGE(WARNING "Could not find an audio sub-system!")
......@@ -211,10 +200,6 @@ IF (APPLE AND (WANT_PLAYER OR WANT_PLAYERSTATIC))
IF(OPENAL_FOUND)
SET(AUDIO_LIBRARY ${OPENAL_LIBRARY})
SET(AUDIODRV_OPENAL 1)
# FIXME: we need to add OPENAL_INCLUDE_DIR only to the wildmidi
# target in src/CMakeLists.txt using TARGET_INCLUDE_DIRECTORIES()
# but that requires cmake-2.8.11 or newer
INCLUDE_DIRECTORIES(${OPENAL_INCLUDE_DIR})
ELSE()
MESSAGE(WARNING "Could not find an audio sub-system!")
......@@ -234,6 +219,9 @@ ENDIF(WIN32)
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include")
FILE (MAKE_DIRECTORY "${CMAKE_BINARY_DIR}/include")
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_BINARY_DIR}/include")
IF(NOT HAVE_STDINT_H) # AND NOT HAVE_INTTYPES_H
INCLUDE_DIRECTORIES(BEFORE "${CMAKE_SOURCE_DIR}/include/stdint")
ENDIF()
IF(APPLE)
SET(APP_BUNDLE_NAME "${CMAKE_PROJECT_NAME}.app")
......
For the player see docs/license/GPLv3.txt
For the library see docs/license/LGPLv3.txt
For the player see docs/license/GPLv3.txt
For the library see docs/license/LGPLv3.txt
......@@ -6,7 +6,7 @@ files into audio which is then passed back to the calling application.
The library API is designed so that it is easy to include WildMIDI into
applications that wish to include MIDI file playback.
Version: 0.3.8
Version: 0.4.0
Licenses: GPLv3+ and LGPLv3
Website: http://www.mindwerks.net/projects/wildmidi
......@@ -30,6 +30,36 @@ Requirements:
CHANGELOG
0.4.0
* API change: The library now returns audio data in host-endian format,
not little-endian.
* API change: WildMidi_GetVersion() added to the api, along with new
numeric version macros in the wildmidi_lib.h header. the dso version
is changed from 1 to 2.
* API change: All long or unsigned long type _WM_Info fields changed
into strictly 32bit fields (int32_t or uint32_t.)
* API change: WildMidi_OpenBuffer() and WildMidi_GetOutput() changed
to accept strictly 32bit size parameters, i.e. uint32_t, instead of
unsigned long.
* API change: WildMidi_ConvertToMidi() and WildMidi_ConvertBufferToMidi()
added for MIDI-like files to be converted to MIDI.
* API change: WildMidi_SetCvtOption() added to support conversion options.
* API change: WildMidi_SongSeek() added to support Type 2 MIDI files.
* API change: WildMidi_GetLyric() added to support embedded text,
such as KAR files.
* API change: WildMidi_GetError() and WildMidi_ClearError() added to
cleanly check for, retrieve and clear error messages. They no longer
go to stderr.
* Support for loading XMI (XMIDI format) files, thanks Ryan Nunn for
releasing his code under the LGPL.
* Support for loading MUS (MUS Id format) files, such as from Doom.
* Support for loading HMP/HMI files, such as from Arena and Daggerfall.
* Support for loading KAR (MIDI with Lyrics) and Type 2 MIDI files.
* Build requires cmake-2.8.11 or newer now.
0.3.9
* Library: Fixed a segmentation fault with bad midi files.
0.3.8
* Library: Fixed a seek-to-0 bug in order to cure an issue of truncated
start (bug #100, gnome/gstreamer bug #694811.)
......
#------------------------------------------------------------------------------#
# This is a Makefile for building libWildMidi using GNU Make and GNU C compiler
# You will need a GCC/DJGPP package and GNU make to do it painlessly.
# Makefile for building WildMidi library and player for DOS.
# You will need a DJGPP build environment and GNU make to do it painlessly.
# To build natively on DOS, you need long file names support (e.g. doslfn.)
#------------------------------------------------------------------------------#
# Targets:
# - all (default): make libWildMidi.a library and wildmidi.exe
......@@ -10,6 +11,9 @@
# Set to 1 for debug build
DEBUG = 0
# Set to 1 if want to build / use a DXE3 version of the library (DJGPP-2.05 or newer)
USE_DXE = 0
# The tools
ifeq ($(CROSS),)
CC=gcc
......@@ -22,8 +26,9 @@ AS=$(CROSS)-as
AR=$(CROSS)-ar
RANLIB=$(CROSS)-ranlib
endif
DXE3GEN=dxe3gen
INCLUDE = -I. -I../include
INCLUDE = -I. -I../include/stdint -I../include
CFLAGS = $(INCLUDE) -Wall -W -fno-common
ARFLAGS = cr
......@@ -32,7 +37,12 @@ CFLAGS+= -DAUDIODRV_DOSSB
SB_OBJ = dosirq.o dosdma.o dossb.o
LD = $(CC)
LDFLAGS = -L. -lWildMidi -lm
ifneq ($(USE_DXE),1)
WM_LINK = WildMidi
else
WM_LINK = WildMidi_dxe
endif
LDFLAGS = -L. -l$(WM_LINK)
# build for pentium and newer (comment out if not wanted)
CFLAGS += -march=i586
......@@ -40,7 +50,6 @@ ifeq ($(DEBUG),1)
CFLAGS += -g
else
CFLAGS += -O2 -fomit-frame-pointer -ffast-math
LDFLAGS+= -s
endif
# Build rules
......@@ -50,11 +59,11 @@ endif
$(CC) -c $(CFLAGS) -o $@ $<
# Objects
LIB_OBJ= wm_error.o file_io.o lock.o wildmidi_lib.o reverb.o gus_pat.o
LIB_OBJ= wm_error.o file_io.o lock.o wildmidi_lib.o reverb.o gus_pat.o f_xmidi.o f_mus.o f_hmp.o f_midi.o f_hmi.o mus2mid.o xmi2mid.o internal_midi.o patches.o sample.o
PLAYER_OBJ= $(SB_OBJ) getopt_long.o wm_tty.o wildmidi.o
# Build targets
TARGETS = libWildMidi.a wildmidi.exe
TARGETS = libWildMidi.a wildmidi.exe libWildMidi_dxe.a wildmidi.dxe
.PHONY: clean distclean
all: $(TARGETS)
......@@ -63,7 +72,11 @@ libWildMidi.a: $(LIB_OBJ)
$(AR) $(ARFLAGS) $@ $^
$(RANLIB) $@
wildmidi.exe: libWildMidi.a $(PLAYER_OBJ)
libWildMidi_dxe.a: wildmidi.dxe
wildmidi.dxe: $(LIB_OBJ)
-$(DXE3GEN) -Y libWildMidi_dxe.a -o $@ -E _WildMidi_ -U $^
wildmidi.exe: lib$(WM_LINK).a $(PLAYER_OBJ)
$(LD) -o $@ $(PLAYER_OBJ) $(LDFLAGS)
clean:
......
This directory contains the Makefile and config.h needed to compile
libWilMidi library and wildmidi player for DOS using DJGPP.
To compile, you need DJGPP library and its associated compiler suite.
Both djgpp-v2.03 and v2.04 should work. DJGPP is available from its
official site at <http://www.delorie.com/djgpp/>
Cd in to the djgpp directory and run 'make', i.e.:
cd djgpp
make
.. which will generate libWildMidi.a and wildmidi.exe. If necessary,
edit the Makefile to meet your needs/environment.
The player (wildmidi.exe) can either output to a Sound Blaster (SB1,
SB2, SBPro, SB16, or compatible) hardware:
wildmidi mymidi.mid
... or, it can generate a wav file:
wildmidi -o output.wav mymidi.mid
Use -r <SampleRate> to specify a sample rate, use -c <ConfigFile> to
point to your wildmidi.cfg config file:
wildmidi -c c:\wildmidi.cfg -r 22050 mymidi.mid
Run "wildmidi -h" to see other command line switches.
This directory contains the Makefile and config.h needed to compile
libWilMidi library and wildmidi player for DOS using DJGPP.
To compile, you need DJGPP library and its associated compiler suite.
Both djgpp-v2.03 and v2.05 should work. DJGPP is available from its
official site at <http://www.delorie.com/djgpp/>
Cd in to the djgpp directory and run 'make', i.e.:
cd djgpp
make
.. which will generate libWildMidi.a and wildmidi.exe. If necessary,
edit the Makefile to meet your needs/environment.
The player (wildmidi.exe) can either output to a Sound Blaster (SB1,
SB2, SBPro, SB16, or compatible) hardware:
wildmidi mymidi.mid
... or, it can generate a wav file:
wildmidi -o output.wav mymidi.mid
Use -r <SampleRate> to specify a sample rate, use -c <ConfigFile> to
point to your wildmidi.cfg config file:
wildmidi -c c:\wildmidi.cfg -r 22050 mymidi.mid
Run "wildmidi -h" to see other command line switches.
#define VERSION "0.3.8"
#define WILDMIDI_CFG "wildmidi.cfg"
#define PACKAGE_URL "http://www.mindwerks.net/projects/wildmidi/"
#define PACKAGE_BUGREPORT "https://github.com/Mindwerks/wildmidi/issues"
#define PACKAGE_VERSION VERSION
#define PACKAGE_VERSION "0.4.0"
#define HAVE_C_INLINE
......
HMP File Format
(Incomplete - Under Construction)
Document version 1
Authored by Chris Ison chrisisonwildcode@gmail.com
Last Edited 24 May 2014
Copyright (C) 2014 WildMidi Developers
This document is licensed under the
Creative Commons Attribution-ShareAlike 4.0 International License.
To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/4.0/
Introduction
This document describes the HMI format as used by the WildMIDI project.
It is not a complete description of the HMI file format and only those
parts that have been decyphered and are relevant to the WildMidi project
are described here. Unfortunately we cannot answer questions about the
format that are not described within this document. If you feel there
is an error in this document please feel free to report it as a bug at
https://github.com/Mindwerks/wildmidi/issues/
Description
// Header
{
char header[18] = "HMI-MIDISONG061595";
char no_idea_1[196];
char beats_per_minute;
char no_idea_2[15];
char track_count;
char no_idea_3[141];
{
// Repeat for number of tracks in track_count
char track_offset[4]; // Stored as little endian;
}
char no_idea_4[??]; // this is the remaining amout up to the first
// track chunk marked by the first track offset.
}
// Track Chunk
{
char track_header[] = "HMI-MIDITRACK";
char no_idea_4[74];
char track_header_size[4];
char no_idea_5[(track_header_size - 91];
{
// Repeat until end of track detected
// ** NOTE ** Since track chunk has no length details,
// you need to scan for end of track marker.
char midi_delta[] = ???; // See MIDI Delta
char midi_event[] = ???; // See MIDI Events
// ** NOTE ** Note On event is slightly different to the
// normal MIDI note on event. See MIDI Events below.
// Last event in track chunk is end of track meta event,
// defined as 0xff 0x2f 0x00.
}
{
// Extra Data
{
// Some HMI files have data after the tracks.
// Details are unknown about these bytes of data.
char no_idea_6[] = ???;
}
MIDI Delta
This is a variable length value that determins how time (in MIDI ticks)
is to pass before the following MIDI event is to be processed.
Just like MIDI's variable length values, HMI files have bit 7 set
on the each value in the variable length value except the last one.
A value of 255 would be stored as 0x81 0x7f, or a value of 1 would
be stored as 0x01 in the HMI variable length format.
Examples:
Delta of 255: < midi event > 0x81 0x7f < midi event>
Delta of 127: < midi event > 0x7f < midi event >
Delta of 65537: < midi event > 0x82 0x80 0x71 < midi event >
MIDI Events
The first byte of a midi events is split into 2 x 4bits. Bits 7-4 is the
command while bits 3-0 is the MIDI channel the command is to occur on.
For example 0x94 means do command 9 on channel 4. The only exception to
this is where bits 7-4 = F in hexidecimal as these are a special group
of commands.
The following commands are detailed in this document with the channel
information (bits 3 - 0) set to 0, example 0x80. However the channel
information could have a value anywhere from 0 to F in hexidecimal.
// Note On Event
{
char cmd = 0x90;
char note = 32; // Could be a value of 0 - 127
char velocity = 100; // Could be a value of 0 - 127.
// If this value is 0 then it
// is treated as a note off
char length[] = < variable length value >; // See MIDI Delta for example
}
// Aftertouch Event
{
// See "Aftertouch Event" in MidFileFormat.txt
}
// Controller Events
{
// See "Controller Events" in MidFileFormat.txt
}
// Patch Event
{
// See "Patch Event" in MidFileFormat.txt
}
// Preasure Event
{
// See "Pressure Event" in MidFileFormat.txt
}
// Pitch Event
{
// See "Patch Event" in MidFileFormat.txt
}
// Sysexs Events
{
// See "Sysex Events" in MidFileFormat.txt
}
// HMI Events
{
// This is undocumented in specifications others have put together
// so nothing other than the following is known about it.
char cmd = 0xfe;
{
char type = 0x10;
char data_1[2];
char size; // Could be anything from 0x00 to 0xff
char data_2[size];
char data_3[5];
}
// *** OR ***
{
char type = 0x15;
char data[6];
}
// *** OR ***
{
char type;
char data[2];
}
}
// Meta Events
{
// See "Meta Events" MidFileFormat.txt
}
HMP File Format
(Incomplete - Under Construction)
Document version 1
Written by Chris Ison
Last Edited 24 May 2014
Copyright (C) 2014 WildMidi Developers
This document is licensed under the
Creative Commons Attribution-ShareAlike 4.0 International License.
To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/4.0/
Introduction
This document describes the HMP format as used by the WildMIDI project.
It is not a complete description of the HMP file format and only those
parts that are relevant to the WildMidi project are described here.
Unfortunately we cannot answer questions about the format that are not
described within this document. If you feel there is an error in this
document please feel free to report it as a bug at
https://github.com/Mindwerks/wildmidi/issues/
The HMP format comes in 2 versions. Apart from the file header there is
no difference between the 2 versions as far WildMIDI is concerned.
Description
// First version of hmp files
{
char header[] = "HMIMIDIP";
char no_idea_1[24]; // All zeros
}
// *** OR ***
// Second version of hmp files
{
char header[] = "HMIMIDIP013195";
char no_idea_1[18]; // All zeros
}
// The remaining header section of hmp files
{ char file_length[4]; // File size minus header[] stored as little-endian
char no_idea_2[16]; // All zeros
char number_of_chunks[4]; // Number of chunks stored as little-endian
char no_idea_3[4]; // Unknown
char beats_per_minute[4]; // beats per minute stored as little-endian
// *** NOTE: Using a division of 60 ***
char song_length_s[4]; // length of song in seconds as little-endian
}
// First version of hmp files
{
char no_idea4[712]; // Unknown
// chunks start here
}
// *** OR ***
// Second version of hmp files
{
char no_idea4[840]; // Unknown
// chunks start here
}
// Chunk information
{
char chunk_number[4]; // Stored as little-endian
char chunk_length[4]; // Size of entire chunk stored as little-endian
char track_number[4]; // Track numbe stored as little endian
{
// Repeat until end of chunk
char midi_delta[] = ???; // See MIDI Delta
char midi_event[] = ???; // See MIDI Events
}
}
MIDI Delta
This is a variable length value that determins how time (in MIDI ticks)
is to pass before the following MIDI event is to be processed. Opposite
to MIDI variable length values. In HMP files the variable length value
is stored in LSB with bit 7 set off for all except the last 7 bit value.
A value of 255 would be stored as 0x7f 0x81, or a value of 1 would be
stored as 0x81 in the HMP variable length format.
Examples:
Delta of 255: < midi event > 0x7f 0x81 < midi event>
Delta of 127: < midi event > 0xff < midi event >
Delta of 65537: < midi event > 0x7f 0x00 0x82 < midi event >
MIDI Events
The first byte of a midi events is split into 2 x 4bits. Bits 7-4 is the
command while bits 3-0 is the MIDI channel the command is to occur on.
For example 0x94 means do command 9 on channel 4. The only exception to
this is where bits 7-4 = F in hexidecimal as these are a special group
of commands.
The following commands are detailed in this document with the channel
information (bits 3 - 0) set to 0, example 0x80. However the channel
information could have a value anywhere from 0x0 to 0xf.
For more detail about the folling MIDI command information please see
MidiFileFormat.txt within the WildMIDI project source code.
// Note Off
{
char cmd = 0x80;
char note = 27; // Could be a value of 0 - 127
char velocity = 0; // Could be a value of 0 - 127. Ignored by WildMIDI
}
// Note On
{
char cmd = 0x90;
char note = 32; // Could be a value of 0 - 127
char velocity = 100; // Could be a value of 0 - 127.
// If this value is 0 then it is treated as a note of
}
// Aftertouch
{
// Adjust the velocity of a note as if adjusting the preasure you
// are placing on the key of a preasure sensitive keyboard after
// you started playing it.
char cmd = 0xa0;
char note = 32; // Could be a value of 0 - 127
char velocity = 100; // Could be a value of 0 - 127.
}
// Controller
{
char cmd = 0xb0;
char controller = 32; // Could be a value of 0 - 127
char setting = 100; // Could be a value of 0 - 127
/*
In track 1 of HMP files controller 110 is set to 255 to
mark the start of the looped events of tracks 2 & 3.
Controller 111 in track 1 set to 128 to mark the end of
the looped events of track 2 & 3.
*/
}
// Patch
{
/*
Change the patch (or sound) used to play notes on the channel
*/
char cmd = 0xc0;
char change_patch = 32; // Could be a value of 0 - 127
}
// Preasure
{
/*
Adjust the velocity of all active notes on the channel
as if adjusting the preasure you are placing on the keys
of a preasure sensitive keyboard after you started playing
them.
*/
char cmd = 0xd0;
char velocity = 32; // Could be a value of 0 - 127
}
// Pitch
{
/*
Adjust the pitch of a channel just like a pitch bend wheel does.
*/
char cmd = 0xe0;
char data_1 = 32; // Could be a value of 0 - 127
char data_2 = 100; // Could be a value of 0 - 127.
}
// Sysex
{
** It is uncertain if sysex events will apepar in a HMP file **
** but they have been included because it is possible **
char cmd = 0xf0;
// *** OR ***
char cmd = 0xf7;
char sysex_size[] = < variable length in MIDI file format >;
char sysex_data[sysex_size] = ...; // Ending with 0xf7
}
// Meta Events
{
char cmd = 0xff;
char instruction = 0x02; // Could be 0 - 127
char data_size[] = < variable length in MIDI file format >;
char data[data_size];
}
This diff is collapsed.
This diff is collapsed.
XMI File Format
(Incomplete - Under Construction)
Document version 1
Authored by Chris Ison chrisisonwildcode@gmail.com
Last Edited 24 May 2014
Copyright (C) 2014 WildMidi Developers
This document is licensed under the
Creative Commons Attribution-ShareAlike 4.0 International License.
To view a copy of this license, visit
http://creativecommons.org/licenses/by-sa/4.0/
Introduction
This document describes the XMI format as used by the WildMIDI project.
It is not a complete description of the XMI file format and only those
parts that have been decyphered and are relevant to the WildMidi project