midi-0.2.2.1: Handling of MIDI messages and files

Safe HaskellSafe
LanguageHaskell2010

Sound.MIDI.Message.Channel.Voice

Description

Channel voice messages

Synopsis

Documentation

get :: C parser => Int -> Int -> Fragile parser T Source

putWithStatus :: C writer => (Int -> T compress writer) -> T -> T compress writer Source

isNoteOn :: T -> Bool Source

NoteOn with zero velocity is considered NoteOff according to MIDI specification.

isNoteOff :: T -> Bool Source

NoteOn with zero velocity is considered NoteOff according to MIDI specification.

zeroKey :: Pitch Source

A MIDI problem is that one cannot uniquely map a MIDI key to a frequency. The frequency depends on the instrument. I don't know if the deviations are defined for General MIDI. If this applies one could add transposition information to the use patch map. For now I have chosen a value that leads to the right frequency for some piano sound in my setup.

explicitNoteOff :: T -> T Source

Convert all NoteOn p 0 to NoteOff p 64. The latter one is easier to process.

implicitNoteOff :: T -> T Source

Convert all NoteOff p 64 to NoteOn p 0. The latter one can be encoded more efficiently using the running status.

realFromControllerValue :: (Integral a, Fractional b) => a -> b Source

Map integral MIDI controller value to floating point value. Maximum integral MIDI controller value 127 is mapped to 1. Minimum integral MIDI controller value 0 is mapped to 0.

data Velocity Source

Instances

Bounded Velocity Source

ToDo: We have defined minBound = Velocity 0, but strictly spoken the minimum Velocity is 1, since Velocity zero means NoteOff. One can at least think of NoteOff with (Velocity 0), but I have never seen that.

Eq Velocity Source 
Ord Velocity Source 
Show Velocity Source 
Arbitrary Velocity Source 
Random Velocity Source 

data Controller Source

We do not define Controller as enumeration with many constructors, because some controllers have multiple names and some are undefined. It is also more efficient this way. Thus you cannot use case for processing controller types, but you can use lookup instead.

maybe (putStrLn "unsupported controller") putStrLn $
lookup ctrl $
   (portamento, "portamento") :
   (modulation, "modulation") :
   []

frequencyFromPitch :: Floating a => Pitch -> a Source

Convert pitch to frequency according to the default tuning given in MIDI 1.0 Detailed Specification.

maximumVelocity :: Velocity Source

The velocity of an ordinary key stroke and the maximum possible velocity.

normalVelocity :: Velocity Source

The velocity of an ordinary key stroke and the maximum possible velocity.

realFromVelocity :: Fractional b => Velocity -> b Source

MIDI specification says, if velocity is simply mapped to amplitude, then this should be done by an exponential function. Thus we map normalVelocity (64) to 0, maximumVelocity (127) to 1, and minimumVelocity (1) to -1. That is, normally you should write something like amplitude = 2 ** realFromVelocity vel or 3 ** realFromVelocity vel.