\documentclass{beamer}

\usetheme[footlinesection,bright]{MLUInformatik}

\usepackage[ngerman]{babel}
\usepackage[isolatin]{inputenc}
\usepackage{comment}


\usepackage{listings}

\definecolor{lightgrey}{rgb}{0.95,0.95,0.95}

\lstset{%
   language=Haskell,
   extendedchars=true,
   showstringspaces=false,
   basicstyle=\ttfamily,
   commentstyle=\highlightcomment,
   keywordstyle=\pmb,
   backgroundcolor=\color{lightgrey},
   frame=single}

\lstnewenvironment{haskelllisting}{\lstset{language=Haskell}}{}


\setbeamertemplate{navigation symbols}{}

\AtBeginSection[] % Do nothing for \section*
{
\begin{frame}<beamer>
%\frametitle{Project}
\tableofcontents[currentsection,subsectionstyle=hide]
\end{frame}
}

\AtBeginSubsection[] % Do nothing for \section*
{
\begin{frame}<beamer>
%\frametitle{Project}
\tableofcontents[currentsection,currentsubsection]
\end{frame}
}

\author{Henning Thielemann}
\title{Haskell musiziert}
\date{2007-07-10}

\begin{document}

\begin{frame}
\titlepage
\end{frame}


\section{Signalverarbeitung}

\begin{frame}
% \frametitle{Assampler - Eindruck}

\centerline{
\includegraphics[width=0.8\textwidth]{Assampler}
}

\end{frame}


\begin{frame}
\frametitle{Assampler}

\begin{itemize}
\item 1999 für Commodore Amiga
\item Zusammenstellen von Klangverarbeitungsalgorithmen: \\
        graphisch oder per Formular
\item blockweise Bedarfsauswertung
\item physikalische Einheiten
\item Beispiel: Ping \\
           Sinuston, Exponentialkurve, Verstärker
\end{itemize}

\end{frame}


\begin{frame}
\frametitle{Assampler - Probleme}

\begin{itemize}
\item Aufteilen von Signalstrom (Gabelung)
\item Rückkopplung, Latenz
\item Abgleich von Abtastraten und Amplitude
\item Umgang mit Zufallszahlen, kohärentes Rauschen
\item flexiblere Automatisierung (Beispiel: Mehrbandvocoder)
\item Übersichtlichkeit: Modularisierung, Dokumentation
\item Musikarrangement
\end{itemize}

\end{frame}


\begin{frame}
\frametitle{Haskell}

% Warum Signalverarbeitungsalgorithmen
% perfekt mit funktionaler Programmierung und Bedarfsauswertung
% beschrieben werden können:

\begin{itemize}
%  laziness for streaming
\item Bedarfsauswertung (lazy evaluation) erlaubt
   \begin{itemize}
   \item Programmierung in Reihenfolge von Signalabhängigkeit
   \item Verarbeitung in zeitlicher Reihenfolge (streaming)
   \end{itemize}
\item Bedarfsauswertung erlaubt Rückkopplung \\
   \begin{itemize}
   \item \lstinline{let y = x + delay y in y}
   \item \lstinline{fix (\\y -> x + delay y)}
   \end{itemize}
\item Gabelungen (sharing)
\item Zufallszahlen: Monade
\item Analogie:
Typenabgleich (type inference) \\
und Abstimmung von Abtastrate und Aussteuerung
\item Compiler für Haskell
% (vergleiche SuperCollider/JIT, CSound/MPEG4)
\end{itemize}

\end{frame}


\begin{frame}[fragile=singleslide]
\frametitle{Signalverarbeitung mit funktionaler Programmierung}

% *** ping

\begin{haskelllisting}
ping =
   envelope
      (exponential 0.1)
      (oscillator 440)
\end{haskelllisting}

\end{frame}


\begin{frame}
\frametitle{Signalparameter - maschinennah}

digitale Hardware-Synthesizer, CSound, SuperCollider:
\begin{itemize}
\item feste Abtastraten für
   \begin{enumerate}
   \item hörbare Signale
   \item Steuersignale
   \item Notenwiedergabe
   \end{enumerate}
\item untypisiert
\item keine physikalischen Einheiten
\end{itemize}
% Ausnahme ist wohl ChucK

\end{frame}


\begin{frame}
\frametitle{Signalparameter - abstrakt}

Ziel: Annäherung an analoge Daten
\vfill{}
Synthesizer-Bibliothek für Haskell:
\begin{itemize}
\item frei wählbare Abtastraten, automatischer Abgleich
\item statisch typisiert \\ Typen für Abtastwerte:
   \begin{itemize}
   \item kontinuierliche Werte -- \texttt{Double}
   \item Wertetupel für Stereophonie -- \texttt{(Double,Double)}
   \item An/Aus-Steuerung -- \texttt{Bool}
   \end{itemize}
\item physikalische Einheiten (dynamisch überprüft)
   \begin{itemize}
   \item Modellierung natürlicher Vorgänge
   \item Nachbau Analogsynthesizer % elektronischer Schaltungen
   \item höhere Programmiersicherheit
   \end{itemize}
\end{itemize}

\end{frame}


\begin{frame}
\frametitle{Signalverarbeitung: Hörbeispiele}

Haskell (Konserve)
\begin{itemize}
\item Fliege
\item Glasbruch
\item Rauschen mit Tschebyscheff-Filter
\end{itemize}

SuperCollider (Echtzeit)
\begin{itemize}
\item Blubberblasen
\item Wind
\item Bass mit Filter
\end{itemize}

\end{frame}


\section{Musikkomposition}

\begin{frame}
\frametitle{Haskore}

\begin{itemize}
\item Paul Hudak:
 "`The Haskell School of Expression. \\
 Learning Functional Programming Through Multimedia"'
\item Algebra der Musik
   \begin{itemize}
   \item sequentielle (\lstinline{+:+}) und parallele (\lstinline{=:=}) Komposition
   \item Rechengesetze
      % \newcommand\means{$\hat{=}$}
      \newcommand\means{$=$}
      \begin{small}
      \begin{center}
      \begin{tabular}{r@{\quad}c@{\quad}l}
      \lstinline{(a +:+ b) +:+ c}  &\means&  \lstinline{a +:+ (b +:+ c)} \\
      \lstinline{(a =:= b) =:= c}  &\means&  \lstinline{a =:= (b =:= c)} \\
      \lstinline{a =:= b}  &\means&  \lstinline{b =:= a} \\
      &\vdots
      \end{tabular}
      \end{center}
      \end{small}
   \end{itemize}
\item Fortschritt gegenüber SoundTracker\&Co.: \\
        Formulierung von Ideen, weniger Kopieren von Abschnitten
\item Haskell erlaubt gleichzeitig \\
   Musikarrangement und Signalerzeugung
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Begleithilfen}

\begin{itemize}
\item regelmäßige aber nicht-periodische Muster: \\
         Quersummen der natürlichen Zahlen modulo 4 im 4er-System
% \item Markov-Ketten
\item Gitarrenakkorde
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Wiedergabemöglichkeiten}

\begin{itemize}
\item Haskell-Synthesizer
   \begin{itemize}
   \item Unter Wasser: Bandpass auf Sägezahn
   \item Häcksler: FM-Synthese
   \item Schwanensee: Bandpass spielt Melodie auf Akkordbegleitung
   \end{itemize}
\item MIDI-Dateien: ChildSong
\item CSound: Alle Vögel sind schon da
\item SuperCollider (Haskell-Schnittstelle von Rohan Drape)
   \begin{itemize}
   \item Glissando
   \item Chill out
   \end{itemize}
\end{itemize}

\end{frame}


\section{Ausblick}

\begin{frame}
\frametitle{Ausblick}

\begin{itemize}
\item Abgleich der Klangparameter für unendlich viele Klänge
\item Echtzeit-Synthesizer mit \lstinline{ByteString}\&Co.
\item Echtzeit-MIDI
\item mehr Interaktivität:
   \begin{itemize}
   \item Klangausgabe bei Tastendruck
   \item Hervorhebung aktuell gespielter Note bei Wiedergabe
   \end{itemize}
\end{itemize}

\end{frame}


\section{Bezugsquellen}

\begin{frame}
\frametitle{Assampler}

Amiga-Assampler
\begin{itemize}
\item Präsenz: \url{http://www.assampler.de/}
\item Saugen: \url{http://aminet.net/search?query=assampler}
\item Amiga-Emulator:
  \begin{itemize}
  \item Linux: \url{http://www.rcdrummond.net/uae/}
  \item Windows: \url{http://www.winuae.net/}
  \end{itemize}
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Haskore}

Leider sehr viele Abhängigkeiten, \\
die nicht unbedingt nötig sind
\begin{itemize}
\item Internetpräsenz von Paul Hudak für Original-Haskore:
          \url{http://www.haskell.org/haskore/}
\item Auf Haskore basierende Projekte:
          \url{http://www.haskell.org/haskellwiki/Haskore}
\item Grundlegend überarbeitetes Paket  (Baustelle!):
          \url{http://darcs.haskell.org/haskore/}
\item unterstützt MIDI-Player Timidity, CSound, SuperCollider
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Klangsynthese}

\begin{itemize}
\item Große Baustelle! \\
\url{http://darcs.haskell.org/synthesizer/}

\item benötigt
  \begin{itemize}
  \item \url{http://darcs.haskell.org/unique-logic/}
  \item \url{http://darcs.haskell.org/numericprelude/}
  \item \url{http://darcs.haskell.org/shell-pipe/}
  \end{itemize}

\item
unterstützt Sox für Klangwiedergabe \\
und Konvertierung in übliche Audioformate

\item Für Demonstrationen: \\
\url{http://darcs.haskell.org/dafx/}
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{SuperCollider}

\begin{itemize}
\item SuperCollider: Echtzeit-Synthesizer von James McCartney \\
\url{http://www.audiosynth.com/}
\item Ansteuerung mit Haskell
  \begin{itemize}
  \item Open Sound Control: (benötigt für Haskore) \\
   \url{http://slavepianos.org/rd/sw/sw-78}
  \item SuperCollider: (benötigt für Haskore) \\
   \url{http://www.slavepianos.org/rd/sw/sw-69}
  \item SuperCollider-Zubehör: \\
   \url{http://slavepianos.org/rd/sw/sw-76}
  \item außerdem benötigt für Haskore: \\
   \url{http://darcs.haskell.org/supercollider-ht/}
  \end{itemize}
\end{itemize}

\end{frame}

\begin{frame}[fragile=singleslide]
\frametitle{SuperCollider-Beispiele}

\texttt{osc}-Dateien enthalten Kommandos für SuperCollider

\vfill

Audiodaten berechnen: \\
\begin{small}
\begin{verbatim}
$ scsynth -D 0 -o 2 -N song.osc _ song.aiff 44100 AIFF int16
$ bunzip2 --stdout song.osc.bz2 | \
     scsynth -D 0 -o 2 -N _ _ song.aiff 44100 AIFF int16
\end{verbatim}
\end{small}

\end{frame}

\begin{frame}
\frametitle{CSound}

\begin{itemize}
\item "`Sound-Compiler"' von Barry Vercoe
\item \url{http://www.csounds.com/}
\item Sprache für Beschreibung von Klängen (Orchestra)
\item Liste von Klangereignissen (Score)
\item Haskore erzeugt beide Dateiarten
\end{itemize}

\end{frame}

\begin{frame}
\frametitle{Nicht zu vergessen \dots}

\begin{itemize}
\item Digitale Signalverarbeitung mit Haskell \\ von Matthew Donadio: \\
           \url{http://haskelldsp.sourceforge.net/},
           \url{http://darcs.haskell.org/dsp/}
\item Physikalische Klangmodellierung mit Clean \\ von Jerzy Karczmarczuk: \\
      ``Functional Framework for Sound Generation''
          \begin{footnotesize}
           \url{http://users.info.unicaen.fr/~karczma/arpap/cleasyn.pdf}
          \end{footnotesize}
\item Diskussionen über \textbf{Haskell und Kunst}: \\
          \begin{small}
           \url{http://lists.lurk.org/mailman/listinfo/haskell-art}
          \end{small}
\end{itemize}

\end{frame}



\end{document}

\begin{abstract}
In dem Vortrag soll vorgeführt werden,
wie Haskell für musikalische Zwecke eingesetzt werden kann.
Haskell eignet sich sowohl für die Berechnung von Klängen,
als auch für das Zusammensetzen von Klängen zu Musikstücken.
Es wird demonstriert, wie man mit Haskell direkt Klänge berechnet
und wie man mit Haskell den Softwaresynthesizer SuperCollider steuert.
Außerdem wird gezeigt,
wie man mit der Haskell-Bibliothek Haskore Musikstücke arrangiert,
und diese über verschiedene Klangerzeuger wiedergibt
(Haskell-Synthesizer, MIDI, CSound, SuperCollider).
\end{abstract}

\begin{todo}
SuperCollider-Air:
   Resonanz (Y-Verzerrung (Phaser Sägezahn))
   mit Rechteckkurve gesteuerter Filter oder Verstärker
\end{todo}
