module Music.LilyPond.Light.Constant where

import Music.LilyPond.Light.Model

-- * Annotations

pppp,ppp,pp,p,mp,mf,f,ff,fff,ffff,fp,sfz :: Annotation
pppp = Dynamic PPPP
ppp = Dynamic PPP
pp = Dynamic Pianissimo
p = Dynamic Piano
mp = Dynamic MezzoPiano
mf = Dynamic MezzoForte
f = Dynamic Forte
ff = Dynamic Fortissimo
fff = Dynamic FFF
ffff = Dynamic FFFF
fp = Dynamic FP
sfz = Dynamic SFZ

cresc,decr,end_cresc,end_decr,espressivo ::Annotation
cresc = Dynamic Begin_Crescendo
decr = Dynamic Begin_Decrescendo
end_cresc = Dynamic End_Dynamic
end_decr = Dynamic End_Dynamic
espressivo = Dynamic Espressivo

arpeggio,fermata,flageolet,harmonic,laissezVibrer,glissando :: Annotation
arpeggio = Articulation Arpeggio
fermata = Articulation Fermata
flageolet = Articulation Flageolet
harmonic = Articulation Harmonic
laissezVibrer = Articulation LaissezVibrer
glissando = Articulation Glissando

marcato,staccato,tenuto,accent :: Annotation
marcato = Articulation Marcato
staccato = Articulation Staccato
tenuto = Articulation Tenuto
accent = Articulation Accent

-- * Clefs

bass_clef,tenor_clef,alto_clef,treble_clef,percussion_clef :: Music
bass_clef = Clef Bass 0
tenor_clef = Clef Tenor 0
alto_clef = Clef Alto 0
treble_clef = Clef Treble 0
percussion_clef = Clef Percussion 0

bass_8vb_clef,treble_8va_clef,treble_8vb_clef,treble_15ma_clef :: Music
bass_8vb_clef = Clef Bass (-1)
treble_8va_clef = Clef Treble 1
treble_8vb_clef = Clef Treble (-1)
treble_15ma_clef = Clef Treble 2

-- * Commands

l :: Music
l = Command BarlineCheck

double_barline,final_barline :: Music
double_barline = Command (Bar DoubleBarline)
final_barline = Command (Bar FinalBarline)

system_break,no_system_break :: Music
system_break = Command Break
no_system_break = Command NoBreak

page_break,no_page_break :: Music
page_break = Command PageBreak
no_page_break = Command NoPageBreak

auto_beam_off :: Music
auto_beam_off = Command AutoBeamOff

tuplet_down,tuplet_neutral,tuplet_up :: Music
tuplet_down = Command TupletDown
tuplet_neutral = Command TupletNeutral
tuplet_up = Command TupletUp

voice_one,voice_two :: Music
voice_one = Command VoiceOne
voice_two = Command VoiceTwo

stem_down,stem_neutral,stem_up :: Music
stem_down = Command StemDown
stem_neutral = Command StemNeutral
stem_up = Command StemUp

dynamic_down,dynamic_neutral,dynamic_up :: Music
dynamic_down = Command DynamicDown
dynamic_neutral = Command DynamicNeutral
dynamic_up = Command DynamicUp

begin_8va,end_8va :: Music
begin_8va = Command (Octavation 1)
end_8va = Command (Octavation 0)

-- * Annotations

ped,no_ped :: Annotation
ped = Phrasing SustainOn
no_ped = Phrasing SustainOff

tie :: Annotation
tie = Begin_Tie

-- | Beaming annotations.
begin_beam,end_beam :: Annotation
begin_beam = Phrasing Begin_Beam
end_beam = Phrasing End_Beam

-- | Slur annotations.
begin_slur,end_slur :: Annotation
begin_slur = Phrasing Begin_Slur
end_slur = Phrasing End_Slur

slur_down,slur_neutral,slur_up :: Music
slur_down = Command (User "\\slurDown")
slur_neutral = Command (User "\\slurNeutral")
slur_up = Command (User "\\slurUp")

-- | Phrasing slur annotations.
begin_phrasing_slur,end_phrasing_slur :: Annotation
begin_phrasing_slur = Phrasing Begin_PhrasingSlur
end_phrasing_slur = Phrasing End_PhrasingSlur

-- * Accidentals

rAcc,cAcc :: Annotation
rAcc = ReminderAccidental
cAcc = CautionaryAccidental

set_accidental_style_dodecaphonic :: Music
set_accidental_style_dodecaphonic =
    let x = "#(set-accidental-style 'dodecaphonic)"
    in Command (User x)

set_accidental_style_neo_modern :: Music
set_accidental_style_neo_modern =
    let x = "#(set-accidental-style 'neo-modern)"
    in Command (User x)

set_accidental_style_modern :: Music
set_accidental_style_modern =
    let x = "#(set-accidental-style 'modern)"
    in Command (User x)

-- * Paper

a4_paper :: Paper
a4_paper =
    Paper {binding_offset = Length 0 MM
          ,bottom_margin = Length 6 MM
          ,indent = Length 15 MM
          ,inner_margin = Length 10 MM
          ,left_margin = Length 10 MM
          ,outer_margin = Length 20 MM
          ,paper_width = Length 210 MM
          ,paper_height = Length 297 MM
          ,ragged_last = False
          ,ragged_last_bottom = True
          ,right_margin = Length 10 MM
          ,systems_per_page = Nothing
          ,top_margin = Length 5 MM
          ,two_sided = False}

length_scale :: Double -> Length -> Length
length_scale n (Length x u) = Length (n * x) u

paper_incr_size :: Paper -> Paper
paper_incr_size x =
    let wd = paper_width x
        ht = paper_height x
    in x { paper_width = ht, paper_height = (length_scale 2 wd) }

a3_paper :: Paper
a3_paper = paper_incr_size a4_paper

a2_paper :: Paper
a2_paper = paper_incr_size a3_paper

landscape :: Paper -> Paper
landscape x =
    let wd = paper_width x
        ht = paper_height x
    in x { paper_width = ht, paper_height = wd }

-- * Settings

default_score_settings :: Score_Settings
default_score_settings =
    Score_Settings { independent_time_signatures = False }

-- * Header

default_header :: Header
default_header =
    Header {dedication = ""
           ,title = ""
           ,subtitle = ""
           ,composer = ""
           ,tagline = ""}