bpfcos — Fonction à points charnière avec interpolation par cosinus (transitions douces).
Opcode du greffon emugens.
Fonction à points charnière avec interpolation par cosinus. Etant données une valeur x et une série de paires (x, y), elle retourne la valeur de y correspondante dans la courbe du demi-cosinus définie par les paires. Fonctionne au taux-i ainsi qu'au taux-k.
ky bpfcos kx, kx1, ky1, kx2, ..., kxn, kyn
kys[] bpfcos kxs[], kx1, ky1, kx2, ..., kxn, kyn
ky bpfcos kx, kxs[], kys[]
ky bpfcos kx, ixs[], iys[]
ky, kz bpfcos kx, kxs[], kys[], kzs[]
ky, kz bpfcos kx, ixs[], iys[], izs[]
kx -- Valeur en entrée. Peut également être un tableau.
kxn, kyn -- Définit un point charnière. Peut changer au taux-k, mais tous les kxs doivent être ordonnés.
Les points (kx1, ky1), (kx2, ky2), etc, définissent une fonction interpolée par cosinus. Cette fonction est évaluée au point kx. Cette fonction s'étend à la fois ver -inf et +inf, si bien que si kx < kx1 alors ky = ky1 et pareillement à l'autre extrémité.
kys[] bpfcos kxs[], kx1, ky1, kx2, ..., kxn, kyn
Pour chaque x dans kxs, la valeur y définié par les points (kx1, ky1), ... (kxn, kyn) est calculée.
ky bpfcos kx, ixs[], iys[]
Dans cette variante les points sont définis par des tableaux. ixs contient toutes les valeurs de x, iys contient toutes les valeurs de y.
ky, kz bpfcos kx, kxs[], kys[], kzs[]
Semblable à la variante ci-dessus, mais pour des points multidimensionnels. Etant données deux courbes partageant les mêmes points x, calcule la valeur pour x dans les deux dimensions simultanément. (Voir exemple)
Note | |
---|---|
Les valeurs x doivent être triées. Les valeurs x et les valeurs y peuvent changer mais les valeurs x doivent rester triées. |
Voici un exemple de l'opcode bpfcos. Il utilise le fichier bpfcos.csd.
Exemple 108. Exemple de l'opcode bpfcos.
<CsoundSynthesizer> <CsOptions> -odac </CsOptions> <CsInstruments> ; Example for opcode bpfcos /* bpf stands for Break Point Function Given an x value and a series of pairs (x, y), it returns the corresponding y value in the half cosine curve defined by the pairs It works both at i- and k- time ky bpfcos kx, kx0, ky0, kx1, ky1, kx2, ky2, ... kys[] bpfcos kxs[], kx0, ky0, kx1, ky1, kx2, ky2, ... ky bpfcos kx, kxs[], kys[] ky, kz bpfcos kx, kxs[], kys[], kzs[] NB: x values must be ordered (kx0 < kx1 < kx2 etc) See also: bpf, linlin, lincos */ sr = 44100 ksmps = 64 nchnls = 1 0dbfs = 1 instr 1 kx line -1, p3, 2.5 ky bpfcos kx, \ 0, 0, \ 1.01, 10, \ 2, 0.5, \ 2.5, -1 printks "kx: %f ky: %f \n", 0.1, kx, ky endin instr 2 ; test i-time ix = 1.2 iy bpfcos ix, 0,0, 0.5,5, 1,10, 1.5,15, 2,20, 2.5,25, 3,30 print iy turnoff endin instr 3 ; bpfcos also works with arrays. For each kx value in kxs, ; calculate the corresponding ky kxs[] fillarray 0, 0.15, 0.25, 0.35, 0.45, 0.55, 0.6 kys[] bpfcos kxs, 0,0, 0.1,10, 0.2,20, 0.3,30, 0.4,40, 0.5,50 printarray kys, 1, "", "kys=" turnoff endin instr 4 ; bpfcos is useful to implement envelopes with ease-in/out shape kpitch bpfcos timeinsts(), 0, 60, 2, 61, 3, 65, 3.5, 60 a0 oscili 0.5, mtof(kpitch) kenv0 linseg 0, 0.5, 1, p3-1, 1, 0.5, 0 kenv bpfcos kenv0, 0, 0, 0.5, 0.25, 1, 0.7 a0 *= interp(kenv) outch 1, a0 endin instr 5 ; arrays can also be used to define the points of a break-point-function ; multiple arrays can be used simultaneously ; In this case, we define a line and for each point in the line a ; corresponding pitch (midinote) and amplitude ; NB: kTimes uses absolute times kTimes[] fillarray 0, 1, 1.5, 2, 3, 5 kPitches[] fillarray 60, 65, 64, 69, 60, 61 kAmps[] fillarray 0, 1, 0.1, 1, 0.1, 1 ; play the envelopes at half speed kpitch, kamp bpfcos timeinsts()*0.5, kTimes, kPitches, kAmps aout oscili a(kamp), a(mtof:k(kpitch)) ; declick aout *= linsegr(0, 0.1, 1, 0.1, 0) outch 1, aout endin </CsInstruments> <CsScore> ; i 1 1 3 ; i 2 0 -1 ; i 3 0 -1 ; i 4 0 5 i 5 0 10 e 12 </CsScore> </CsoundSynthesizer>