module Csound.Typed.Opcode.Miscellaneous ( fareylen, fareyleni, modmatrix, pwd, system_i, system, tableshuffle, tableshufflei) where import Control.Applicative import Control.Monad.Trans.Class import Csound.Dynamic import Csound.Typed -- -- | -- returns the length of a Farey Sequence. -- -- This opcode can be used in conjunction with GENfarey. -- It calculates the length of Farey Sequence Fn. Its length is given by: -- |Fn| = 1 + SUM over n phi(m) -- where phi(m) is Euler's totient function, which gives the number of integers ≤ m that are coprime to m. -- -- > kfl fareylen kfn -- -- csound doc: fareylen :: Tab -> Sig fareylen b1 = Sig $ f <$> unTab b1 where f a1 = opcs "fareylen" [(Kr,[Kr])] [a1] -- | -- returns the length of a Farey Sequence. -- -- This opcode can be used in conjunction with GENfarey. -- It calculates the length of Farey Sequence Fn. Its length is given by: -- |Fn| = 1 + SUM over n phi(m) -- where phi(m) is Euler's totient function, which gives the number of integers ≤ m that are coprime to m. -- -- > ifl fareyleni ifn -- -- csound doc: fareyleni :: Tab -> D fareyleni b1 = D $ f <$> unTab b1 where f a1 = opcs "fareyleni" [(Ir,[Ir])] [a1] -- | -- Modulation matrix opcode with optimizations for sparse matrices. -- -- The opcode can be used to let a large number of k-rate modulator -- variables modulate a large number of k-rate parameter variables, -- with arbitrary scaling of each modulator-to-parameter -- connection. Csound ftables are used to hold both the input -- (parameter) variables, the modulator variables, and the scaling -- coefficients. Output variables are written to another Csound ftable. -- -- > modmatrix iresfn, isrcmodfn, isrcparmfn, imodscale, inum_mod, \\ -- > inum_parm, kupdate -- -- csound doc: modmatrix :: Tab -> Tab -> Tab -> D -> D -> D -> Sig -> SE () modmatrix b1 b2 b3 b4 b5 b6 b7 = SE $ (depT_ =<<) $ lift $ f <$> unTab b1 <*> unTab b2 <*> unTab b3 <*> unD b4 <*> unD b5 <*> unD b6 <*> unSig b7 where f a1 a2 a3 a4 a5 a6 a7 = opcs "modmatrix" [(Xr,[Ir,Ir,Ir,Ir,Ir,Ir,Kr])] [a1 ,a2 ,a3 ,a4 ,a5 ,a6 ,a7] -- | -- Asks the underlying operating system for the current directory -- name as a string. -- -- pwd call the operating system to determine -- the current directory (folder). pwd runs -- at i-time only. -- -- > Sres pwd   -- -- csound doc: pwd :: Str pwd = Str $ return $ f where f = opcs "pwd" [(Sr,[])] [] -- | -- Call an external program via the system call -- -- system and system_i call -- any external command understood by the operating system, similarly -- to the C function system(). system_i runs -- at i-time only, while -- system runs both at initialization and -- performance time. -- -- > ires system_i itrig, Scmd, [inowait] -- -- csound doc: system_i :: D -> Str -> D system_i b1 b2 = D $ f <$> unD b1 <*> unStr b2 where f a1 a2 = opcs "system_i" [(Ir,[Ir,Sr,Ir])] [a1,a2] -- | -- Call an external program via the system call -- -- system and system_i call -- any external command understood by the operating system, similarly -- to the C function system(). system_i runs -- at i-time only, while -- system runs both at initialization and -- performance time. -- -- > kres system ktrig, Scmd, [knowait] -- -- csound doc: system :: Sig -> Str -> Sig system b1 b2 = Sig $ f <$> unSig b1 <*> unStr b2 where f a1 a2 = opcs "system" [(Kr,[Kr,Sr,Kr])] [a1,a2] -- | -- shuffles the content of a function table so that each element of the source -- table is put into a different random position. -- -- This opcode can be used in order to shuffle the content of -- function tables into a random order but without loosing any of -- the elements. Imagine shuffling a deck of cards. Each element of -- the table is copied to a different random position. If that -- position was already chosen before then the next free position -- is chosen. The length of the table remains the same. -- -- > tableshuffle ktablenum -- -- csound doc: tableshuffle :: Sig -> SE () tableshuffle b1 = SE $ (depT_ =<<) $ lift $ f <$> unSig b1 where f a1 = opcs "tableshuffle" [(Xr,[Kr])] [a1] -- | -- shuffles the content of a function table so that each element of the source -- table is put into a different random position. -- -- This opcode can be used in order to shuffle the content of -- function tables into a random order but without loosing any of -- the elements. Imagine shuffling a deck of cards. Each element of -- the table is copied to a different random position. If that -- position was already chosen before then the next free position -- is chosen. The length of the table remains the same. -- -- > tableshufflei itablenum -- -- csound doc: tableshufflei :: D -> SE () tableshufflei b1 = SE $ (depT_ =<<) $ lift $ f <$> unD b1 where f a1 = opcs "tableshufflei" [(Xr,[Ir])] [a1]