ebook img

Haskell school of music PDF

387 Pages·2013·2.529 MB·English
Save to my drive
Quick download
Download
Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.

Preview Haskell school of music

The Haskell School of Music — From Signals to Symphonies — Paul Hudak Yale University Department of Computer Science Version 2.5 (January 2013) i The Haskell School of Music — From Signals to Symphonies — Paul Hudak Yale University Department of Computer Science New Haven, CT, USA Version 2.5 (January 2013) Copyright (cid:2)c Paul Hudak January 2011, 2012, 2013 All rights reserved. No part of this publication may be reproduced or distributed in any form or by any means, or stored in a data base or retrieval system, without the prior written permission of the author. Cover image: Euterpe, the Greek Muse of Music (attribution unknown) Contents Preface xv 1 Computer Music, Euterpea, and Haskell 1 1.1 The Note vs. Signal Dichotomy . . . . . . . . . . . . . . . . . 2 1.2 Basic Principles of Programming . . . . . . . . . . . . . . . . 3 1.3 Computation by Calculation . . . . . . . . . . . . . . . . . . . 4 1.4 Expressions and Values . . . . . . . . . . . . . . . . . . . . . 8 1.5 Types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 1.6 Function Types and Type Signatures . . . . . . . . . . . . . . 11 1.7 Abstraction, Abstraction, Abstraction . . . . . . . . . . . . . 13 1.7.1 Naming . . . . . . . . . . . . . . . . . . . . . . . . . . 13 1.7.2 Functional Abstraction . . . . . . . . . . . . . . . . . . 16 1.7.3 Data Abstraction . . . . . . . . . . . . . . . . . . . . . 19 1.8 Haskell Equality vs. Euterpean Equality . . . . . . . . . . . . 22 1.9 Code Reuse and Modularity . . . . . . . . . . . . . . . . . . . 23 1.10 [Advanced] Programming with Numbers . . . . . . . . . . . . 24 2 Simple Music 28 2.1 Preliminaries . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 2.2 Notes, Music, and Polymorphism . . . . . . . . . . . . . . . . 30 2.3 Convenient Auxiliary Functions . . . . . . . . . . . . . . . . . 34 2.3.1 A Simple Example . . . . . . . . . . . . . . . . . . . . 36 2.4 Absolute Pitches . . . . . . . . . . . . . . . . . . . . . . . . . 41 ii CONTENTS iii 3 Polymorphic & Higher-Order Functions 44 3.1 Polymorphic Types . . . . . . . . . . . . . . . . . . . . . . . . 45 3.2 Abstraction Over Recursive Definitions . . . . . . . . . . . . . 46 3.2.1 Map is Polymorphic . . . . . . . . . . . . . . . . . . . 48 3.2.2 Using map . . . . . . . . . . . . . . . . . . . . . . . . 49 3.3 Append . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 3.3.1 [Advanced] The Efficiency and Fixity of Append . . . 51 3.4 Fold . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 3.4.1 Haskell’s Folds . . . . . . . . . . . . . . . . . . . . . . 54 3.4.2 [Advanced] Why Two Folds? . . . . . . . . . . . . . . 55 3.4.3 Fold for Non-empty Lists . . . . . . . . . . . . . . . . 56 3.5 [Advanced] A Final Example: Reverse . . . . . . . . . . . . . 57 3.6 Currying . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 3.6.1 Currying Simplification . . . . . . . . . . . . . . . . . 60 3.6.2 [Advanced] Simplification of reverse . . . . . . . . . . 61 3.7 Errors . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 4 A Musical Interlude 66 4.1 Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 4.2 Transcribing an Existing Score . . . . . . . . . . . . . . . . . 68 4.2.1 Auxiliary Functions . . . . . . . . . . . . . . . . . . . 68 4.2.2 Bass Line . . . . . . . . . . . . . . . . . . . . . . . . . 71 4.2.3 Main Voice . . . . . . . . . . . . . . . . . . . . . . . . 71 4.2.4 Putting It All Together . . . . . . . . . . . . . . . . . 72 4.3 Simple Algorithmic Composition . . . . . . . . . . . . . . . . 73 5 Syntactic Magic 76 5.1 Sections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 5.2 Anonymous Functions . . . . . . . . . . . . . . . . . . . . . . 78 5.3 List Comprehensions . . . . . . . . . . . . . . . . . . . . . . . 79 5.3.1 Arithmetic Sequences . . . . . . . . . . . . . . . . . . 81 5.4 Function Composition . . . . . . . . . . . . . . . . . . . . . . 82 CONTENTS iv 5.5 Higher-Order Thinking . . . . . . . . . . . . . . . . . . . . . . 83 5.6 Infix Function Application . . . . . . . . . . . . . . . . . . . . 84 6 More Music 86 6.1 Delay and Repeat. . . . . . . . . . . . . . . . . . . . . . . . . 86 6.2 Inversion and Retrograde . . . . . . . . . . . . . . . . . . . . 87 6.3 Polyrhythms . . . . . . . . . . . . . . . . . . . . . . . . . . . 89 6.4 Symbolic Meter Changes . . . . . . . . . . . . . . . . . . . . . 90 6.5 Computing Duration . . . . . . . . . . . . . . . . . . . . . . . 91 6.6 Super-retrograde . . . . . . . . . . . . . . . . . . . . . . . . . 91 6.7 takeM and dropM . . . . . . . . . . . . . . . . . . . . . . . . 92 6.8 Removing Zeros . . . . . . . . . . . . . . . . . . . . . . . . . . 93 6.9 Truncating Parallel Composition . . . . . . . . . . . . . . . . 95 6.9.1 Lazy Evaluation to the Rescue . . . . . . . . . . . . . 96 6.10 Trills . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97 6.11 Grace Notes . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 6.12 Percussion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 6.13 A Map for Music . . . . . . . . . . . . . . . . . . . . . . . . . 102 6.14 A Fold for Music . . . . . . . . . . . . . . . . . . . . . . . . . 104 6.15 Crazy Recursion . . . . . . . . . . . . . . . . . . . . . . . . . 105 7 Qualified Types and Type Classes 108 7.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 7.2 Equality . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110 7.3 Defining Our Own Type Classes . . . . . . . . . . . . . . . . 112 7.3.1 Dervived Instances . . . . . . . . . . . . . . . . . . . . 113 7.3.2 Default Methods . . . . . . . . . . . . . . . . . . . . . 115 7.3.3 Inheritance . . . . . . . . . . . . . . . . . . . . . . . . 116 7.4 Haskell’s Standard Type Classes . . . . . . . . . . . . . . . . 118 7.4.1 The Num Class . . . . . . . . . . . . . . . . . . . . . . 119 7.4.2 The Show Class . . . . . . . . . . . . . . . . . . . . . 120 7.4.3 The Functor Class . . . . . . . . . . . . . . . . . . . . 123 CONTENTS v 7.5 Other Derived Instances . . . . . . . . . . . . . . . . . . . . . 123 7.6 The type of play . . . . . . . . . . . . . . . . . . . . . . . . . 126 7.7 Reasoning With Type Classes . . . . . . . . . . . . . . . . . . 127 8 Interpretation and Performance 130 8.1 Abstract Performance . . . . . . . . . . . . . . . . . . . . . . 131 8.1.1 Context . . . . . . . . . . . . . . . . . . . . . . . . . . 132 8.1.2 Player Map . . . . . . . . . . . . . . . . . . . . . . . . 133 8.1.3 Interpretation . . . . . . . . . . . . . . . . . . . . . . . 134 8.1.4 Efficiency Concerns. . . . . . . . . . . . . . . . . . . . 137 8.2 Players . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 8.2.1 Example of Player Construction . . . . . . . . . . . . 141 8.2.2 Deriving New Players From Old Ones . . . . . . . . . 143 8.2.3 A Fancy Player . . . . . . . . . . . . . . . . . . . . . . 143 8.3 Putting it all Together . . . . . . . . . . . . . . . . . . . . . . 144 9 Self-Similar Music 148 9.1 Self-Similar Melody . . . . . . . . . . . . . . . . . . . . . . . . 148 9.1.1 Sample Compositions . . . . . . . . . . . . . . . . . . 151 9.2 Self-Similar Harmony . . . . . . . . . . . . . . . . . . . . . . . 152 9.3 Other Self-Similar Structures . . . . . . . . . . . . . . . . . . 153 10 Proof by Induction 156 10.1 Induction and Recursion . . . . . . . . . . . . . . . . . . . . . 156 10.2 Examples of List Induction . . . . . . . . . . . . . . . . . . . 157 10.3 Proving Function Equivalences . . . . . . . . . . . . . . . . . 159 10.3.1 [Advanced] Reverse . . . . . . . . . . . . . . . . . . . . 160 10.4 Useful Properties on Lists . . . . . . . . . . . . . . . . . . . . 163 10.4.1 [Advanced] Function Strictness . . . . . . . . . . . . . 163 10.5 Induction on the Music Data Type . . . . . . . . . . . . . . . 167 10.5.1 The Need for Musical Equivalence . . . . . . . . . . . 170 10.6 [Advanced] Induction on Other Data Types . . . . . . . . . . 171 CONTENTS vi 10.6.1 A More Efficient Exponentiation Function . . . . . . . 173 11 An Algebra of Music 177 11.1 Musical Equivalance . . . . . . . . . . . . . . . . . . . . . . . 177 11.1.1 Literal Player . . . . . . . . . . . . . . . . . . . . . . . 179 11.2 Some Simple Axioms . . . . . . . . . . . . . . . . . . . . . . . 179 11.3 The Fundamental Axiom Set . . . . . . . . . . . . . . . . . . 182 11.4 An Algebraic Semantics . . . . . . . . . . . . . . . . . . . . . 184 11.5 Other Musical Properties . . . . . . . . . . . . . . . . . . . . 184 12 Musical L-Systems and Generative Grammars 186 12.1 Generative Grammars . . . . . . . . . . . . . . . . . . . . . . 186 12.1.1 A Simple Implementation . . . . . . . . . . . . . . . . 187 12.1.2 A More General Implementation . . . . . . . . . . . . 189 12.2 An L-System Grammar for Music . . . . . . . . . . . . . . . . 192 12.2.1 Examples . . . . . . . . . . . . . . . . . . . . . . . . . 193 13 Random Numbers ... and Markov Chains 196 13.1 Random Numbers . . . . . . . . . . . . . . . . . . . . . . . . 196 13.2 Probability Distributions. . . . . . . . . . . . . . . . . . . . . 199 13.2.1 Random Melodies and Random Walks . . . . . . . . . 203 13.3 Markov Chains . . . . . . . . . . . . . . . . . . . . . . . . . . 205 13.3.1 Training Data . . . . . . . . . . . . . . . . . . . . . . . 206 14 From Performance to Midi 209 14.1 An Introduction to Midi . . . . . . . . . . . . . . . . . . . . . 209 14.1.1 General Midi . . . . . . . . . . . . . . . . . . . . . . . 210 14.1.2 Channels and Patch Maps . . . . . . . . . . . . . . . . 211 14.1.3 Standard Midi Files . . . . . . . . . . . . . . . . . . . 213 14.2 Converting a Performance into Midi . . . . . . . . . . . . . . 215 14.3 Putting It All Together . . . . . . . . . . . . . . . . . . . . . 218 15 Basic Input/Output 219 CONTENTS vii 15.1 IO in Haskell . . . . . . . . . . . . . . . . . . . . . . . . . . . 219 15.2 do Syntax . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221 15.3 Actions are Just Values . . . . . . . . . . . . . . . . . . . . . 222 15.4 Reading and Writing MIDI Files . . . . . . . . . . . . . . . . 224 16 Higher-Order Types and Monads 225 16.1 The Functor Class . . . . . . . . . . . . . . . . . . . . . . . . 225 16.2 The Monad Class . . . . . . . . . . . . . . . . . . . . . . . . . 228 16.2.1 Other Instances of Monad . . . . . . . . . . . . . . . . 232 16.2.2 Other Monadic Operations . . . . . . . . . . . . . . . 235 16.3 The MonadPlus Class . . . . . . . . . . . . . . . . . . . . . . 235 16.4 State Monads . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 16.5 Type Class Type Errors . . . . . . . . . . . . . . . . . . . . . 240 17 Musical User Interface 242 17.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 17.2 Basic Concepts . . . . . . . . . . . . . . . . . . . . . . . . . . 243 17.2.1 The Type of a Signal Function . . . . . . . . . . . . . 244 17.2.2 proc Declarations . . . . . . . . . . . . . . . . . . . . . 245 17.2.3 Four Useful Functions . . . . . . . . . . . . . . . . . . 246 17.2.4 [Advanced] Why Arrows? . . . . . . . . . . . . . . . . 246 17.3 The UISF Arrow . . . . . . . . . . . . . . . . . . . . . . . . . 247 17.3.1 Graphical Input and Output Widgets . . . . . . . . . 248 17.3.2 Widget Transformers . . . . . . . . . . . . . . . . . . . 250 17.4 Events and Mediators . . . . . . . . . . . . . . . . . . . . . . 252 17.4.1 Mediators . . . . . . . . . . . . . . . . . . . . . . . . . 253 17.4.2 MIDI Input and Output . . . . . . . . . . . . . . . . . 254 17.4.3 MIDI Device IDs . . . . . . . . . . . . . . . . . . . . . 255 17.4.4 Timers and Delays . . . . . . . . . . . . . . . . . . . . 257 17.5 A Graphical Canvas . . . . . . . . . . . . . . . . . . . . . . . 258 17.6 Putting It All Together . . . . . . . . . . . . . . . . . . . . . 258 17.7 Musical Examples . . . . . . . . . . . . . . . . . . . . . . . . 258 CONTENTS viii 17.7.1 Chord Builder . . . . . . . . . . . . . . . . . . . . . . 259 17.7.2 Chaotic Composition . . . . . . . . . . . . . . . . . . . 261 17.7.3 MIDI Echo Effect. . . . . . . . . . . . . . . . . . . . . 262 17.8 General I/O From Within a MUI . . . . . . . . . . . . . . . . 263 18 Sound and Signals 266 18.1 The Nature of Sound . . . . . . . . . . . . . . . . . . . . . . . 266 18.1.1 Frequency and Period . . . . . . . . . . . . . . . . . . 269 18.1.2 Amplitude and Loudness . . . . . . . . . . . . . . . . 270 18.1.3 Frequency Spectrum . . . . . . . . . . . . . . . . . . . 274 18.2 Digital Audio . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 18.2.1 From Continuous to Discrete . . . . . . . . . . . . . . 278 18.2.2 Fixed-Waveform Table-Lookup Synthesis . . . . . . . 280 18.2.3 Aliasing . . . . . . . . . . . . . . . . . . . . . . . . . . 281 18.2.4 Quantization Error . . . . . . . . . . . . . . . . . . . . 284 18.2.5 Dynamic Range . . . . . . . . . . . . . . . . . . . . . . 286 19 Euterpea’s Signal Functions 288 19.1 Signals and Signal Functions . . . . . . . . . . . . . . . . . . 289 19.1.1 The Type of a Signal Function . . . . . . . . . . . . . 291 19.1.2 Four Useful Functions . . . . . . . . . . . . . . . . . . 293 19.1.3 Some Simple Examples . . . . . . . . . . . . . . . . . 294 19.2 Generating Sound . . . . . . . . . . . . . . . . . . . . . . . . 299 19.3 Instruments . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300 19.3.1 Turning a Signal Function into an Instruement . . . . 301 19.3.2 Envelopes . . . . . . . . . . . . . . . . . . . . . . . . . 303 20 Spectrum Analysis 307 20.1 Fourier’s Theorem . . . . . . . . . . . . . . . . . . . . . . . . 307 20.1.1 The Fourier Transform . . . . . . . . . . . . . . . . . . 309 20.1.2 Examples . . . . . . . . . . . . . . . . . . . . . . . . . 310 20.2 The Discrete Fourier Transform . . . . . . . . . . . . . . . . . 311 CONTENTS ix 20.2.1 Interpreting the Frequency Spectrum . . . . . . . . . . 314 20.2.2 Amplitude and Power of Spectrum . . . . . . . . . . . 316 20.2.3 A Haskell Implementation of the DFT . . . . . . . . . 318 20.3 The Fast Fourier Transform . . . . . . . . . . . . . . . . . . . 324 20.4 Further Pragmatics . . . . . . . . . . . . . . . . . . . . . . . . 325 20.5 References . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326 21 Additive Synthesis and Amplitude Modulation 327 21.1 Preliminaries . . . . . . . . . . . . . . . . . . . . . . . . . . . 327 21.2 A Bell Sound . . . . . . . . . . . . . . . . . . . . . . . . . . . 328 21.3 Amplitude Modulation . . . . . . . . . . . . . . . . . . . . . . 331 21.3.1 AM Sound Synthesis . . . . . . . . . . . . . . . . . . . 332 21.4 What do Tremolo and AM Radio Have in Common? . . . . . 333 A The PreludeList Module 335 A.1 The PreludeList Module . . . . . . . . . . . . . . . . . . . . . 336 A.2 Simple List Selector Functions . . . . . . . . . . . . . . . . . 336 A.3 Index-Based Selector Functions . . . . . . . . . . . . . . . . . 337 A.4 Predicate-Based Selector Functions . . . . . . . . . . . . . . . 339 A.5 Fold-like Functions . . . . . . . . . . . . . . . . . . . . . . . . 339 A.6 List Generators . . . . . . . . . . . . . . . . . . . . . . . . . . 341 A.7 String-Based Functions . . . . . . . . . . . . . . . . . . . . . . 341 A.8 Boolean List Functions . . . . . . . . . . . . . . . . . . . . . . 342 A.9 List Membership Functions . . . . . . . . . . . . . . . . . . . 343 A.10 Arithmetic on Lists . . . . . . . . . . . . . . . . . . . . . . . . 343 A.11 List Combining Functions . . . . . . . . . . . . . . . . . . . . 344 B Haskell’s Standard Type Classes 346 B.1 The Ordered Class . . . . . . . . . . . . . . . . . . . . . . . . 346 B.2 The Enumeration Class . . . . . . . . . . . . . . . . . . . . . 347 B.3 The Bounded Class . . . . . . . . . . . . . . . . . . . . . . . . 348 B.4 The Show Class . . . . . . . . . . . . . . . . . . . . . . . . . . 349

See more

The list of books you might like

Most books are stored in the elastic cloud where traffic is expensive. For this reason, we have a limit on daily download.