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

## oscbnk

oscbnk — Mélange la sortie de n'importe quel nombre d'oscillateurs.

## Description

Ce générateur unitaire mélange la sortie de n'importe quel nombre d'oscillateurs. La fréquence, la phase et l'amplitude de chaque oscillateur peuvent être modulées par deux LFO (tous les oscillateurs ont un jeu de LFO séparé, avec différentes phase et fréquence) ; de plus, la sortie de chaque oscillateur peut être filtrée au travers d'un égaliseur paramétrique (aussi contrôlé par les LFO). Cet opcode trouve sa plus grande utilité dans des instruments de rendu d'ensemble (cordes, chœur, etc.).

Bien que les LFO fonctionnent au taux-k, les modulations d'amplitude, de phase et de filtrage sont interpolées en interne, et il est ainsi possible (et recommandé dans la plupart des cas) d'utiliser cette unité avec de faibles taux de contrôle (~1000 Hz) sans dégradation audible de la qualité.

La phase et la fréquence initiale de tous les oscillateurs et LFO peuvent être fixées par un générateur intégré de nombres aléatoires sur 31 bit amorçable par une “graine”, ou spécifiées manuellement dans une table de fonction (GEN2).

## Syntaxe

    ares oscbnk  kcps, kamd, kfmd, kpmd, iovrlap, iseed, kl1minf, kl1maxf, \
          kl2minf, kl2maxf, ilfomode, keqminf, keqmaxf, keqminl, keqmaxl, \
          keqminq, keqmaxq, ieqmode, kfn [, il1fn] [, il2fn] [, ieqffn]   \
          [, ieqlfn] [, ieqqfn] [, itabl] [, ioutfn]

## Initialisation

iovrlap -- Nombre d'oscillateurs.

iseed -- Valeur de la graine du générateur de nombres aléatoires (entier positif dans l'intervalle 1 à 2147483646 (2 ^ 31 - 2)). Si iseed <= 0 la graine est l'heure courante.

ieqmode -- Mode de l'égaliseur paramétrique

- -1 : désactive l'EQ (plus rapide)

- 0 : crête

- 1 : à plateau low shelf

- 2 : à plateau high shelf

- 3 : crête (filtrage sans interpolation)

- 4 : à plateau low shelf (sans interpolation)

- 5 : à plateau high shelf (sans interpolation)

Les modes sans interpolation sont plus rapides, et dans certains cas (par exemple filtre à plateau high shelf aux fréquences de coupure basses) également plus stables ; cependant, l'interpolation est utile pour éviter le “bruit de transition” aux faibles taux de contrôle.

ilfomode -- Type de la modulation par les LFO, somme de :

- 128 : LFO1 module la fréquence

- 64 : LFO1 module l'amplitude

- 32 : LFO1 module la phase

- 16 : LFO1 module l'EQ

- 8 : LFO2 module la fréquence

- 4 : LFO2 module l'amplitude

- 2 : LFO2 module la phase

- 1 : LFO2 module l'EQ

Si un LFO ne module rien, il n'est pas calculé, et le numéro de sa ftable (il1fn ou il2fn) peut être omis.

il1fn (facultatif : par défaut 0) -- Numéro de la table de fonction de LFO1. La forme d'onde dans cette table doit être normalisée (valeur absolue <= 1), et elle est lue avec une interpolation linéaire.

il2fn (facultatif : par défaut 0) -- Numéro de la table de fonction de LFO2. La forme d'onde dans cette table doit être normalisée (valeur absolue <= 1), et elle est lue avec une interpolation linéaire.

ieqffn, ieqlfn, ieqqfn (facultatif : par défaut 0) -- Tables de lecture pour la fréquence, le niveau et le Q de EQ (facultatif si EQ est désactivé). La position de lecture dans une table est 0 si le signal de modulation est inférieur ou égal à -1, (longueur de table / 2) si le signal de modulation vaut zero, et le point de garde si le signal de modulation est supérieur ou égal à 1. Ces tables doivent être normalisées dans l'intervalle 0 - 1, et ont un point de garde étendu (longueur de table = puissance de deux + 1). Toutes les tables sont lues avec une interpolation linéaire.

itabl (facultatif : par défaut 0) -- Table de fonction stockant les valeurs de phase et de fréquence pour tous les oscillateurs (facultatif). Les valeurs dans cette table sont dans l'ordre suivant (5 pour chaque oscillateur) :

phase de l'oscillateur, phase de lfo1, fréquence de lfo1, phase de lfo2, fréquence de lfo2, ...

Toutes les valeurs sont dans l'intervalle 0 à 1 ; si le nombre spécifié est supérieur à 1, il est ramené cycliquement (phase) ou limité (fréquence) à l'intérieur de l'intervalle permis. Une valeur négative (ou la fin de la table) utilisera la sortie du générateur de nombres aléatoires. La valeur aléatoire est toujours calculée (même si aucun nombre aléatoire n'est utilisé), si bien que le fait de basculer entre une valeur aléatoire et une valeur fixe n'altérera pas les autres valeurs.

ioutfn (facultatif : par défaut 0) -- Table de fonction pour écrire les valeurs de phase et de fréquence (facultatif). Le format est le même que celui de itabl. Cette table est utile lors de l'expérimentation avec des nombres aléatoires pour enregistrer les meilleures valeurs.

L'accès aux deux tables facultatives (itabl et ioutfn) n'a lieu que pendant l'initialisation. Il est utile de savoir cela, car les tables peuvent être réécrites en toute sécurité après l'initialisation de l'opcode, permettant le pré-calcul des paramètres pendant le temps-i et le stockage dans une table temporaire avant l'initialisation de oscbnk.

## Exécution

ares -- Signal de sortie.

kcps -- Fréquence de l'oscillateur en Hz.

kamd -- Profondeur de la modulation d'amplitude (0 - 1).

(sortie MA) = (entrée MA) * ((1 - (prof MA)) + (prof MA) * (modulateur))

Si ilfomode n'est pas réglé pour moduler l'amplitude, alors (sortie MA) = (entrée MA) quelque soit la valeur de kamd. Dans ce cas, kamd n'aura pas d'effet.

Note : La modulation d'amplitude est appliquée avant l'égaliseur paramétrique.

kfmd -- Profondeur de la MF (en Hz).

kpmd -- Profondeur de la modulation de phase.

kl1minf, kl1maxf -- Fréquence minimale et maximale de LFO1 en Hz.

kl2minf, kl2maxf -- Fréquence minimale et maximale de LFO2 en Hz. (Note : il est permis d'avoir des fréquences nulles ou négatives pour l'oscillateur et les LFO.)

keqminf, keqmaxf -- Fréquence minimale et maximale de l'égaliseur paramétrique en Hz.

keqminl, keqmaxl -- Niveau minimum et maximum de l'égaliseur paramétrique.

keqminq, keqmaxq -- Q minimum et maximum de l'égaliseur paramétrique.

kfn -- Table de la forme d'onde de l'oscillateur. Le numéro de la table peut être changé au taux-k (c'est utile pour choisir parmi un ensemble de tables à bande limitée générées par GEN30, afin d'éviter les erreurs de repliement). La table est lue avec une interpolation linéaire.

| Note
oscbnk utilise le même générateur de nombres aléatoires que rnd31. C'est pourquoi il est également recommandé de lire sa documentation.

## Exemples

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

Example 560. Exemple de l'opcode oscbnk.

Voir les sections Audio en Temps Réel et Options de la Ligne de Commande pour plus d'information sur l'utilisation 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 oscbnk.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    /* Written by Istvan Varga */
    sr	=  48000
    kr	=  750
    ksmps	=  64
    nchnls	=  2

    ga01	init 0
    ga02	init 0

    /* sawtooth wave */
    i_	ftgen 1, 0, 16384, 7, 1, 16384, -1
    /* FM waveform */
    i_	ftgen 3, 0, 4096, 7, 0, 512, 0.25, 512, 1, 512, 0.25, 512,	\
    			     0, 512, -0.25, 512, -1, 512, -0.25, 512, 0
    /* AM waveform */
    i_	ftgen 4, 0, 4096, 5, 1, 4096, 0.01
    /* FM to EQ */
    i_	ftgen 5, 0, 1024, 5, 1, 512, 32, 512, 1
    /* sine wave */
    i_	ftgen 6, 0, 1024, 10, 1
    /* room parameters */
    i_	ftgen 7, 0, 64, -2, 4, 50, -1, -1, -1, 11,			\
    			    1, 26.833, 0.05, 0.85, 10000, 0.8, 0.5, 2,	\
    			    1,  1.753, 0.05, 0.85,  5000, 0.8, 0.5, 2,	\
    			    1, 39.451, 0.05, 0.85,  7000, 0.8, 0.5, 2,	\
    			    1, 33.503, 0.05, 0.85,  7000, 0.8, 0.5, 2,	\
    			    1, 36.151, 0.05, 0.85,  7000, 0.8, 0.5, 2,	\
    			    1, 29.633, 0.05, 0.85,  7000, 0.8, 0.5, 2

    /* generate bandlimited sawtooth waves */

    i0	=  0
    loop1:
    imaxh	=  sr / (2 * 440.0 * exp(log(2.0) * (i0 - 69) / 12))
    i_	ftgen i0 + 256, 0, 4096, -30, 1, 1, imaxh
    i0	=  i0 + 1
    	if (i0 < 127.5) igoto loop1

    	instr 1

    p3	=  p3 + 0.4

    ; note frequency
    kcps	=  440.0 * exp(log(2.0) * (p4 - 69) / 12)
    ; lowpass max. frequency
    klpmaxf	limit 64 * kcps, 1000.0, 12000.0
    ; FM depth in Hz
    kfmd1	=  0.02 * kcps
    ; AM frequency
    kamfr	=  kcps * 0.02
    kamfr2	=  kcps * 0.1
    ; table number
    kfnum	=  (256 + 69 + 0.5 + 12 * log(kcps / 440.0) / log(2.0))
    ; amp. envelope
    aenv	linseg 0, 0.1, 1.0, p3 - 0.5, 1.0, 0.1, 0.5, 0.2, 0, 1.0, 0

    /* oscillator / left */

    a1	oscbnk kcps, 0.0, kfmd1, 0.0, 40, 200, 0.1, 0.2, 0, 0, 144,	      \
    		0.0, klpmaxf, 0.0, 0.0, 1.5, 1.5, 2,			      \
    		kfnum, 3, 0, 5, 5, 5
    a2	oscbnk kcps, 1.0, kfmd1, 0.0, 40, 201, 0.1, 0.2, kamfr, kamfr2, 148,  \
    		0, 0, 0, 0, 0, 0, -1,					      \
    		kfnum, 3, 4
    a2	pareq a2, kcps * 8, 0.0, 0.7071, 2
    a0	=  a1 + a2 * 0.12
    /* delay */
    adel	=  0.001
    a01	vdelayx a0, adel, 0.01, 16
    a_	oscili 1.0, 0.25, 6, 0.0
    adel	=  adel + 1.0 / (exp(log(2.0) * a_) * 8000)
    a02	vdelayx a0, adel, 0.01, 16
    a0	=  a01 + a02

    ga01	=  ga01 + a0 * aenv * 2500

    /* oscillator / right */

    ; lowpass max. frequency

    a1	oscbnk kcps, 0.0, kfmd1, 0.0, 40, 202, 0.1, 0.2, 0, 0, 144,	      \
    		0.0, klpmaxf, 0.0, 0.0, 1.0, 1.0, 2,			      \
    		kfnum, 3, 0, 5, 5, 5
    a2	oscbnk kcps, 1.0, kfmd1, 0.0, 40, 203, 0.1, 0.2, kamfr, kamfr2, 148,  \
    		0, 0, 0, 0, 0, 0, -1,					      \
    		kfnum, 3, 4
    a2	pareq a2, kcps * 8, 0.0, 0.7071, 2
    a0	=  a1 + a2 * 0.12
    /* delay */
    adel	=  0.001
    a01	vdelayx a0, adel, 0.01, 16
    a_	oscili 1.0, 0.25, 6, 0.25
    adel	=  adel + 1.0 / (exp(log(2.0) * a_) * 8000)
    a02	vdelayx a0, adel, 0.01, 16
    a0	=  a01 + a02

    ga02	=  ga02 + a0 * aenv * 2500

    	endin

    /* output / left */

    	instr 81

    i1	=  0.000001
    aLl, aLh, aRl, aRh	spat3di ga01 + i1*i1*i1*i1, -8.0, 4.0, 0.0, 0.3, 7, 4
    ga01	=  0
    aLl	butterlp aLl, 800.0
    aRl	butterlp aRl, 800.0

    	outs aLl + aLh, aRl + aRh

    	endin

    /* output / right */

    	instr 82

    i1	=  0.000001
    aLl, aLh, aRl, aRh	spat3di ga02 + i1*i1*i1*i1, 8.0, 4.0, 0.0, 0.3, 7, 4
    ga02	=  0
    aLl	butterlp aLl, 800.0
    aRl	butterlp aRl, 800.0

    	outs aLl + aLh, aRl + aRh

    	endin

    </CsInstruments>
    <CsScore>

    /* Written by Istvan Varga */
    t 0 60

    i 1 0 4 41
    i 1 0 4 60
    i 1 0 4 65
    i 1 0 4 69

    i 81 0 5.5
    i 82 0 5.5
    e

    </CsScore>
    </CsoundSynthesizer>

## Crédits

Auteur : Istvan Varga
2001

Nouveau dans la version 4.15

Mis à jour en avril 2002 par Istvan Varga

Prev | Up | Next
opcode | Home | oscil1