Haskell musiziert Haskell musiziert Henning Thielemann 2014-06-27 Haskell musiziert Übersicht 1 Übersicht 2 Signalverarbeitung 3 Musik 4 Abschluss Haskell musiziert Übersicht Wie sind Computer an Musik beteiligt? Signal: zeitlicher Verlauf von Membranauslenkungen Erzeugung: Instrumente, Effekte, Sprache Verarbeitung: Verfremden, Sprachverzerrung, Entrauschen, Klicks entfernen, Brummen entfernen, Manipulation von Tempo und Tonhöhe Analyse: Gleichstromanteil, Lautstärkeverlauf, Frequenzanalyse, Spracherkennung Kompression Musik: zeitliche Anordnung von Ereignissen Erzeugung: Zufallsmusik, Begleitautomatik Analyse: Takt, Tonart Haskell musiziert Signalverarbeitung 1 Übersicht 2 Signalverarbeitung 3 Musik 4 Abschluss Haskell musiziert Signalverarbeitung Grundlagen 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Signalverarbeitung Grundlagen Was hören wir? Geräusch: zeitabhängige Auslenkung einer Membran mathematisch: Auslenkung ist Funktion der Zeit Haskell musiziert Signalverarbeitung Grundlagen Klangeigenschaft: Tonhöhe tiefer Ton hoher Ton Haskell musiziert Signalverarbeitung Grundlagen Klangeigenschaft: Lautstärke leise laut Haskell musiziert Signalverarbeitung Grundlagen Klangeigenschaft: Klangfarbe dumpf scharf Haskell musiziert Signalverarbeitung Grundlagen Keine Klangeigenschaft: Phasenlage 0◦ 90◦ Haskell musiziert Signalverarbeitung Grundlagen Wie hören wir? Ohr zerlegt Signal in reine Sinus-Schwingungen verschiedener Frequenzen Einzelne Schwingungen: Mischung: Haskell musiziert Signalverarbeitung Grundlagen Amplitudenmodulation vs. Frequenzmischung Heisenbergsche Unschärferelation: man kann Frequenz und Zeitpunkt eines Tones nicht beliebig genau angeben Grund: Definition von Ton“ ” es gibt keine momentane Frequenzzusammensetzung Lautstärkeänderung kann prinzipiell nicht von Tonüberlagerung unterschieden werden Haskell musiziert Signalverarbeitung Grundlagen Modulation statischer Ton: klingt künstlich Frequenzmodulation: Vibrato-Effekt Überlagerung mehrerer verschieden modulierter Töne: Chorus Haskell musiziert Signalverarbeitung Signalalgorithmen 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Signalverarbeitung Signalalgorithmen Einfacher Klang Haskell musiziert Signalverarbeitung Signalalgorithmen Signalfluss exponential oscillator envelope Haskell musiziert Signalverarbeitung Signalalgorithmen Signalalgorithmus imperativ – maschinennah expo := exponential 0.1 osci := oscillator 440 ping := envelope expo osci funktional – Umsetzung von Flussdiagramm ping = envelope ( exponential 0.1) ( oscillator 440) Haskell musiziert Signalverarbeitung Signalalgorithmen Rechnen mit Signalen Addition = b Mischen Multiplikation = b Lautstärkemodulation (envelope) Rechengesetze a+b =b+a Kommutativität (a + b) + c = a + (b + c) Assoziativität h · (a + b) = h · a + h · b Distributivität Haskell musiziert Signalverarbeitung Signalalgorithmen Haskell musiziert Signalverarbeitung Signalalgorithmen Assampler 1999 für Commodore Amiga Zusammenstellen von Klangverarbeitungsalgorithmen: graphisch oder per Formular Bedarfsauswertung in Blöcken physikalische Einheiten Beispiel: Ping Sinuston, Exponentialkurve, Verstärker Haskell musiziert Signalverarbeitung Signalalgorithmen Assampler - Probleme Aufteilen von Signalstrom (Gabelung) Rückkopplung, Latenz Abgleich von Abtastraten und Amplitude Umgang mit Zufallszahlen, kohärentes Rauschen flexiblere Automatisierung (Beispiel: Mehrbandvocoder) Übersichtlichkeit: Modularisierung, Dokumentation Musikarrangement Haskell musiziert Signalverarbeitung Signalalgorithmen Haskell: Laziness type Signal = [] Beispiel Mischen: c = zipWith (+) a b zum Berechnen des ersten Wertes von c benötigt man nur die ersten Werte von a und b Bedarfsauswertung (lazy evaluation) erlaubt Programmierung in Reihenfolge von Signalabhängigkeit Verarbeitung in zeitlicher Reihenfolge (streaming) Gabelungen (sharing) let x = sound param in zipWith (+) x (delay x) Bedarfsauswertung erlaubt Rückkopplung let y = x + delay y in y fix (\y -> x + delay y) Haskell musiziert Signalverarbeitung Signalalgorithmen Haskell Zufallszahlen: Monade Analogie: Typenabgleich (type inference) und Abstimmung von Abtastraten Compiler für Haskell oder LLVM-JIT Haskell musiziert Signalverarbeitung Signalalgorithmen Komplexes Beispiel: Tausend Sterne sind ein Dom Gitarre: Anfang wegwerfen, Verzerrer, Hall, Verstärken Begleitung: am Anfang auffüllen, mit Gitarre Mischen Synthesizer: MIDI→Audiosignal, vieles mehr Hall: Überlagerung vieler Echos Synthesizer-Instrument: Anschlagstärke, Hüllkurve, Tongenerator, . . . Haskell musiziert Signalverarbeitung Signalalgorithmen Fazit: Haskell vs. Signalflussdiagramm Haskell kann Übersetzung von Signalflussdiagrammen + nicht-kausale Operationen + Wiederholung von Operationen + Unterprogramme + diskrete Datenströme (MIDI-Kommandos) Haskell musiziert Signalverarbeitung Signalalgorithmen Signalverarbeitung: Hörbeispiele Haskell Fliege Glasbruch Rauschen mit Tschebyscheff-Filter Blubberblasen Wind Bass mit Filter SuperCollider evtl. Haskell musiziert Signalverarbeitung Signalalgorithmen Bedarfsauswertung: Beispiele Laziness = Nichtstriktheit + Pufferung let str = ’a’:str in str let prg = 0 : map succ prg in prg Fibonacci-Folge Sinuskurve iterativ berechnen Differentialgleichung – expliziter Euler Primzahlen-Folge Haskell musiziert Signalverarbeitung Signalalgorithmen Bedarfsauswertung: Schwingungsgleichung y 00 + p · y 0 + q · y = 0 Lösung: y : R→C y = t 7→ e λ·t Einsetzen: t 7→ λ2 · e λ·t + p · λ · e λ·t + q · e λ·t = 0 λ2 + p · λ + q = 0 Haskell musiziert Signalverarbeitung Signalalgorithmen Übung Selber programmieren: Blubberblasen: Sinus, frequenzmoduliert mit Sägezahn Fliege: Sägezahn, frequenzmoduliert mit rosa Rauschen Technik: GHC Pakete bytestring oder storablevector SoX, WAVE oder hsndfile-storablevector Haskell musiziert Signalverarbeitung Signalalgorithmen noch mehr Übung Oscillator Blubbern Exponential Ping Rauschen Tiefpass erster Ordnung Komplexer Tiefpass erster Ordnung Echo/Kammfilter Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Signalparameter - maschinennah digitale Hardware-Synthesizer, CSound, SuperCollider: feste Abtastraten für hörbare Signale Steuersignale Notenwiedergabe untypisiert keine physikalischen Einheiten Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Signalparameter - physikalisch Ziel: Annäherung an analoge Daten Synthesizer-Bibliothek für Haskell: frei wählbare Abtastraten, automatischer Abgleich statisch typisiert Typen für Abtastwerte: kontinuierliche Werte – Double Wertetupel für Stereophonie – (Double,Double) An/Aus-Steuerung – Bool physikalische Einheiten Modellierung natürlicher Vorgänge Nachbau Analogsynthesizer höhere Programmiersicherheit Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Physikalische Einheiten Abtastrate 44100 Hz – 44100 Abtastwerte pro Sekunde Amplitude 1 V – Spannungsbereich -1 V . . . 1 V 441-Hz-Ton bei Abtastrate 44100 Hz: 100 Abtastwerte pro Schwingung Ebenfalls möglich: Abtastrate 1000/m und Schwingung mit Frequenz 10/m Nicht möglich: Abtastrate 1000/m und Schwingung mit Frequenz 10 Hz Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Vorgehensweise Am Ende jeder Rechnung muss maschinennaher Parameter stehen maschinennahe Parameter einheitenlos Alternative: Spezielle Einheiten für Maschinenparameter Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Physikalische Einheiten: dynamisch geprüft data PhysicalSignal t t ’ y y ’ yv = PhysicalSignal { sampleRate :: t ’ , amplitude :: y ’ , body :: [ yv ] } Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Physikalische Einheiten: dynamisch geprüft Beispiele: Monosignal ohne Einheiten PhysicalSignal Double Double Double Double Double Stereosignal mit Einheiten PhysicalSignal Double (SI Double Double) Double (SI Double Double) (Stereo Double Double) Signal mit Festkommaabtastwerten PhysicalSignal Double Double Double Double FixedPoint Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Probleme Beispiel: mix x y unterschiedliche Abtastratenwerte und -einheiten unterschiedliche Amplitudenwerte und -einheiten Konflikte zur Laufzeit getestet Ziel: Lasse Typprüfer testen Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Lösungen Abtastrate müssen meistens gleich sein Abtastrate schwer nachträglich zu ändern Interpolation, Qualitätsverlust besser: gleiche Abtastrate vorher sicherstellen Zusammenhangskomponenten mit gleicher Abtastrate Amplituden können ruhig verschieden sein Amplituden leicht nachträglich zu ändern nur kleine Rundungsfehler am besten: Amplituden anpassen, wenn nötig Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Abtastratenkontext newtype Rate s t t ’ = Rate t ’ data ContextSignal s y y ’ yv = ContextSignal { amplitude :: y ’ , body :: [ yv ] } sound :: Reader ( Rate s t t ’) ( ContextSignal s y y ’ yv ) Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Mixer im Wandel der Zeit vorher mix :: PhysicalSignal t t ’ y y ’ yv -> PhysicalSignal t t ’ y y ’ yv -> PhysicalSignal t t ’ y y ’ yv nachher mix :: Reader ( Rate s t t ’) ( ContextSignal s y y ’ yv -> ContextSignal s y y ’ yv -> ContextSignal s y y ’ yv ) Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Abtastraten Reader wird mit Applicative-Kombinatoren verwendet Bindung an den Kontext lösen render :: Reader ( Rate s t t ’) ( ContextSignal s y y ’ yv -> PhysicalSignal t t ’ y y ’ yv ) aus diesem Funktor kann man nur ausbrechen mit run :: ( forall s . Reader ( Rate s t t ’) a ) -> t ’ -> a abgeschaut bei ST-Monad Haskell musiziert Signalverarbeitung Sicherheit: Physikalische Einheiten Einheiten newtype Dimensio nalNum ber d a = DimensionalNumbe r a d kann sein: (Einheiten in Typen für arme Leute) Scalar Time Frequency (Recip Time) Voltage ... Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Speicherung der Abtastwerte Liste Chunky StorableVector Generator Prozesse LLVM Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Datenstruktur Liste Vorteile Bedarfsauswertung pro Element Gabelungen mit Pufferung beliebige Rückkopplung jeder Haskell-Datentyp als Element möglich, auch Funktionen → ideal für Signalverarbeitung Nachteile sehr langsam Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Verschmelzung von Listenoperationen Effizienzsteigerung durch Verschmelzen von Listenoperationen benötigt Optimiererregeln map g xs) = map (f.g) xs Beispiel: map f (map erspart Listen als Zwischenergebnisse bekannte Systeme foldr foldr/build unfoldr foldl foldl/unfoldr stream-fusion, ähnlich zu unfoldr Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Verschmelzung von Listenoperationen: Probleme Optimierer wendet Regeln nicht immer an Optimierer wendet Regeln nicht immer wie beabsichtigt an Konflikte mit INLINE und SPECIALISE Probleme mit Optimierer sehr schwer zu untersuchen manches lässt sich nicht in Regeln schreiben Beispiel: Rückkopplung selbst eine einzige Liste kostet zu viel Zeit Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen StorableVector Liste von Blöcken mit Rohdaten Vorteile sehr schnell Gabelungen mit Pufferung Nachteile Rückkopplung mit Verzögerung abhängig von Blockgröße nur Haskell-Datentypen mit maschinennaher Darstellung Storable-Klasse zip zip, Alternativen: behalte alle Blockgrenzen: zu viele kleine Blöcke behalte nicht alle Blockgrenzen: zu viele Abhängigkeiten Verschmelzung von Operationen entweder inkorrekt oder ineffizient Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Verschmelzung Listen mit StorableVector storablevector-streamfusion Optimierungen werden nicht zuverlässig angewendet Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Listengenerator Wenn man Funktion hat, braucht man keine Daten data Generator a = forall s . Generator ( StateT s Maybe a ) s Generator ist Liste ohne Speicher“ ” benötigt nur INLINE statt RULES etwas zuverlässiger alle Haskell-Datentypen enthält auch Überraschungen keine Gabelungen keine Rückkoppelungen Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Listengenerator vs. Listen Listengenerator und Listen sind gleichmächtig lis tFromGenerat or :: Generator a -> [ a ] lis tFromGenerat or ( Generator f s ) = unfoldr ( runStateT f ) s List .unfoldr gen eratorFromLi st :: [ a ] -> Generator a gen eratorFromLi st = Cons ( StateT (\ s -> case s of [] -> Nothing a : as -> Just (a , as ))) Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Generatoren und Gabelungen oscillator envelope exponential oscillator stereo envelope Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Generatoren und Gabelungen let env = exponential in zipWith stereo ( envelope env osciLeft ) ( envelope env osciRight ) Problem exponential wird zweimal berechnet Grund: env bezeichnet nicht Daten der Hüllkurve, sondern erzeugende Funktion Beobachtung jeder Abtastwert von exponential wird sofort konsumiert Zwischenspeicherung von env unnötig Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Kausale Prozesse Problem: Gabelung auf Ebene eines Abtastwertes Lösung: kausaler Prozess data Causal a b = forall s . Causal ( a -> StateT s Maybe b ) s Ausgabewert hängt nur von aktuellem und früheren Eingabewerten ab Arrow statt Funktion Arbeit mit Arrow-Kombinatoren ( pointfree style“) ” Spezielle Arrow-Notation (in GHC oder mit Präprozessor) Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Kausale Prozesse oscillator :: Generator a exponential :: Generator a envelope :: Causal (a , a ) a zipWith stereo :: Causal (a , a ) ( Stereo a ) apply :: Causal a b -> Generator a -> Generator b apply (( applyFirst envelope oscillator0 &&& applyFirst envelope oscillator1 ) >>> zipWith stereo ) exponential Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Maximale Effizienz mit LLVM Low-Level Virtual Machine Compiler-Backend portabler Assembler Unterstützung Vektoreinheiten von CPU Haskell-Schnittstelle llvm Adaption von Generator kausaler Prozess Kombinatoren bauen LLVM-Code zusammen Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Maximale Effizienz mit LLVM Genaue Steuerung von INLINE Genaue Angabe des Übersetzungszeitpunktes Übersetzung zur Laufzeit Benutzung in GHCi über StorableVector Austausch mit Haskell-Code neues Problem Code für Instrument einmal erzeugen Parameter (Tonhöhe, Länge) später übergeben Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Fazit Probleme Listen sind immer noch am schönsten, aber am wenigsten effizient Optimierung essentiell, aber unzuverlässig Speicherlecks wegen Bedarfsauswertung Arrows sind nötig, aber irgendwie auch hässlich Benötigt: Möglichkeit des Eingriffs, um Speicherleck zu verhindern Deklarativität wird aufgegeben, Modularität muss erhalten bleiben Haskell musiziert Signalverarbeitung Effizienz: Datenstrukturen Was nun? Nach so vielen Abstrichen: Was ist eigentlich noch der Vorteil von Haskell gegenüber einer imperativen Sprache? Haskell musiziert Musik 1 Übersicht 2 Signalverarbeitung 3 Musik 4 Abschluss Haskell musiziert Musik Echtzeit 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Musik Echtzeit Echtzeitverarbeitung Midimory Memory mit Tönen Haskell musiziert Musik Echtzeit Echtzeitverarbeitung MIDI via ALSA Schema: Klaviatur → Stromeditor → Synthesizer → Lautsprecher MIDI-Stromeditor reactive-balsa empfängt MIDI-Nachrichten sendet veränderte MIDI-Nachrichten erzeugt neue MIDI-Nachrichten nach eigenem Takt Haskell musiziert Musik Echtzeit Anwendungen setze parallel gedrückte Tasten in serielles Muster um wandele Instrumentwechsel-Befehle um wechsle Instrument nach jeder Note: Tomatensalat“ ” Klaviatur aufteilen Linkshänderklavier Tasten auf Regler abbilden Intervall-Gehörschule Haskell musiziert Musik Echtzeit Funktionale reaktive Programmierung FRP: functional reactive programming“ ” Unterscheidung zwischen Ereignis und Zustand Ereignisse: Taste gedrückt oder losgelassen, Regler bewegt Zustand: Menge gedrückter Tasten, Reglerstand weitere Anwendungen: GUI, Robotik, Animation reactive-banana: funktionaler Stil (nicht Arrows) Monad: Erzeugung neuer Ereignisse Haskell musiziert Musik Echtzeit Echtzeitverarbeitung mit Listen (alt) type EventList a = [( RelativeTime , a )] type Process a b = EventList a -> EventList b einfaches Entfernen und Hinzufügen von Ereignissen Berechnen von RelativeTime heißt Warten bis Zeit verstrichen Echo-Events Unlösbar: Aufteilen und später Zusammenführen des Stromes Paket: streamed Haskell musiziert Musik Echtzeit Echtzeitverarbeitung mit Prozessen (alt) data Process a b = forall s c . Process ( StateArrow s Either c a ) (b , EventList c )) (Either (s , EventList c ) Zustand von Typ s Taktereignis von Typ c Eingabe: Entweder Takt oder externes Ereignis Ausgabe: verarbeitetes Ereignis und neue Taktereignisse beginne mit Startzustand und -taktereignissen Haskell musiziert Musik Echtzeit Echtzeitverarbeitung mit Prozessen (alt) Kombinatoren ähnlich zu Arrow map :: -- Arrow . arr ( a -> b ) -> Process a b compose :: -- Category .. Process b c -> Process a b -> Process a c guide :: ( a -> Bool ) -> Process a b -> Process a b -> Process a b Arrow.first nicht möglich Haskell musiziert Musik Komposition 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Musik Komposition Haskore Paul Hudak: The Haskell School of Expression. ” Learning Functional Programming Through Multimedia“ Algebra der Musik sequentielle (+:+) und parallele (=:=) Komposition Rechengesetze (a +:+ b) +:+ c = a +:+ (b +:+ c) (a =:= b) =:= c = a =:= (b =:= c) a =:= b = b =:= a .. . Fortschritt gegenüber SoundTracker&Co.: Formulierung von Ideen, weniger Kopieren von Abschnitten Haskell erlaubt gleichzeitig Musikarrangement und Signalerzeugung Haskell musiziert Musik Komposition Begleithilfen regelmäßige aber nicht-periodische Muster: Quersummen der natürlichen Zahlen modulo 4 im 4er-System Gitarrenakkorde Haskell musiziert Musik Komposition Wiedergabemöglichkeiten Haskell-Synthesizer Unter Wasser: Bandpass auf Sägezahn Häcksler: FM-Synthese Schwanensee: Bandpass spielt Melodie auf Akkordbegleitung MIDI-Dateien: ChildSong CSound: Alle Vögel sind schon da SuperCollider Glissando Chill out Notenblatt (noch zu erledigen) Haskell musiziert Musik Komposition Haskore: Aufbau Melody (ohne Instrumente) Music (mit Instrumenten) Player: Interpretation Performance Back-End: MIDI, CSound, SuperCollider . . . Haskell musiziert Musik Komposition Haskore: Music-Typ data Music instr = Note Pitch Dur instr | Rest Dur | Serial [ Music instr ] | Parallel [ Music instr ] | Tempo Rational ( Music instr ) | Transpose Int ( Music instr ) | Player Name ( Music instr ) | Phrase PhraseAttribute ( Music instr ) Haskell musiziert Musik Komposition Wunschliste mehr Interaktivität in Editor oder Entwicklungsumgebung Klangausgabe bei Tastendruck im Editor Noteneingabe in Editor über MIDI/ALSA Hervorhebung aktuell gespielter Note bei Wiedergabe Haskell musiziert Musik Live-Sequencer 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Musik Live-Sequencer Interaktiver Haskell-Sequenzer Änderungen am laufenden Musikstück gemeinsame Komposition über Netzwerk Demonstration Arbeitsweise Interpreter stark vereinfachtes Haskell, untypisiert, kein Sharing“ ” benötigt externe Klangerzeuger Haskell musiziert Abschluss 1 Übersicht 2 Signalverarbeitung 3 Musik 4 Abschluss Haskell musiziert Abschluss Bezugsquellen 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Abschluss Bezugsquellen Assampler Amiga-Assampler Präsenz: http://www.assampler.de/ Saugen: http://aminet.net/search?query=assampler Amiga-Emulator: Linux: http://www.rcdrummond.net/uae/ Windows: http://www.winuae.net/ Haskell musiziert Abschluss Bezugsquellen Haskore Internetpräsenz von Paul Hudak für Original-Haskore: http://www.haskell.org/haskore/ Auf Haskore basierende Projekte: http://www.haskell.org/haskellwiki/Haskore Grundlegend überarbeitetes Paket: http://code.haskell.org/haskore/revised/ haskore: MIDI-Dateien, CSound haskore-supercollider: SuperCollider haskore-synthesizer: Verbindung mit synthesizer Weiterentwicklung von Paul Liu Euterpea Haskell musiziert Abschluss Bezugsquellen Klangsynthese synthesizer-core, synthesizer-dimensional synthesizer-alsa, synthesizer-midi, synthesizer-llvm unterstützt sox für Klangwiedergabe und Konvertierung in übliche Audioformate Für Demonstrationen: http://code.haskell.org/~thielema/dafx/ Haskell musiziert Abschluss Bezugsquellen SuperCollider SuperCollider: Echtzeit-Synthesizer von James McCartney http://www.audiosynth.com/ Ansteuerung mit Haskell Open Sound Control: hosc SuperCollider: hsc3 opensoundcontrol-ht, supercollider-ht Haskell musiziert Abschluss Bezugsquellen SuperCollider-Beispiele osc-Dateien enthalten Kommandos für SuperCollider Audiodaten berechnen: $ 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 Haskell musiziert Abschluss Bezugsquellen CSound Sound-Compiler“ von Barry Vercoe ” http://www.csounds.com/ Sprache für Beschreibung von Klängen (Orchestra) Liste von Klangereignissen (Score) Haskore erzeugt beide Dateiarten Weitere Schnittstellen: csound-expression, hCsound Haskell musiziert Abschluss Bezugsquellen Live-Sequencer live-sequencer http://www.haskell.org/haskellwiki/Live-Sequencer etliche Videos auf DuRöhre Haskell musiziert Abschluss Weitere Informationen 1 Übersicht 2 Signalverarbeitung Grundlagen Signalalgorithmen Sicherheit: Physikalische Einheiten Effizienz: Datenstrukturen 3 Musik Echtzeit Komposition Live-Sequencer 4 Abschluss Bezugsquellen Weitere Informationen Haskell musiziert Abschluss Weitere Informationen Nicht zu vergessen . . . Diskussionen über Haskell und Kunst: http://lists.lurk.org/mailman/listinfo/haskell-art Digitale Signalverarbeitung mit Haskell von Matthew Donadio: http://haskelldsp.sourceforge.net/, dsp Physikalische Klangmodellierung mit Clean von Jerzy Karczmarczuk: “Functional Framework for Sound Generation” http://users.info.unicaen.fr/~karczma/arpap/cleasyn.pdf Haskell musiziert Abschluss Weitere Informationen Weitere Projekte Daniel van den Eijkel: hommage Rohan Drape: hmt, hdf George Giorgidze: YampaSynth Samuel Silva: hamusic (MusicXML) ...