-- Copyright 2017 Evan Laforge
-- This program is distributed under the terms of the GNU General Public
-- License 3.0, see COPYING or http://www.gnu.org/licenses/gpl-3.0.txt

-- | Some standard call names.  These are used to construct calls symbolically,
-- or so instruments can override standard symbols.  These form a kind of API,
-- so they should be coordinated between the different places that use them.
--
-- 'Derive.Expr.ToExpr' and 'Derive.Expr.generator' are useful for constructing
-- symbolic expressions.
module Derive.Symbols where
import qualified Derive.Expr as Expr


-- | This is called implicitly for note track titles, e.g. '>foo +bar' becomes
-- 'note-track foo +bar'.  It's mostly to reuse the call machinery for note
-- track titles, but as a bonus you can override it to customize note track
-- titles.
note_track :: Expr.Symbol
note_track :: Symbol
note_track = Symbol
"note-track"

-- | The standard note call is bound to this, in addition to "".  Internally
-- calls wanting a standard note call this though, so you can rebind "" locally
-- without getting recursion.
default_note :: Expr.Symbol
default_note :: Symbol
default_note = Symbol
"NOTE"

-- | If this is bound, scale degree pitch calls will be passed to this as a
-- single pitch argument.  Otherwise, they set the pitch, like the @set@ call.
-- So unlike 'default_note', where you rebind the "" call and 'default_note' is
-- the escape hatch, you rebind 'default_pitch' itself to hook the pitch
-- evaluation.
default_pitch :: Expr.Symbol
default_pitch :: Symbol
default_pitch = Symbol
"PITCH"

null_note :: Expr.Symbol
null_note :: Symbol
null_note = Symbol
""

-- | Call used by the infix @=@ syntax.
equal :: Expr.Symbol
equal :: Symbol
equal = Symbol
"="

mute :: Expr.Symbol
mute :: Symbol
mute = Symbol
"m"

-- | Cause notes to be stronger or weaker.
accent, weak :: Expr.Symbol
accent :: Symbol
accent = Symbol
"v"
weak :: Symbol
weak = Symbol
"^"