\subsubsection{The Score File} \seclabel{score-file} \begin{haskelllisting}
> module Haskore.Interface.CSound.Note where
>
> import qualified Haskore.Basic.Pitch           as Pitch
> import qualified Haskore.Music.Rhythmic        as RhyMusic
> import qualified Haskore.Interface.CSound.InstrumentMap as InstrMap
> import Haskore.Interface.CSound (Instrument, Velocity, PField)
\end{haskelllisting} \begin{haskelllisting}
> data T =
>    Cons {
>      parameters :: [PField],
>      velocity   :: Velocity,
>      instrument :: Instrument,
>      pitch      :: Maybe Pitch.Absolute
>    }
> fromRhyNote :: RealFrac dyn =>
>    InstrMap.ToSound drum ->
>    InstrMap.ToSound instr ->
>       dyn -> Pitch.Relative -> RhyMusic.Note drum instr -> T
> fromRhyNote dMap iMap dyn trans (RhyMusic.Note vel body) =
>    let velCS = velocityFromStd dyn vel
>    in  case body of
>           RhyMusic.Tone instr p ->
>              uncurry (flip Cons velCS) (iMap instr)
>                      (Just (pitchFromStd trans p))
>           RhyMusic.Drum drum ->
>              uncurry (flip Cons velCS) (dMap drum) Nothing
> velocityFromStd :: RealFrac dyn =>
>    dyn -> Rational -> Velocity
> velocityFromStd dyn vel =
>    velocityToDb (fromRational (toRational dyn * vel))
> --   velocityToDb (realToFrac dyn * vel)
> pitchFromStd :: Pitch.Relative -> Pitch.T -> Pitch.Absolute
> pitchFromStd trans p =
>    let csoundP = Pitch.toInt p + zeroKey + trans
>    in  if csoundP<0
>        then error ("CSound.Note: pitch " ++ show csoundP ++
>                    " must not be negative")
>        else csoundP
\end{haskelllisting} \begin{haskelllisting}
> velocityToDb :: Float -> Float
> velocityToDb = (50*)
>
> -- still unused, but it should be implemented this way
> amplitudeToDb :: Float -> Float
> amplitudeToDb v = 20 * logBase 10 v
> {- Offset to map from Haskore's pitch 0
>    to the corresponding pitch of CSound -}
> zeroKey :: Int
> zeroKey = 84
\end{haskelllisting}