module Csound.Catalog.Reson(
Reson,
anO, anA, anE, anIY, anO2, wow,
strikeModes, scrapeModes, modesInstr, wetModesInstr,
strike, scrape, simpleStrike, simpleScrape,
Modes(..), fromModes,
singleModes, dahinaModes, banyanModes, xylophoneModes, tibetanBowlModes180,
spinelSphereModes, potLidModes, redCedarWoodPlateModes,
tubularBellModes, redwoodPlateModes, douglasFirWoodPlateModes,
uniformWoodenBarModes, uniformAluminumBarModes, vibraphoneModes1,
vibraphoneModes2, chalandiPlatesModes, tibetanBowlModes152,
tibetanBowlModes140, wineGlassModes, smallHandbellModes,
albertClockBellBelfastModes, woodBlockModes
) where
import Csound.Base
type Reson = [(Sig, Sig)]
anO, anA, anE, anIY, anO2 :: Reson
anO = [(280, 20), (650, 25), (2200, 30), (3450, 40), (4500, 50)]
anA = [(650, 50), (1100, 50), (2860, 50), (3300, 50), (4500, 50)]
anE = [(500, 50), (1750, 50), (2450, 50), (3350, 50), (5000, 50)]
anIY = [(330, 50), (2000, 50), (2800, 50), (3650, 50), (5000, 50)]
anO2 = [(400, 50), (840, 50), (2800, 50), (3250, 50), (4500, 50)]
wow :: Sig -> Reson -> Reson
wow kmod = fmap $ \(a, b) -> (a + kmod, b)
strikeModes :: Modes Sig -> Sig -> Sig
strikeModes ms cps = modesInstr ms (blp cps simpleStrike) cps
scrapeModes :: Modes Sig -> Sig -> SE Sig
scrapeModes ms cps = fmap (\exciter -> modesInstr ms exciter cps) simpleScrape
modesInstr :: Modes Sig -> Sig -> Sig -> Sig
modesInstr = wetModesInstr 0.1
wetModesInstr :: D -> Modes Sig -> Sig -> Sig -> Sig
wetModesInstr dryRatio ms exciter cps
= (modesGain ms * )
$ dryWet (sig dryRatio) (modes (fromModes ms) cps) exciter
simpleStrike :: Sig
simpleStrike = mpulse 1 0
strike :: D -> SE Sig
strike dt' = do
onHighDur <- noise 1 0
onNormDur <- noise (osciln 1 (1 / dt) decayShape 1) 0
return $ guardedTuple
[ (sig dt <* 0.001, onLowDur)
, (sig dt >=* 1, onHighDur)
] onNormDur
where
onLowDur = mpulse 1 0
decayShape = estartEnds [1, 0.002, 0]
dt = maxB dt' 0.00001
simpleScrape :: SE Sig
simpleScrape = scrape 5000 50
scrape :: Sig -> Sig -> SE Sig
scrape lpCps hpCps = fmap (bhp hpCps . blp lpCps) $ pinkish 0.005
data Modes a = Modes
{ modesFrequencies :: [a]
, modesQualityFactor :: a
, modesQualityRatios :: [a]
, modesGain :: a }
fromModes :: Num a => Modes a -> [(a, a)]
fromModes a = zip (modesFrequencies a) (fmap (modesQualityFactor a * ) $ modesQualityRatios a)
singleModes, dahinaModes, banyanModes, xylophoneModes, tibetanBowlModes180, spinelSphereModes,
potLidModes, redCedarWoodPlateModes, tubularBellModes, redwoodPlateModes, douglasFirWoodPlateModes,
uniformWoodenBarModes, uniformAluminumBarModes, vibraphoneModes1, vibraphoneModes2, chalandiPlatesModes,
tibetanBowlModes152, tibetanBowlModes140, wineGlassModes, smallHandbellModes, albertClockBellBelfastModes,
woodBlockModes :: Fractional a => Modes a
singleModes = Modes
{ modesFrequencies = [1, 1]
, modesQualityFactor = 1000
, modesQualityRatios = repeat 1
, modesGain = 15 }
dahinaModes = Modes
{ modesFrequencies = [1, 2.89, 4.95, 6.99, 8.01, 9.02]
, modesQualityFactor = 50
, modesQualityRatios = repeat 1
, modesGain = 15 }
banyanModes = Modes
{ modesFrequencies = [1, 2.0, 3.01, 4.01, 4.69, 5.63]
, modesQualityFactor = 444
, modesQualityRatios = repeat 1
, modesGain = 15 }
xylophoneModes = Modes
{ modesFrequencies = [1, 3.932, 9.538, 16.688, 24.566, 31.147]
, modesQualityFactor = 200
, modesQualityRatios = repeat 1
, modesGain = 15 }
tibetanBowlModes180 = Modes
{ modesFrequencies = [1, 2.77828, 5.18099, 8.16289, 11.66063, 15.63801, 19.99]
, modesQualityFactor = 2200
, modesQualityRatios = repeat 1
, modesGain = 15 }
spinelSphereModes = Modes
{ modesFrequencies =
[1, 1.026513174725, 1.4224916858532, 1.4478690202098, 1.4661959580455
, 1.499452545408, 1.7891839345101, 1.8768994627782, 1.9645945254541
, 1.9786543873113, 2.0334612432847, 2.1452852391916, 2.1561524686621
, 2.2533435661294, 2.2905090816065, 2.3331798413917, 2.4567715528268
, 2.4925556408289, 2.5661806088514, 2.6055768738808, 2.6692760296751
, 2.7140956766436, 2.7543617293425, 2.7710411870043
]
, modesQualityFactor = 80
, modesQualityRatios = repeat 1
, modesGain = 15 }
potLidModes = Modes
{ modesFrequencies = [ 1, 3.2, 6.23, 6.27, 9.92, 14.15 ]
, modesQualityFactor = 1500
, modesQualityRatios = repeat 1
, modesGain = 15 }
redCedarWoodPlateModes = Modes
{ modesFrequencies = [ 1, 1.47, 2.09, 2.56 ]
, modesQualityFactor = 100
, modesQualityRatios = repeat 1
, modesGain = 15 }
tubularBellModes = Modes
{ modesFrequencies = [ 272/437, 538/437, 874/437, 1281/437, 1755/437, 2264/437, 2813/437, 3389/437, 4822/437, 5255/437 ]
, modesQualityFactor = 2000
, modesQualityRatios = repeat 1
, modesGain = 15 }
redwoodPlateModes = Modes
{ modesFrequencies = [ 1, 1.47, 2.11, 2.57 ]
, modesQualityFactor = 100
, modesQualityRatios = repeat 1
, modesGain = 15 }
douglasFirWoodPlateModes = Modes
{ modesFrequencies = [ 1, 1.42, 2.11, 2.47 ]
, modesQualityFactor = 100
, modesQualityRatios = repeat 1
, modesGain = 15 }
uniformWoodenBarModes = Modes
{ modesFrequencies = [ 1, 2.572, 4.644, 6.984, 9.723, 12 ]
, modesQualityFactor = 300
, modesQualityRatios = repeat 1
, modesGain = 15 }
uniformAluminumBarModes = Modes
{ modesFrequencies = [1, 2.756, 5.423, 8.988, 13.448, 18.680 ]
, modesQualityFactor = 1000
, modesQualityRatios = repeat 1
, modesGain = 15 }
vibraphoneModes1 = Modes
{ modesFrequencies = [1, 3.984, 10.668, 17.979, 23.679, 33.642]
, modesQualityFactor = 2000
, modesQualityRatios = repeat 1
, modesGain = 15 }
vibraphoneModes2 = Modes
{ modesFrequencies = [1, 3.997, 9.469, 15.566, 20.863, 29.440]
, modesQualityFactor = 2000
, modesQualityRatios = repeat 1
, modesGain = 15 }
chalandiPlatesModes = Modes
{ modesFrequencies = [1, 1.72581, 5.80645, 7.41935, 13.91935]
, modesQualityFactor = 500
, modesQualityRatios = repeat 1
, modesGain = 15 }
tibetanBowlModes152 = Modes
{ modesFrequencies = [1, 2.66242, 4.83757, 7.51592, 10.64012, 14.21019, 18.14027]
, modesQualityFactor = 2200
, modesQualityRatios = repeat 1
, modesGain = 15 }
tibetanBowlModes140 = Modes
{ modesFrequencies = [1, 2.76515, 5.12121, 7.80681, 10.78409]
, modesQualityFactor = 2200
, modesQualityRatios = repeat 1
, modesGain = 15 }
wineGlassModes = Modes
{ modesFrequencies = [1, 2.32, 4.25, 6.63, 9.38]
, modesQualityFactor = 1500
, modesQualityRatios = repeat 1
, modesGain = 15 }
smallHandbellModes = Modes
{ modesFrequencies =
[ 1, 1.0019054878049, 1.7936737804878, 1.8009908536585, 2.5201981707317
, 2.5224085365854, 2.9907012195122, 2.9940548780488, 3.7855182926829
, 3.8061737804878, 4.5689024390244, 4.5754573170732, 5.0296493902439
, 5.0455030487805, 6.0759908536585, 5.9094512195122, 6.4124237804878
, 6.4430640243902, 7.0826219512195, 7.0923780487805, 7.3188262195122
, 7.5551829268293
]
, modesQualityFactor = 2500
, modesQualityRatios = repeat 1
, modesGain = 15 }
albertClockBellBelfastModes = Modes
{ modesFrequencies =
[ 2.043260,1.482916,1.000000,3.328848,4.761811,1.477056,0.612007
,2.661295,1.002793,4.023776,0.254139,2.043916,4.032463,2.659438
,4.775560,5.500494,3.331014,0.809697,2.391301, 0.254098,1.901476,2.366563
]
, modesQualityFactor = 2400
, modesQualityRatios = repeat 1
, modesGain = 15 }
woodBlockModes = Modes
{ modesFrequencies = [915/915,1540/915,1863/915,3112/915]
, modesQualityFactor = 60
, modesQualityRatios = repeat 1
, modesGain = 15 }