Karya, built on 2023-08-29T07:47:28 (patch 7a412d5d6ba4968ca4155ef276a062ccdeb9109a)
Safe HaskellSafe-Inferred

Derive.Scale

Description

Scale is actually defined in Derive.Deriver.Monad to avoid circular imports. But you should refer to it from here.

The difference between this and Derive.Scale.Scales is that this is intended for using scales, while Scales is intended for implementing them.

Synopsis

Documentation

data Transposition Source #

Constructors

Chromatic 
Diatonic 

Instances

Instances details
Show Transposition Source # 
Instance details

Defined in Derive.Deriver.Monad

newtype LookupScale Source #

A scale can configure itself by looking in the environment and by looking up other scales.

Instances

Instances details
Show LookupScale Source # 
Instance details

Defined in Derive.Deriver.Monad

data Scale Source #

Constructors

Scale 

Fields

Instances

Instances details
Pretty Scale Source # 
Instance details

Defined in Derive.Deriver.Monad

data Range Source #

This is an inclusive pitch range, intended for instrument ranges.

Constructors

Range 

Instances

Instances details
Show Range Source # 
Instance details

Defined in Derive.Scale

Methods

showsPrec :: Int -> Range -> ShowS #

show :: Range -> String #

showList :: [Range] -> ShowS #

Eq Range Source # 
Instance details

Defined in Derive.Scale

Methods

(==) :: Range -> Range -> Bool #

(/=) :: Range -> Range -> Bool #

Pretty Range Source # 
Instance details

Defined in Derive.Scale

type PitchNn = DeriveT.PitchConfig -> Either DeriveT.PitchError Pitch.NoteNumber Source #

I would much rather pass a more specific value than Environ. Unfortunately, ChromaticScales.SemisToNoteNumber needs a per-scale value (e.g. Environ.key or Environ.tuning). So pitch_nn needs to be parameterized with a "get_key" function, but it also needs Environ.key. I think it's doable by parameterizing pitch_nn and hence note_to_call and moving smap_semis_to_nn into note_to_call, but it seems complicated.

data Definition Source #

Constructors

Make !Pitch.ScaleId !(Text, Derive.DocumentedCall) !(DeriveT.Environ -> LookupScale -> Either DeriveT.PitchError Scale)

Fancy scales can configure themselves. Since you can't just look at the Scale directly, it has the ScaleId (pattern, doc) extracted.

Simple !Scale 

get :: Derive.CallName -> [DeriveT.Val] -> Derive.Deriver Scale Source #

Lookup a scale or throw.

call :: Sig.Parser a -> (a -> Derive.Deriver Scale) -> Derive.WithArgDoc Derive.ScaleF Source #

Scale calls always use Sig.Unprefixed. This makes them inconsistent with other kinds of calls, but I think is the better default, since I try to make them respond to some standard env vals, such as key or scale-inst. Especially scale-inst relies on it.

semis_per_octave :: Derive.Layout -> Pitch.Semi Source #

Number of chromatic steps in an octave. Nothing if this scale doesn't have octaves.

pc_per_octave :: Derive.Layout -> Maybe Pitch.PitchClass Source #

Number of diatonic steps in an octave. Nothing if this scale doesn't have octaves. This is the same as semis_per_octave for scales without a diatonic/chromatic distinction.

pitches :: Scale -> DeriveT.Environ -> [Pitch.Pitch] Source #

Return the pitches in the scale. If the scale has an unbounded range, this may go on forever, so zip with note_numbers if you want the usable range. Also, not all scales actually have defined degrees.

notes :: Scale -> DeriveT.Environ -> [Pitch.Note] Source #

Return the notes in the scale. As with pitches, it may be unbounded.

note_numbers :: Scale -> DeriveT.Environ -> Derive.Deriver [Pitch.NoteNumber] Source #

Return pitches of the scale's degrees.

patch_scale :: Pitch.ScaleId -> [Pitch.NoteNumber] -> Patch.Scale Source #

Make a patch scale from the NoteNumbers.

assign_keys :: Int -> [Pitch.NoteNumber] -> [(Int, Pitch.NoteNumber)] Source #

Try to assign MIDI keys that correspond to the NoteNumbers, but they won't line up if there are too many NoteNumbers.