Taller de Álgebra I - Verano de 2015 Trabajo práctico Este trabajo consiste en implementar lo necesario para trabajar con melodı́as en Haskell. En este caso, tendremos un tipo para representar algunas figuras musicales1 , otro tipo para representar algunas alteraciones 2 y otra para representar algunas notas musicales3 . Luego, una melodı́a es equivalente a una lista de pares figura-nota en la cual se genera una secuencia de notas con distintas duraciones (nunca intercaladas). Además, hablaremos de escalas 4 , en nuestro caso, una secuencia de notas que la describen y de tiempo o duración de una figura musical. Para lograrlo, se definen los siguientes tipos: data Figura = SemiCorchea | Corchea | Negra | Blanca | Redonda deriving (Show, Eq) data Alteracion = Sostenido | Comun deriving (Show, Eq) data Nota = Do Alteracion | Re Alteracion | ... | Si Alteracion type Melodia = [(Figura, Nota)] type Escala = [Nota] type Tiempo = Float Como ayuda, en el esqueleto del tp, encontrarán ciertas melodı́as definidas y ciertas funciones que pueden serles útiles para simplificar las pruebas. Ver: yaLloviendoEsta5 y damaSofisticada 6 Ejercicios 1. Implementar la función mostrarNota :: Nota -> String que convierte una nota a su representación textual. Por ejemplo, *Main> mostrarNota (Do Sostenido) "Do #" *Main> mostrarNota (Si Comun) "Si" 2. Implementar la función tiempoTotal :: Melodia -> Tiempo que calcula el tiempo de una melodı́a en base a sus figuras. Para obtener el valor de cada figura utilizar la función tiempo Por ejemplo: *Main> tiempoTotal yaLloviendoEsta 16.0 *Main> tiempoTotal damaSofisticada 11.0 3. Implementar la función notaMasTocada :: Melodia -> Nota que devuelve la nota que más tiempo aparece en una melodı́a. Por ejemplo: *Main> notaMasTocada yaLloviendoEsta Sol *Main> notaMasTocada damaSofisticada Sol 4. Implementar la función notasIguales :: Nota -> Nota -> Bool que determine si dos notas son o no la misma. Para organizar de una forma efectiva 1 http://es.wikipedia.org/wiki/Figura_musical http://es.wikipedia.org/wiki/alteracion_(musica) 3 http://es.wikipedia.org/wiki/nota_(sonido) 4 http://es.wikipedia.org/wiki/Escala_musical 5 https://www.youtube.com/watch?v=3f_Il0b6YGY 6 https://www.youtube.com/watch?v=OYJOLWZTPYk 2 1 las notas, se dice que la mı́nima distancia posible entre dos notas musicales diferentes con sonidos diferentes es de medio tono, o un semitono7 (1/2 tono). Basados en esto podemos decir que entre Do y Re sostenido, existe una distancia de tres semitonos. Además ocurre que Mi sostenido es igual a Fa ya que no hay semitonos entre ambos. Por lo tanto, dos notas son iguales cuando su distancia en semitonos es cero. 5. Implementar la función sumarSemitonos :: Nota -> Int -> Nota que dada una nota n y un número x, devuelve alguna de las notas equivalente a sumar x semitonos a n. 6. Implementar la función escala :: Nota -> Escala que dada una nota, genera la escala diatónica mayor 8 correspondiente. Una escala diatónica mayor se genera a partir de la nota y sumando T, T, ST, T, T, T progresivamente. Por ejemplo: *Main> escala (Do Comun) [Do,Re,Mi,Fa,Sol,La,Si] *Main> escala (Re Sostenido) [Re #,Fa,Sol,Sol #,La #,Do,Re] 7. Implementar la función estaEnEscala :: Melodia -> Nota -> Bool que devuelve verdadero si la melodı́a utiliza notas que sólo provengan de la escala que se genera con la nota pasada como parámetro. 8. Implementar la función enAlgunaEscala :: Melodia -> Bool que determine si la melodı́a esta compuesta utilizando alguna escala (sin notas provenientes de otras escalas). Por ejemplo *Main> enAlgunaEscala yaLloviendoEsta True *Main> enAlgunaEscala damaSofisticada False Condiciones de entrega: El trabajo práctico se debe hacer en grupos de exactamente tres personas. Se debe entregar el código por mail a los docentes. La fecha de entrega es el martes 3/3 a las 23:59. 7 8 http://es.wikipedia.org/wiki/Semitono http://es.wikipedia.org/wiki/Escala_diatonica 2