CONNOR HARRIS: Hallo. Ich bin Connor Harris. Ich bin ein CS50 CA an der Harvard. STEPHEN Krewson: Ich bin Stephen Krewson. Ich bin ein TF für CS50 an der Yale. CONNOR HARRIS: Und wir sprechen über einige Technologien, die Sie zu verwenden, wenn Sie daran interessiert sind möchten dabei eine endgültige Projekt oder wirklich nichts mit Musik. Wir werden auf zunächst ein Schwerpunkt werden Programmiersprache namens Haskell. Es ist eine funktionelle Sprache, so das Paradigma ist sehr verschieden von C oder PHP oder andere imperativen Sprachen dass Sie bereits verwendet haben, und vor allem auf einer Bibliothek in Haskell geschrieben genannt Euterpea, die Menschen helfen können mit Musik zu schreiben funktional, im Grunde. Und Stephen sind Sie zu Fuß durch ein großartiges Beispiel dafür, dass. Danach werde ich Ihnen vorstellen etwas namens LillyPond, die ist eine Technologie zur Satz Musik. Es ist irgendwie wie LaTeX für die Musik, wenn einer von euch haben LaTeX für Mathe Klassen verwendet oder andere P set-Klassen oder was auch immer. Und so gebe ich Ihnen wieder einige einfache Beispiele, dass und zeigen Sie in die allgemeine Richtung einigen besseren Ressourcen. STEPHEN Krewson: In Darüber hinaus ist es dachte, wir wäre cool einzurichten ein bisschen von Hinweise in Richtung einer Rohrleitung zwischen Euterpea generierte MIDI-Dateien in LillyPond, so bieten wir einige Kurse vor Skripten derjenigen, die es tun, mit LillyPond bereitgestellt nur um es zu halten, Open-Source- und eine Rohrleitung gehen. CONNOR HARRIS: Wieder sollten wir betonen, Diese beiden Technologien, die Sie nicht haben, um sie gemeinsam zu nutzen. Sie sind nicht darauf ausgelegt, zu arbeiten zusammen, obwohl sie sehr schön. STEPHEN Krewson: Richtig. Und völlig kostenlos. CONNOR HARRIS: So Bestätigungen, gerade gelesen, dass. STEPHEN Krewson: Zur Kenntnis genommen. Dank dieser Leute. Dies werde ich auf nur für einen Moment zu verweilen. Der Installationsprozess ist ein wenig kompliziert. Wir haben eine auf der GitHub las mir dass Sie einen Blick auf zu nehmen. Emailen Sie mich einfach, wenn Sie irgendwelche Fragen haben. Aber wir werden diese unter der Annahme ausgeführt dass dies für alle arbeiten. CONNOR HARRIS: Und wenn Sie nicht können bekommen LillyPond zu arbeiten, keine große Sache. Es gibt keine Live-Zusammenstellung, beteiligt sein werden, zumindest auf meinem Ende. STEPHEN Krewson: Haskell und LillyPond sollten beide haben Installateure. Euterpea ist als Download Paket, so weiter und so fort. Also wir über Computermusik im Gespräch. Und dies ist nur eine sehr 50.000-Fuß-Ansicht. Es gibt ein paar verschiedene Aspekte davon. Und das ist rau und ist wird einige Details zu verschleiern. Aber wir etwas einfallen könnte wie algorithmische Komposition, unter Verwendung von Algorithmen, Verwendung von Code, um zu erzeugen eine Art von-- vielleicht eine selbstähnliche Tonfolge, oder vielleicht Notizen unter einem Zwang. Und dann diejenigen, könnte ausgeführt oder interpretiert mit analogen Instrumenten oder so etwas. Jedoch war die Zusammensetzung algorithmisch durchgeführt. Aber natürlich, vielleicht der Bereich der Computer-Musik oder digitale Musik wir sind besser vertraut mit digital Klangsynthese oder digitale Abtastung und Digital-Aufnahme. Viele digitale Instrumente sind durch digitale Abtastung erfolgt. In der Tat, werden wir mit einer der in die Form einer Soundfont-Bibliothek später. Aber es gibt auch so etwas wie digitale Synthese, die herauskamen der späten 70er und in den 80er Jahren mit Yamaha und John Chowning an der Stanford Dabei FM-Synthese oder FM-Synthese, wo Sie einen Träger hatte Signal und ein Modulationssignal sowohl im Audiospektrum. Aber was wir auf konzentriert heute ist die so genannte MIDI, und natürlich, algorithmische Komposition. Wir gehen nicht, um Instrumente zu machen, aber wir stattdessen gehen, um etwas Musik zu machen, und dann, dass interpretiert bekommen von einigen Instrumenten, sind konform zu den allgemeine MIDI-Standard. Also, was ist MIDI? Ich werde nicht zu tief in sie zu erhalten, aber MIDI ist Datenübertragungsprotokoll. Es ist eine Art von einem Führer über verschiedenen Unternehmen und Branchen für die Organisation von Klängen oder Patches. Also werden wir sehen, dass es gibt eine MIDI-Standard für all die verschiedenen Percussion- Sounds und MIDI-Empfehlungen für alle unterschiedlichen Arten von Synthesizer oder verschiedene Arten von allen Instrumenten Gruppen in einem Orchester, zu sagen. Du bist wahrscheinlich kennen 0 bis 127 MIDI-Meldungen. Ein MIDI-Signal ist in der Regel ein Bit anzeigt, ob es sich um ein Daten oder eine Statuspaket, und dann gibt es sieben Bits eines Signals. Und diese steuern können alles von Volumen der Wirkung oder Druck auf einem bestimmten Schlüssel Wenn Sie mit einem MIDI gerade ausführen Controller sowie natürlich Noten. Und natürlich hat MIDI war äußerst nützlich, denn es ist ein Weg, um Draht zusammen oder Daisy-Chain- eine Reihe von MIDI-Hardware-Geräte. Ich habe sieben oder acht wieder bei mir zu Hause. Es wird wirklich kompliziert, aber es ist wirklich mächtig. Und es ist wirklich alt. Es ist aus den frühen 80er Jahren, und es ist wirklich schön und klein. CONNOR HARRIS: Ja. All die klassischen Nintendo Videospiele würde wahrscheinlich haben MIDI-Dateien für die Musik, zum Beispiel. STEPHEN Krewson: Hier ist ein Beispiel der allgemeinen MIDI, zeigt MIDI als eine Art allgemeine Protokoll. Und ich denke, dass wir von der denken kann, Unterschied zwischen der Spezifikation dass es so etwas wie diese Instrumentenklänge und die tatsächliche Umsetzung dieser Instrumente klingt in einem Soundfont oder einen bestimmten MIDI- Synthesizer als Differenz zwischen vielleicht ein typeface--, die besagt, in der Regel ist dies die Gestaltung der diese besondere Art und Weise zu vertreten characters-- und eine bestimmte Schriftart dass eine spezifische Größe und Klangfarbe, und es gibt Realisierung the-- CONNOR HARRIS: Vielleicht ein besserer Vergleich wäre werden die Unicode-Standard says-- sie gibt eine Zahl, die jedem Charakter, und wirklich jede Sprache in der Welt, oder eine große Sammlung von Skripten der Sprache in der Welt, und das sind in etwas grafische gemacht durch verschiedene Font-Pakete. Und natürlich können Sie denken MIDI als Unicode des Klangs. Und es ist nur eine Liste von-- einem großen Strom Veranstaltungen und Instrumente und so weiter, und Sie verfügen über einen separaten haben Programm, wie ein Schriftbild, zu, dass in machen etwas, das hörbar ist. STEPHEN Krewson: Warum Haskell? Haskell ist eine funktionale Programmiersprache Sprache, sehr weit fortgeschritten, sehr verschieden von C, sehr verschieden von PHP. Und wir werden sehen, dass es eine einfache Funktions Zusammensetzung in Haskell das wird es uns ermöglichen, durch die Brise Zusammenstellung oder die Eingabe auf, Transkription, so etwas wie Frere Jacques, Dieses einfache Lied, hat viele Teile in ihm, sind selbstähnlich oder Wiederholen. So wird dies einige sein die Motivation, warum wir verwenden Haskell, in denen Funktionen sind Bürger erster Klasse. Und ich wollte, um zu verlängern diese ein wenig. Es ist ein bisschen einfach, notieren Frere Jacques in Haskell. Aber was, wenn wir wollten, fügen Sie ein Drum-Part, um es? Was ist, wenn wir wollten, um zu versuchen, so etwas wie eine Roland 808 oder 909 Trommel Rechner, auf dem Sie etwa 16 verschiedene Schritte? Normalerweise sind diese dachte an als 16tel-Noten. Und Sie können die globale Kontrolle Tempo, und Sie können herausgreifen eine Reihe von verschiedenen Schlagteile der Bass-Drum, ein Klatschen, verschiedene Schlingen, offenen und geschlossenen Hoch Hüte auf diese Art von Kanälen, und dann können Sie EQ oder passen ihre Lautstärke. Und wir werden eine schöne Art und Weise zu sehen Haskell vertreten Sie diesen Schritt Sequenzer mit allen verschiedene coole Dinge in Haskell wir mit der Erzeugung tun können Listen und Filtern über Listen, Mapping über Listen, Kartierung Funktionen über Listen. Und eine schnelle Entschuldigung. Dies ist eine sehr oberflächliche und übermäßig schnelle Skizze einiger der Aspekte von Haskell und Euterpea, die eine domänenspezifische ist Embedded-Sprache geschrieben in Haskell für Musikarten. Also bitte überprüfen Sie den Code online. Starten Sie GHCI, die die Glasgow Haskell Compiler-Interpreter. Und ich werde tun, einige von diesem in ein wenig damit Sie sehen können, wie es geht. Und das können Sie mit Last in the-- die Syntax ist Doppelpunkt und dann der Befehl. Sie können Dateien zu laden in. Sie können Ordner durchsuchen auf diese Dateien verwenden um alle Funktionen sehen, dass bestehen in einem bestimmten Modul. Und dann, als wir, die Art und die Art zu sehen Klassen sind so wichtig in Haskell, so können Sie immer besonders check-- wenn Sie in einem neuen DSCL Arbeits wie dieses, was ist eine Musikrichtung? Ich weiß, über die Art, numerische Typen arbeiten in Haskell, aber ich weiß nicht viel über Musik. Aber Sie können die Art und Weise sie zu erkunden indem Sie dieses T oder Typ-Befehl definiert und dann in einem bestimmten Aufruf Funktion oder ein Datenobjekt. CONNOR HARRIS: Ja. Wenn Sie C und Clang dachte, war hardass über Typen, Sie haben keine Ahnung von Haskell. Die gute Sache über Haskell ist, dass Wenn Sie Ihren Code zu kompilieren und wenn Haskell Typprüfungen, es ist wohl richtig, weil die Art System ist so streng. STEPHEN Krewson: Ja. Also ich will nur gehen through-- wieder dies nicht tun es ein paar von justice-- Die Merkmale der Haskell, dass zumindest seine creators-- und es erstellt wurde in den späten 1980er Jahren durch eine Gruppe von Leuten, ein Komitee von etwa 20 people-- dachte, waren wichtig. Und das erste, was sie in einem Papier aufgelistet, beschrieben die Entstehung der Haskell über die ersten 20 Jahre oder so war, dass es faul. Also, was bedeutet das? Nun, es bedeutet, wenn wir über eine Art des Ausdrucks, müssen wir es bewerten. Und Haskell tut dies in einem Call- nach Bedarf Weg oder ein nicht-strenge Art und Weise. Das heißt, wenn wir haben eine Reihe von Bestandteile unserer Ausdruck, wir versuchen, die Auswertung zu verzögern dieser Subkomponenten bis die absolut letzte minute-- das heißt, bis wir tatsächlich benötigen. Also das ist die means-- wirklich cool, vor allem wenn wir über die Abstraktion denken einer musikalischen Step-Sequenzer. Sie schalten Sie ihn ein, und Sie beginnen läuft ein Schritt sequence-- wenn Sie überhaupt mit einer Trommel bearbeitet machine-- und es geht einfach immer. So wäre es wirklich schön, wenn wir könnte, dass in Haskell zu emulieren. Und wir können sie mit unendlicher tun Werte, insbesondere unendlich Listen. Es ist sehr einfach, ein Typ unendliche Liste in Haskell. Sie könnten nur die Syntax nach unten hier, wo Sie durch 3 siehe 1, entfernen Sie den 3 1 dot dot und , dass es eine unendliche Liste aller natürlichen Zahlen, die sich auf so weit wie Sie sich vorstellen können. Ich möchte eine Einführung Konzept der Falten sofort. Und wieder, der Zweck dieses Seminars ist es nicht über Falten in Haskell lernen oder Funktionen höherer Ordnung. Aber ich möchte nur, um es zu präsentieren, geben eine genaue Vorstellung davon, wie komisch Haskell ist und wie stark es ist. Und vor allem werden wir be-- wenn wir unsere verschiedenen Drum-Parts, werden wir manipulieren Listen Zahlen, falten Sie sie auf einander. Und um das zu tun, werden wir werden mit Karten und Falten. Es gibt einen richtigen assoziative falten, die dieses Recht ist hier-- 1 minus die Menge, 2 abzüglich der Menge, minus 3 0. Und die Syntax für eine Falte, eine Falte geben Ihnen ein Grundwert und dann eine operation-- in diesem Fall wird die Addition oder Subtraktion. Ich habe beide Fälle gezeigt. Und dann gibt es ein Akkumulator, sammelt sich über die gesamte Liste, Anwendung dieser Operator plus oder minus und dann anfall es. So wird diese the-- sein, wenn es hieß mit Klapp r Plus von 0, beginnend mit 0, wir würden dann summieren alle die Zahlen in dieser Liste. Und das ist eine Liste von 1 bis 3. CONNOR HARRIS: Also, um es zu einem anderen setzen So dauert fach r drei Argumente. Es gibt eine Funktion, selbst nimmt zwei Argumente, dann gibt es ein Starter-Wert, und es gibt eine Liste von Werten. Und was Sie tun, ist nehmen Sie Starterwert, erster Wert, setzen sie in der Funktion. Was bekommen Sie heraus, Nimm das, Futter, in die Funktion der zweiter Wert, was Sie bekommen, nehmen, dass, zu füttern, die in die in Abhängigkeit von dem dritten Wert. Und dann, wenn Sie unten gehen Diese ganze Liste auf diese Weise, Wirst du irgendwann bist einige singuläre Wert, der ist des gleichen Typs von dem, was Sie begonnen mit und vom gleichen Typ wie die Dinge in der Liste, und dann das ist die Rückkehr aufgrund der Falte R. STEPHEN Krewson: Also insbesondere, dies sind Funktionen höherer Ordnung, weil sie unter einem anderen Funktion als eines der Argumente. CONNOR HARRIS: Ja. Wenn Sie bestimmte andere verwendet haben languages-- Ich weiß, R, [unverständlich] Sprache hat diese, genannt reduzieren. Sie könnten ähnliche Funktionen haben in anderen Sprachen, gerade angerufen verschiedene Dinge. STEPHEN Krewson: Und Das Schöne an Falte R in diesem Fall ist, dass Falte R kann mit unendlichen Listen zu arbeiten. Also in diesem Boden, dieser P5 wird die Erzeugung der stellt fest, dass werden in der Step-Sequenzer für eingeschaltet einige Drum-Part, der fünfte Drum-Part, und vielleicht ist es ein conga Trommel oder so etwas. Und dies ist eine absichtlich stumpfen Art des Schreibens dieses, aber es macht Spaß, weil es viel demonstriert Dinge über Haskell und Euterpea. So klappen R dieser colon-- Doppelpunkt ist nur ein Operator, der die Dinge drückt zusammen auf einem list-- auf nüchternen genannt Liste, die nur die leere Klammern. Und ich rufe, dass auf dieser unendliche Liste. Dies ist eigentlich zwei Listen addiert hier unten. Die Liste 1 Komma 6 dot Punkt 1, 6, 11, 16. In gerade so Haskell-- ein paar Zeichen, die Sie kann die gesamte Erzeugung Zahlenfolge , die fünf Zahlen voneinander entfernt sind Stretching auf in die Unendlichkeit. Und ich voranstellen, um die Diese kürzere kleine list-- 3, 8, 21-- nur um zu zeigen wie Sie Listen zu verketten. Und dann habe ich mich auf sich selbst gefaltet. Und das endet einfach nur eine Art von Identität Betrieb, aber es ist unendlich. Und falten R kann das tun, weil es träge auswertet, wie es in der oben genannten. Wenn wir eine 1 und eine 2 und 3, können wir nur Halter aus dem ganzen Rest davon. Das wird nicht für die Arbeit Minus oder Plus, aber es wird für diese Doppelpunkt arbeiten Identität Operation auf der Liste. Wie können wir also praktisch zu verwenden, wenn wir eine unendlich lange Liste der Dinge? Nun, bietet Haskell eine Menge functions-- und sehen eher in diese in Ihr eigenes Zeit-- wie nehmen die sagt, OK, wir sind Erzeugen dieses unendliche Liste, aber wir sind gerade dabei, einige nehmen Anzahl der es Und in diesem Fall-- Wir werden dies später zu sehen unsere Drum-Machine code-- GM ist nur eine Art von globaler Variable für die Anzahl von Schritten im Sequenzer. Auf den roll-in-Maschinen I Sie zeigten, das ist in der Regel 16, aber ich habe es mit 32 implementiert. Es spielt eigentlich keine Rolle. Haskell ist auch rein, so hat es starke statische Typisierung, die Connor spielte auf. So Funktionen mathematischen im sense-- sie sind mehr mathematische dass sie garantiert sind um nicht zugreifen oder ändern jede Art von variable oder führen Eingang oder Ausgang. Also, wenn Sie eine Funktion haben, es ist deterministisch. Es wird immer das gleiche zurück Wert in dem Zustand des Programms oder gleich bleiben. Es gibt natürlich Ausnahmen monadic dies, aber das ist jenseits unserer Möglichkeiten. CONNOR HARRIS: Ja. Was dies bedeutet, ist jedoch, da sind ein paar wichtige [unverständlich] Folgen davon. Einer ist, dass es sehr einfach ist, parallelisieren Haskell-Programme. Weil, wenn Sie haben, dh eine Funktion, dass muss sich auf eine Million Werte zu betreiben, wenn Sie wissen, dass die Funktion wird immer geben den gleichen Wert, wenn Sie zu einem bestimmten value-- füttern wenn Sie [unverständlich] f von 1 sind, f 2, dann ist f von 3 oder whatnot-- f von 1 ist nicht zu schreiben, in eine Datei oder etwas tun, dass den Wert F2 zu verändern. Sie können einfach spalten diese Funktion, um eine Millionen verschiedene Maschinen oder eine Million verschiedenen Threads oder was auch immer, erhalten Sie alle Antworten zurück, erhalten Sie alle Rückgabewerte zurück, und das ist es. So sehr einfach, Dinge zu parallelisieren. Der Nachteil ist, dass die Eingangs und Ausgangs insbesondere passen in das Typsystem in sehr komplizierte Art und Weise. Wir werden nun in dieses Recht, aber ich Sie ermutigen, auf einige Ressourcen zu suchen online, wenn Sie darüber wissen willst. STEPHEN Krewson: So Geben classes-- und dies was-- Klassen von Typen wurden erfunden, um zu lösen ein Problem der Überladen von Operatoren. Also für die Gleichstellung haben wollten wir zwischen verschiedenen Arten von Dingen. Natürlich könnten wir denken von-- Gleichstellung von numerischen Typen ist sehr einfach zu denken, aber was ist die Gleichstellung von Listen? Wie sieht es mit der Gleichstellung von Baum Bein Datenstrukturen? Und das ist alles möglich in Haskell wegen der Typklassen. Also, wenn Sie eine bestimmte Daten Typ-- definieren und hier handelt es sich um musikalische Tonhöhen. Wir sind endlich bis zu einem gewissen Computermusik. So haben wir C, Cis, und so weiter und so fort. Sie gehören zu einer Reihe von verschiedene Typklassen. EQ-- sie gehören zu den EQ-Typ-Klasse. Das heißt, sie zu unterstützen Gleichheit Operationen. Schauen Sie, ob man auswerten kann Abfolge der musikalischen Grundelemente ist die gleiche wie eine andere. Sie gehören zu den Ordnungs Klasse. Das heißt, es gibt eine Bestellung auf diese. D kommt nach C Cis kommt nach C als gut. Sie gehören zu der Klasse zeigen, was bedeutet, sie können zu einer Konsole oder Terminal ausgedruckt werden. Sie gehören zu den Klasse aufgezählt, die bedeutet, dass, obwohl Das sind Zeichen, sie eine zugrunde liegende numerische haben Darstellung ab 0 und Abheben durch jedoch viele Dinge sind hier, 20 oder so, oder 30 oder 40, vielleicht. CONNOR HARRIS: Und wenn wir haben einen Datentyp dass derives-- mit diesem Stichwort "deriving--" eine bestimmte Art Klasse, es bedeutet, dass der Compiler versuchen, automatisch etwas zu konstruieren. Also vielleicht wirst du zu wollen, definieren eine Qualität unterschiedlich. Sie wollen definieren, Cis- als gleich D flat, zum Beispiel. Mit dieser Konstruktion Hier, glaube ich nicht Cis denken und D flat gleich sein werden, denn der Compiler automatisch sagen alle verschiedenen möglichen Wert unterscheidet sich von jedem anderen. So ist es möglich, zu überschreiben die Standardimplementierungen diese Arten von Klassen. Auch bei der Referenz wenn aussehen Sie darüber wissen willst. STEPHEN Krewson: Und hier, eigentlich, diese werde hilfreich sein, wenn wir Code später. Wir sehen einige der Infixoperatoren zur sequentiellen Komposition, parallel Zusammensetzung usw. her, diese Vor-und Gleichheitszeichen umgeben durch Doppelpunkte. Das bedeutet, dass wir diese verschiedenen spielen Musik Primitiven nacheinander. Das ist, sequentielle Komposition. Oder wir können sie in zu spielen parallel zur gleichen Zeit. So kann ich einen musikalischen Wert haben, und dann wird diese gleich und Doppelpunkte, Infix parallel Zusammensetzung Betreiber, und spielt sie als eine Art von Akkord. Und wir werden zu bedienen dies, wenn wir kombinieren unsere Drum-Part mit unseren wenig Frere Jacques Song um diese beiden Sequenzen spielen Notenwerten gleichzeitig. Currying ist-- Curry wurde zuletzt Name des Haskell Curry, der die Haskell Bild ist benannt nach. Und dies ermöglicht uns eine schöne Eleganz, wenn wir Schreiben all diese verschiedenen Funktionen oder Filter, die wir sind werde Mapping über unsere Listen sein. Funktion zweier arguments-- f x und Y- kann dargestellt werden als f von x zu y aufgetragen. Es ist also eine Funktion von ein Argument, das zurückkehrt Eine weitere Funktion eines Arguments. Dies bedeutet also, wir können eine Karte Funktion f von x über Liste von y ist. CONNOR HARRIS: Möchten Sie ein Beispiel dafür? STEPHEN Krewson: Ja. Ich habe ein Beispiel rechts hier von einige der Dinge, die wir schreiben. So replizieren 2-- gut, replizieren dauern wird, ein Wert, der ist, wie viele Mal etwas zu replizieren, und dann wird es eine value-- nehmen in der Regel eine Liste oder so etwas. So, hier sind wir Mapping replizieren 2 über eine andere Liste. Wenn wir also map replizieren 2, wenn wir replizieren 2 gelten auf das erste Element dieser list-- und das sind Listen von Musik phrases-- werden zwei zu produzieren "Sie sleeping--" so werden Sie schlafen, werden Sie schlafen. So, jetzt haben wir zwei. Aber Replikation dauert zwei Argumente, sondern weil wir sind currying und dann Zuordnung, Wir können Replikat 2 stellen As mit als Funktion zurückgegeben einem argument-- nur replizierende zweimal. Und dann werden wir die Anwendung, die jedem Element dieser Liste von Phrasen. Und concat ist ein Haskell Betrieb zum Abflachen einer Liste. Weil Replikat 2 Willen produzieren eine Liste von Listen. Und das ist hier, diese Zwischenform. Und so ist, dann wir können concat oder flach, dass zweimal. CONNOR HARRIS: Eine einfachere Beispiel currying, wenn Sie like-- mir vorstellen, f ist nur ein Multiplikationsfunktion, die zwei Takes Argumente und ihr Produkt zurückgibt. Also, wenn Sie ein F haben 4 5, es ist 20. Aber Sie dies als denken können also-- Sie eine Funktion f 4 haben , dass ein Argument und kehrt viermal diese argument-- gerade Teil Anwendung, nur ein Argument 4. Und wenn Sie f von 4 füttern 5, das wird Ihnen 20. Und das ist eine einfachere Beispiel currying. Es ist normalerweise eine der Lehrbuch Einsen. STEPHEN Krewson: Lambda Ausdrücke oder anonyme Funktionen sind ein weiteres Markenzeichen Haskell. Also, wenn wir brauchen zu schüren ein kleine Funktion Leben replizieren, aber sagen, dass es nicht in die Standardbibliothek, können wir ein Syntax verwenden ähnlich der folgenden. Und wir werden über diese Brise. Eine Sache, du wirst eine Menge in den Stuhl Drum Machine ist wir machen Anrufe In den so genannten Filter, der wie zuvor, ist eine Abbildung einer Funktion über eine Liste, ist aber eine Abbildung einer Booleschen Funktion. So haben wir hier ein Beispiel der eine ein anonym definierte Boolesche Funktion, dauert nur ein paar Werte. Dies ist streng genommen nicht um eine anonyme Funktion. Aber es ist zu definieren mit dass Syntax für Kürze, und dies dauert nur x-Modul N- CONNOR HARRIS: Ja. Also f eine Funktion zwei Argumente n und p , dass eine Funktion, die selbst ist zurück eine Funktion von einem vor, nämlich x. STEPHEN Krewson: I genannten Infixoperatoren. Was sind Infixoperatoren? Nun, Infixoperatoren die normale Weise, die wir repräsentieren Operationen, sagen, in mathematics-- 2 plus 2 anstelle des Betreibers sowie und dann zwei Argumente 2 und 2. CONNOR HARRIS: Es heißt Umgekehrte Polnische Notation, das ist, ein Begriff, ich bezweifle, dass jemand von euch wissen würde. STEPHEN Krewson: Richtig. Umgekehrte Polnische Notation oder Präfix. Aber Haskell beschlossen, benutzen Infixoperatoren. Das sind also einige der die benutzerdefinierten diejenigen, werden für die definierte Euterpea DSCL in Haskell. Das war also sequentiellen Komposition. Dies war parallel Zusammensetzung, und das wurde Abschneiden parallel Komposition. Und wir müssen, dass mit unseren Drum-Machine, weil wir die letzte verwenden Betreiber in diesem kleinen Tupel gibt um die Drum-Machine zusammen spielen Mit unseren Frere Jacques Lied. Und unsere Drum-Machine ist gehen unendlich zu sein. Er spielt einfach immer. Aber die Frere Jacques Song nicht. Es ist nicht so lang. Es ist nur ein paar Bars. Also brauchen wir, um die Trommel Maschine zu stoppen Sobald die kürzere musikalischen Wert kommt zu einem Ende. Und das Infix Betreiber ist super hilfsbereit, dass. Und Infix-Notation wie Das ist ganz nett, denn, Sie haben eine Funktion wie haben Zitat, das die Ganzzahl-Division gibt von x durch etwas else-- sorry, dass sein sollte a und b. Man könnte es als Zitat von b zu schreiben. Also, wenn Sie put-- Element ein weiteres Beispiel. x Element in irgendeiner Liste, wenn du es in Backticks, können Sie es verwenden. Auch wenn es kein Symbol wie plus oder minus oder Zeiten, können Sie den Namen eines verwenden Funktion wie die in Backticks als Infix-Operator, was ziemlich cool ist. CONNOR HARRIS: Wiederum ist dies alles nur syntaktischer Zucker, wirklich. Es beeinflusst nicht den Kern der Sprache. STEPHEN Krewson: So sehen wir hier für die letzten Satz unserer Frere Jacques Song, Ich einige kleine Akkorde oder Drittel über die parallele Komposition Operator. Dies ist eine andere Art zu sagen, einige von dem, was wir gerade gesagt. So können Sie Funktionen zuordnen von einem Streit über Listen. CONNOR HARRIS: Wieder Referenzen für Haskell-- Einführungslehrbücher wird all dies haben in ihm. STEPHEN Krewson: Also hier ist ein hübsches Schlüssel Zeile des Step-Sequenzer Wir werden einen Blick auf mit zu nehmen eine Liste Verständnis. Und wir sehen hier, dass Element in festBetreiber zurück Anführungszeichen. Also, wenn x ein Element von der Liste der x ist, dann werden wir perc Funktionen aufrufen. So perc ist nur ein Schlagfunktion. Es dauert einige Wert p, der ist Teil der beschränkten Menge aller die verschiedenen Percussion-Sounds dass wir in einem vorherigen Folie sah, und dann gibt es, dass Dauer einer Viertelnote. Sonst gibt es es eine QNR und QNR ist nur eine Viertelnote Ruhe. Das ist also Aufbau etwas Schönes. Wir haben eine Liste von Elementen, und wir werden Schleife über einige Liste von einer auf den max Wert unserer Step-Sequenzer. Und wenn wir an einem bestimmten i bist diese Liste von einem bis zu dem Maximalwert, wenn das i ist ein Mitglied dieser Satz in dieser Funktion erstellt, gut, dann biegen wir es in ein Perkussions. Ansonsten haben wir eine Pause, spielen nur die ist zu sagen, wir haben nur schweigen. Und wir hier, dass in sehen können Diese Liste Verständnis Syntax, x durch dieses besiedelt Liste konstruiert ein zum globalen Größe des Sequenzers. CONNOR HARRIS: Ja. Die grundlegende Syntax für Liste Leseverständnis ist Halterung, Wert mit einige Variablen, Bar, mögliche Werte der Variablen selbst, geschlossen Halterung. Und wenn Sie gesetzt Bauer Notation gemacht in jeder Art von Mathematik-Klasse, Sie könnte 2n derart festgelegt haben dass n oder n in z. Ähnliche thing-- dieser Notation ist gemeint, suggestive sein dieser mathematischen Notation. STEPHEN Krewson: Und du kannst gelten mehrere Prädikate und mehrere Filter in einer Liste Verstehen, was sehr nett ist. Algebraische types-- wir nicht verweilen lange hier. Es ist keine gute Idee in Haskell oder eine gute, klar Vorstellung wie zu nehmen, sagen wir, einen Standard Parameter an eine Funktion oder so etwas. In Python ist dies ganz einfach. Sie können einfach sagen, mit gleich auf die Deklaration der Funktion, ein Standardwert in Falls keiner zugeführt wird. In Haskell, könnten Sie vielleicht benutzen vielleicht die vielleicht geben, was braucht entweder gar nichts oder ein Wert vom Typ gerade ein. So nutzen wir diese in der Drum-Machine um uns zu erlauben optional Volumen zu geben Parameter zu jedem der Trommelteile. So dass gibt uns eine Möglichkeit, mit EQ oder ein Volumen auf einem bestimmten Kanal. CONNOR HARRIS: In andere Haskell Beispiele Sie könnte vielleicht für benutzt sehen Funktionen, die ausfallen könnten. Dies ist ein allgemeines. STEPHEN Krewson: Und Sie liefern kann eine Art von Fehlermeldung als Standard. Und das ist besonders praktisch, wenn Sie tun das I / O in Haskell. Das kann Tricks. CONNOR HARRIS: oder für eine ähnliches Beispiel, denken einer Funktion, die Teilung beinhaltet eines Parameters, der 0 sein kann. Und das funktionieren könnte Rück vielleicht was auch immer. Also, wenn es keine Division durch 0, es wird nur, was auch immer zurück. Und wenn es eine Division durch 0, wird nichts zurück als Mittel zur Signalisierung des Fehlers. Weil einer Folge Haskell ist sehr strikte Typisierung ist, dass es keine real-- Ausnahmen sind umständlich, im Grunde, Fehlerbehandlung ist umständlich. Und dies ist eine sehr gemeinsamer Weg, es zu tun. STEPHEN Krewson: So, jetzt kommen wir an einen anderen knifflige Sache über Haskell, das Muster ist Matching und Funktionsdefinitionen. Zeigte ich Ihnen in der letzten Folie der Erklärung der Schrittkette Funktion, die einen vielleicht Wert nahm, dann ein int, dann eine Liste von Ganzzahlen, gibt dann eine Folge von Musik-Werte gibt kommentierten sowohl mit Tonhöhe und Lautstärke. Also diese drei Argumente kann Muster in folgender Weise aufeinander abgestimmt. Und wir wollen immer sicher sein, zuerst tun einen Basisfall oder Ausgangsfall. Und diese Unterstriche kann nur interpretiert werden, um einen Wert, dass es meine. Wenn wir also einen Anruf mit Schritt-Sequenz mit einigen Wert, einen anderen Wert, und dann wird die leere Liste, was wir wollen, Rückkehr ist nur Stille, eine Ruhe 0. Und anstatt dass wobei eine leere Liste oder 0, es ist ein Rest 0, weil wir Umgang mit der Musik-Typ, und die leere Liste der Musik Typ ist nur ein Rest ohne Dauer. Es ist keine Musik. Und dann sehen wir, wenn wir einen Schritt erhalten Sequenz mit einer V für Volumen Argument, p für vorsorglich Instrument Argument und dann eine Liste von x ist. Dann tun wir ein paar Sachen. Insbesondere wenden wir Diese Liste Verständnis, und wir führen einige Operationen an der vielleicht Wert um es in einen numerischen Wert, so dass drehen es könnte dann aufgezählten verwendet werden und um das Gerät auszuwählen. Wiederum ist dies ein wenig bit absichtlich inconcise nur um alle seltsame Dinge zeigen Sie in Haskell, wie Sie tun können Schauen Sie sich auf Ihrem eigenen Zeit. Gut. Also werden wir endlich zu tun, was wir vorgenommen haben, was machen einige Computermusik. Also werden wir versuchen, machen den Frere Jacques Lied. Es gibt also, wie viele Sätze in Frere Jacques? Vier. Groß. Und was schön ist, dass sie alle wiederholt dieselbe Menge an Zeit, die zwei ist. So haben wir vier Sätze jeweils zweimal wiederholt. Insbesondere sind sie in einer Runde. Und es gibt viele, viele Möglichkeiten zur Implementierung von ein runder, die Spaß zu tun sein könnte. Ich habe es in einem getan ziemlich einfache Weise hier ist, das ist genau das, um die Linie construct-- Funktion nimmt eine Liste von Musikwerte und wandelt es in sequentielle Komposition indem diese sequentielle Komposition Operator. Und dann habe ich die verschiedenen Teile zu verzögern indem er sie mit einer Ruhe beginnen. So beginne ich mit einem Rest der beiden Maßnahmen, und dann eine Pause von vier Maßnahmen, und dann eine Pause von sechs Maßnahmen, und dann wird das Rund funktioniert, wie wir alle wissen, das Lied. Wir sehen zwei Anmerkungen oder Modifikationen der Musikwerte die in dieser sequentiellen enthalten sind Anordnung der Musik-Elemente. Wir haben ein Add Volumen. Dies ist eine Funktion, um zu kommentieren Musik mit einem bestimmten Volumen. Dies ist ein gutes Beispiel ein MIDI-Signal Lauf 0-127, die sieben Bits Informationen, die getragen werden kann. Und then-- wir es sahen sehr kurz, aber die allgemeine MIDI Liste von verschiedenen Instrumenten. Und es gibt nicht eine ganze Menge von ihnen. Wenn Sie eine digitale Audio-Workstation zu verwenden, wie Ableton Live oder Pro Tools, Es ist ein unglaublich breitere Palette von Synthesizern und VST-Instrumente. Aber nur die MIDI-Standard hat ein paar oder mehrere Dutzend. Und einige von ihnen sind lustig. Ich dachte, es würde Spaß machen, wenn wir gespielt das Instrument das MIDI-Instrument Hubschrauber, und dann das nächsten Wege durch die Runde, wir haben ein Pad Synthesizer, und dann der dies abgedroschen Blei Rechteck synth, und dann äußern Schlamm, der eine etwas undeutlich auf mein schlechtes MIDI Synthesizer, aber sie OK. Und dann sehen wir dieses let und in der Syntax von Haskell, und dann spielen wir diese Teile zusammen mit der parallelen Komposition Betreiber. Und wir könnten wahrscheinlich zeigen einige dieser. Hier ist der Code. Und Sie können in C sehen, es würde sein ein viel Räuspern und Einstellung der Tisch-Code, bevor Sie könnte Musik wie diese machen. Oder jede andere Programmiersprache Sprache, würden Sie wahrscheinlich müssen mit einer Art interagieren Bibliothek oder API und setzen alles auf, und dann müssten Sie, um aufzuräumen. Aber hier in Haskell ist, denke ich, sobald Sie den Dreh raus zu bekommen von ihm, unglaublich lesbar und sehr ausdrucksvoll. So gibt es die Umsetzung von Frere Jacques. Gut. Jetzt Percussion wollen wir, und das ist ein bisschen unordentlicher. Werfen wir also einen Blick auf die Folien. Die große Idee ist, zu machen eine Reihe von Listen oder von Teilen. Aus diesen roll-in Maschinen gibt waren in der Regel etwa vielleicht acht bis 10 Rhythmus- oder Percussion-Parts. Und verwenden Sie dann eine Reihe von Techniken. Und wir these-- mit gesprochen haben Falten, Filter, Lambda-Funktionen, Überlisten auf Werte erzeugen kartiert in einem gewissen Bereich von 1 bis r, r 16, oder 32 Schritte in der Ablaufkette. Und dann, wenn es einen Wert in dieser Liste als wir durch den Sequenzer laufen, , die durch sie immer und über, stellt sich in diesem Sinne, und dass die Probe ausgelöst wird. Hier sind all die verschiedenen Möglichkeiten, seltsame Ich kam mit, um Notizen zu generieren. Versuchen Sie es auf Ihrer eigenen halb Summe. Es wird cool klingen. Zeit erlaubt, werden wir durch diese gehen. Aber für jetzt, ich denke, wir sollten Demo, was wir haben. Hoffen wir, dass dies geht auf OK. Das ist also GHCI. Und wir werden eine Datei zu laden Ich habe angerufen song.lhs, das ist die Datei, die ich Ihnen gezeigt, nur. OK, groß. Als Connor sagte, es kompiliert, wird geprüft Typ, so kann ich viel leichter zu atmen. Es wird nicht auf mich zu sprengen. Ich wollte Sie etwas Nützliches zu zeigen. Sie können sehen, dass ein Modul geladen genannte 50. Sie können dieses Modul zu durchsuchen. Und das ist so schön, über doing-- vielleicht, was Sie tun in Haskell nicht genannte Software-Entwicklung, aber Sie eine Menge tun können, fun stuff auf eigene Faust. Und der Workflow ist wirklich nett, wie im Vergleich zu vielen anderen Sprachen, weil Sie in einem wirklich sehen können, erkennen, was vor sich geht. So sehen wir, dass wir alle diese Sätze, die sind Listen von Musikstandplätze, und dann werden wir bauen diese bis in etwas größeren, Das ist ein Musik-Lied. Es ist eine musikalische Einheit. Und dann können wir das alles zu spielen mit einer Funktion namens spielen Musik. Sie können, dass hier unten zu sehen. Das ist einfach nur spielen. Ich sollte sagen-- ich nicht darüber reden Diese Dollar-Zeichen, die überall ist. Dollar-Zeichen ist ein weiterer Infix-Operator. Aber es hat die niedrigste Priorität hat von jedem Betreiber, die effektiv bedeutet, dass alles, was auf die links von der Dollarzeichen und das Recht der Dollar-Zeichen, wir werden, bevor es ausgewertet zu werden. Also ist es ein bisschen wie ein anderer Weg, indem Klammern. CONNOR HARRIS: Es ist im Grunde Funktion Komposition. Und es stellt sicher, dass Sie nicht, wenn have-- Sie funktioniert auf jeder Seite oder infix Betreiber auf beiden Seiten, werden sie nicht assoziieren über sie und geben Ihnen unerwartete Ergebnisse. STEPHEN Krewson: Also wir can-- mit, dass, können wir rufen. Zuerst werden wir es ohne Schlagzeug zu spielen. Das ist der Hubschrauber, die MIDI-Hubschrauber. [Musikwiedergabe] Da ist der Rechteckwelle. Die Stimme sickern. Und man kann wirklich wild gehen mit diesem. Ich nahm eine ziemlich einfache, weil ich wusste, ich sollte nicht abbeißen mehr als ich kauen konnte. Nur halten sie ziemlich einfach um die wichtigsten Ideen zu zeigen. Aber dann dachte ich, wir haben haben einige Trommeln diesem hinzufügen. Gerade weil es sich um ein wenig undurchdringlich, und ich habe nicht mit dem Name des Drum-Parts, I zugeordnet them--, weil sie Teil dieser Aufzählungsklasse, Ich kartiert sie ints. Man ist wie ein Bass-Drum. Zero ist als gut. Seven ist ein Hi-Hat. Und unten in hier, wo die Funktionen bekommen ein wenig mehr zufällig, Diese sind wie Congas. Also, wenn Sie denken, vielleicht ein about-- Spaßweise, einen Drumcomputer zu implementieren ist sehr ordentlich zu bedienen Muster auf Bass-Drum. So zum Beispiel, auf das Filtern über die Liste mit allem, was zurückgibt a 1, wenn es Modul 04 übernommen. So bekomme ich 1, 5, 9, 13, so dass diese 17-- ist der erste Schlag jedes Taktes. Und dann ist dies das gleiche Sache verschoben über zwei Stufen. Also das ist die offbeat. Also das wäre so etwas wie einen hohen Hut. Und hier dann wieder, nach unten, es ist ein wenig zufällig, weil wir tun Congatrommeln. Und ich habe einige Maracas sich auch hier. So konnte ich spielen Drum Machine rufen, aber es würde ewig so weitergehen, und es könnte zu starten Grabbing up der gesamte Speicher in meinem System. Also werde ich diese Funktion aufrufen spielen Musik, die wie wir sehen werden, verwenden Sie das Abschneiden parallel Zusammensetzung in unserem kleinen Frere Jacques Song zu spielen zusammen mit diesem seltsamen Drum-Machine. Werfen wir also einen Blick. Und bitte Verbesserung auf meinem Anordnung aller Drum-Parts. Nicht meine Spezialität, aber ich hatten viel Spaß dabei. [Musikwiedergabe] Also selbstverständlich ist dies alles etwas nicht so viel Spaß wenn wir nicht konvertieren zu einem Ergebnis, so ist es vielleicht könnte interpretiert werden durch einen menschlichen Darsteller. Also werde ich es nicht ausführen Sie hier. Ich habe bereits die Dateien generiert. Sie können sehen, dass es eine dot LilyPond file-- und dies meine segue zu sein über Connor-- und ein Punkt MIDI-Datei, und ein Punkt PDF-Datei, die das, was ist LilyPond wird letztlich zu generieren. Aber das sind diese Skripte, und ich werde nur laufen sie mit ihren Hilfeoptionen. Wenn Sie diese zum Laufen zu bringen mit Euterpea, können Sie eine MIDI-Datei zu erzeugen. Und dann von der MIDI-Datei Mit diesem MIDI 2LY Programm, können Sie eine Lilie zu erzeugen Pond-Datei, und Sie können Sie eine PDF der Partitur zu erzeugen. Und wir sollten einen Blick auf diese zu nehmen. So Connor wird wahrscheinlich zeigen Ihnen, wie Sie kommentieren das besser, aber dies ist Frere Jacques als von mir in Euterpea generiert. Es ist nur in C. Ich sollte herausgefunden haben herauszufinden, was das hacken es ist eigentlich in. Aber das ist die Pipeline für wie Sie, dass zu tun. Reden wir mehr über LilyPond. CONNOR HARRIS: OK Mal sehen. Haben Sie erwähnen Erfahren Sie Haskell? STEPHEN Krewson: Oh ja. Schauen Sie Erfahren Sie Haskell. Es ist in den Ressourcen. Das ist, wie ich anfing, lernen, und es ist toll. Nicht dumm Lernen. CONNOR HARRIS: So ist es online. So ein Mann namens [unverständlich] learnyouahaskell.com, keine Leerzeichen. Grammatik ist krank. STEPHEN Krewson: Es ist veranschaulicht, auch. CONNOR HARRIS: Also, was ist LilyPond? Es ist eine deklarative Programmierung Sprache für Notensatz. So declarative-- möglich denken Sie an Dinge wie HTML, wo du nicht bist saying-- HTML sagt nicht, wie Web-Browser sollte Render-Seiten Schritt für Schritt. Es ist nur das sage ist eine Textbeschreibung von dem, was Sie wollen, dass die Seite aussehen soll. Und dann ist es auch ein Programm dass kompiliert diese Sprache, oder er seinen eingelesen und dann tatsächlich funktioniert die Schriftsatz für Sie, und es spuckt diese wunderbare aussehende PDF-Partituren. Sie können auch PNG-Format oder was auch immer. Eine gute Möglichkeit zu denken, dieser ist in Analogie ist, dass LaTeX ist so etwas wie LillyPond, sondern für ganz normale Schriftsatz. Also statt von-- es nicht WYSIWYG, was Sie See Was Sie erhalten, wie, sagen, Finale oder Sibelius, oder Microsoft Word, wo Sie geben Echtzeit und Entwurf Dinge in Echtzeit und Änderungen zu sehen augenblicklich. Es ist textbasiert. Sie müssen Ihre kompilieren Noten mit einem separaten Programm und raus PDFs später. Dies ist etwas weniger bequem für den Einsatz, wenn Sie versuchen, direkt schreiben in eine Partitur und du bist versuchen, auf den Computer zu komponieren. Aber es gibt viele Vorteile dafür. One, es sieht viel schöner, weil LillyPond kann tatsächlich die Zeit nehmen, zu tun Layout-Entscheidungen richtig, im Gegensatz zu Sibelius oder Finale, das haben kompromittiert Algorithmen so stellen dass sie angezeigt werden kann Dinge in Echtzeit. Also, warum ist LilyPond-- Computergrafik ist hart. Wenn Sie alles, was mit Musik zu tun und Sie zu schreiben, Partituren möchten, Sie wollen nicht zu schreiben alles selbst beginnend mit, wie man zeichnet Mitarbeiter und wie man Notizblöcke ziehen. Es ist sehr schwer. Es ist zuvor getan. Du bist in Ordnung. Wenn Sie Finale oder Sibelius verwenden möchten, die Dateiformate für die Dinge sind sehr kompliziert, und Sie können nicht wirklich nutzen sie programmatisch. Sie können sich mit Finale öffnen Sibelius und gehen Sie auf Datei, Exportieren als PDF Sie sich, aber man kann nicht wirklich rufen, daß aus einem Skript. LillyPond, können Sie anrufen aus diesen Skripten. Man könnte leicht zu iterieren Mit LaTeX LillyPond. Ich werde nicht so viel Zeit zu gehen in gerade dieser Technologien, aber sie existieren. Wenn Sie wollen, um zu suchen in eine LillyPond Buch es ist ein Programm, das mit stammt Ihre LillyPond Verteilung, und es ist für die Iteration LillyPond Fragmente in LaTeX wenn Sie etwas tun wollen wie ein großer Musikwissenschaft Dokument Beispiele, zum Beispiel. Und es ist eine gute Fähigkeit zur Leben, wenn Sie etwas zu tun, mit Musik, nicht nur CS50. Ich habe LillyPond für alle verwendeten meiner Komposition Projekte da ich war im Grunde ein Senior in der High School. Also hier sind einige einfache Beispiele. Dieses ist im Allgemeinen repräsentativ der Schwierigkeitsgrad , dass die meisten Leute würden ehrlich sie versuchten, LilyPond für einfache Projekte zu verwenden. Dieser erste ist der Beginn zu einer Choralvorspiel von Bach. Das untere ist ein Auszug von einem meiner eigenen Werke, und es ist nur da, um zu zeigen, Sie Dinge wie [unverständlich] Putting mehrere Zeilen in der gleichen Personal, wie lyrische undersetting funktioniert. Lyric Unterlagen sind eine Sache, die sehr ist leicht zu LilyPond für Chormusik zu verwenden. Und so dann ist da noch etwas mehr komplizierte Beispiele. Alle diese sind in getan LilyPond und sie sind machbar. Diese erste Auszug stammt aus [Unverständlich] durch [unverständlich]. Und das [unverständlich] aus ein Stück für Solo-Bass Flöte durch [unverständlich], der ein longtime-- ist, die war ein langjähriges Mitglied der Musik-Abteilung hier, denke ich. Ich bin nicht sicher, wo er weg gegangen. Aber er ist der Berater der Harvard war Komponistenverband für eine lange Zeit. Wundervoller Mann. Und er etwas Musik, die sehr hat schreibt komplizierte Notation, LillyPond Trotzdem kann die hand sehr schön. Also, nur um Ihnen ein Gefühl von zu geben, was Funktionen dieses Ding ist so sind-- die Interna von LillyPond sind sehr kompliziert. Und Sie können es verwenden eine lange Zeit, einschließlich für einige ziemlich kompliziert Dinge, ohne wirklich zu mit zu viel über sie wissen. Aber die Grundidee ist, die auf dem untersten Ebene die Atome LillyPonds sind die Noten. Der Anhang enthält eine Kontext aufgerufen Stimmen. Also die Stimme Kontext Grundsätzlich entspricht um eine einzelne Zeile der Polyphonie. Und dann Zusammenhang kann hierarchisch enthalten in höheren Ebene diejenigen, stellen Mitarbeiter an der Partitur oder größere Gruppen, wie Klavierstäbe oder Chor Mitarbeiter, und dann schließlich gesamte Partitur Kontexten. Und Sie umfassen eigentlich kann mehrere Noten in einem Buch. Und jeder hat einen Rahmen Anzahl der angeschlossenen Graveure. Wenn Sie durch das aussehen Inhalte eines Kontext und drucken Sie ein bestimmtes Symbol oder eine bestimmte Klasse von Symbolen als notwendig. Also, um jede Stimme Zusammenhang gibt es [unverständlich] Notizen Kupferstecher, die im Grunde eine Funktion oder ein Objekt, das alle die Notiz schreibt Köpfe auf die richtigen Teile einer Seite. Dann gibt es eine Spalte Kupferstecher, die schreibt Spalten auf das Personal. Dann gibt es ein Metronom Zeichen Graveur, dass schreibt Metronomangaben in einer Partitur. Und all diese passen ziemlich gut in der Hierarchie. Und es ist sehr, sehr, sehr kundengerecht, die Sie brauchen wenn Sie wollen, um Dinge wie das zu bekommen. Also alle Kontexte ein Viele verschiedene Attribute dass Sie für alles ändern kann aus dem Abstand, um verschiedene Schrift Auswahl an Größen der Dinge. Wenn Sie noch tun wollen kompliziertere Dinge, gibt es eine eingebettete Skriptsprache. Sie nutzen Regelung, die ist Lisp-Dialekt. Dies tun, wahrscheinlich nicht bedeutet nichts für Sie. Aber im Grunde eine Regelung andere funktionelle Programmiersprache, mehr oder weniger. STEPHEN Krewson: Die tie-in. CONNOR HARRIS: Ja. Es ist eine gute tie-in, nehme ich an. Und es als Unterrichtssprache verwendet wird, tatsächlich, sich Massen Ave. Am MIT. Und es ist sehr praktisch für LillyPond aus verschiedenen technischen Gründen. Und so, wenn Sie einfach zu machen möchten Tweaks abhängig conditionals, für example-- es gibt bestimmte Bedingung einer Punktzahl, die erfüllt ist, machen Änderungen an der Layout oder whatnot-- dann diese Einrichtungen sind dort. Sie sind kompliziert. Also hier ist ein ziemlich einfaches Codebeispiel. Es ist fünf Zeilen. Grundsätzlich bin ich, die zwei Mitarbeiter. Es ist in 3/4. Der erste Mitarbeiter hat eine befestigt Tempobezeichnung, aber das ist eigentlich los weiter zu gehen, um die ganze Partitur, weil Tempo Marken sind auf den Schuss. Die Metronom-Stecher ist an dem Rahmen punkten. Es gibt verschiedene Schlüssel, weil die [unverständlich] Stecher Ist der Mitarbeiter angebracht. Sie können tatsächlich zu tun ist. Die Probe schrieb ich ist tatsächlich in C-Dur, aber es ist einfach zu zeigen, die Sie haben können verschiedene Schlüssel in verschiedenen Mitarbeiter. Und die grundlegende Syntax ist Ihnen zu schreiben beachten Sie Namen mit E, F, G, was auch immer. Wenn Sie Vorzeichen tun wollen, Sie Suffix oder ES. Dies ist aus dem Niederländischen musikwissenschaftliche Kongresse. Und Oktavsprüngen zu tun, zu benutzen müssen Sie diese Markierungen, Komma oder Apostroph. Die relative bedeutet nur, was auch immer Sie eine Notiz, es wird automatisch in die plaec werden Oktave in der Nähe des vorhergehenden. Und wenn Sie mehr als springen möchten a fifth-- sagen, ein Fünftel oder more-- dann müssen Sie die [unverständlich] zu verwenden. Aber sonst, die Sie nicht haben, um geben Sie die Oktave jeder einzelnen Note. Und relative C, Prime und C, müssen Sie nur angeben, mittlere C und Basis C, insbesondere ersten Noten. Dann können Sie diese Mitarbeiter, die zu organisieren diese beiden Stimmen oder Proben von Musik, und Sie haben eine Punktzahl. Und das sieht so aus. Wenn Sie sich die Zeit nehmen wollen Kopie, die Probe von LillyPond Code auf dem vorherigen schieben Sie hier, und Sie kann es für LillyPond selbst schreiben. Ich weiß, wir haben etwas das sieht aus wie diese. So gibt es eine andere Technologie heißt Music XML gepflegt von ganz anderen Personen. XML ist ein Textdaten structure-- I sollte nicht sagen Daten structure-- sagen Metapher Karte Art. Und es wurde entwickelt, um zu halten hierarchische Daten sehr gut. HTML, zum Beispiel, ist eine Art von XML. Und Sie können XML, weil sie sagen hatte alle Montagewinkel und Winkel Bügel Schrägstriche die zeigen Datenfelder. Ich habe nicht einen Code haben Beispiel aus der Musik-XML. Sie können es sich selbst finden. Grundsätzlich ist der Grund, möchten Sie vielleicht um XML als Zwischenstufe verwenden ist vor allem, es ein Austauschformat für die im Grunde every-- Ich sollte nicht sagen jeder, aber eine Menge verschiedener Punktzahl Schriftsteller. Also, wenn Sie in der Musik zu schreiben XML, nicht nur LillyPond können lesen Sie es mit Hilfe dieses auxilary Programm namens Musik XML zu LY, sondern auch Finale lesen es, Sibelius kann es lesen. Je nachdem, wie Sie Ihre interne Objekt Hierarchie arbeitet für die Darstellung von Musik, könnte es einfacher sein zu schreiben, Musik XML als LillyPond und nur auf Musik XML vertrauen um LY, um die Konvertierung zu tun. Ich glaube nicht, dass [unverständlich] hat Musik XML. STEPHEN Krewson: Es ist nicht. Jemand arbeitet daran, though. CONNOR HARRIS: OK. Euterpea nicht über eine Noch Musik XML-Ausgabefunktion. Wenn Sie möchten, eine endgültige Projektidee, vielleicht haben Sie in Kontakt mit Jungs dass Stephen kennt und sie deine Hilfe gebrauchen könnte. STEPHEN Krewson: Ich würde gerne, dass. CONNOR HARRIS: Auch grundsätzlich alle Programmiersprachen das ist sein Salz wert verfügt bereits über eine XML-Bibliothek, so können Sie intern alle konvertieren Ihrer Musik in eine Objekt , dass die XML-Bibliothek können schreiben darauf hin, dass würde weniger erfordern Änderungen an Ihrem inneren Struktur für was auch immer Sie musik nachrichten schreiben wollen, als es zu schreiben direkt im LillyPond würden. Dann einfach drucken Sie es aus mit XML mit die XML-Bibliotheken in Ihrer Sprache, welcher garantiert, dass es syntaktisch korrekt und alles, und dann wandeln Sie es in LillyPond. So Technologie, um möchten Sie vielleicht Blick in, wenn Sie etwas zu tun, so was. [Unverständlich], ein anderer auxilarry Technologie. Dies ist im Grunde Tech Works oder Tech Studio für LillyPond. So bietet es Hilfe bei Syntax, mit Vorlagen für verschiedene gemeinsame Kombinationen von Instrumenten. Es ermöglicht Split-Screen-Anzeige, so können Sie Ihren Code in einem Fenster haben und PDF in einem anderen Fenster und klicken Sie Orte in der PDF- bei der zuständigen springen Spots in Ihrem Quellcode. Dies ist besonders nützlich, wenn Sie tatsächlich sind Schreiben LillyPond Dateien selbst als wenn Sie erzeugen sind sie programmatisch. Aber noch einmal, es ist etwas Nützliches zu müssen. Groß. Ein weiterer resources-- Ich werde einfach sehr schnell gehen durch diese. LillyPond manuals-- LillyPond hat ausgezeichnete Dokumentation auf ihrer Website. Sie haben ein Tutorial. Sie haben eine Syntaxreferenz. Sie haben Hunderte von Snippets für verschiedene Kleinigkeiten yo Möglicherweise müssen tun, um zu zeigen, verschiedene Fähigkeiten. Wenn Sie verwenden möchten, Die Skriptsprache oder kreiere umfassen Anpassungen, dann gibt es Interna Referenz zu dieser URL. Wenn Sie Musik XML verwenden möchten, gibt es dass URL, musicxml.com/tutorial. Und dann, wenn Sie brauchen, um zu lernen Schema weil Sie tatsächlich verwenden möchten die Skriptmöglichkeiten in LillyPond, dann gibt es eine [unverständlich] genannt Strukturierte Interpretation von Computerprogrammen, Das ist nicht nur das zweite größten CS Lehrbuch je written-- finden Sie mich danach, wenn Sie wissen wollen, was ich denke, der Größte ist-- aber es ist auch eine sehr gute Einführung in die Sprache richtig. Sie werden nicht mehr als brauchen die ersten paar Abschnitte. Das ist schon alles. Irgendwelche Fragen? STUDENT: Wo kann ich Ihre generierten Frere Jacques so kann ich es auf meinem iPod zu setzen? STEPHEN Krewson: Nun, können Sie schreiben bis zu einem gewissen wav-Datei in Euterpea. Und Sie haben den Code. Es ist auf GitHub. Machen Sie Ihre eigenen Variationen Frere Jacques von CS50 hive mind. Es wäre toll. CONNOR HARRIS: Wer sonst? STEPHEN Krewson: Wir brauchen eine bessere Bass-Drum, auch. Es ist wirklich schlecht. STUDENT: Euterpea hat nicht nur die Masseseite, aber signal-- STEPHEN Krewson: Ja. In der Tat, das Werk I in Euterpea tat, als ich nahm this-- es gibt eine Aufbaustudium an der Yale, dass verwendet es-- war auf Klangsynthese. Es gibt also eine wirklich nette Art mit Pfeilen und einige der Notation wir sahen Komponieren zusammen Signalfunktionen. Insbesondere Bass für die meisten von ihnen ist nur eine einfache Sinuswelle. Aber wenn Sie komponieren diejenigen starten in seltsamen programmatische Möglichkeiten, Sie verrückte Sound zu bekommen Effekte, wie seltsam Kaskaden. Sie können sehr kiesig erstellen Töne mit einer Menge von Modulation. Ich habe ein Projekt auf körnigen Synthese, die ist irgendwo zwischen FM und Probenahme. Sie nehmen sehr klein, kleine Proben, und dann kombinieren sie mit irgendeiner Art von Modulator und den Aufbau einer volleren Klang. Wir haben auch physikalische Modellierung, so versuchen, über die Physik zu denken und Psychoakustik von so etwas wie eine Trompete, und zum Nachdenken über die Art und Weise der Ton wird abprallen die Glocke der Trompete und die Akustik das Zimmer und Modellierung daß die Grund Oszillatoren. CONNOR HARRIS: Vielen Dank. Danke fürs Kommen. Und ich bin immer bereit, nehmen Fragen email-- connorharris@college.harvard.edu. STEPHEN Krewson: Ja. stephen.krewson@yale.edu. Cool.