diff options
| author | Gary Scavone <gary@music.mcgill.ca> | 2013-10-11 15:38:21 +0200 |
|---|---|---|
| committer | Stephen Sinclair <sinclair@music.mcgill.ca> | 2013-10-11 15:38:21 +0200 |
| commit | 0f31bb3d0ae7fc6f5ff41e3c4963450dad350fc2 (patch) | |
| tree | 0af744d634b17667adcbd4f2ba8e1c9c08218165 /doc/html/index.html | |
| parent | a9f686ec60569047d7df03bfb034326700a56a57 (diff) | |
Release 2.0.0 tarball2.0.0
Diffstat (limited to 'doc/html/index.html')
| -rw-r--r-- | doc/html/index.html | 62 |
1 files changed, 38 insertions, 24 deletions
diff --git a/doc/html/index.html b/doc/html/index.html index 7e433c1..4728ef1 100644 --- a/doc/html/index.html +++ b/doc/html/index.html @@ -9,9 +9,9 @@ <HR> <!-- Generated by Doxygen 1.6.2 --> <div class="contents"> -<h1>The <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> Tutorial </h1><h3 class="version">1.0.15 </h3><center><a class="el" href="index.html#intro">Introduction</a> <a class="el" href="index.html#download">Download</a> <a class="el" href="index.html#start">Getting Started</a> <a class="el" href="index.html#error">Error Handling</a> <a class="el" href="index.html#probing">Probing Ports</a> <a class="el" href="index.html#output">MIDI Output</a> <a class="el" href="index.html#input">MIDI Input</a> <a class="el" href="index.html#virtual">Virtual Ports</a> <a class="el" href="index.html#compiling">Compiling</a> <a class="el" href="index.html#debug">Debugging</a> <a class="el" href="index.html#apinotes">API Notes</a> <a class="el" href="index.html#acknowledge">Acknowledgements</a> <a class="el" href="index.html#license">License</a></center><h2><a class="anchor" id="intro"> +<h1>The <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> Tutorial </h1><h3 class="version">2.0.0 </h3><center><a class="el" href="index.html#intro">Introduction</a> <a class="el" href="index.html#download">Download</a> <a class="el" href="index.html#start">Getting Started</a> <a class="el" href="index.html#error">Error Handling</a> <a class="el" href="index.html#probing">Probing Ports</a> <a class="el" href="index.html#output">MIDI Output</a> <a class="el" href="index.html#input">MIDI Input</a> <a class="el" href="index.html#virtual">Virtual Ports</a> <a class="el" href="index.html#compiling">Compiling</a> <a class="el" href="index.html#debug">Debugging</a> <a class="el" href="index.html#multi">Using Simultaneous Multiple APIs</a> <a class="el" href="index.html#apinotes">API Notes</a> <a class="el" href="index.html#acknowledge">Acknowledgements</a> <a class="el" href="index.html#license">License</a></center><h2><a class="anchor" id="intro"> Introduction</a></h2> -<p><a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> is a set of C++ classes (<a class="el" href="classRtMidiIn.html" title="A realtime MIDI input class.">RtMidiIn</a> and <a class="el" href="classRtMidiOut.html" title="A realtime MIDI output class.">RtMidiOut</a>) that provides a common API (Application Programming Interface) for realtime MIDI input/output across Linux (ALSA & Jack), Macintosh OS X, Windows (Multimedia Library), and SGI operating systems. <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> significantly simplifies the process of interacting with computer MIDI hardware and software. It was designed with the following goals:</p> +<p><a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> is a set of C++ classes (<a class="el" href="classRtMidiIn.html" title="A realtime MIDI input class.">RtMidiIn</a>, <a class="el" href="classRtMidiOut.html" title="A realtime MIDI output class.">RtMidiOut</a> and API-specific classes) that provides a common API (Application Programming Interface) for realtime MIDI input/output across Linux (ALSA & Jack), Macintosh OS X (CoreMidi & Jack), and Windows (Multimedia Library & Kernel Streaming) operating systems. <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> significantly simplifies the process of interacting with computer MIDI hardware and software. It was designed with the following goals:</p> <ul> <li> object oriented C++ design </li> @@ -22,14 +22,18 @@ only two header files and one source file for easy inclusion in programming proj <li> MIDI device enumeration </li> </ul> +<p>Where applicable, multiple API support can be compiled and a particular API specified when creating an RtAudio instance.</p> <p>MIDI input and output functionality are separated into two classes, <a class="el" href="classRtMidiIn.html" title="A realtime MIDI input class.">RtMidiIn</a> and <a class="el" href="classRtMidiOut.html" title="A realtime MIDI output class.">RtMidiOut</a>. Each class instance supports only a single MIDI connection. <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> does not provide timing functionality (i.e., output messages are sent immediately). Input messages are timestamped with delta times in seconds (via a <code>double</code> floating point type). MIDI data is passed to the user as raw bytes using an std::vector<unsigned char>.</p> +<h2><a class="anchor" id="whatsnew"> +What's New (Version 2.0)</a></h2> +<p>No incompatable API changes were made in version 2.0, however, support for multiple compiled APIs (where available) was added (see <a class="el" href="index.html#multi">Using Simultaneous Multiple APIs</a>). Other changes include: 1. Added Windows Kernel Streaming support (thanks to Sebastien Alaiwan), though not tested in Visual Studio (and timestamping is not implemented); and 2. Support for the IRIX (SGI) operating system was discontinued.</p> <h2><a class="anchor" id="download"> Download</a></h2> -<p>Latest Release (11 August 2011): <a href="http://www.music.mcgill.ca/~gary/rtmidi/release/rtmidi-1.0.15.tar.gz">Version 1.0.15</a></p> +<p>Latest Release (18 June 2012): <a href="http://www.music.mcgill.ca/~gary/rtmidi/release/rtmidi-2.0.0.tar.gz">Version 2.0.0</a></p> <h2><a class="anchor" id="start"> Getting Started</a></h2> <p>The first thing that must be done when using <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> is to create an instance of the <a class="el" href="classRtMidiIn.html" title="A realtime MIDI input class.">RtMidiIn</a> or <a class="el" href="classRtMidiOut.html" title="A realtime MIDI output class.">RtMidiOut</a> subclasses. <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> is an abstract base class, which itself cannot be instantiated. Each default constructor attempts to establish any necessary "connections" with the underlying MIDI system. <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> uses C++ exceptions to report errors, necessitating try/catch blocks around many member functions. An <a class="el" href="classRtError.html" title="Exception handling class for RtAudio & RtMidi.">RtError</a> can be thrown during instantiation in some circumstances. A warning message may also be reported if no MIDI devices are found during instantiation. The <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> classes have been designed to work with "hot pluggable" or virtual (software) MIDI devices, making it possible to connect to MIDI devices that may not have been present when the classes were instantiated. The following code example demonstrates default object construction and destruction:</p> -<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "RtMidi.h"</span> +<div class="fragment"><pre class="fragment"><span class="preprocessor">#include "<a class="code" href="RtMidi_8h.html">RtMidi.h</a>"</span> <span class="keywordtype">int</span> main() { @@ -58,7 +62,7 @@ Probing Ports</a></h2> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> -<span class="preprocessor">#include "RtMidi.h"</span> +<span class="preprocessor">#include "<a class="code" href="RtMidi_8h.html">RtMidi.h</a>"</span> <span class="keywordtype">int</span> main() { @@ -99,7 +103,7 @@ Probing Ports</a></h2> } <span class="comment">// Check outputs.</span> - nPorts = midiout-><a class="code" href="classRtMidiOut.html#ad6cddbcc7faa20a7be229f765ade0877" title="Return the number of available MIDI output ports.">getPortCount</a>(); + nPorts = midiout-><a class="code" href="classRtMidiOut.html#a0c4d662e1c398ddf35a2dbaf66f50976" title="Return the number of available MIDI output ports.">getPortCount</a>(); std::cout << <span class="stringliteral">"\nThere are "</span> << nPorts << <span class="stringliteral">" MIDI output ports available.\n"</span>; <span class="keywordflow">for</span> ( <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i=0; i<nPorts; i++ ) { <span class="keywordflow">try</span> { @@ -128,7 +132,7 @@ MIDI Output</a></h2> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> -<span class="preprocessor">#include "RtMidi.h"</span> +<span class="preprocessor">#include "<a class="code" href="RtMidi_8h.html">RtMidi.h</a>"</span> <span class="keywordtype">int</span> main() { @@ -136,7 +140,7 @@ MIDI Output</a></h2> std::vector<unsigned char> message; <span class="comment">// Check available ports.</span> - <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nPorts = midiout-><a class="code" href="classRtMidiOut.html#ad6cddbcc7faa20a7be229f765ade0877" title="Return the number of available MIDI output ports.">getPortCount</a>(); + <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> nPorts = midiout-><a class="code" href="classRtMidiOut.html#a0c4d662e1c398ddf35a2dbaf66f50976" title="Return the number of available MIDI output ports.">getPortCount</a>(); <span class="keywordflow">if</span> ( nPorts == 0 ) { std::cout << <span class="stringliteral">"No ports available!\n"</span>; <span class="keywordflow">goto</span> cleanup; @@ -191,7 +195,7 @@ Queued MIDI Input</a></h3> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> <span class="preprocessor">#include <signal.h></span> -<span class="preprocessor">#include "RtMidi.h"</span> +<span class="preprocessor">#include "<a class="code" href="RtMidi_8h.html">RtMidi.h</a>"</span> <span class="keywordtype">bool</span> done; <span class="keyword">static</span> <span class="keywordtype">void</span> finish(<span class="keywordtype">int</span> ignore){ done = <span class="keyword">true</span>; } @@ -209,7 +213,7 @@ Queued MIDI Input</a></h3> std::cout << <span class="stringliteral">"No ports available!\n"</span>; <span class="keywordflow">goto</span> cleanup; } - midiin-><a class="code" href="classRtMidiIn.html#a7e853661b1056083e07318d67c51f6fd" title="Open a MIDI input connection.">openPort</a>( 0 ); + midiin-><a class="code" href="classRtMidiIn.html#a39df8f81a22f729a9904707dde487d2c" title="Open a MIDI input connection.">openPort</a>( 0 ); <span class="comment">// Don't ignore sysex, timing, or active sensing messages.</span> midiin-><a class="code" href="classRtMidiIn.html#af9507125aaa42276ccc01df576fc3533" title="Specify whether certain MIDI message types should be queued or ignored during input...">ignoreTypes</a>( <span class="keyword">false</span>, <span class="keyword">false</span>, <span class="keyword">false</span> ); @@ -246,7 +250,7 @@ MIDI Input with User Callback</a></h3> <span class="preprocessor">#include <iostream></span> <span class="preprocessor">#include <cstdlib></span> -<span class="preprocessor">#include "RtMidi.h"</span> +<span class="preprocessor">#include "<a class="code" href="RtMidi_8h.html">RtMidi.h</a>"</span> <span class="keywordtype">void</span> mycallback( <span class="keywordtype">double</span> deltatime, std::vector< unsigned char > *message, <span class="keywordtype">void</span> *userData ) { @@ -268,7 +272,7 @@ MIDI Input with User Callback</a></h3> <span class="keywordflow">goto</span> cleanup; } - midiin-><a class="code" href="classRtMidiIn.html#a7e853661b1056083e07318d67c51f6fd" title="Open a MIDI input connection.">openPort</a>( 0 ); + midiin-><a class="code" href="classRtMidiIn.html#a39df8f81a22f729a9904707dde487d2c" title="Open a MIDI input connection.">openPort</a>( 0 ); <span class="comment">// Set our callback function. This should be done immediately after</span> <span class="comment">// opening the port to avoid having incoming messages written to the</span> @@ -300,30 +304,32 @@ Compiling</a></h2> <tr> <td>Linux </td><td>ALSA Sequencer </td><td>__LINUX_ALSASEQ__ </td><td><code>asound, pthread</code> </td><td><code>g++ -Wall -D__LINUX_ALSASEQ__ -o midiprobe midiprobe.cpp RtMidi.cpp -lasound -lpthread</code> </td></tr> <tr> -<td>Linux </td><td>Jack MIDI </td><td>__LINUX_JACK__ </td><td><code>jack</code> </td><td><code>g++ -Wall -D__LINUX_JACK__ -o midiprobe midiprobe.cpp RtMidi.cpp -ljack</code> </td></tr> +<td>Linux or Mac </td><td>Jack MIDI </td><td>__UNIX_JACK__ </td><td><code>jack</code> </td><td><code>g++ -Wall -D__UNIX_JACK__ -o midiprobe midiprobe.cpp RtMidi.cpp -ljack</code> </td></tr> <tr> <td>Macintosh OS X </td><td>CoreMidi </td><td>__MACOSX_CORE__ </td><td><code>CoreMidi, CoreAudio, CoreFoundation</code> </td><td><code>g++ -Wall -D__MACOSX_CORE__ -o midiprobe midiprobe.cpp RtMidi.cpp -framework CoreMidi -framework CoreAudio -framework CoreFoundation</code> </td></tr> <tr> -<td>Irix </td><td>MD </td><td>__IRIX_MD__ </td><td><code>md, pthread</code> </td><td><code>CC -Wall -D__IRIX_MD__ -o midiprobe midiprobe.cpp RtMidi.cpp -laudio -lpthread</code> </td></tr> -<tr> <td>Windows </td><td>Multimedia Library </td><td>__WINDOWS_MM__ </td><td><code>winmm.lib, multithreaded</code> </td><td><em>compiler specific</em> </td></tr> +<tr> +<td>Windows </td><td>Kernel Streaming </td><td>__WINDOWS_KS__ </td><td><code>ks.h, ksmedia.h, setupapi.lib, ksuser.lib, multithreaded</code> </td><td><em>compiler specific</em> </td></tr> </table> -<p>The example compiler statements above could be used to compile the <code>midiprobe.cpp</code> example file, assuming that <code>midiprobe.cpp</code>, <code><a class="el" href="RtMidi_8h_source.html">RtMidi.h</a></code>, <code><a class="el" href="RtError_8h_source.html">RtError.h</a></code>, and <code>RtMidi.cpp</code> all exist in the same directory.</p> +<p>The example compiler statements above could be used to compile the <code>midiprobe.cpp</code> example file, assuming that <code>midiprobe.cpp</code>, <code><a class="el" href="RtMidi_8h.html">RtMidi.h</a></code>, <code><a class="el" href="RtError_8h_source.html">RtError.h</a></code>, and <code>RtMidi.cpp</code> all exist in the same directory.</p> <h2><a class="anchor" id="debug"> Debugging</a></h2> -<p>If you are having problems getting <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> to run on your system, try passing the preprocessor definition <code>__RTMIDI_DEBUG__</code> to the compiler (or define it in <a class="el" href="RtMidi_8h_source.html">RtMidi.h</a>). A variety of warning messages will be displayed that may help in determining the problem. Also try using the programs included in the <code>test</code> directory. The program <code>midiprobe</code> displays the queried capabilities of all MIDI ports found.</p> +<p>If you are having problems getting <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> to run on your system, try passing the preprocessor definition <code>__RTMIDI_DEBUG__</code> to the compiler (or define it in <a class="el" href="RtMidi_8h.html">RtMidi.h</a>). A variety of warning messages will be displayed that may help in determining the problem. Also try using the programs included in the <code>test</code> directory. The program <code>midiprobe</code> displays the queried capabilities of all MIDI ports found.</p> +<h2><a class="anchor" id="multi"> +Using Simultaneous Multiple APIs</a></h2> +<p>Support for each MIDI API is encapsulated in specific <a class="el" href="classMidiInApi.html">MidiInApi</a> or <a class="el" href="classMidiOutApi.html">MidiOutApi</a> subclasses, making it possible to compile and instantiate multiple API-specific subclasses on a given operating system. For example, one can compile both the CoreMIDI and Jack support on the OS-X operating system by providing the appropriate preprocessor definitions for each. In a run-time situation, one might first attempt to determine whether any Jack ports are available. This can be done by specifying the api argument <a class="el" href="classRtMidi.html#aac66af04a85fe5c5f07c360574a19406a1f59daf3120f47c0ae3891773112ddfa">RtMidi::UNIX_JACK</a> when attempting to create an instance of <a class="el" href="classRtMidiIn.html" title="A realtime MIDI input class.">RtMidiIn</a> or <a class="el" href="classRtMidiOut.html" title="A realtime MIDI output class.">RtMidiOut</a>. If no available ports are found, then an instance of <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> with the api argument <a class="el" href="classRtMidi.html#aac66af04a85fe5c5f07c360574a19406a3f41293f89467641484fbd54c4530908">RtMidi::MACOSX_CORE</a> can be created. Alternately, if no api argument is specified, <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> will first look for CoreMIDI ports and if none are found, then Jack ports (in linux, the search order is ALSA and then Jack; in windows, the search order is WinMM and then WinKS). In theory, it should also be possible to have separate instances of <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> open at the same time with different underlying API support, though this has not been tested.</p> +<p>The static function <a class="el" href="classRtMidi.html#a025fa339486c9a34b26ec707aa2944ce" title="A static function to determine the available compiled MIDI APIs.">RtMidi::getCompiledApi()</a> is provided to determine the available compiled API support. The function RtMidi::getCurrentApi() indicates the API selected for a given <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> instance.</p> <h2><a class="anchor" id="apinotes"> API Notes</a></h2> <p><a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> is designed to provide a common API across the various supported operating systems and audio libraries. Despite that, some issues should be mentioned with regard to each.</p> <h3><a class="anchor" id="linux"> Linux:</a></h3> -<p><a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> for Linux was developed using the Fedora distribution. A decision was made to not include support for the OSS API because the OSS API provides such limited functionality and because <a href="http://www.alsa-project.org/">ALSA</a> support is now incorporated in the Linux kernel. <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> uses the ALSA sequencer API, which allows for virtual software input and output ports.</p> +<p><a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> for Linux was developed using the Fedora distribution. Two different MIDI APIs are supported on Linux platforms: <a href="http://www.alsa-project.org/">ALSA</a> and <a href="http://jackit.sourceforge.net/">Jack</a>. A decision was made to not include support for the OSS API because the OSS API provides such limited functionality and because <a href="http://www.alsa-project.org/">ALSA</a> support is now incorporated in the Linux kernel. The ALSA sequencer and Jack APIs allows for virtual software input and output ports.</p> <h3><a class="anchor" id="macosx"> Macintosh OS X (CoreAudio):</a></h3> <p>The Apple CoreMidi API allows for the establishment of virtual input and output ports to which other software applications can connect.</p> -<h3><a class="anchor" id="irix"> -Irix (SGI):</a></h3> -<p>The Irix version of <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> was written and tested on an SGI Indy running Irix version 6.5.4 and the MD audio library.</p> +<p>The <a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a> Jack support can be compiled on Macintosh OS-X systems, as well as in Linux.</p> <h3><a class="anchor" id="windowsds"> Windows (Multimedia Library):</a></h3> <p>The <code>configure</code> script provides support for the MinGW compiler.</p> @@ -335,6 +341,8 @@ Acknowledgements</a></h2> <p>Many thanks to the following people for providing bug fixes and improvements: </p> <ul> <li> +Sebastien Alaiwan (Jack memory leaks, Windows kernel streaming) </li> +<li> Jean-Baptiste Berruchon (Windows sysex code) </li> <li> Pedro Lopez-Cabanillas (ALSA sequencer API, client naming) </li> @@ -345,10 +353,14 @@ Eduardo Coutinho (Windows device names) </li> <li> Paul Dean (increment optimization) </li> <li> +Luc Deschenaux (sysex issues) </li> +<li> John Dey (OS-X timestamps) </li> <li> Christoph Eckert (ALSA sysex fixes) </li> <li> +Martin Koegler (various fixes) </li> +<li> Immanuel Litzroth (OS-X sysex fix) </li> <li> Jon McCormack (Snow Leopard updates) </li> @@ -360,20 +372,22 @@ Alexander Svetalkin (Jack MIDI) </li> Casey Tucker (OS-X driver information, sysex sending) </li> <li> Bastiaan Verreijt (Windows sysex multi-buffer code) </li> +<li> +Dan Wilcox </li> </ul> <h2><a class="anchor" id="license"> License</a></h2> <p><a class="el" href="classRtMidi.html" title="An abstract base class for realtime MIDI input/output.">RtMidi</a>: realtime MIDI i/o C++ classes<br/> - Copyright (c) 2003-2011 Gary P. Scavone</p> + Copyright (c) 2003-2012 Gary P. Scavone</p> <p>Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:</p> <p>The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.</p> -<p>Any person wishing to distribute modifications to the Software is requested to send the modifications to the original developer so that they can be incorporated into the canonical version.</p> +<p>Any person wishing to distribute modifications to the Software is asked to send the modifications to the original developer so that they can be incorporated into the canonical version. This is, however, not a binding provision of this license.</p> <p>THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. </p> </div> <HR> <table><tr><td><img src="../images/mcgill.gif" width=165></td> - <td>©2003-2011 Gary P. Scavone, McGill University. All Rights Reserved.<br> + <td>©2003-2012 Gary P. Scavone, McGill University. All Rights Reserved.<br> Maintained by Gary P. Scavone, gary at music.mcgill.ca</td></tr> </table> |
