\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