Trabajo Práctico

Anuncio
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
Descargar