-- | Instruments from Csound amsterdam catalog by Jean-Claude Risset
module Csound.Catalog.Wave.Amsterdam(
    tibetan        
) where

import Csound.Base

-- | Tibetan chant. It's a chorus of many sinusoids.
--
-- > tibetan n off cps
--
-- * n - the number of sinusoids (the best is 9)
--
-- * off - frequency step of the harmonics ~ (0.01, 0.03)
-- 
-- * cps - the frequency of the note
tibetan :: Int -> Sig -> Sig -> Sig
tibetan :: Int -> Sig -> Sig -> Sig
tibetan Int
n Sig
off Sig
cps = Int -> Sig -> (Sig -> Sig) -> Sig -> Sig
chorusPitch Int
n (Sig
2 Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Sig
off Sig -> Sig -> Sig
forall a. Num a => a -> a -> a
* Int -> Sig
forall a b. (Integral a, Num b) => a -> b
fromIntegral Int
n) (Tab -> Sig -> Sig
oscBy Tab
wave) Sig
cps
    where wave :: Tab
wave = BoolD -> Tab -> Tab -> Tab
forall a bool. (IfB a, bool ~ BooleanOf a) => bool -> a -> a -> a
ifB ((Sig -> D
ir Sig
cps) D -> D -> BooleanOf D
forall a. OrdB a => a -> a -> BooleanOf a
`lessThan` D
230) (Int -> Tab
waveBy Int
5) (BoolD -> Tab -> Tab -> Tab
forall a bool. (IfB a, bool ~ BooleanOf a) => bool -> a -> a -> a
ifB ((Sig -> D
ir Sig
cps) D -> D -> BooleanOf D
forall a. OrdB a => a -> a -> BooleanOf a
`lessThan` D
350) (Int -> Tab
waveBy Int
3) (Int -> Tab
waveBy Int
1))
          waveBy :: Int -> Tab
waveBy Int
x = [PartialStrength] -> Tab
sines ([PartialStrength] -> Tab) -> [PartialStrength] -> Tab
forall a b. (a -> b) -> a -> b
$ [PartialStrength
0.3, PartialStrength
0, PartialStrength
0, PartialStrength
0] [PartialStrength] -> [PartialStrength] -> [PartialStrength]
forall a. [a] -> [a] -> [a]
++ Int -> PartialStrength -> [PartialStrength]
forall a. Int -> a -> [a]
replicate Int
x PartialStrength
0.1