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

## modmatrix

modmatrix — Opcode matrice de modulation avec optimisation pour les matrices creuses.

## Description

On peut utiliser cet opcode pour faire moduler un grand nombre de paramètres variables de taux-k par un grand nombre de variables modulantes de taux-k, avec une pondération arbitraire de chaque connexion paramètre-modulateur. Des ftables de Csound sont utilisées pour contenir les variables en entrée (les paramètres), les variables modulantes et les coefficients de pondération. Les variables de sorties sont écrites dans une autre ftable de Csound.

## Syntaxe

    modmatrix iresfn, isrcmodfn, isrcparmfn, imodscale, inum_mod, \\
    inum_parm, kupdate

## Initialisation

iresfn -- numéro de la ftable pour les variables de sortie.

isrcmodfn -- numéro de la ftable pour les variables sources de modulation.

isrcparmfn -- numéro de la ftable pour les paramètres variables en entrée.

imodscale -- matrice des coefficients de pondération/routage. C'est aussi une ftable de Csound, utilisée comme une matrice de inum_mod lignes et inum_parm colonnes.

inum_mod -- nombre de variables de modulation.

inum_parm -- nombre de paramètres variables (en entrée et en sortie).

Les arguments inum_mod et inum_parm ne doivent pas nécessairement être des puissances de deux.

## Exécution

kupdate -- indicateur pour la mise à jour des coefficients de pondération. Quand l'indicateur a une valeur non nulle, les coefficients de pondération sont lus directement de la table imodscale. Quand l'indicateur vaut zéro, les coefficients de pondérations sont parcourus et une matrice de pondération optimisée est stockée en interne dans l'opcode.

Chaque modulateur dans isrcmodfn, est pondéré par un coefficient (dans imodscale) déterminant son degré d'influence sur chaque paramètre. Puis tous les modulateurs pour un paramètre sont additionnés et la valeur de modulation résultante est ajoutée à la valeur du paramètre d'entrée lu dans iscparmfn. Enfin, les valeurs du paramètre de sortie sont écrites dans la table iresfn.

Les tables suivantes donnent un aperçu du processus exécuté par l'opcode modmatrix, dans un exemple simplifié utilisant 3 paramètres et 2 modulateurs. Appelons les paramètres "cps1", "cps2" et "cutoff", et les modulateurs "lfo1" et "lfo2".

Les variables d'entrée peuvent avoir ces valeurs à un certain moment :

Table 12.

| cps1 | cps2 | cutoff
--- | --- | --- | ---
isrcparmfn | 400 | 800 | 3

... tandis que les variables de modulation ont ces valeurs :

Table 13.

| lfo1 | lfo2
--- | --- | ---
isrcmodfn | 0.5 | -0.2

Les coefficients de pondération/routage sont :

Table 14.

imodscale | cps1 | cps2 | cutoff
--- | --- | --- | ---
lfo1 | 40 | 0 | -2
lfo2 | -50 | 100 | 3

... et les valeurs de sortie résultantes sont :

Table 15.

| cps1 | cps2 | cutoff
--- | --- | --- | ---
iresfn | 430 | 780 | 1.4
lfo2 | -50 | 100 | 3

La valeur de sortie pour "cps1" est calculée comme 400+(0.5*40)+(-0.2*-50), de même pour "cps2" 800+(0.5*0)+(-0.2*100), et pour "cutoff" : 3+(0.5*-2)+(-0.2*3)

La ftable imodscale peut être spécifiée dans la partition comme ceci :

    f1  0  8  -2  200 0 2 50 300 -1.5

Ou mieux en utilisant ftgen dans l'orchestre :

    gimodscale ftgen 0, 0, 8, -2, 200, 0, 2, 50, 300, -1.5

Evidemment, les paramètres variables et les modulateurs n'ont pas nécessairement des valeurs statiques, de même que la table des coefficients de pondération/routage peut être continuellement renouvelée au moyen d'opcodes comme tablew.

## Exemples

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

Example 523. Exemple de l'opcode modmatrix.

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 flags here according to platform
    ; Audio out   Audio in
    ;-odac           -iadc    ;;;RT audio I/O
    ; For Non-realtime ouput leave only the line below:
     -o modmatrix.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    	sr	=	44100
    	kr	=	441
    	ksmps	=	100
    	nchnls	=	2
    	0dbfs	= 	1

    ; basic waveforms
    giSine	ftgen	0, 0, 65537, 10, 1	; sine wave
    giSaw 	ftgen	0, 0, 4097, 7, 1, 4096, -1	; saw (linear)
    giSoftSaw ftgen	0, 0, 65537, 30, giSaw, 1, 10	; soft saw (only 10 first harmonics)

    ; modmatrix tables
    giMaxNumParam	= 128
    giMaxNumMod	= 32
    giParam_In ftgen 0, 0, giMaxNumParam, 2, 0	; input parameters table
    ; output parameters table (parameter values with added modulators)
    giParam_Out ftgen 0, 0, giMaxNumParam, 2, 0
    giModulators ftgen 0, 0, giMaxNumMod, 2, 0	 ; modulators table
    ; modulation scaling and routing (mod matrix) table, start with empty table
    giModScale ftgen 0, 0, giMaxNumParam*giMaxNumMod, -2, 0

    ;********************************************
    ; generate the modulator signals
    ;********************************************
    	instr 1

    ; LFO1, 1.5 Hz, normalized range (0.0 to 1.0)
    kLFO1	oscil	0.5, 1.5, giSine		; generate LFO signal
    kLFO1	= kLFO1+0.5				; offset

    ; LFO2, 0.4 Hz, normalized range (0.0 to 1.0)
    kLFO2	oscil	0.5, 0.4, giSine		; generate LFO signal
    kLFO2	= kLFO2+0.5				; offset

    ; write modulators to table
    	tablew	kLFO1, 0, giModulators
    	tablew	kLFO2, 1, giModulators

    	endin

    ;********************************************
    ; set parameter values
    ;********************************************
    	instr 2

    ; Here we can set the parameter values
    icps1	= p4
    icps2	= p5
    icutoff	= p6

    ; write parameters to table
    	tableiw	icps1, 0, giParam_In
    	tableiw	icps2, 1, giParam_In
    	tableiw	icutoff, 2, giParam_In

    	endin

    ;********************************************
    ; mod matrix edit
    ;********************************************
    	instr 3

    ; Here we can write to the modmatrix table by using tablew or tableiw

    iLfo1ToCps1	= p4
    iLfo1ToCps2	= p5
    iLfo1ToCutoff	= p6
    iLfo2ToCps1	= p7
    iLfo2ToCps2	= p8
    iLfo2ToCutoff	= p9

    	tableiw	iLfo1ToCps1, 0, giModScale
    	tableiw	iLfo1ToCps2, 1, giModScale
    	tableiw	iLfo1ToCutoff, 2, giModScale
    	tableiw	iLfo2ToCps1, 3, giModScale
    	tableiw	iLfo2ToCps2, 4, giModScale
    	tableiw	iLfo2ToCutoff, 5, giModScale

    ; and set the update flag for modulator matrix
    ; ***(must update to enable changes)
    ktrig	init 1
    	chnset	ktrig, "modulatorUpdateFlag"
    ktrig	= 0

    	endin

    ;********************************************
    ; mod matrix
    ;********************************************
    	instr 4

    ; get the update flag
    kupdate	chnget	"modulatorUpdateFlag"

    ; run the mod matrix
    inum_mod	= 2
    inum_parm	= 3
    	modmatrix giParam_Out, giModulators, giParam_In, \\
    	giModScale, inum_mod, inum_parm, kupdate

    ; and reset the update flag
    	chnset	0, "modulatorUpdateFlag"  ; reset the update flag

    	endin

    ;********************************************
    ; audio generator to test values
    ;********************************************
    	instr 5

    ; basic parameters
    	iamp	= ampdbfs(-5)

    ; read modulated parameters from table
    	kcps1	table	0, giParam_Out
    	kcps2	table	1, giParam_Out
    	kcutoff	table	2, giParam_Out

    ; set filter parameters
    	kCF_freq1	= kcps1*kcutoff
    	kCF_freq2	= kcps2*kcutoff
    	kReso		= 0.7
    	kDist		= 0.3

    ; oscillators and filters
    	a1	oscili	iamp, kcps1, giSoftSaw
    	a1	lpf18	a1, kCF_freq1, kReso, kDist

    	a2	oscili	iamp, kcps2, giSoftSaw
    	a2	lpf18	a2, kCF_freq2, kReso, kDist

    		outs 	a1, a2

    	endin

    </CsInstruments>
    <CsScore>

    ;********************************************
    ; set initial parameters
    ;	cps1	cps2	cutoff
    i2 0 1	400	800	3

    ;********************************************
    ; set modmatrix values
    ;	lfo1ToCps1 lfo1ToCps2 lfo1ToCut lfo2ToCps1 lfo2ToCps2 lfo2ToCut
    i3 0 1 	40         0          -2        -50        100        3

    ;********************************************
    ; start "always on" instruments
    #define SCORELEN # 20 #	 ; set length of score

    i1 0 $SCORELEN			; start modulators
    i4 0 $SCORELEN			; start mod matrix
    i5 0 $SCORELEN			; start audio oscillator

    e

    </CsScore>
    </CsoundSynthesizer>

## Voir aussi

Opcodes d'Algèbre Linéaire, Opcodes Vectoriels, tablew.

## Crédits

Auteurs : Oeyvind Brandtsegg et Thom Johansen

Nouveau dans la version 5.12

Prev | Up | Next
mode | Home | monitor