CONNOR HARRIS: Ciao. Sono Connor Harris. Sono una CA CS50 ad Harvard. STEPHEN Krewson: io sono Stephen Krewson. Sono un TF per CS50 a Yale. CONNOR HARRIS: E stiamo andando a parlare su alcune tecnologie che si potrebbe desidera utilizzare se siete interessati nel fare un progetto finale o realmente qualsiasi cosa con la musica. Stiamo per essere concentrandosi su una prima linguaggio di programmazione chiamato Haskell. Si tratta di un funzionale lingua, così il paradigma è molto diverso da C o PHP o altri linguaggi imperativi che hai utilizzato già, e in particolare su una libreria scritta in Haskell chiamato Euterpea, che può aiutare le persone con scrivere musica funzionale, fondamentalmente. E Stephen vi guiderà attraverso un grande esempio di questo. Dopo questo, io ti presento qualcosa chiamato LillyPond, che è una tecnologia per la musica composizione. E 'un po' come LaTeX per la musica, se qualcuno di voi hanno usato LaTeX per lezioni di matematica o altre classi P set o quello che hai. E così io ti darò, ancora una volta, alcuni semplici esempi di quello e il punto è nella generale direzione di alcune risorse migliori. STEPHEN Krewson: In Inoltre, abbiamo pensato che sarebbe bello per impostare un po 'di suggerimenti verso un gasdotto tra I file MIDI Euterpea generati in LillyPond, in modo da fornire qualche istruzione su script per fare questo che sono dotato di LillyPond solo per tenerlo open source e ottenere una pipeline in corso. CONNOR HARRIS: Anche in questo caso, dobbiamo sottolineare, queste due tecnologie, è non è necessario usarli insieme. Non sono progettati per lavorare insieme, anche se lo fanno molto bene. STEPHEN Krewson: Giusto. E totalmente gratuito. CONNOR HARRIS: So riconoscimenti, basta leggere questo. STEPHEN Krewson: Debitamente osservato. Grazie a queste persone. Questo io indugiare su solo per un momento. Il processo di installazione è un po 'difficile. Abbiamo un leggimi sul GitHub che si può dare un'occhiata a. Basta email me se avete domande. Ma noi corriamo questo sotto l'ipotesi che funziona per tutti. CONNOR HARRIS: E se non è possibile arrivare LillyPond al lavoro, non un grosso problema. Non c'è compilation live che saranno coinvolti, almeno da parte mia. STEPHEN Krewson: Haskell e LillyPond dovrebbe entrambi hanno installatori. Euterpea viene scaricato come un pacchetto, così via e così via. Quindi stiamo parlando di computer music. E questo è solo un molto vista di 50.000 piedi. Ci sono alcuni aspetti diversi di essa. E questo è agitato ed è andando a oscurare alcuni dettagli. Ma si potrebbe pensare a qualcosa come la composizione algoritmica, utilizzando algoritmi, utilizzando il codice, per generare qualche tipo di-- forse un auto-simile sequenza di note, o forse le note sotto qualche vincolo. E poi quelli potrebbero essere eseguiti o interpretate con strumenti analogici o qualcosa di simile. Ma la composizione era fatto algoritmicamente. Ma naturalmente, forse l'area computer music o musica digitale siamo più familiarità con è digitale la sintesi del suono o di campionamento digitale e registrazione digitale. Un sacco di strumenti digitali sono fatto attraverso campionamento digitale. In realtà, saremo utilizzando uno di quelli in la forma di una libreria di font audio successivamente. Ma c'è anche qualcosa chiamato sintesi digitale che è venuto fuori degli anni '70 e negli anni '80 con ' Yamaha e John Chowning a Stanford facendo sintesi FM o Frequenza sintesi di modulazione, dove si aveva un vettore segnale ed un segnale modulante sia nello spettro audio. Ma quello che ci siamo concentrati su oggi è una cosa chiamata MIDI, e, naturalmente, composizione algoritmica. Non stiamo andando a fare strumenti, ma stiamo invece andando a fare un po 'di musica, e poi che otterrà interpretato da alcuni strumenti sono conforme alla standard General MIDI. Allora, qual è il MIDI? Io non ho intenzione di entrare troppo in profondità in esso, ma MIDI è il protocollo di trasferimento dei dati. E 'una sorta di guida attraverso diverse aziende e industrie per l'organizzazione di suoni o patch. Così vedremo che c'è uno standard MIDI per tutti i vari strumenti a percussione suoni e le raccomandazioni MIDI per tutti i diversi tipi di synth o diversi tipi di tutti gli strumenti gruppi in un'orchestra, dicono. Probabilmente siete a conoscenza con Da 0 a 127 messaggi MIDI. Un segnale MIDI è tipicamente un bit che indica che si tratti di un dato o un lo stato dei pacchetti, e poi c'è sette bit di un segnale. E questi possono controllare tutto da volume all'azione o pressione su un determinato tasto se si sta eseguendo con un MIDI regolatore nonché, naturalmente, gli appunti. E, naturalmente, il MIDI ha stato estremamente utile, perché è un modo per legare insieme o daisy chain un gruppo di dispositivi hardware MIDI. Ho sette o otto di nuovo a casa mia. Si diventa veramente complicato, ma è davvero potente. Ed è davvero vecchio. E 'dai primi anni '80, e è veramente bello e piccole. CONNOR HARRIS: Sì. Tutto il classico di Nintendo videogiochi sarebbe probabilmente avere i file MIDI per la musica, per esempio. STEPHEN Krewson: Ecco un esempio di MIDI generale, mostrando MIDI come una sorta di protocollo generale. E penso che possiamo pensare al differenza tra la specificazione che ci dovrebbe essere qualcosa di simile questi suoni strumentali e l'attuale realizzazione di tali strumenti suoni in un tipo di carattere del suono o di una particolare MIDI sintetizzatore come la differenza tra forse un typeface-- che dice, in generale, questo è il disegno di in questo modo particolare di rappresentare characters-- e un carattere particolare che ha una dimensione e specifico timbro, e c'è la realizzazione di the-- CONNOR HARRIS: Forse un meglio sarebbe confronto essere lo standard Unicode says-- dà un numero a ogni personaggio, e davvero tutte le lingue del mondo, o un vasto insieme di script di lingua nel mondo, e quindi quelli sono resi in qualcosa di grafica da diversi pacchetti di font. E ovviamente, si può pensare di MIDI come Unicode del suono. Ed è solo un elenco di-- un grande flusso di eventi e strumenti e quant'altro, e devi avere un separato programma, come un carattere tipografico, a rendere che in qualcosa che è udibile. STEPHEN Krewson: Allora perché Haskell? Haskell è una programmazione funzionale lingua, molto avanzata, molto diverso da C, molto diversa da PHP. E stiamo andando a vedere che c'è una facilità di composizione di funzioni in Haskell che ci permetterà di brezza attraverso comporre o digitando su, trascrivere, qualcosa di simile a Frere Jacques, questa semplice canzone che ha un sacco di parti in modo che sono auto-simile o ripetere. Quindi questo sarà un po 'di la motivazione per cui stiamo usando Haskell, in cui le funzioni sono cittadini di prima classe. E volevo prolungare questo un po '. E 'un po' facile annotare Frere Jacques a Haskell. Ma cosa succede se volessimo aggiungere una parte di batteria ad esso? E se abbiamo voluto provare a fare qualcosa di simile a un tamburo Roland 808 o 909 macchina in cui si dispone circa 16 diverse fasi? Di solito questi sono pensato note come 16 °. Ed è possibile controllare il globale tempo, e si può scegliere un gruppo di diverse parti di percussioni di grancassa, un applauso, diverse insidie, aperti e chiusi cappelli alti su questo genere di canali, e poi si può EQ o regolare il loro volume. E vedremo un bel modo di Haskell di rappresentare questo passaggio sequencer con tutte le varie cose interessanti a Haskell si può fare con la generazione di liste e filtraggio più liste, mappatura su liste, mappatura funzioni oltre elenchi. E un rapido scuse. Questo è un molto superficiale e abbozzo eccessivamente rapido di alcuni aspetti di Haskell e Euterpea, che è un dominio specifico linguaggio incorporato scritto in Haskell per generi musicali. Quindi, per favore controlli anche il codice in linea. Accendi GHCI, che è il Glasgow Haskell Compiler Interpreter. E farò un po ' di questo in un po ' così si può vedere come è fatto. E questo consente di caricare con the-- la sintassi è colon e poi il comando. È possibile caricare in file. È possibile utilizzare Sfoglia su quei file per visualizzare tutte le funzioni che esistere in un particolare modulo. E poi come vedremo, tipi e tipo le classi sono così importanti in Haskell, in modo da poter sempre check-- soprattutto se si sta lavorando in una nuova DSCL in questo modo, quello che è un tipo di musica? Conosco il modo numerico tipi lavorano in Haskell, ma io non ne so molto di musica. Ma è possibile esplorare il modo in cui sono definita utilizzando questo comando t o tipo e quindi chiamando in un particolare funzione o un oggetto dati. CONNOR HARRIS: Sì. Se pensavate C e Clang era hardass sui tipi, non avete idea su Haskell. La cosa buona di Haskell è che se è possibile ottenere il codice per la compilazione e se di tipo Haskell controlli, è probabilmente giusto, perché il sistema tipo è così rigoroso. STEPHEN Krewson: Sì. Quindi voglio solo andare through-- e ancora, questo non sta facendo justice-- alcuni dei le caratteristiche di Haskell che, almeno alla sua creators-- ed è stato creato alla fine del 1980 da un gruppo di persone, un comitato di circa 20 people-- pensato erano importanti. E la prima cosa che elencati in un documento che descritto la genesi di Haskell nei primi 20 anni o giù di lì era che era pigro. Che cosa significa questo? Beh, vuol dire quando abbiamo qualche tipo di espressione, dobbiamo valutarlo. E Haskell fa in una chiamata mediante necessità o un modo non rigoroso. Cioè, se abbiamo un po 'di componenti della nostra espressione, proviamo a ritardare la valutazione di tali sottocomponenti fino a quando l'ultimo minute-- assoluto cioè fino a quando abbiamo effettivamente bisogno di loro. Quindi questo means-- che è davvero cool, soprattutto se stiamo pensando l'astrazione di un step sequencer musicale. Si accende e si avvia l'esecuzione di un passo sequence-- se mai lavorato con un tamburo machine-- e si va solo per sempre. Quindi sarebbe davvero bello se potrebbe emulare quel in Haskell. E possiamo farlo con infinita valori, in particolare liste infinite. E 'molto facile da digitare un lista infinita di Haskell. Si potrebbe utilizzare la sintassi giù qui, dove si vede da 1 a 3, rimuovere il 3 1 dot dot, e che è una lista infinita di tutti i numeri naturali estendentesi su quanto si possa immaginare. Voglio introdurre un concetto di pieghe subito. E ancora, lo scopo di questo seminario non è per conoscere le pieghe in Haskell o funzioni di ordine superiore. Ma voglio solo introdurlo a dare un senso preciso di come strano Haskell è e quanto sia potente. E in particolare, stiamo andando a essere-- quando facciamo le nostre diverse parti di batteria, stiamo andando a manipolare liste di numeri, piegarli uno sull'altro. E per farlo, faremo prevede di utilizzare mappe e pieghe. C'è un diritto associativo piega, che è questo quello giusto qui-- 1 meno la quantità, 2 meno la quantità, 3 meno 0. E la sintassi per un piega, si dà una piega un valore di base e poi un operation-- in questo caso, addizione o sottrazione. Ho mostrato entrambi i casi. E poi c'è un accumulatore che accumula su tutta la lista, applicazione di tale operatore più o minus, e quindi accumularla. Quindi questo sarà the-- se fosse chiamato con piega r più di 0, a partire da 0, saremmo poi sommare tutti i numeri in tale elenco. E questo è un elenco di 1-3. CONNOR HARRIS: Quindi, per dirla in altro modo, piega r prende tre argomenti. C'è una funzione che si prende due argomenti, poi c'è un valore di avviamento, e c'è un elenco di valori. E quello che fai è prendere valore antipasto, primo valore, metterli in funzione. Che cosa si ottiene fuori, prendere quella, mangimi che in funzione del secondo valore, ciò che si ottiene fuori, prendere quella, mangimi che nella funzione del terzo valore. E poi se si va giù tutta questa lista in questo modo, si sta andando ad ottenere alla fine un valore singolare che è dello stesso tipo di quello che hai iniziato con e dello stesso tipo come le cose nella lista, e poi questo è il risultato di ritorno di fold R. STEPHEN Krewson: Quindi, in particolare, queste sono funzioni di ordine superiore, perché stanno prendendo un altro funzione come uno degli argomenti. CONNOR HARRIS: Sì. Se hai utilizzato alcuni altri languages-- So R, [incomprensibile] lingua ha questa, chiamata Ridurre. Si potrebbe avere funzioni simili in altre lingue, appena chiamato cose differenti. STEPHEN Krewson: E Il bello di piega R in questo caso è che piega R può lavorare con liste infinite. Quindi, in questo fondo, questo P5 sta generando le note che sono accesi nella step sequencer per qualche parte di batteria, la quinta parte di batteria, e forse è una conga drum o qualcosa del genere. E questo è volutamente modo ottusa della stesura di questo, ma è divertente, perché dimostra molto di cose su Haskell e Euterpea. Così piega R di questo colon colon-- è solo un operatore che spinge cose insieme su un list-- chiamato su un vuoto lista, che è solo le staffe vuote. E sto chiedendo che in questa lista infinita. Questo è in realtà due liste sommati qui. La lista 1 comma 6 punti dot è 1, 6, 11, 16. Quindi Haskell-- in proprio alcuni caratteri, è può generare l'intero sequenza di numeri che sono cinque numeri a parte si estende su all'infinito. E io anteporre a che questo piccolo list-- più corto 3, 8, 21-- solo per mostrarvi come è possibile concatenare liste. E poi ho ripiegato su se stesso. E questo finisce per essere solo una sorta di Funzionamento identità, ma è infinita. E piega R può farlo, perché pigramente valuta, come in precedenza. Se abbiamo un 1 e 2 e 3, possiamo appena fuori l'intera staffa resto. Che non funziona per meno o più, ma lavorerà per questo colon operazione identità sulla lista. Quindi, come possiamo praticamente usiamo che se noi avere un infinitamente lungo elenco di cose? Beh, Haskell fornisce un sacco di functions-- e guardare più in questi in il proprio tempo-- come prendere che dice, OK, siamo generando questa lista infinita, ma stiamo solo andando a prendere un po ' numero di esso E in questo case-- vedremo in seguito a il nostro code-- drum machine GM è solo una sorta di globale variabile per il numero di passi nel sequencer. Sulle macchine roll-in I si mostrò, che è tipicamente 16, ma ho implementato con 32. Non ha molta importanza. Haskell è anche puro, quindi ha una forte tipizzazione statica che Connor alludeva. Così funzioni sono matematica nel sense-- sono più matematica che sono garantiti di non accedere o modificare qualsiasi tipo di variabile o ingresso o di uscita eseguire. Quindi, se avete una funzione, è deterministico. Sarà sempre tornare lo stesso valore nello stato del programma o rimanere lo stesso. Ci sono, naturalmente, eccezioni monadiche per questo, ma questo è di là della nostra portata. CONNOR HARRIS: Sì. Ciò significa, però, è lì sono alcuni importanti [incomprensibile] conseguenze di questo. Uno è che è molto facile parallelizzare programmi Haskell. Perché se si dispone, dire, una funzione di tale deve operare su un milione di valori, se si sa che la funzione sarà sempre dare lo stesso valore se si alimenta a un certo value-- se siete [incomprensibile] f 1, f 2, allora f di 3 o whatnot-- f 1 non sta per scrivere in un file o fare qualcosa che alterano il valore di f2. Si può solo dividere questa funzione per un milioni di macchine diverse o un milione diversi fili o qualsiasi altra cosa, ottenere tutte le risposte indietro, ottenere tutti i valori di ritorno indietro, e allora il gioco è fatto. Quindi è molto facile per parallelizzare le cose. Il rovescio della medaglia è che l'ingresso e soprattutto in uscita inserirsi nel sistema di tipo in modi molto complicati. Non entreremo in che in questo momento, ma io vi incoraggio a guardare alcune risorse online, se si vuole imparare a tale proposito. STEPHEN Krewson: So digitare classes-- e questo classi era-- di tipi sono stati inventati per risolvere un problema di overloading degli operatori. Così abbiamo voluto avere uguaglianza tra i diversi tipi di cose. Naturalmente, potremmo pensare di-- uguaglianza tra tipi numerici è molto facile pensare, ma per quanto riguarda la parità tra le liste? Che dire di parità tra strutture di dati gamba albero? E questo è possibile in Haskell a causa di classi tipo. Quindi, se si definisce una certa type-- dati e qui, questi sono passi musicali. Stiamo arrivare finalmente ad alcuni computer music. Così abbiamo C, C sharp, e così via. Essi appartengono a un gruppo di diverse classi di tipo. EQ-- appartengono alla classe tipo di EQ. Ciò significa che sostengono operazioni di uguaglianza. Così si può valutare se un Sequenza di primitive musicali è la stessa come una diversa. Essi appartengono alla classe ordinale. Questo significa che c'è un ordine a questi. D viene dopo C. C sharp viene dopo C pure. Appartengono alla classe dimostrare, il che significa che possono essere stampato a una console o un terminale. Appartengono alla classe elencate, che significa che anche se questi sono i personaggi, hanno un numerico sottostante rappresentazione a partire da 0 e andando fuori attraverso però molte cose sono qui, il 20 o giù di lì, o 30 o 40, forse. CONNOR HARRIS: E quando abbiamo un tipo di dati che derives-- con quella parola chiave "deriving--" una certa classe di tipo, ciò significa che il compilatore tenterà per costruire automaticamente qualcosa. Così forse si vorrà definire una qualità differente. Avrai voglia definire Do diesis uguale a D piatta, per esempio. Con questa costruzione qui, non credo che Do diesis e Re bemolle sarà uguale, perché il compilatore verrà automaticamente dire ogni diverso valore possibile è distinto da ogni altro. Così è possibile sovrascrivere le implementazioni predefinite di questi tipi di classi. Ancora una volta, guardare il riferimento, se Vuoi imparare a tale proposito. STEPHEN Krewson: E qui, in realtà, questo sarà essere utile per quando codice in seguito. Vediamo alcuni degli operatori infissi per la composizione sequenziale, composizione parallela, e così avanti, questi vantaggi e segni di uguale circondato da due punti. Ciò significa che possiamo giocare a questi diversi primitive musicali uno dopo l'altro. Ecco la composizione sequenziale. Oppure possiamo giocare a parallelo allo stesso tempo. Così posso avere un valore musicale, e poi questo è uguale e due punti, infisso operatore di composizione parallela, e li gioca come una sorta di accordo. E stiamo andando a utilizzare questo quando si combinano la nostra parte di batteria con il nostro canzoncina Frere Jacques a giocare a questi due sequenze di valori musicali allo stesso tempo. Currying Curry è-- ultimo nome di Haskell Curry, che l'immagine Haskell prende il nome. E questo ci permette un bello eleganza quando siamo scrivere tutte queste diverse funzioni o dei filtri che siamo sta per essere mappatura sulle nostre liste. Una funzione di due arguments-- f di x e y-- può essere rappresentato come f di x applicato a y. Quindi è una funzione di un argomento che ritorna un'altra funzione di un argomento. Quindi questo significa che possiamo mappare funzione f di x sopra l'elenco di y di. CONNOR HARRIS: Vuoi dare un esempio di questo? STEPHEN Krewson: Sì. Ho un esempio proprio qui da alcune delle cose che faremo scrivere. Così replicare 2-- bene, replicare avrà un valore, che è il numero di volte per replicare qualcosa, e poi ci vorrà un value-- solitamente una lista o qualcosa. Ecco, noi siamo la mappatura 2 replicare su un altro elenco. Quindi, se mappiamo replicare 2, se noi replichiamo 2 si applicano al primo elemento di questo list-- e questi sono liste di phrases-- musicale produrrà due di "tu sleeping--" così dormi, dormi. Così ora abbiamo due. Ma la replica prende due argomenti, ma perché siamo currying e poi la mappatura, possiamo rappresentare replicato 2 come abbiano fatto ritorno in funzione uno argument-- appena replica due volte. E poi stiamo applicando tale ad ogni elemento di questo elenco di frasi. E concat è un Haskell operazione per appiattire una lista. Perché replicato 2 volontà produrre una lista di liste. E questa è la forma intermedia qui. E così poi possiamo concat o appiattire che due volte. CONNOR HARRIS: Un semplice esempio di currying, se vuoi like-- immaginare f è solo un funzione di moltiplicazione che prende due argomenti e restituisce il loro prodotto. Quindi, se avete un f 4 5, è 20. Ma si può pensare a questo come also-- si dispone di una funzione f 4 che prende un argomento e ritorna quattro volte questo argument-- solo applicazione parziale che solo un argomento 4. E se si mangimi f di 4 5, che vi darà 20. E questo è un semplice esempio di accattivarsi. Di solito uno di quelli dei libri di testo. STEPHEN Krewson: Lambda espressioni o funzioni anonime sono un altro segno distintivo Haskell. Quindi, se abbiamo bisogno di improvvisare una piccola funzione replicare la vita, ma dire che non è in la libreria standard, possiamo usare una sintassi simile al seguente. E faremo brezza su questo. Una cosa che vedrete un sacco di in drum machine sta stiamo facendo le chiamate a qualcosa chiamato filtrare, che come prima, è una mappatura di una funzione su una lista, ma è una mappatura di una funzione booleana. Così abbiamo qui un esempio di un anonimo Funzione booleana definita che richiede solo un paio di valori. Questo non è strettamente parlando una funzione anonima. Ma è definire con che la sintassi per brevità, e questo richiede solo x modulo n-- CONNOR HARRIS: Sì. Quindi f è una funzione di due argomenti n e p che restituisce una funzione che è esso stesso una funzione di un argomento, cioè x. STEPHEN Krewson: I operatori infissi menzionati. Quali sono operatori infissi? Beh, operatori infissi sono la come di consueto noi rappresentiamo le operazioni, dire, in mathematics-- 2 plus 2 anziché l'operatore più e poi due argomenti 2 e 2. CONNOR HARRIS: Si chiama notazione polacca inversa, che è un termine dubito qualcuno di voi volesse sapere. STEPHEN Krewson: Giusto. Reverse Polish Notation o il prefisso. Ma Haskell ha deciso di utilizzare operatori infissi. Quindi questi sono alcuni dei quelli personalizzati che sono definiti per il Euterpea DSCL in Haskell. Quindi questa è stata la composizione sequenziale. Questo era composizione parallela, e questo è stato troncando composizione parallela. E abbiamo bisogno che con la nostra drum machine, perché useremo l'ultimo operatore in quel piccolo tuple ci a suonare la drum machine lungo con la nostra canzone Frere Jacques. E la nostra drum machine è sta per essere infinito. Si gioca solo per sempre. Ma la canzone Frere Jacques non è. Non è così a lungo. E 'solo un paio di bar. Quindi abbiamo bisogno di fermare la drum machine come Non appena il valore musicale più breve arriva al termine. E che l'operatore infissa è super disponibile con quello. E notazione infissa come questo è una specie di piacevole, perché dire che hai una funzione come citazione, che dà la divisione intera di x da qualcosa else-- mi dispiace, che dovrebbe essere a e b. Si potrebbe scrivere come un preventivo di b. Quindi, se si è elemento put-- un altro esempio di questo. x elemento in qualche lista, se si mette in backtick, è possibile utilizzarlo. Anche se non è un simbolo come più o meno o tempi, è possibile utilizzare il nome di una funzione come quella in backticks come operatore infisso, che è piuttosto fresco. CONNOR HARRIS: Ancora una volta, questo è tutto lo zucchero sintattico, davvero. Non influenza il nucleo del linguaggio. STEPHEN Krewson: Così vediamo qui per la ultima frase della nostra canzone Frere Jacques, Ho giocato alcuni piccoli accordi o terzi utilizzando la composizione parallela operatore. Questo è un altro modo di dire qualche di quello che abbiamo appena detto. Così è possibile mappare le funzioni di un argomento su liste. CONNOR HARRIS: Anche in questo caso, i riferimenti per i libri di testo introduttivi Haskell-- avrà tutto questo in esso. STEPHEN Krewson: Quindi, ecco una bella la linea fondamentale del step sequencer daremo un'occhiata a utilizzare la comprensione lista. E vediamo qui è quell'elemento operatore in fissa tra virgolette schiena. Quindi, se x è un elemento della lista di x di, allora chiameremo le funzioni perc. Quindi perc è solo una funzione di percussione. Ci vuole un po valore di p che è parte della insieme limitato di tutti i diversi suoni di percussioni che abbiamo visto in una diapositiva precedente, e allora si dà che durata di un quarto di nota. Altrimenti dà un QNR, e QNR è solo un quarto di riposo nota. Quindi questo è costruire qualcosa di bello. Abbiamo una lista di elementi, e faremo un ciclo su qualche lista da uno al valore massimo della nostra step sequencer. E quando siamo in un particolare i in tale elenco di uno al valore massimo, se che i è un membro di questo set creato in questa funzione, bene, allora ci rivolgiamo lo in una nota percussioni. In caso contrario, dobbiamo solo giocare un periodo di riposo, che Vale a dire, dobbiamo solo rimanere in silenzio. E possiamo vedere qui che in questa lista di comprensione della sintassi, x è popolata da questo Lista costruito uno la dimensione globale del sequencer. CONNOR HARRIS: Sì. La sintassi di base per list comprehension è Staffa, valore che coinvolge Alcune variabili, bar, possibili valori delle variabili stessi, chiuso staffa. E se avete fatto la notazione costruttore set in qualsiasi tipo di classe di matematica, si potrebbe avere impostato 2n tale che n sia o n è in z. Simile cosa-- questa notazione è destinato a essere suggestiva di tale notazione matematica. STEPHEN Krewson: E si può applicare più predicati e più filtri in un elenco comprensione, che è molto bella. Algebrica abbiamo types-- Non si soffermerà a lungo qui. Non c'è una buona idea in Haskell o un buon, concetto ovvio di come prendere, per esempio, un default parametro di una funzione o di qualcosa. In Python, questo è abbastanza facile. Si può solo dire con uguale su la dichiarazione della funzione, un valore predefinito in caso nessuno è in dotazione. In Haskell, si potrebbe forse utilizzare forse il tipo forse, che prende o niente o un valore di tipo solo. Quindi sfruttiamo questo la drum machine per permetterci di dare volume opzionale parametri a ciascuna delle parti di batteria. In modo che ci dà un modo di avere EQ o un volume su un determinato canale. CONNOR HARRIS: In altri esempi Haskell, potresti trovarlo forse utilizzato per funzioni che potrebbe non riuscire. Questo è comune. STEPHEN Krewson: E puoi fornire una sorta di messaggio di errore come predefinito. E questo è particolarmente utile quando si sta facendo l'I / O in Haskell. Che può essere trucchi. CONNOR HARRIS: O per una esempio simile, pensare di una funzione che coinvolge divisione di un parametro che può essere 0. E tale funzione potrebbe tornare forse qualunque. Quindi, se non c'è divisione per 0, tornerà solo quello. E se c'è divisione per 0, verrà restituito nulla come un modo di segnalazione dell'errore. Perché uno conseguenza di Molto tipizzazione di Haskell è che non c'è real-- eccezioni sono scomodi, in fondo, la gestione degli errori è imbarazzante. E questo è uno molto comune modo di farlo. STEPHEN Krewson: Così ora otteniamo a un'altra cosa mind-bending su Haskell, che è modello definizioni di corrispondenza e funzione. Vi ho mostrato in l'ultima diapositiva del Dichiarazione della sequenza di fase funzione, che ha avuto un valore forse, poi un int, quindi una lista di int, quindi restituisce una sequenza di I valori di musica ci annotati sia con tono e il volume. Quindi questi tre argomenti possono essere modello corrispondente nel modo seguente. E vogliamo sempre essere sicuri di fare un caso base o il caso di uscita prima. E queste sottolineature può solo essere interpretato a qualsiasi valore che c'è. Quindi, se vogliamo ottenere una chiamata al passaggio sequenza con un certo valore, qualche altro valore, e poi l'elenco vuoto, quello che vogliamo per tornare è solo il silenzio, un periodo di riposo 0. E invece di quella essendo una lista vuota o 0, si tratta di un periodo di riposo 0, perché siamo trattare con il tipo di musica, e la lista vuota della musica tipo è solo un resto di nessuna durata. Non è la musica. E poi vediamo se otteniamo un passo sequenza con una v per la discussione del volume, p per strumento di precauzione argomento, e poi una lista di x. Poi facciamo un po 'di roba. In particolare, si applica questa lista di comprensione, e noi eseguiamo alcuni operazioni sul valore forse per trasformarlo in un valore numerico in modo che si potrebbe poi enumerato e usate per selezionare lo strumento. Di nuovo, questo è un po ' bit deliberatamente inconcise solo per mostrare tutte le cose strane si può fare in Haskell, come si dare un'occhiata sul proprio tempo. Tutto ok. Quindi noi stiamo finalmente arrivare a facciamo quello che abbiamo deciso di fare, che è fare un po 'computer music. Quindi stiamo andando a cercare di rendere la canzone Frere Jacques. Quindi ci sono quanti frasi in Frere Jacques? Quattro. Grande. E ciò che è bello è che sono tutti ripetevano la stessa quantità di tempo, che è due. Così abbiamo quattro frasi ogni Ripetere due volte. E in particolare, sono in un giro. E ci sono molti, molti modi per implementare una partita che potrebbe essere divertente da fare. L'ho fatto in un piuttosto modo semplice qui, che è solo per construct-- linea funzione accetta un elenco di valori di musica e lo trasforma in composizione sequenziale applicando tale composizione sequenziale operatore. E poi ho ritardare le diverse parti facendoli iniziano con un periodo di riposo. Così comincio con una pausa di due misure, e quindi un riposo di quattro misure, e quindi un riposo di sei misure, e poi il turno opere, come tutti sappiamo questa canzone. Vediamo due annotazioni o modifiche dei valori musicali che sono contenuti in questo sequenziale disposizione di elementi musicali. Abbiamo un volume aggiuntivo. Questa è una funzione di annotare musica con un particolare volume. Questo è un buon esempio di un segnale in esecuzione MIDI da 0 a 127, i sette bit di informazioni che possono essere trasportato. E then-- abbiamo visto molto brevemente, ma il MIDI generale elenco di tutti i vari strumenti. E non c'è un sacco di loro. Se si utilizza una workstation audio digitale, come Ableton Live o Pro Tools, c'è una gamma incredibilmente ampia di sintetizzatori e strumenti VST. Ma solo lo standard MIDI ha pochi, o di alcune decine. E alcuni di loro sono divertenti. Ho pensato che sarebbe stato divertente se abbiamo giocato lo strumento lo strumento MIDI elicottero, e quindi la prossimo strada tra la rotonda, abbiamo fatto un synth pad, e quindi di questo cavo banale onda quadra synth, e poi voce melma, che sono un po 'indistinto sul mio male MIDI sintetizzatore, ma OK. E allora vediamo questo let e nella sintassi da Haskell, e poi stiamo giocando tutte queste parti insieme con l'operatore di composizione parallela. E potremmo probabilmente mostrare una parte di questo. Ecco il codice. E si può vedere in C, ci sarebbe un sacco di compensazione gola e l'impostazione il codice della tabella prima di potrebbe fare musica come questo. O qualsiasi altra programmazione lingua, si sarebbe probabilmente devono interagire con una sorta di biblioteca o API e impostato tutto, e allora dovresti pulire. Ma qui a Haskell è, credo, una volta si ottiene il blocco di esso, incredibilmente leggibile e molto espressivo. Quindi non vi è l'implementazione di Frere Jacques. Tutto ok. Ora vogliamo aggiungere percussioni, e questo è un po 'Messier. Quindi, diamo uno sguardo alle diapositive. Così la grande idea è di fare un gruppo di liste o di parti. Su quelle macchine roll-in, ci erano tipicamente circa otto forse a 10 rhythm o percussioni parti. E quindi utilizzare un mucchio di tecniche. E abbiamo parlato con these-- pieghe, filtri, funzioni lambda, mappato sulle liste per generare i valori in qualche campo da 1 a r, r è 16, o 32 passi nel sequencer. E poi se c'è un valore in quella lista come stiamo correndo attraverso il sequencer, che l'attraversa più e sopra, si accende quella nota, e quel campione viene attivato. Qui ci sono tutti i diversi modi strani Mi si avvicinò con per generare note. Prova sul proprio somma semi. Sarà il suono fresco. Tempo permettendo, andremo attraverso questo. Ma per ora, credo dovremmo demo quello che abbiamo. Speriamo questo va OK. Quindi questo è GHCI. E noi carichiamo un file Ho chiamato song.lhs, che è il file che ho appena mostrato. Ok fantastico. Come ha detto Connor prima, compilato, Tipo E, così posso respirare molto più facile. Non sta andando a soffiare su di me. Volevo mostrarvi qualcosa di utile. Si può vedere che una modulo caricato chiamato 50. È possibile sfogliare quel modulo. E questo è così bello su doing-- forse quello che si sta facendo in Haskell non è chiamato lo sviluppo del software, ma si può fare un sacco di cose divertenti da soli. E il flusso di lavoro è davvero bello come rispetto a un sacco di altre lingue, perché si può vedere in una davvero modo leggibile quello che sta succedendo. Così vediamo che abbiamo tutte queste frasi, che sono liste di piazzole di musica, e poi noi costruire questi in qualcosa di più grande, che è un brano musicale. Si tratta di una unità musicale. E allora possiamo giocare questo tutto con una funzione chiamata musica del gioco. Si può vedere che qui. Che è solo giocare. Dovrei say-- Non ho parlato questo segno del dollaro che è ovunque. Segno del dollaro è un altro operatore infisso. Ma ha la precedenza più bassa di qualsiasi operatore, che di fatto significa che tutto su alla sinistra del simbolo del dollaro e alla destra del simbolo del dollaro, stiamo andando a ottenere valutata prima di esso. Quindi è un po 'come un altro modo di aggiungere parentesi. CONNOR HARRIS: E 'fondamentalmente composizione di funzioni. E assicura che non se have-- avete funzioni di entrambi i lati o infisso operatori su entrambi i lati, non lo faranno associarlo attraverso di esso e dare risultati imprevisti. STEPHEN Krewson: Così abbiamo can-- utilizzando tale, possiamo chiamare. In primo luogo, giocheremo senza la batteria. Questo è l'elicottero, l'elicottero MIDI. [RIPRODUZIONE DI BRANI MUSICALI] C'è l'onda quadra. La melma voce. E si può davvero scatenarsi con questo. Ho preso una bella semplice, perché sapevo che non dovevo mordere più di quanto potessi masticare. Basta tenere abbastanza semplice per mostrare le idee principali. Ma poi mi sono detto, abbiamo avuto modo di aggiungere alcuni fusti per questo. Proprio perché si tratta di un po 'impenetrabili, e non ho usato la nome delle parti di batteria, Ho mappato them-- perché sono parte di quella classe enumerato, Li ho mappato a int. Uno è come una grancassa. Zero è così. Sette è un alto cappello. E giù a qui dove il funzioni diventano un po 'più casuale, questi sono come tamburi conga. Quindi, se pensate about-- forse un modo divertente per implementare una drum machine è quello di utilizzare molto ordinato modelli sul grancassa. Così, per esempio, sul filtraggio sulla lista con tutto quello che restituisce un 1 quando è il modulo 04 preso. In modo da ottenere 1, 5, 9, 13, 17-- quindi questo è la prima battuta di ogni misura. E allora questo è lo stesso cosa spostato in due fasi. Ecco, questo è il insolito. Quindi questo sarebbe qualcosa di simile a un alto cappello. E poi di nuovo, qui, è un po 'a caso, perché stiamo facendo tamburi conga. E ho alcune maracas qui, anche. Così ho potuto chiamare drum machine gioco, ma sarebbe andare avanti per sempre, e potrebbe iniziare afferrando tutta la memoria nel mio sistema. Così ti chiamo questa funzione riprodurre musica, che, come vedremo, utilizzare la composizione parallela troncare a fare la nostra piccola canzone Frere Jacques insieme a questo drum machine strano. Quindi, diamo uno sguardo. E per favore migliorare il mio disposizione di tutte le parti di batteria. Non la mia specialità, ma io aveva un sacco di divertimento farlo. [RIPRODUZIONE DI BRANI MUSICALI] Quindi, naturalmente, questo è tutto un po 'non come divertimento se non siamo in grado di convertire ad un punteggio così forse potrebbe essere interpretato da un performer umano. Quindi non correrò qui. Ho già generato i file. Si può vedere che c'è una dot LilyPond file-- e questo sarà il mio segue verso Connor-- e un file MIDI puntino, e un file PDF puntino, che è ciò che LilyPond alla fine genererà. Ma questi sono questi script, e io basta correre con le loro opzioni di aiuto. Se si ottiene questi installato e funzionante con Euterpea, è possibile generare un file MIDI. E poi dal file MIDI con questo programma MIDI 2LY, è possibile generare un giglio File di stagno, e poi si in grado di generare un PDF della partitura. E dovremmo dare un'occhiata a questo. Così Connor probabilmente mostrerà come annotare questo meglio, ma questo è Frere Jacques come generato da me in Euterpea. E 'solo in C. avrei capito che cosa l'hack è in realtà in. Ma questa è la conduttura per come hai fatto con quella. Parliamo di più su LilyPond. CONNOR HARRIS: OK Vediamo. Hai accennato Scopri È Haskell? STEPHEN Krewson: Oh sì. Scopri Scopri È Haskell. E 'nelle risorse. È così che ho iniziato imparare, ed è bello. L'apprendimento non muto. CONNOR HARRIS: Quindi è in linea. Così un ragazzo di nome [incomprensibile] learnyouahaskell.com, senza spazi. La grammatica è malato. STEPHEN Krewson: E 'illustrato, troppo. CONNOR HARRIS: Allora, qual è LilyPond? Si tratta di una programmazione dichiarativa lingua per la musica composizione. Così declarative-- è possibile pensare a cose come HTML, dove tu non sei saying-- HTML non dice come i browser web dovrebbe il rendering delle pagine passo dopo passo. E 'solo dicendo questo è una descrizione testuale di ciò che si desidera che la pagina per assomigliare. E poi è anche un programma che compila questo linguaggio, o leggere la sua e poi in realtà fa la composizione per voi, e sputa fuori questi meravigliosi spartiti in PDF che cercano. È inoltre possibile ottenere formato PNG o qualsiasi altra cosa. Un buon modo di pensare questo è per analogia è che LaTeX è un po 'come LillyPond, ma solo per composizione ordinaria. Così, invece di-- non è WYSIWYG, ciò che vedi È quello che ottieni, come, dire Finale è, o Sibelius, o Microsoft Word, in cui è possibile digitare in in tempo reale e progetti di cose in tempo reale e vedere i cambiamenti istantaneamente. Si basa testo. Devi compilare il i punteggi con un programma separato e uscire PDF più tardi. Questo è un po 'meno conveniente per l'uso, se siete cercando di scrivere direttamente in un punteggio e sei il tentativo di scrivere sul computer. Ma ci sono molti di vantaggi per esso. Uno, ha un aspetto molto più gradevole, perché LillyPond può effettivamente prendere il tempo di fare decisioni di layout correttamente, a differenza di Sibelius o Finale, che hanno a fare gli algoritmi così compromesse che possono visualizzare le cose in tempo reale. Allora, perché è LilyPond-- computer grafica è difficile. Se stai facendo qualcosa con la musica e si desidera scrivere colonne sonore, non si vuole scrivere fuori tutto da soli a partire da come disegnare personale e come disegnare blocchi per appunti. È molto difficile. E 'stato fatto prima. Stai bene. Se si desidera utilizzare Finale o Sibelius, i formati di file per quelle cose sono molto complicate, e non è possibile davvero usarli programmazione. È possibile aprire Sibelius con Finale e andare su File, Esporta in formato PDF te stesso, ma non si può davvero chiamare tale da uno script. LillyPond, è possibile chiamare da questi script. Si potrebbe facilmente iterare LillyPond con LaTeX. Non avrò molto tempo per andare in queste tecnologie in questo momento, ma esistono. Se si vuole guardare in un libro LillyPond, è un programma che viene fornito con la vostra distribuzione LillyPond, ed è per l'iterazione Frammenti LillyPond in LaTeX se si vuole fare qualcosa come un grande documento di Musicologia con esempi, per esempio. Ed è una buona abilità per vita se stai facendo qualcosa con la musica, non solo CS50. Ho usato LillyPond per tutti dei miei progetti di composizione da quando ero praticamente un liceo. Quindi, ecco alcuni semplici esempi. Questo è fondamentalmente rappresentativa del livello di difficoltà che la maggior parte della gente affrontarlo stavano cercando usare LilyPond per progetti semplici. Questo primo è l'inizio per un preludio corale di Bach. Questo fondo è un estratto da una delle mie opere, ed è solo lì per mostrare voi le cose come [incomprensibile] mettendo più righe nella stessa personale, come lirica undersetting funziona. Sottostrati testi sono una cosa che è molto facile da usare LilyPond per la musica corale. E così poi c'è ancora un po ' Esempi complicati. Tutti questi sono fatti in LilyPond e sono fattibili. Questo primo brano è da [Incomprensibile] di [incomprensibile]. E questo [incomprensibile] da un pezzo per contrabbasso solo flauto di [incomprensibile], che è un longtime-- che era un membro di lunga data del dipartimento di musica qui, credo. Io non sono sicuro di dove se n'è andato via a. Ma era il consigliere di Harvard Autori Associazione per lungo tempo. Uomo meraviglioso. E scrive una musica che ha molto notazione complicato che LillyPond può comunque gestire molto bene. Quindi, solo per darvi un senso di ciò che le capacità di questa cosa così are-- la struttura interna di LillyPond sono molto complicato. E lo si può utilizzare per molto tempo, includendo per alcuni piuttosto complicato le cose, senza realmente dover conoscere molto su di loro. Ma l'idea di base è che il livello più basso, gli atomi di LillyPonds sono le note. Le note contengono una Contesto chiamati voci. Così il contesto voce corrisponde sostanzialmente ad una singola linea di polifonia. E poi contesto può essere contenuta gerarchicamente in quelle di livello superiore che rappresentano il personale sul punteggio o raggruppamenti più grandi come personale di pianoforte o personale del coro, e poi alla fine interi contesti punteggio. E si può effettivamente comprendere più punteggi in un libro. E ogni contesto ha una numero di incisori collegati. Se si guarda attraverso il contenuti del contesto e stampare un certo simbolo o un certa classe di simboli come necessario. Quindi, per ogni contesto voce, c'è [incomprensibile] note incisore che è fondamentalmente una funzione o un oggetto che scrive tutte le note teste sulle parti destra della pagina. Poi c'è un incisore di fessura, che scrive fuori fessure sul personale. Poi c'è un metronomo incisore marchio che scrive fuori segni di metronomo in una partitura. E tutti questi si adattano abbastanza bene nella gerarchia. Ed è molto, molto, molto personalizzabile, che è necessario se si vuole ottenere cose del genere. Così tutti i contesti hanno un sacco di diversi attributi che è possibile modificare per ogni cosa dalla distanza di vari tipo di carattere selezione di dimensioni delle cose. Se si vuole fare anche le cose più complicate, c'è un linguaggio di scripting incorporato. Usano regime, che è il dialetto di LISP. Questi probabilmente non lo fanno significa qualcosa per te. Ma in fondo, di un regime un'altra funzionale linguaggio di programmazione, più o meno. STEPHEN Krewson: Il tie-in. CONNOR HARRIS: Sì. E 'un buon tie-in, suppongo. Ed è utilizzato come lingua di insegnamento, in realtà, giù Mass Ave. Al MIT. Ed è molto utile per LillyPond per varie ragioni tecniche. E così, se si vuole fare semplice tweaks dipendenti condizionali, per example-- c'è certo condizioni di un punteggio che ha incontrato, apportare modifiche al layout o whatnot-- poi quelle strutture ci sono. Sono complicato. Quindi, ecco un esempio di codice piuttosto semplice. E 'cinque righe. Fondamentalmente, io sto definendo due bastoni. E 'in 3/4. La prima personale ha un attaccato contrassegno tempo, ma che sta realmente accadendo per andare a tutta punteggio, perché segni di tempo sono al livello di punteggio. L'incisore segno di metronomo è attaccato a segnare contesto. Ci sono diverse chiavi, perché il [incomprensibile] incisore si allega il personale. Si può effettivamente fare è. Il campione che ho scritto è in realtà in do maggiore, ma è solo per dimostrare si può avere chiavi diverse in diversi stati maggiori. E la sintassi di base è che si scrive notare nomi con E, F, G, qualunque cosa. Se si vuole fare alterazioni, si suffisso è o ES. Questo è da olandese convegni musicologici. E per fare salti di ottava, devi usare questi segni di graduazione, virgola o apostrofo. Il relativo significa semplicemente ciò che avete una nota, esso verrà automaticamente plaec nel ottava più vicino a quello precedente. E se si vuole saltare oltre un fifth-- dire un quinto o more-- quindi è necessario utilizzare il [incomprensibile]. Ma per il resto, non c'è bisogno di specificare l'ottava di ogni singola nota. E relativo C, primo e C, è sufficiente specificare centrale C e base C, specialmente prime note. Poi ci sono i bastoni che organizzano queste due voci o campioni di musica, e si dispone di un punteggio. E che assomiglia a questo. Se si vuole prendere il tempo di copiare quel campione di LillyPond codice sul precedente scivolare giù qui, e si può scrivere per LillyPond te. So che abbiamo qualcosa che sembra un po 'come questo. Quindi c'è un'altra tecnologia chiamato XML Musica mantenuto da persone completamente diverse. XML è un dato testuale structure-- I Non dovrebbe dire dati structure-- dicono mappa metafora sorta di. Ed è progettato per contenere dati gerarchici molto bene. HTML, per esempio, è un tipo di XML. E si può dire XML perché avuto tutte le parentesi angolari e l'angolo marchi staffa di barra che i campi spettacolo dati. Non ho un codice Esempio da XML Music. Si possono trovare da soli. In sostanza, il motivo si potrebbe desiderare utilizzare XML come stadio intermedio è, prima di tutto, è un formato di interscambio praticamente per every-- non dovrei dirlo ogni, ma un sacco di punteggio diverso scrittori. Quindi, se si scrive in Musica XML, non solo può LillyPond letta con l'aiuto di questo auxilary programma chiamato XML Musica per LY, ma anche in grado di leggere Finale esso, Sibelius può leggerlo. A seconda di come il vostro oggetto interno Gerarchia lavora per rappresentare la musica, potrebbe essere più facile da scrivere XML musica piuttosto che LillyPond e fare affidamento solo su XML Musica a LY per eseguire la conversione. Non credo che [incomprensibile] ha XML Music. STEPHEN Krewson: Non è così. Qualcuno sta lavorando su di esso, però. CONNOR HARRIS: OK. Euterpea non ha un Funzione di output XML musica ancora. Se volete un idea finale del progetto, forse entrare in contatto con i ragazzi che Stefano conosce, e si potrebbe utilizzare il vostro aiuto. STEPHEN Krewson: Mi piacerebbe che. CONNOR HARRIS: Inoltre, in fondo, ogni linguaggi di programmazione che vale la pena il suo sale ha già una libreria XML, modo da poter convertire internamente tutto della vostra musica in un oggetto che la libreria XML può scrivere che richiederebbe meno modifiche alla vostra struttura interna per qualsiasi musica che gli oggetti voglio scrivere che scriverlo direttamente in LillyPond sarebbe. Poi basta stamparlo con XML con le librerie XML nella tua lingua, che garantisca che è sintatticamente corretto e tutto, e poi convertirlo in LillyPond. Quindi la tecnologia si potrebbe desiderare di esaminare se si sta facendo qualcosa come questo. [Incomprensibile], un altro La tecnologia auxilarry. Questo è fondamentalmente Tech Opere o Tech Studio per LillyPond. Così offre aiuto sintassi, con i modelli per vari comuni combinazioni di strumenti. Permette split screen di visualizzazione in modo è possibile avere il codice in una finestra e PDF in un'altra finestra e clicca sui luoghi in PDF per passare al rispettivo punti in codice sorgente. Questo è più utile se si sta effettivamente scrittura LillyPond file te che se si sta generando a livello di programmazione. Ma ancora una volta, è qualcosa di utile da avere. Grande. Un'altra resources-- mi limiterò a passare attraverso questo molto rapidamente. LillyPond manuals-- LillyPond ha documentazione eccellente sul suo sito web. Hanno un tutorial. Essi hanno un riferimento sintassi. Hanno centinaia di frammenti per varie piccole cose yo potrebbe essere necessario fare per dimostrare varie capacità. Se si desidera utilizzare il linguaggio di scripting o rendere più ampia personalizzazioni, poi c'è interni riferimento a tale URL. Se si desidera utilizzare XML Musica, c'è tale URL, musicxml.com/tutorial. E poi se hai bisogno di imparare schema perché in realtà desidera utilizzare le strutture di scripting in LillyPond, poi c'è una [incomprensibile] chiamato Interpretazione strutturato dei programmi per computer, che non è solo la seconda più grande libro di testo CS mai written-- trovarmi in seguito se volete sapere quello che penso il più grande quello è-- ma è anche un ottimo introduzione alla lingua corretta. Non avrete bisogno di più di le prime sezioni. E questo è tutto. Qualsiasi domanda? STUDENTE: Dove posso scaricare il tuo generato Frere Jacques così posso mettere sul mio iPod? STEPHEN Krewson: Beh, è ​​possibile scrivere fuori per un po 'di file wav in Euterpea. E tu hai il codice. E 'su GitHub. Fai le tue variazioni di Frere Jacques da CS50 mente alveare. Sarebbe fantastico. CONNOR HARRIS: Nessun altro? STEPHEN Krewson: Abbiamo bisogno una migliore grancassa, anche. E 'davvero male. STUDENTE: Euterpea non solo lato composizione, ma signal-- STEPHEN Krewson: Sì. Infatti, il lavoro che ha fatto in Euterpea quando ho ha preso questo-- c'è un laurea corso a Yale che utilizza it-- era in sintesi sonora. Quindi c'è una davvero bel modo usando le frecce e alcuni di notazione abbiamo visto comporre insieme le funzioni di segnalazione. In particolare, il basso per più di loro è solo una semplice onda sinusoidale. Ma se si inizia a comporre quelle in modi strani programmatiche, è possibile ottenere il suono pazzo effetti, come cascate strani. È possibile creare molto grintoso suona con un sacco di modulazione. Ho fatto un progetto su granulari sintesi, che è da qualche parte tra FM e campionamento. Si prende molto piccolo, piccoli campioni, e poi combinarle con una sorta di modulatore e costruire un suono più ricco. Abbiamo anche fatto la modellazione fisica, in modo cercando di pensare alla fisica e psicoacustica di qualcosa di simile una tromba, e pensare al modo il suono è rimbalzando la campana della tromba e l'acustica di la camera e modellazione che con gli oscillatori di base. CONNOR HARRIS: Grazie mille. Grazie per essere venuti. E io sono sempre disposto a prendere le domande per email-- connorharris@college.harvard.edu. STEPHEN Krewson: Sì. stephen.krewson@yale.edu. Raffreddare.