rnd31

rnd31 — Opcodes aléatoires bipolaires sur 31 bit avec une distribution contrôlée.

Description

Opcodes aléatoires bipolaires sur 31 bit avec une distribution contrôlée. Ces unités sont portables, c-à-d qu'avec la même valeur de graine on obtiendra la même séquence aléatoire sur tous les systèmes. La distribution des nombres aléatoires générés peut être changée au taux-k.

Syntaxe

ax rnd31 kscl, krpow [, iseed]
ix rnd31 iscl, irpow [, iseed]
kx rnd31 kscl, krpow [, iseed]

Initialisation

ix -- valeur de sortie au taux-i.

iscl -- mise à l'échelle de la sortie. Les nombres aléatoires générés sont compris entre -iscl et iscl.

irpow -- contrôle la distribution des nombres aléatoires. Si irpow est positif, la distribution aléatoire (x compris entre -1 et 1) est abs(x)((1 / irpow) - 1) ; pour des valeurs négatives de irpow, elle vaut (1 - abs(x))((-1 / irpow) - 1). En fixant irpow à -1, 0 ou 1 on obtiendra une distribution uniforme (c'est aussi plus rapide à calculer).

[Un graphique des distributions pour différentes valeurs de irpow.]

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

iseed (facultatif, par défaut=0) -- valeur de la graine pour le générateur de nombres aléatoires (nombre entier positif compris entre 1 et 2147483646 (231 - 2)). Avec une valeur nulle ou négative la graine est prise à partir de l'horloge du système (c'est le comportement par défaut). Une graine à partir de l'horloge du système nous garantit la génération de séquences aléatoires différentes, même si plusieurs opcodes aléatoires sont appelés dans un temps très court.

Dans les versions de taux-a et de taux-k la graine est fixée à l'initialisation de l'opcode. Avec une sortie de taux-i, si la graine est nulle ou négative, elle sera prise à partir de l'horloge du système lors du premier appel, puis retournera la valeur suivante de la séquence aléatoire lors des appels successifs ; les valeurs positives de la graine sont fixées à tous les appels de taux-i. La graine est locale pour les unités de taux-a et -k, et globale pour les unités de taux-i.

[Note] Notes

  • bien que des valeurs de graines allant jusqu'à 2147483646 soient permises, il est recommandé d'utiliser des nombres plus petits (< 1000000) pour des raisons de portabilité, car les grands nombres peuvent être arrondis à une valeur différente si l'on utilise des nombres flottants sur 32 bit.

  • rnd31 au taux-i avec une graine positive produira toujours la même valeur en sortie (ce n'est pas un bogue). Pour obtenir des valeurs différentes, fixer la graine à 0 dans les appels successifs, ce qui retournera la valeur suivante de la séquence aléatoire.

Exéution

ax -- valeur de sortie au taux-a.

kx -- valeur de sortie au taux-k.

kscl -- mise à l'échelle de la sortie. Les nombres aléatoires générés sont compris entre -kscl et kscl. Semblable à iscl, mais il peut être modifié au taux-k.

krpow -- contrôle la distribution des nombres aléatoires. Semblable à irpow, mais il peut être modifié au taux-k.

Exemples

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

Exemple 746. Exemple de l'opcode rnd31 au taux-a.

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

; Initialize the global variables.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1

; Instrument #1.
instr 1
  ; Create random numbers at a-rate in the range -2 to 2 with 
  ; a triangular distribution, seed from the current time.
  a31 rnd31 2, -0.5

  ; Use the random numbers to choose a frequency.
  afreq = a31 * 500 + 100

  a1 oscil 30000, afreq, 1
  out a1
endin


</CsInstruments>
<CsScore>

; Table #1, a sine wave.
f 1 0 16384 10 1

; Play Instrument #1 for one second.
i 1 0 1
e


</CsScore>
</CsoundSynthesizer>


Voici un exemple de l'opcode rnd31 au taux-k. Il utilise le fichier rnd31_krate.csd.

Exemple 747. Exemple de l'opcode rnd31 au taux-k.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi 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 rnd31_krate.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

; Initialize the global variables.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1

; Instrument #1.
instr 1
  ; Create random numbers at k-rate in the range -1 to 1 
  ; with a uniform distribution, seed=10.
  k1 rnd31 1, 0, 10
        
  printks "k1=%f\\n", 0.1, k1
endin


</CsInstruments>
<CsScore>

; Play Instrument #1 for one second.
i 1 0 1
e


</CsScore>
</CsoundSynthesizer>


Sa sortie contiendra des lignes comme celles-ci :

k1= 0.112106
k1=-0.274665
k1= 0.403933

Here is an example of the rnd31 opcode that uses the number 7 as a seed value. It uses the file rnd31_seed7.csd.

Exemple 748. An example of the rnd31 opcode that uses the number 7 as a seed value.

<CsoundSynthesizer>
<CsOptions>
; Select audio/midi 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 rnd31_seed7.wav -W ;;; for file output any platform
</CsOptions>
<CsInstruments>

; Initialize the global variables.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1

; Instrument #1.
instr 1
  ; i-rate random numbers with linear distribution, seed=7. 
  ; (Note that the seed was used only in the first call.)
  i1 rnd31 1, 0.5, 7
  i2 rnd31 1, 0.5
  i3 rnd31 1, 0.5
        
  print i1
  print i2
  print i3
endin


</CsInstruments>
<CsScore>

; Play Instrument #1 for one second.
i 1 0 1
e


</CsScore>
</CsoundSynthesizer>


Sa sortie contiendra des lignes comme celles-ci :

instr 1:  i1 = -0.649
instr 1:  i2 = -0.761
instr 1:  i3 =  0.677

Voici un exemple de l'opcode rnd31 qui utilise l'horloge du système comme graine. Il utilise le fichier rnd31_time.csd.

Exemple 749. Eexemple de l'opcode rnd31 qui utilise l'horloge du système comme graine.

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

; Initialize the global variables.
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1

; Instrument #1.
instr 1
  ; i-rate random numbers with linear distribution,
  ; seeding from the current time. (Note that the seed 
  ; was used only in the first call.)
  i1 rnd31 1, 0.5, 0
  i2 rnd31 1, 0.5
  i3 rnd31 1, 0.5

  print i1
  print i2
  print i3
endin


</CsInstruments>
<CsScore>

; Play Instrument #1 for one second.
i 1 0 1
e


</CsScore>
</CsoundSynthesizer>


Sa sortie contiendra des lignes comme celles-ci :

instr 1:  i1 = -0.691
instr 1:  i2 = -0.686
instr 1:  i3 = -0.358

Crédits

Auteur : Istvan Varga

Nouveau dans la version 4.16