380 likes | 996 Views
Art, Math, Music and Computer Programming Languages Creativity with Patterns Programming with Functions Everyone understands functions: f(x) = x + 1 g(x,y) = sine(x) - y abs(x) = if x < 0 then -x else x
E N D
Art, Math, MusicandComputer Programming Languages Creativity with Patterns
Programming with Functions Everyone understands functions: f(x) = x + 1 g(x,y) = sine(x) - y abs(x) = if x < 0 then -x else x Functional Programming uses functions (and nothing else!) to write computer programs. We use functions to create some simple but interesting programs that explore things like math or music or art …
Programming languages If you use languages like Java or C++ you have to tell the computer a lot about how to do something. You need to learn a lot to do a little but you can do almost anything if you work really hard … We are interested in languages where you don’t have to say how to do things - anyone can write programs in these languages! Our languages deal with specific domains - they are not meant to do everything.
Everything is a Function Why functions? Because we can represent just about everything with them: Pictures are functions from points onto colors Music is a function from time to sets of notes Math is a study of functions In all of these areas, we want to capture patterns and give them names Reflection Shapes Scales Rotations Repetition
Notation Using a computer requires precise notations. f x y -- function f applied to arguments x and y (x,y) -- A 2-dimensional point (or vector) f x = x+1 -- A function definition f (x,y) = (y,x) -- f has one argument, a point
Functional Images We use a language called Pan (Picture Animation) to create pictures. A picture is a function from a coordinate (place on the X-Y plane) to a color. Computer geeks write things like this: a Picture has type “Point -> Color” You should know about coordinates but ... What’s a color?
Colors We describe colors using 3 numbers, each between 0 and 1 Amount of Red Amount of Green Amount of Blue Example: Yellow = Red + Green rgb 1 1 0 We can also add Transparency 0 = clear, 1 = solid rgba 1 1 0 0.5 -- semi-transparent yellow
A Picture! We can define a simple picture like this: pic (x,y) = if abs x + abs y < 100 then black else white What does this define? The coordinate system is in pixels and the origin is at the center of the window. Test1
Another Picture! More colors! Let’s change the black to a color that varies with location pic (x,y) = if abs x + abs y < 100 then rgb 0.5 (abs x/100) (abs y/100) else white rgb defines a color from the red, green, and blue components. Test2
Adding Controls r <- slider “red” (0,1) 0 pic (x,y) = if abs x + abs y < 100 then rgb r (abs x/100) (abs y/100) else white slider uses a label, a range, and an initial value to define an interactive controller Test3
Transformations A function that maps one point onto another is a transformation: A Transformation has type “Point -> Point” moveIt (x,y) = (x+1, y+1) What is moveIt (2,3)? twistIt (x,y) = (y, -x) What is twistIt (2,3)
Visualizing Transformations So how can we “see” a transform on points? One way is to use it as a lens to view an image. Here’s a transformation: f (x,y) = (x*x, y*y) f (0,0) = (0,0) f (1,1) = f(-1,1) = f(1,-1) = f (-1,-1) = (1,1) f (2,2) = (4,4) So, if we look at (2,2) we’ll see what’s at (4,4)
y x Original Image Warped Image Here’s what happens: y x Test4
Symmetry The image symmetric about both the x and y axis: f(-x,y) = f(x,y) Can you prove this?? f(x,-y) = f(x,y)
Polar Coordinates A different way to locate points on a plane Use distance and angle to the origin d angle Simple transformation in polar coordinates have interesting effects …
Swirling This transformation adds extra rotation as points move out from the origin f (distance, angle) = (distance, angle + k * distance) k is a parameter – we can adjust this and watch how the picture changes. Test5
Altering the Distance f (r, theta) = (g r theta, theta) What if g r theta = r + k (k is a parameter) g r theta = r + k*theta g r theta = r*r*k Test6 Test7 Test8
Rippling Move further or closer to the origin depending on the angle g r theta = r * (1 + k*sine (n * theta)) The “sine” function generates a ripple. Test9 Sine tells you how high up you are on the unit circle given an angle.
Ramps A periodic function repeats itself. One of the simplest periodic functions is a series of ramps from 0 to 1, repeated over and over: ramps x = x when 0 <= x and x < 1 = x = ramps (x+1) when x < 0 = ramps (x-1) when x >= 1 A more useful version of this function is parameterized by its period: pramps p x = p * ramps (x/p) y = ramps p x
Using Ramps p <- slider “Size of square” (10,300) 100 f (x,y) = (pramps p x, pramps p y) This replicates the image in the square of size s over the entire plane (tiling) Test10
A Sawtooth These function is symmetric: teeth(x) = x when 0 <= x and x < ½ = 1-x when ½ <= x and x < 1 ..... plus rest of “ramps” We can also parameterize by the period (sawtooth) Tiling the angle in polar coordinates = kaleidoscope f (distance, angle) = (distance, sawtooth(width, angle))
Using the Sawtooth Tiling: f (x,y) = (pteeth p x, pteeth p y) Circular reflections: f (r, theta) = (pteeth p r, theta) Kaleidoscope: f (t, theta) = (r, pteeth p theta) test11 test12 test13
The Grand Finale Define factor to take apart a number x as follows: (big, little) = factor p x where big is a multiple of p , -p/2 < little <= p/2, and big + little = x Now, apply a warping t such that slicer p t (x,y) = (x’ + bigx, y’ + bigy) where (bigx, littlex) = factor p x (bigy, littley) = factor p y (x’, y’) = t (littlex, littley)
Apply this to the following transformations: f (r, theta) = (r+k, theta) f (r, theta) = (0, 0) test14 test15
Haskore • Motivation: • Traditional music notation has many limitations: • Unable to express a composer’s intentions. • Biased toward music that is humanly performable. • Unable to express notions of algorithmic composition.Haskore (“Haskell” + “Score”) is a library of Haskellfunctions and datatypes for composing music.
Defining Music… Can we create music with functions? Of course! NoteName = Cf | C | Cs | Df | D | Ds | Ef | E | Es | Ff | F | Fs | Gf | G | Gs | Af | A | As | Bf | B | Bs Music = Note (NoteName, Integer) Duration [Attributes] -- a note Rest Duration -- a rest Music :+: Music -- sequential composition Music :=: Music -- parallel composition Tempo Float Music -- scale the tempo Trans Integer Music -- transposition
C Major Scale For convenience, c oct duration attributes = Note (C, oct) duration attributes cmaj = c 3 0.2 [] :+: d 3 0.2 [] :+: e 3 0.2 [] :+: ….. c 4 0.2 []
Simple Transformations Add a parallel line 7 notes higher: pfifth m = m :=: Trans 7 m cmaj5 = pfifth cmaj againFaster m = m :+: (Tempo 2 m) cmaj5twice = againFaster cmaj5 cmaj5four = againFaster cmaj5twice
Function Composition Function composition notation: (f . g) x = f (g x) Make a “pipeline” of transformers. pfifth . Trans 5 . Tempo 2 -- Music transfomers means: double the tempo, transpose up 5, and add a parallel part a fifth higher Such notation makes it easier to work with functions!
Types Types help us understand functions x :: Music -- x is a piece of music y :: Music -> Music -- y a function that accepts music and returns music (a music transformer) z :: Integer -> Music -> Music -- z has two arguments, an integer and some music z 3 -- if passed only one argument, you get a music transformer Using only some of the arguments is called currying: named after Haskell Curry
Simple Iteration We use functions to capture music structures One such structure is simple iteration: rpt :: Integer -> Music -> Music rpt 0 m = Rest 0 --- a “null” piece of music rpt n m = m :+: rpt (n-1) m Use recursion to define a function that iterates n times cmaj4 = rpt 4 cmaj What does rpt 3 . rpt 3 do?
More Complex Patterns Why repeat the same thing exactly the same? We can add a function that changes the music with each iteration: rptm :: Integer -> (Music -> Music) -> Music -> Music rptm 0 f m = Rest 0 rptm n f m = m :+: rptm (n-1) f (f m) cmr = rptm 4 pfifth cmaj cmr1 = rptm 4 (pfifth . Tempo 1.5) cmaj This changes the music!
More Examples A function to recursively apply transformations f (to elements in a sequence) and g (to accumulated phrases): rep :: (Music -> Music) -> (Music -> Music) -> Integer -> Music -> Music rep f g 0 m = Rest 0 rep f g n m = m :=: g (rep f g (n-1) (f m)) An example using "rep" three times, recursively, to create a "cascade" of sounds. run = rep (Trans 5) (delay tn) 8 (c 4 tn) cascade = rep (Trans 4) (delay en) 8 run cascades = rep id (delay sn) 2 cascade waterfall = cascades :+: revM cascades
How Did That Work? rep f g 0 m = Rest 0 rep f g n m = m :=: g (rep f g (n-1) (f m)) At each step, apply f “going down” and g “coming back” Play m at the same time as the “rep” part If n = 2, we get rep f g 2 m = m :=: g ( rep f g 1 (f m)) = m :=: g ( f m :=: g (rep f g o (f (f m)))) = m :=: g ( f m :=: g (Rest 0)) run = rep (Trans 5) (delay tn) 8 (c 4 tn)
The Grand Finale Write a function that plays a piece of music with the same music played twice as fast an octave higher, and so on. m Higher & Faster m m m m m m
The Program pyr 1 m = m pyr n m = m :=: (rpt 2 . Trans 12 . Tempo 2 . pyr (n-1)) m tune = c 4 0.1 [] :+: g 4 0.1 [] :+: e 4 0.1 [] :+: g 4 0.1 [] alldone = pyr 4 (Tempo 0.3 tune)
Gloveby Tom Makucevichwith help from Paul HudakComposed using Haskore, a Haskell DSL,and rendered using csound.
Thank You! Join us tomorrow to get some “hands on” experience with tunes and toons. Help us build a web page. Bring your creativity! Embarrass your friends. Compose music. Play with pictures. We will have a camera available …