\documentclass[a4paper,11pt]{report}
\usepackage[german]{babel}
\usepackage{epsfig}
\usepackage{verbatim}
\newcommand{\url}[1]{\nobreak{\it#1}}
\newcommand{\tilda}{\def\~{}}
\newcommand{\grad}{\ensuremath{^\circ}}
\usepackage{german}
\hyphenation{Midi-schnittstelle um-standlich ALSA-Sequencer}
\sloppy
\selectlanguage{\austrian}
\begin{document}
\titlepage
\title{050.128\\
Interdisziplin\"ares Didaktikpraktikum\\
WS 1005/2006\\
Portierung der MIDI-Befehle zwischen zwei Logo-Implementationen\\
F\"acher: Informatik, Musikerziehung
}
\author{Alexander \"Olzant\\
9301547}
\maketitle

\tableofcontents


\chapter{Einleitung}

F\"ur die Lehrveranstaltung \glqq Spezielle Kapitel der
Schulinformatik\grqq{} bei Prof. Neuwirth ist die Verwendung des an und 
f\"ur sich freien Logo-Dialekts MSWLogo vorgesehen, die jedoch nur f\"ur
eine spezifische Plattform verf\"ugbar ist. Die Didaktischen Konzepte der
Lehrveranstaltung bestehen in Verstehen und Begreifen einer funktionalen 
Programmiersprache und erweiterter Datenstrukturen mittels der
Programmierung einer Melodie- bzw Ger\"auschstruktur und Abspielen dieser
\"uber die MIDI-Funktionen der Programmiersprache, um diese nun auch auf
freien Betriebssystemen nutzen zu k\"onnen, wurde eine M\"oglichkeit gesucht,
die MIDI-Ausgabe auch unter GNU/Linux zu erm\"oglichen.

Eine M\"oglichkeit w\"are hier gewesen, \"uber den Emulator Wine die
Midi\-{}schnittstellen des Host-Systems mit MSWLogo zu nutzen, was jedoch
umst\"andlich und unelegant gewesen w\"are und auch nicht auf allen
CPU-Plattformen funktioniert.

Die Implementation erfolgte hier mittels Ansteuerung \"uber ALSA-Sequencer,
tats\"achlich ist die gew\"ahlte M\"oglichkeit eine von mehreren Varianten,
timidity asynchron anzusprechen; der Vorteil ist, dass ein beliebiges
Midi-Device (Software-Synthesizer, Keyboard, ...) angeschlossen werden kann,
der Nachteil liegt auf der Hand: durch die Beschr\"ankung auf die
ALSA-Architektur ist die Verwendungsm\"oglichkeit derzeit auf GNU/Linux 
eingeengt, eine Verwendung auf anderen Plattformen bedingt eine Portierung
auf z. B. timidity-eigene Interfaces.

Der patch wurde auf x86 und ppc getestet,
sollte also eigentlich auf allen Linux-Plattformen (Big Endian/Little
Endian) funktionieren, allerdings wurde keine 64-bit-Plattform getestet.

Da der Rest der Dokumentation inhaltlich bereits als README vorlag, wurde
dieses per cut and paste importiert.

\chapter{Zeitplan}

Die Implementierung erfolgte innerhalb von drei Wochen, wobei wie unten
beschrieben der Grossteil der Zeit daf\"ur verwendet wurde, die
ALSA-Sequencer-Schnittstelle in ausreichendem Masse zu verstehen.

\chapter{Verwendung}

\begin{verbatim}
$ timidity -iAD -Os -q0/0 -k0 --reverb=d --chorus=d
Requested buffer size 32768, fragment size 8192
ALSA pcm 'default' set buffer size 32768, period size 4096 bytes
TiMidity starting in ALSA server mode
Opening sequencer port: 128:0 128:1 128:2 128:3
\end{verbatim}
\begin{verbatim}
$ rlwrap logo ~/src/ucblogo-5.5-midi-ok/mididefs.lgo 
You don't say what to do with [128:0 TiMidity/TiMidity port 0]
? ignore (midimessage [144 60 127])
? ignore (midimessage [144 60 0])
? (noteon 1 60 1)
? (noteon 1 60 0)
\end{verbatim}



\chapter{README-\"Ubersetzung}


\section{Copyright, Autor}

Dieser Patch steht wie die Ursprungsprogramme unter der GNU GPL Version 2
oder einer sp\"ateren Version, siehe
{\tt http://www.gnu.org/copyleft/gpl.html} f\"ur weitere Informationen.
Im Verweisteil sind auch die originalen Versionen von UCB Logo
und MSWLogo zu finden.

Alexander Oelzant $<$alexander@oelzant.priv.at$>$


\section{Installation}

Die Verteilung erfolgt als
Debian GNU/Linux Sarge Pakete, der Patch sollte mit jeder Version
von UCBLogo funktionieren. Wenn Du das Paket selbst kompilieren m\"ochtest,
achte auf die Verf\"ugbarkeit von libasound2 und den asound2
EntwicklerInnenpaketen (diese stellen unter anderem das Verzeichnis {\tt
/usr/include/alsa} und die dort befindlichen Header-Dateien zur
Verf\"ugung).

Es besteht sowohl die M\"oglichkeit, das Debian-Paket selbst zu kompilieren
mittels einer Kommandozeile \"ahnlich 
{\tt chmod a+x debian/rules;
dpkg-buildpackage -rfakeroot or dpkg-source -x ucblogo\_5.5-1.dsc; cd
ucblogo-5.5; dpkg-buildpackage)}, oder es in der \"ublichen Art \glqq{}von
Hand\grqq{} zu installieren:

\begin{verbatim}
> curl http://www.cs.berkeley.edu/~bh/downloads/ucblogo.tar.gz | tar -xzv
or
> curl http://tigerente.htu.tuwien.ac.at/~aoe/mystuff/ucblogo_midi/ucblogo_5.5.orig.tar.gz | tar -xzv
> mv ucblogo ucblogo-5.5
> cd ucblogo-5.5
> curl http://tigerente.htu.tuwien.ac.at/~aoe/mystuff/ucblogo_midi/ucblogo_5.5-1.diff.gz | gzip -d |  patch -p1
> ./configure
> make
# make install
\end{verbatim}


Laut Voreinstellungen werden die Midi-F\"ahigkeiten eingebaut, beim {\tt
configure} sollte also die folgende Zeile in der Ausgabe aufscheinen:

\begin{verbatim}
checking for snd_seq_event_output in -lasound... yes
\end{verbatim}

<<<<<<< dipr.tex
Wenn dieser Test negativ ausf\"allt, siehe oben - vermutlich fehlen die
ALSA (Advanced Linux Sound Architecture) dynamischen Laufzeitbibliotheken 
oder die zum Neubauen notwendigen EntwicklerInnenbibliotheken nd
Header-Dateien aus dem entsprechenden {\tt -dev}-Paket.

Eine andere M\"oglichkeit w\"are eine alte ALSA-Installation, die es
notwendig macht $<$sys/asoundlib.h$>$ anstatt von
$<$alsa/asoundlib.h$>$ einzubinden, wof\"ur ich leider noch keinen {\tt
configure}-Test habe, es w\"are in diesem Falle also notwendig, in der
Datei {\tt mmwind.c} \lq $1 ||$\rq{} am Anfang zu entfernen.

F\"ur die Dokumentation ist auch \LaTeX{} notwendig, um jedoch nur die
ausf\"uhrbare Datei zu erhalten, kann darauf verzichtet und der
auftretende Fehler bei der Ertstellung der Dokumentation ignoriert werden,
in diesem Falle kann direkt zur Installationsphase weitergegangen werden.

Wenn alle anderen Mittel versagen, kann noch {\tt configure} mit
{\tt autoconf} neu gebaut
werden, indem {\tt autoreconf} aufgerufen wird.

Wenn Du die gepatchte Version ausprobieren, aber nicht Deine gesamte
Installation daf\"ur riskieren willst, ist es hierbei allerdings 
notwendig, {\tt ./logo} mitzuteilen, wo es
seine Logo-Bibliotheken findet, in denen einige der Standardbefehle wie
{\tt foreach}, {\tt `}, {\tt while} etc definiert sind. Das kann 
entweder geschehen, indem make eine {\tt LIBLOC} \"ubergeben wird
(siehe auch die {\tt debian/rules} Datei)
=======
If the check is negative, see above - you are probably missing the alsa
(asound2) libraries or dev packages. Another possibility of failure might be
an old installation with {\tt $<$sys/asoundlib.h$>$} instead of
{\tt $<$alsa/asoundlib.h$>$};
I don't have a configure check for that yet, so you might have to remove
the \lq 1 $\|\|$\rq{} at the beginning of {\tt mmwind.c}.

(For the documentation, the build system also wants LaTeX. If you only want
the logo executable, you can ignore the error when make'ing docs and
proceed straight to make install)

If all else fails, it is also possible to rebuild configure and config.h.in
using autoconf e. g. by calling the command \lq autoreconf\rq.

If you want to try out the patched version but are not ready to sacrifice
your distro version, it is wise to tell ./logo where to find the logo
standard libraries where many of the default commands like foreach, `,
while etc are defined. this can be accomplished by either giving make
a LIBLOC variable (also see debian/rules)
>>>>>>> 1.4

\begin{verbatim}
> make LIBLOC=/usr/share/ucblogo
\end{verbatim}

oder indem {\tt ./configure} das bereits beim Start mitgeteilt wird:

\begin{verbatim}
> ./configure   --libdir=/usr/share/ucblogo
\end{verbatim}

Andernfalls k\"onnen Beschwerden \"uber das Fehlen von Standardbefehlen
in der folgenden Art auftreten:

\begin{verbatim}
I don't know how  to while
I don't know how  to foreach
...
\end{verbatim}


\section{Verwendung}

<<<<<<< dipr.tex
Wenn eine Distributionseigene Variante von UCBLogo am System installiert
ist, kann, wie im vorhergehenden Kapitel beschrieben, die neugebaute
Version sofort getestet werden, ohne erst installiert werden zu m\"ussen,
wenn der {\tt LIBLOC}-Pfad korrekt gesetzt ist.

Da UCBLogo von sich aus keine {\tt readline}-Unterst\"utzung zur
komfortableren Bedienung der zeilenorientierten Schnittstelle bietet,
empfiehlt die offizielle Dokumentation
({\tt http://www.cs.berkeley.edu/\~{}bh/announce})
{\tt rlwrap} als Ersatz; dieser Empfehlung
kann ich mich nur anschliessen, da es das Arbeiten mit dem Interpreter sehr
viel fl\"ussiger und einfacher gestaltet.

Das modifizierte Programm bietet drei neue Befehle:
{\tt midiopen}, {\tt midimessage} und {\tt midiclose}.

{\tt midiopen} nutzt 0 oder 2 Eingabeparameter. Als Voreinstellung
wird {\tt client:port} als {\tt 128:0} angenommen, was dem ersten
Client-Sequencer beim ALSA-System entspricht, auf den normalerweise ein
Software-Midisynthesizer wie TiMidiTy+ gebunden wird.
wenn {\tt (midiopen :client
:port)} aufgerufen wird, also etwa {\tt (midiopen 64 0)}, dann wird dieser
Synthesizer-Client anstatt dessen verwendet. Das w\"are die korrekte
Anwendung, wenn etwa ein Hardware-Midi-Synthesizer an einen MPU401 Adapter 
angeschlossen w\"are oder ein \glqq Wavetable\grqq{}-Ger\"at verwendet
werden soll, wie es bei manchen Audiokarten eingerichtet ist. Eine
Liste der g\"ultigen {\tt client:port} Konfigurationen kann mittels des
Befehls {\tt pmidi -l} angezeigt werden.
=======
If you have a distro version of ucblogo installed, you can test your freshly
compiled version right away without installation, provided you set the LIBLOC
path as described in the previous chapter.

Since ucblogo comes without readline support, the official announcement
suggests using rlwrap as a replacement. This versatile utility provides all
the advantages that full readline integration has including history support
and is thus second best to linking with libreadline (see also
{\tt http://www.cs.berkeley.edu/~bh/announce}).

The modified logo provides three new commands: {\tt midiopen}, {\tt
midimessage} and {\tt midiclose}.

{\tt midiopen} takes 0 or 2 parameters. Default client:port are 128:0, which is
the default sequencer client configuration with alsa. If ({\tt midiopen :client
:port}) is called, e. g. ({\tt midiopen 64 0}), this client is used instead. This
might be preferable if you have a hardware midi device like a synthesizer
connected to the MPU401 midi port or just want to use the wavetable device
built into some soundcards. You can get a list of valid client:port
combinations with {\tt pmidi -l}.
>>>>>>> 1.4

Der empfohlene Weg, TiMidiTy+ als ALSA Sequencer Client aufzurufen, ist
folgender:

\begin{verbatim}
> timidity -iAD -Os -q0/0 -k0 --reverb=d --chorus=d
\end{verbatim}

oder

\begin{verbatim}
> timidity -iA -Ol -Os -q0/0 -k0 --reverb=d --chorus=d --verbose=3 | \
  grep -ivE \lq ME_NONE|output data .2048\rq.
\end{verbatim}

<<<<<<< dipr.tex
Die erste Version verschwindet nach dem Start als Daemon im Hintergrund,
die letztere Version zeigt als Fehlersuch-Ausgabe die Midi-Nachrichten
an, die der Sequencer empf\"angt und bleibt im Vordergrund des aktiven
Terminals.

Da alle beschriebenen Vorkehrungen unternommen wurden, um mit
Prof. Neuwirths {\tt mididefs.lgo} verwendet zu werden, ist hier ein
Warnhinweis angebracht: da nur die Midi-Befehle in UCBLogo eingebaut
wurden, funktioniert der Rest {\em nicht}, im speziellen schlagen
{\tt dllopen/dllcall} nat\"urlich fehl. Es scheint auch, als ob diese
Implementation eine leichte Diskrepanz in der Aufrufsemantik zu jener von
MSWLogo aufweist, sodass einige kleine \"Anderungen an {\tt mididefs.lgo}
notwendig sind, bevor es mit der modfizierten Version von UCBLogo korrekt
funkioniert:
=======
The former version politely daemonizes after start, the latter command is
intended mainly for debugging as it outputs all midi messages to the
terminal and does not fork.

As all of this is intended for use with Prof. Neuwirth's {\tt mididefs.lgo}, a
caveat is in order here: as only the midi commands have been hacked into
UCB logo, some others (notably dllopen/dllcall) will not work. Also, it
seems that either this implementation has a slight discrepancy with the
original or ucblogo has different output handling from mswlogo. This boils
down to the fact that a few changes are necessary to {\tt mididefs.lgo} before it
works with the modified ucblogo:
>>>>>>> 1.4

<<<<<<< dipr.tex
\begin{enumerate}
\item Die Datei muss von DOS- auf UNIX-Zeilenumbruchkonvention umgestellt
werden (cr/lf auf nur lf), andernfalls bricht UCBLogo mit folgender
Fehlermeldung ab:
\begin{verbatim}
=======
\begin{itemize}
\item the file has to be converted from dos to unix (cr/lf to lf only),
   otherwise logo complains with
\begin{verbatim}
>>>>>>> 1.4
 too many inputs to midi.rescale  in noteon
 ]midimessage (list 208 + :chan - 1 (midi.rescale :press 0 1) 0)
<<<<<<< dipr.tex
\end{verbatim}
\item Alle {\tt midimessage}-Befehle m\"ussen ein vorangestelltes {\tt run}
oder {\tt ignore} erhalten, sonst erwartet UCBLogo einen R\"uckgabewert
ungleich []:
=======
\end{verbatim}
\item all {\tt midimessage} commands have to be preceded with \lq run\rq{} or \lq
ignore\rq,
  otherwise logo does not know what to do with the [] output:
>>>>>>> 1.4
\begin{verbatim}
 ? noteon 1 60 1
 You don't say what to do with []  in noteon
\end{verbatim}
<<<<<<< dipr.tex
\item die {\tt dllopen/dllcall}-Befehle m\"ussen durch funktional
\"aquivalente Konstrukte ersetzt werden. Da nur {\tt waitmilli} diese
verwendet, reicht es hier behelfsm\"assig, anstatt der {\tt dllcall.*}
  {\tt wait int :millisec / (1000/60)} einzusetzen. (Nat\"urlich w\"are es
	auch m\"oglich, {\tt dlopen/dlsym} als Midibefehle zur Verf\"ugung zu
	stellen oder eine {\tt waitmilli} Logofunktion zu implementieren;
	eine h\"asslichere (und durch den {\tt fork/exec}-overhead wohl nicht
	sinnvolle) M\"oglichkeit w\"are es auch, ein {\tt (shell [usleep
	(:millisec * 1000)]} daf\"ur zu verwenden.
\end{enumerate}
=======
\item the dllopen/dllcall commands have to be removed and replaced
  with e. g. wait int :millisec / (1000/60)
  (implementing dlopen/dlsym would be possible, and it would be even
  easier to just write a waitmilli logo call; an unthinkably ugly
  alternative would further be the usage of {\tt (shell [usleep (:millisec *
  1000)]}, but the exec overhead is sizeable, albeit uncalculable, thus
  making this possibility hardly a practical one.
\end{itemize}
>>>>>>> 1.4

<<<<<<< dipr.tex
Diese Kommandozeile wandelt die originale {\tt mididefs.lgo} in eine
UCBLogo-taugliche Variante um:
=======
This commandline converts the original {\tt mididefs.lgo} to a version
suitable for ucblogo:
>>>>>>> 1.4

\begin{verbatim}
> < mididefs.lgo.orig  sed -e 's/\r//' -e 's/midimessage/run &/g' \
  -e 's/dllload [^ ]*//' -e 's/.*dllcall.*/wait int :millisec \/ (1000\/60)/' \
  > mididefs.lgo
\end{verbatim}

<<<<<<< dipr.tex
(Mensch beachte, dass das erste \lq $>$\rq{} den Shellprompt zymbolisieren
soll, w\"ahrend die anderen gr\"osser/kleiner-Zeichen unver\"andert zu
kopieren sind)

Als weiteres {\em caveat} w\"are hier anzuf\"uhren, dass TiMidiTy+
nat\"urlich patches (Sample-Dateien, Audiofiles f\"ur die Instrumente)
installiert haben muss, damit es auch tats\"achlich T\"one ausgeben
kann. Wenn nur sporadische oder keine T\"one ausgegeben werden, kann es am
Fehlen oder an der Unvollst\"andigkeit der Patchsets liegen; eine
Distributionseigene Variante wird \"ublicherweise ein dazupassendes Paket
mit Patch-Dateien aufweisen, ansonsten k\"onnen
Installationsanleitungen etwa auf der TiMidiTy+-Homapage gefunden werden
(s. u.) oder auf jener der Software-Drummachine tk707, die ebenfalls gut mit
einem korrekt eingerichteten Software-Synthesizer funktioniert.

Schlussendlich m\"ussen die Programme {\tt logo} und {\tt timidity}
tats\"achlich in der Lage sein, auf die ALSA-Ger\"atedateien, im speziellen
{\tt /dev/snd/seq}, zuzugreifen. Wenn diese nicht existiert, was
bei der k\"urzlichen Auflassung von {devfs} nicht so unwahrscheinlich
erscheint, kann sie leicht mittels folgender Befehle neu eingerichtet
werden:
=======
(note that the first \lq $>$\rq{} is supposed to symbolise the unix prompt, the
other greater/lesser than signs are to be copied verbatim)

Another caveat is that timidity needs to have patches installed in order to
be able to produce midi sounds. If you hear sporadic or no audio, you
likely do not have a full set installed. See the timidity homepage or the
TK707 manual (under Links below) for instructions how to build, install
and configure TiMidity++.

Finally, in order to communicate through the ALSA sequencer infrastructure,
the programs (logo and timidity) need to be able to access
/dev/snd/seq. If it does not exist (not too unlikely with respect to the
Linux kernel team recently abandoning devfs), you can make your own by
issuing 
>>>>>>> 1.4

\begin{verbatim}
# mkdir /dev/snd
# mknod /dev/snd/seq -m 666 c 116 1
\end{verbatim}

Falls Lese- und Schreibrechte nicht bereits den (etwas riskanten) 
freiz\"ugigen Bedingungen der letzten Zeile entsprechen, k\"onnen
diese mit {\tt chmod} gesetzt werden:

\begin{verbatim}
# chmod 666 /dev/snd/seq 
\end{verbatim}

Die etwas sicherere Variante ist die Verwendung einer eigenen 
{\tt audio}-Gruppe, wie sie auf vielen Systemen bereits vorhanden sein wird:

\begin{verbatim}
# chmod 660 /dev/snd/seq
# chgrp audio /dev/snd/seq
\end{verbatim}
{\tt \# adduser {\bf $<$your\_user$>$} audio}

<<<<<<< dipr.tex
({\bf $<$your\_user$>$} ist hier durch den Namen des/der BenutzerIn zu
erstetzen, welchEr {\tt logo} bzw {\tt timidity} ausf\"uhren k\"onnen
soll)


\section{Implementation}

Der Logo betreffende Teil war relativ leicht zu bew\"altigen: ausser den
notwendigen Zeilen in {\tt init.c} und {globals.h}, um die Schnittstelle zu
definieren, waren noch Teile von {\tt mmwind.c} aus dem MSWLogo-Quellcode
zu portieren bzw. d\"ur ALSA neu zu implementieren.

Hilfedateien f\"ur die neuen Befehle sind im entsprechenden Verzeichnis
abgelegt.

Die Programmierung des ALSA-Sequencer-Teils erwies sich als etwas
schwieriger: da ich keine Tutorials zur Erstellung von Sqeuencer Clients
finden konnte, musste ich auf den Quellcode vorhandener Projekte
zur\"uckgreifen, n\"amlich {\tt pmidi}, {\tt tk707} sowie {\tt ltrace}s der
Aufruffolgen entsprechender Programme. {\tt pmidi} scheint allerdings
techisch gesehen ein ofline-Player zu sein: es ordnet den Ereignissen
Zeitstempel zu, anstatt sie direkt abzuspielen, {\tt tk707} ist daf\"ur
wieder sehr vielseitig und nicht allzu leicht zu analysieren.

Letzten Endes brachte ich den Code zum Laufen, nachdem ich das
Vers\"aumnis nachholte, die Queue zu starten, was
ALSA davon angehalten hatte, die Nachrichten zu senden, bzw
TiMidiTy+, sie zu empfange. Besonders erfreut war ich \"uber die
{\tt snd\_midi\_event\_encode}-Schnittstelle, welche eine Midi-Nachricht
direkt in eine f\"ur die Sequencer-Sendefunktionen taugliche Struktur
packte.
=======
(provided an audio group exists. substitute {\bf $<$your\_user$>$} with the name of
the user you want to run logo/timidity)


\section{implementation}

The logo part was easy: apart from adding the relevant interface lines
to {\tt init.c} and {\tt globals.h}, I only had to port parts of {\tt
mmwind.c} from the
mswlogo distribution. Helpfiles for the new commands are also provided
in the directory of the same name.

The alsa midi sequencer part proved somewhat more difficult; since I could
not find any tutorial-style documentation on the subject of programming 
a midi sequencer client to send events to another midi sequencer device,
I looked at the source code of relevant projects, namely pmidi, 
pmidi, tk707 source and some ltraces. pmidi however seems to be an
offline midi player technically (it puts timestamps on the events as opposed 
to sending them at once), and tk707 is versatile, but far from being a
simple programming example.

In the end I only forgot to start the queue, which prevented TiMidity from
receiving any messages. After that it worked instanteneously. I was
particularly pleased with the snd\_midi\_event\_encode interface which takes
any midi message and packs it into an event that can directly be sent to
the sequencer.
>>>>>>> 1.4

Die Reihenfolge der Midi-relevanten Funktionsaufrufe ist die folgende:

\begin{verbatim}
lmidiopen
 snd_seq_open
 snd_seq_alloc_queue
 snd_seq_client_id
 snd_seq_create_simple_port (wrapper for snd_seq_create_port)
 snd_seq_connect_to
 snd_seq_start_queue

midimessage
 snd_seq_ev_clear (macro)
 snd_midi_event_new (macro)
 snd_midi_event_init (macro)
 snd_midi_event_no_status
 snd_midi_event_reset_encode
 snd_seq_ev_set_dest
 snd_seq_ev_set_source
 snd_midi_event_encode
 snd_seq_ev_schedule_real
 snd_seq_event_output
 snd_seq_drain_output
\end{verbatim}

\glqq{\tt long midi messages}\grqq f\"ur {\tt sysex} Ereignisse (0xf0, system
exclusive, also f\"ur bestimmte Systeme spezifische Metadaten wie
Sampledateien oder spezielle Kontrollnachrichten) wurden bisher nicht
implementiert, da kein Bedarf bestand und ich keine Hardwareger\"ate
besitze, welche ungwe\"ohnliche Ansteuerung ben\"otigen k\"onnten. Das wird
sich wohl in n\"achster Zukunft nicht \"andern, die Funktionalit\"at sollte
aber bei Bedarf einfach hinzuzuf\"ugen sein.


<<<<<<< dipr.tex
\section{Bekannte Unbilden}
=======
Return value of {\tt midimessage} confuses default {\tt mididefs.lgo}. See
modifications under \lq usage\rq.
>>>>>>> 1.4

<<<<<<< dipr.tex
\begin{itemize}
\item
Der R\"uckgabewert von {\tt midimessage} verwirrt ein nicht modifiziertes
{\tt mididefs.lgo}. Modifikationen siehe \lq usage\rq.
=======
{\tt midiopen} does not complain if connected to an inexistent sequencer. This
should be fixed.
>>>>>>> 1.4

\item
{\tt midiopen} gibt keine Beschwerde aus, wenn es zu einem nicht existenten
oder empfangsbereiten Sequencer verbunden wird.
\end{itemize}

\section{Noch zu erledigen}

<<<<<<< dipr.tex
\begin{itemize}
\item
{\tt midiopen} gibt keine Beschwerde aus, wenn es zu einem nicht existenten
oder empfangsbereiten Sequencer verbunden wird.
=======
\begin{itemize}
\item
{\tt midiopen} does not complain if connected to an inexistent sequencer. This
should be fixed.
>>>>>>> 1.4

<<<<<<< dipr.tex
\item
{\tt waitmilli} sollte in korrekter, eleganter Manier angelegt werden
=======
\item
Implement {\tt waitmilli} in a proper fashion.
>>>>>>> 1.4

<<<<<<< dipr.tex
\item
{\tt autoconf}-Test auf das Vorhandensein von $<$sys/asoundlib.h$>$ 
anstatt von $<$alsa/asoundlib.h$>$
=======
\item
check for {\tt$<$sys/asoundlib.h$>$} instead of
{\tt$<$alsa/asoundlib.h$>$} via autoconf
>>>>>>> 1.4

<<<<<<< dipr.tex
\item
\glqq{\tt long midi messages}\grqq f\"ur {\tt sysex} Ereignisse (0xf0, system
exclusive)
\end{itemize}
=======
\item Long midi messages for sysex events (0xf0, 240)
\end{itemize}
>>>>>>> 1.4


\section{Verweise, Danksagungen usw.}

\begin{itemize}
\item
\begin{verbatim}
http://homepage.univie.ac.at/erich.neuwirth/midilogo/midilogo.zip
\end{verbatim}

<<<<<<< dipr.tex
Prof. Erich Neuwirths Vortrag beim Eurologo 2005-Kongress
beschreibt erstmalig die
{\tt noteon/noteoff} Functionen als didaktisches Konstrukt, um
die Informatik mit der Musikerziehung zu kombinieren und dabei
spielerisch komplexe Datenstrukturen audzubauen und musikalische
Grundbegriffe zu lernen und zu implementieren. Siehe auch sein
PDF unter
=======
Prof. Erich Neuwirth's Eurologo 2005 contribution introducing the
noteon/noteoff functions as didactic constructs for combining combining
computer science and musical education. See also the PDF only at

{\tt http://eurologo2005.oeiizk.waw.pl/PDF/E2005Neuwirth.pdf}
>>>>>>> 1.4

{\tt http://eurologo2005.oeiizk.waw.pl/PDF/E2005Neuwirth.pdf}

\item
\begin{verbatim}
http://www.alsa-project.org/
\end{verbatim}

<<<<<<< dipr.tex

Das ALSA-Projekt
(Advanced Linux Sound Architecture) stellt die Grundlage f\"ur alle
modernen Midi-Applikationen unter GNU/Linux dar. Auf der Homepage findet
sich umfangreiche Dokumentation zu den Schnittstellen.

=======
The ALSA project (Advance Linux Sound Architecture) provides the foundation
for all current midi sequencing under GNU/Linux. They also have extensive
documentation on the used functions under

>>>>>>> 1.4
{\tt http://www.alsa-project.org/alsa-doc/alsa-lib/}


\item
\begin{verbatim}
http://www.cs.berkeley.edu/~bh/
\end{verbatim}

UCB Logo kann direkt von Brian Harveys homepage bezogen werden, wo
auch sein Werk
\lq Computer Science Logo Style\rq{} kostenlos in den Formaten PDF and HTML 
zur Verf\"ugung steht.


\item
\begin{verbatim}
http://www.softronix.com/
\end{verbatim}

<<<<<<< dipr.tex
Die Firma, welche MSWLogo wartet und vertreibt, ein C++-Derivat von
UCBLogo, hat einigen Aufwand betrieben, um alle zu dem Zeitpunkt attraktiv
erscheinenden Multimedia-Erweiterungen auch f\"ur Logo zur Verf\"ugung zu
stellen. Da ihre Software unter der GPL Version 2 oder sp\"ater steht,
hatte ich nat\"urlich auch keinerlei Bedenken, die Interfaces und
Funktionsdefinitionen direkt zu kopieren. Danke d\"ur diesen Beitrag an die
Gemeinschaft!
=======
The makers of MSWLogo, a C++ relative partly derived from usblogo, have put
their product under the GPL Version 2, therefore I feel no remorse copying
most of the {\tt mmwind.c} file from their code. Thanks for providing this
code to the community!
>>>>>>> 1.4


\item
\begin{verbatim}
http://www.timidity.jp/
\end{verbatim}

TiMidity++ basiert auf TiMidity von Tuukka Toivonen. Es wird von
Masanao Izumo $<$iz@onicos.co.jp$>$ aktiv weiterentwickelt und umfasst
heute neben der ALSA-Sequencer-Schnittstelle noch andere M\"oglichkeiten,
es \"ueber das Netzwerk anzusprechen. Die remote-Methode erschien
allerdings bei einem anderen Projekt etwas instabil bzw ungenau, ausserdem
ist mir der Wartungsstatus dieser Schnittstelle nicht ganz klar.

Bez\"uglich der Konfiguration von TiMidiTy+, insbesondere das Setup der
Patch-Dteien/Samples, verweise ich auf die Homepage bzw. die Dokumentation
zur Software-Drum-Machine {\em tk707}.

\item
\begin{verbatim}
http://sourceforge.net/projects/pmidi
\end{verbatim}

Diese einfache Midi-Applikation wurde von Steve Ratcliffe $<$steve@parabola.demon.co.uk$>$
geschrieben, um Midi-Dateien \"uber dan ALSA-Sequencer abzuspielen.
Einige der Codezeilen dieses Projekts (Sequencer-Device-Initialisierung,
Schleife zur Ausgabe des Namens des Midi-Endpunkts)
flossen ebenfalls in den Midi-Patch ein.


\item
\begin{verbatim}
http://www-lmc.imag.fr/lmc-edp/Pierre.Saramito/tk707
\end{verbatim}

<<<<<<< dipr.tex
TK707 ist eine Software-drum machine f\"ur das ALSA midi interface, 
teilweise trug es zu meinem Verst\"andnis f\"ur die ALSA-Programmierung
bei. Auf der Webseite ist auch Dokumentation \"uber das Bauen
und Einrichten des Software-Synthesizer TiMidiTy+ zu finden, die sehr
hilfreich sein kann, wenn hierzu keine fertigen Pakete verwendet werden
sollen.

{\tt http://www-lmc.imag.fr/lmc-edp/Pierre.Saramito/tk707/tk707.html\#SEC8}
=======
TK707 is a drum machine for the ALSA midi interface, it partly helped me
understand how events can be sent to the destination device at once.
They also have some documentation on how to compile and install timidity
and to use it as a midi sequencer device in the installation manual under

http://www-lmc.imag.fr/lmc-edp/Pierre.Saramito/tk707/tk707.html\#SEC8
>>>>>>> 1.4

\item
\begin{verbatim}
http://www.midiox.com/app.htm
\end{verbatim}

\begin{verbatim}
ftp://ftp.cs.ruu.nl/pub/MIDI/PROGRAMS/mf2tsrc.zip
\end{verbatim}

Quellcode f\"ur t2mf und mf2t ist von Jamie O'Connell verf\"ugbar. Die
C-Syntax ist ein wenig altmodisch, kann jedoch mit GCC 3.x unter Verwendung
folgender Konstrukte erfolgen:

\begin{verbatim}
> curl -O ftp://ftp.cs.ruu.nl/pub/MIDI/PROGRAMS/mf2tsrc.zip 
> mkdir mf2tsrc
> cd mf2tsrc
> unzip -x ../mf2tsrc.zip
> sed -ie '/extern.*sys_errlist/d' mf2t.c t2mf.c 
> make -f makefile.unx
> cp t2mf mf2t ~/bin
\end{verbatim}

Dies setzt voraus, dass \~{}/bin sich im \$PATH befindet, ansonsten
k\"onnen die Programme in ein Verzeichnis kopiert werden, f\"ur welches
diese Bedingung erf\"ullt ist.

\begin{verbatim}
# cp t2mf mf2t /usr/local/bin
\end{verbatim}
\end{itemize}


\end{document}
%for my trusty editor vim: textwidth=75
