grain3
Prev | Opcodes et opérateurs de l'orchestre | Next

## grain3

grain3 — Générateur de textures par synthèse granulaire avec plus de contrôle.

## Description

Génère des textures par synthèse granulaire. grain2 est plus simple à utiliser mais grain3 offre plus de contrôle.

## Syntaxe

    ares grain3 kcps, kphs, kfmd, kpmd, kgdur, kdens, imaxovr, kfn, iwfn, \
          kfrpow, kprpow [, iseed] [, imode]

## Initialisation

imaxovr -- nombre maximum de grains se chevauchant. Le nombre de chevauchements peut être calculé par (kdens * kgdur) ; cependant, il peut être surestimé sans coût supplémentaire lors de l'exécution, et un simple chevauchement utilise (selon le système) de 16 à 32 octets en mémoire.

iwfn -- table de fonction contenant la forme d'onde d'une fenêtre (utiliser GEN20 pour calculer iwfn).

iseed (facultatif, par défaut 0) -- valeur de la graine du générateur de nombres aléatoires (entier positif compris entre 1 et 2147483646 (231 - 2)). Une valeur nulle ou négative force la graine à prendre la valeur de l'horloge de l'ordinateur (c'est le comportement par défaut).

imode (facultatif, par défaut 0) -- somme de valeurs prises parmi les suivantes :

- 64 : synchronise la phase au démarrage des grains sur kcps.

- 32 : démarre tous les grains sur une position d'échantillon entière. Ceci peut être plus rapide dans certains cas, tout en rendant moins précis le déroulement temporel des enveloppes de grain.

- 16 : ne pas générer de grains ayant une date de démarrage inférieure à zéro. (Voir la figure ci-dessous ; cette option désactive les grains marqués en rouge sur l'image).

- 8 : forme d'onde de la fenêtre avec interpolation (plus lent).

- 4 : pas d'interpolation pour la forme d'onde des grains (rapide, mais de moindre qualité).

- 2 : la fréquence des grains est modifiée continuellement par kcps et kfmd (par défaut, chaque grain garde la fréquence avec laquelle il a démarré). Avec des taux de contrôle élevés, ceci peut ralentir le processus. Contrôle aussi la modulation de phase (kphs)

- 1 : ignorer l'initialisation.

Graphique montrant des grains avec une date de démarrage inférieure à zéro en rouge.

## Exécution

ares -- signal de sortie.

kcps -- fréquence du grain en Hz.

kphs -- phase du grain. C'est une position dans la forme d'onde du grain, exprimée comme une fraction (entre 0 et 1) de la longueur de la table.

kfmd -- variation aléatoire (bipolaire) de la fréquence du grain en Hz.

kpmd -- variation aléatoire (bipolaire) de la phase au démarrage.

kgdur -- durée du grain en secondes. kgdur contrôle aussi la durée des grains déjà actifs (en fait la vitesse à laquelle la fonction fenêtre est lue). Ce comportement ne dépend pas des indicateurs positionnés dans imode.

kdens -- nombre de grains par seconde.

kfrpow -- cette valeur contrôle la variation de la distribution de la fréquence du grain. Si kfrpow est positif, la distribution aléatoire (x est compris entre -1 et 1) est

abs(x) ^ ((1 / kfrpow) - 1) ;

pour des valeurs négatives de kfrpow, elle est

(1 - abs(x)) ^ ((-1 / kfrpow) - 1)

En fixant kfrpow à -1, 0, ou 1 on obtiendra une distribution uniforme (dont le calcul est plus rapide). L'image ci-dessous montre quelques exemples pour kfrpow. La valeur par défaut de kfrpow est 0.

Un graphique des distributions pour différentes valeurs de kfrpow.

kprpow -- variation de la distribution de phase aléatoire (voir kfrpow). En fixant kphs et kpmd à 0.5, et kprpow à 0 on émulera grain2.

kfn -- table de fonction contenant la forme d'onde du grain. Le numéro de table peut changer au taux-k (on peut ainsi choisir parmi un ensemble de tables à bande limitée générées par GEN30, afin d'éviter le repliement).

| Note
grain3 utilise en interne le même générateur aléatoire que rnd31. Il est ainsi recommandé de lire également sa documentation.

## Exemples

Voici un exemple de l'opcode grain3. Il utilise le fichier grain3.csd.

Example 360. Exemple de l'opcode grain3.

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation des options de la ligne de commande.

    <CsoundSynthesizer>
    <CsOptions>
    ; Select audio/midi flags here according to platform
    ; Audio out   Audio in    No messages
    -odac           -iadc     -d     ;;;RT audio I/O
    ; For Non-realtime ouput leave only the line below:
    ; -o grain3.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    sr	=  48000
    kr	=  1000
    ksmps   =  48
    nchnls	=  1

    /* Bartlett window */
    itmp	ftgen 1, 0, 16384, 20, 3, 1
    /* sawtooth wave */
    itmp	ftgen 2, 0, 16384, 7, 1, 16384, -1
    /* sine */
    itmp	ftgen 4, 0, 1024, 10, 1
    /* window for "soft sync" with 1/32 overlap */
    itmp	ftgen 5, 0, 16384, 7, 0, 256, 1, 7936, 1, 256, 0, 7936, 0
    /* generate bandlimited sawtooth waves */
    itmp	ftgen 3, 0, 4096, -30, 2, 1, 2048
    icnt	=  0
    loop01:
    ; 100 tables for 8 octaves from 30 Hz
    ifrq	=  30 * exp(log(2) * 8 * icnt / 100)
    itmp	ftgen icnt + 100, 0, 4096, -30, 3, 1, sr / (2 * ifrq)
    icnt	=  icnt + 1
    	if (icnt < 99.5) igoto loop01
    /* convert frequency to table number */
    #define FRQ2FNUM(xout'xcps'xbsfn) #

    $xout	=  int(($xbsfn) + 0.5 + (100 / 8) * log(($xcps) / 30) / log(2))
    $xout	limit $xout, $xbsfn, $xbsfn + 99

    #

    /* instr 1: pulse width modulated grains */

    	instr 1

    kfrq	=  523.25		; frequency
    $FRQ2FNUM(kfnum'kfrq'100)	; table number
    kfmd	=  kfrq * 0.02		; random variation in frequency
    kgdur	=  0.2			; grain duration
    kdens	=  200			; density
    iseed	=  1			; random seed

    kphs	oscili 0.45, 1, 4	; phase

    a1	grain3	kfrq, 0, kfmd, 0.5, kgdur, kdens, 100,		\
    		kfnum, 1, -0.5, 0, iseed, 2
    a2	grain3	kfrq, 0.5 + kphs, kfmd, 0.5, kgdur, kdens, 100,	\
    		kfnum, 1, -0.5, 0, iseed, 2

    ; de-click
    aenv	linseg 0, 0.01, 1, p3 - 0.05, 1, 0.04, 0, 1, 0

    	out aenv * 2250 * (a1 - a2)

    	endin

    /* instr 2: phase variation */

    	instr 2

    kfrq	=  220			; frequency
    $FRQ2FNUM(kfnum'kfrq'100)	; table number
    kgdur	=  0.2			; grain duration
    kdens	=  200			; density
    iseed	=  2			; random seed

    kprdst	expon 0.5, p3, 0.02	; distribution

    a1	grain3	kfrq, 0.5, 0, 0.5, kgdur, kdens, 100,		\
    		kfnum, 1, 0, -kprdst, iseed, 64

    ; de-click
    aenv	linseg 0, 0.01, 1, p3 - 0.05, 1, 0.04, 0, 1, 0

    	out aenv * 1500 * a1

    	endin

    /* instr 3: "soft sync" */

    	instr 3

    kdens	=  130.8		; base frequency
    kgdur	=  2 / kdens		; grain duration

    kfrq	expon 880, p3, 220	; oscillator frequency
    $FRQ2FNUM(kfnum'kfrq'100)	; table number

    a1	grain3 kfrq, 0, 0, 0, kgdur, kdens, 3, kfnum, 5, 0, 0, 0, 2
    a2	grain3 kfrq, 0.667, 0, 0, kgdur, kdens, 3, kfnum, 5, 0, 0, 0, 2

    ; de-click
    aenv	linseg 0, 0.01, 1, p3 - 0.05, 1, 0.04, 0, 1, 0

    	out aenv * 10000 * (a1 - a2)

    	endin

    </CsInstruments>
    <CsScore>

    t 0 60
    i 1 0 3
    i 2 4 3
    i 3 8 3
    e

    </CsScore>
    </CsoundSynthesizer>

## Voir aussi

grain2

## Crédits

Auteur : Istvan Varga

Nouveau dans la version 4.15

Mise à jour en avril 2002 par Istvan Varga

Prev | Up | Next
grain2 | Home | granule