module Csound.Typed.Opcode.PitchConverters (
    
    
    -- * Functions.
    cent, cpsmidinn, cpsoct, cpspch, ftom, mtof, mton, ntom, octave, octcps, octmidinn, octpch, pchmidinn, pchoct, pchtom, semitone,
    
    -- * Tuning Opcodes.
    cps2pch, cpstun, cpstuni, cpsxpch) where

import Csound.Dynamic
import Csound.Typed

-- Functions.

-- | 
-- Calculates a factor to raise/lower a frequency by a given amount of cents.
--
-- >  cent (x) 
--
-- csound doc: <http://csound.com/docs/manual/cent.html>
cent :: SigOrD a => a -> a
cent :: forall a. SigOrD a => a -> a
cent a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1 Name
"cent" E
a1

-- | 
-- Converts a Midi note number value to cycles-per-second.
--
-- >  cpsmidinn  (MidiNoteNumber)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/cpsmidinn.html>
cpsmidinn :: SigOrD a => a -> a
cpsmidinn :: forall a. SigOrD a => a -> a
cpsmidinn a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"cpsmidinn" E
a1

-- | 
-- Converts an octave-point-decimal value to cycles-per-second.
--
-- >  cpsoct  (oct)  (no rate restriction)
--
-- csound doc: <http://csound.com/docs/manual/cpsoct.html>
cpsoct :: SigOrD a => a -> a
cpsoct :: forall a. SigOrD a => a -> a
cpsoct a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1 Name
"cpsoct" E
a1

-- | 
-- Converts a pitch-class value to cycles-per-second.
--
-- >  cpspch  (pch)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/cpspch.html>
cpspch :: SigOrD a => a -> a
cpspch :: forall a. SigOrD a => a -> a
cpspch a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"cpspch" E
a1

-- | 
-- Convert frequency to midi
--
-- Convert frequency to midi note number, taking global value
-- 	  of A4 into account.
--
-- > imidi  ftom  ifreq
-- > kmidi  ftom  kfreq
--
-- csound doc: <http://csound.com/docs/manual/ftom.html>
ftom ::  D -> Sig
ftom :: D -> Sig
ftom D
b1 = GE E -> Sig
Sig (GE E -> Sig) -> GE E -> Sig
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D -> GE E
unD D
b1
    where f :: E -> E
f E
a1 = Name -> Spec1 -> [E] -> E
opcs Name
"ftom" [(Rate
Ir,[Rate
Ir]),(Rate
Kr,[Rate
Kr])] [E
a1]

-- | 
-- Convert a midi to frequency
--
-- Convert a midi note number value to cycles per second, taking
-- 	  global value of A4 into account.
--
-- > ifreq  mtof  imidi
-- > kfreq  mtof  kmidi
--
-- csound doc: <http://csound.com/docs/manual/mtof.html>
mtof ::  D -> Sig
mtof :: D -> Sig
mtof D
b1 = GE E -> Sig
Sig (GE E -> Sig) -> GE E -> Sig
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D -> GE E
unD D
b1
    where f :: E -> E
f E
a1 = Name -> Spec1 -> [E] -> E
opcs Name
"mtof" [(Rate
Ir,[Rate
Ir]),(Rate
Kr,[Rate
Kr])] [E
a1]

-- | 
-- Convert midi note number to string note name
--
-- Convert midi note number to string note name, with an accuracy
-- 	  of 1 cent.
--
-- > Snote  mton  kmidi
-- > Snote  mton  imidi
--
-- csound doc: <http://csound.com/docs/manual/mton.html>
mton ::  Sig -> Str
mton :: Sig -> Str
mton Sig
b1 = GE E -> Str
Str (GE E -> Str) -> GE E -> Str
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sig -> GE E
unSig Sig
b1
    where f :: E -> E
f E
a1 = Name -> Spec1 -> [E] -> E
opcs Name
"mton" [(Rate
Sr,[Rate
Kr]),(Rate
Sr,[Rate
Ir])] [E
a1]

-- | 
-- Convert note name to midi note number
--
-- Convert note name to midi note number. It allows note name to
-- 	  include microtones or a deviation in cents.
--
-- > kmidi  ntom  Snote
-- > imidi  ntom  Snote
--
-- csound doc: <http://csound.com/docs/manual/ntom.html>
ntom ::  Str -> D
ntom :: Str -> D
ntom Str
b1 = GE E -> D
D (GE E -> D) -> GE E -> D
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Str -> GE E
unStr Str
b1
    where f :: E -> E
f E
a1 = Name -> Spec1 -> [E] -> E
opcs Name
"ntom" [(Rate
Kr,[Rate
Sr]),(Rate
Ir,[Rate
Sr])] [E
a1]

-- | 
-- Calculates a factor to raise/lower a frequency by a given amount of octaves.
--
-- >  octave (x)
--
-- csound doc: <http://csound.com/docs/manual/octave.html>
octave :: SigOrD a => a -> a
octave :: forall a. SigOrD a => a -> a
octave a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1 Name
"octave" E
a1

-- | 
-- Converts a cycles-per-second value to octave-point-decimal.
--
-- >  octcps  (cps)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/octcps.html>
octcps :: SigOrD a => a -> a
octcps :: forall a. SigOrD a => a -> a
octcps a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"octcps" E
a1

-- | 
-- Converts a Midi note number value to octave-point-decimal.
--
-- >  octmidinn  (MidiNoteNumber)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/octmidinn.html>
octmidinn :: SigOrD a => a -> a
octmidinn :: forall a. SigOrD a => a -> a
octmidinn a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"octmidinn" E
a1

-- | 
-- Converts a pitch-class value to octave-point-decimal.
--
-- >  octpch  (pch)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/octpch.html>
octpch :: SigOrD a => a -> a
octpch :: forall a. SigOrD a => a -> a
octpch a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"octpch" E
a1

-- | 
-- Converts a Midi note number value to octave point pitch-class units.
--
-- >  pchmidinn  (MidiNoteNumber)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/pchmidinn.html>
pchmidinn :: SigOrD a => a -> a
pchmidinn :: forall a. SigOrD a => a -> a
pchmidinn a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"pchmidinn" E
a1

-- | 
-- Converts an octave-point-decimal value to pitch-class.
--
-- >  pchoct  (oct)  (init- or control-rate args only)
--
-- csound doc: <http://csound.com/docs/manual/pchoct.html>
pchoct :: SigOrD a => a -> a
pchoct :: forall a. SigOrD a => a -> a
pchoct a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1k Name
"pchoct" E
a1

-- | 
-- Convert pch to midi note number
--
-- Convert pch to midi note number. pch representation has the form
-- 	  Octave.pitchclass,
-- 	  pitchclass being a number between 00 and 12.
--
-- > imidi  pchtom  ipch
-- > kmidi  pchtom  kpch
--
-- csound doc: <http://csound.com/docs/manual/pchtom.html>
pchtom ::  D -> Sig
pchtom :: D -> Sig
pchtom D
b1 = GE E -> Sig
Sig (GE E -> Sig) -> GE E -> Sig
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D -> GE E
unD D
b1
    where f :: E -> E
f E
a1 = Name -> Spec1 -> [E] -> E
opcs Name
"pchtom" [(Rate
Ir,[Rate
Ir]),(Rate
Kr,[Rate
Kr])] [E
a1]

-- | 
-- Calculates a factor to raise/lower a frequency by a given amount of semitones.
--
-- >  semitone (x)
--
-- csound doc: <http://csound.com/docs/manual/semitone.html>
semitone :: SigOrD a => a -> a
semitone :: forall a. SigOrD a => a -> a
semitone a
b1 = GE E -> a
forall a. Val a => GE E -> a
fromGE (GE E -> a) -> GE E -> a
forall a b. (a -> b) -> a -> b
$ E -> E
f (E -> E) -> GE E -> GE E
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> a -> GE E
forall a. Val a => a -> GE E
toGE a
b1
    where f :: E -> E
f E
a1 = Name -> E -> E
opr1 Name
"semitone" E
a1

-- Tuning Opcodes.

-- | 
-- Converts a pitch-class value into cycles-per-second (Hz) for equal divisions of the octave.
--
-- > icps  cps2pch  ipch, iequal
--
-- csound doc: <http://csound.com/docs/manual/cps2pch.html>
cps2pch ::  D -> D -> D
cps2pch :: D -> D -> D
cps2pch D
b1 D
b2 = GE E -> D
D (GE E -> D) -> GE E -> D
forall a b. (a -> b) -> a -> b
$ E -> E -> E
f (E -> E -> E) -> GE E -> GE (E -> E)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D -> GE E
unD D
b1 GE (E -> E) -> GE E -> GE E
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D -> GE E
unD D
b2
    where f :: E -> E -> E
f E
a1 E
a2 = Name -> Spec1 -> [E] -> E
opcs Name
"cps2pch" [(Rate
Ir,[Rate
Ir,Rate
Ir])] [E
a1,E
a2]

-- | 
-- Returns micro-tuning values at k-rate.
--
-- > kcps  cpstun  ktrig, kindex, kfn
--
-- csound doc: <http://csound.com/docs/manual/cpstun.html>
cpstun ::  Sig -> Sig -> Tab -> Sig
cpstun :: Sig -> Sig -> Tab -> Sig
cpstun Sig
b1 Sig
b2 Tab
b3 = GE E -> Sig
Sig (GE E -> Sig) -> GE E -> Sig
forall a b. (a -> b) -> a -> b
$ E -> E -> E -> E
f (E -> E -> E -> E) -> GE E -> GE (E -> E -> E)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Sig -> GE E
unSig Sig
b1 GE (E -> E -> E) -> GE E -> GE (E -> E)
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Sig -> GE E
unSig Sig
b2 GE (E -> E) -> GE E -> GE E
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b3
    where f :: E -> E -> E -> E
f E
a1 E
a2 E
a3 = Name -> Spec1 -> [E] -> E
opcs Name
"cpstun" [(Rate
Kr,[Rate
Kr,Rate
Kr,Rate
Kr])] [E
a1,E
a2,E
a3]

-- | 
-- Returns micro-tuning values at init-rate.
--
-- > icps  cpstuni  index, ifn
--
-- csound doc: <http://csound.com/docs/manual/cpstuni.html>
cpstuni ::  D -> Tab -> D
cpstuni :: D -> Tab -> D
cpstuni D
b1 Tab
b2 = GE E -> D
D (GE E -> D) -> GE E -> D
forall a b. (a -> b) -> a -> b
$ E -> E -> E
f (E -> E -> E) -> GE E -> GE (E -> E)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D -> GE E
unD D
b1 GE (E -> E) -> GE E -> GE E
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Tab -> GE E
unTab Tab
b2
    where f :: E -> E -> E
f E
a1 E
a2 = Name -> Spec1 -> [E] -> E
opcs Name
"cpstuni" [(Rate
Ir,[Rate
Ir,Rate
Ir])] [E
a1,E
a2]

-- | 
-- Converts a pitch-class value into cycles-per-second (Hz) for equal divisions of any interval.
--
-- Converts a pitch-class value into cycles-per-second (Hz) for equal divisions of any interval. There is a restriction of no more than 100 equal divisions.
--
-- > icps  cpsxpch  ipch, iequal, irepeat, ibase
--
-- csound doc: <http://csound.com/docs/manual/cpsxpch.html>
cpsxpch ::  D -> D -> D -> D -> D
cpsxpch :: D -> D -> D -> D -> D
cpsxpch D
b1 D
b2 D
b3 D
b4 = GE E -> D
D (GE E -> D) -> GE E -> D
forall a b. (a -> b) -> a -> b
$ E -> E -> E -> E -> E
f (E -> E -> E -> E -> E) -> GE E -> GE (E -> E -> E -> E)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> D -> GE E
unD D
b1 GE (E -> E -> E -> E) -> GE E -> GE (E -> E -> E)
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D -> GE E
unD D
b2 GE (E -> E -> E) -> GE E -> GE (E -> E)
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D -> GE E
unD D
b3 GE (E -> E) -> GE E -> GE E
forall a b. GE (a -> b) -> GE a -> GE b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> D -> GE E
unD D
b4
    where f :: E -> E -> E -> E -> E
f E
a1 E
a2 E
a3 E
a4 = Name -> Spec1 -> [E] -> E
opcs Name
"cpsxpch" [(Rate
Ir,[Rate
Ir,Rate
Ir,Rate
Ir,Rate
Ir])] [E
a1,E
a2,E
a3,E
a4]