lfsr

lfsr — Registre à décalage avec rétroaction linéaire (LFSR).

Description

Produit une série de nombres entiers positifs pseudo-aléatoires. C'est la technique utilisée dans les modules de synthèses dénommés "machines de Turing" et elle sert habituellement à générer des suites mélodiques. Cette implantation est adaptée du firmware du module Ornament & Crime tel qu'utilisé dans les applications Quantermain et Meta-Q.

Syntaxe

knum lfsr ilen, iprob [, iseed]

Initialisation

ilen -- longueur du registre à décalage, les valeurs autorisées sont 1-31 (inclusivement). Plus le registre est grand et plus grands sont les nombres entiers générés. On peut utiliser ce paramètre pour restraindre la sortie à un intervalle désiré.

iprob -- probabilité, les valeurs autorisées sont 1-255 (inclusivement). Contrôle l'étalement de la sortie ; plus les valeurs sont grandes et plus l'étalement des valeurs de sortie est grand.

iseed (facultatif, -1 par défaut) -- état initial du registre à décalage, sous la forme d'un motif binaire. La valeur est traîtée comme un entier non signé si bien que la valeur par défaut -1 correspond effectivement à tous les bit positionnés (0b11111111...).

Exécution

knum -- entier en sortie.

Exemples

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

Exemple 501. Exemple de l'opcode lfsr.

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>
-W -o lfsr.wav
</CsOptions>

<CsInstruments>

sr = 44100
ksmps = 1
nchnls = 2
0dbfs = 1.0

; triangle wave
gitabsz init 2^13
giTri ftgen 1, 0, gitabsz, 7, 0, gitabsz/4, 1, gitabsz/2, -1, gitabsz/4, 0

; Grady Centaur scale
giCent = ftgen(100, 0, 128, -51,
               12, 2, 297.989, 60,
               1.0, 21/20, 9/8, 7/6, 5/4, 4/3, 7/5, 3/2, 14/9, 5/3, 7/4, 15/8, 2.0)

; just print the values
instr 1
    kn = lfsr(5, 128)
    printk2(kn)
endin

; play a melodic sequence
instr 2
    idur = p3
    iamp = p4
    iwav = p5
    itun = p6

    ; keep range small and transpose up 2 octaves to ensure audibility
    ; we're interpreting these number like MIDI notes numbers for easy table lookups
    kidx = lfsr(5, 128) + 24

    ktrig = metro(1)
    schedkwhen(ktrig, 0, 1, 3, 0, 1, iamp, iwav, itun, kidx)
endin

instr 3
    idur = p3
    iamp = ampdb(p4)
    iwav = p5
    itun = p6
    inote = p7

	kenv = linen(iamp, 0.1, idur, 0.1)
	aout = poscil3(kenv, tablekt(inote, itun), iwav)
	outs(aout, aout)
endin

</CsInstruments>
<CsScore>
i 1 0 0.25
i 2 0 10 -6 1 100

e
</CsScore>
</CsoundSynthesizer>


Crédits

Par : Dave Seidel 2020

Basé sur du code de Patrick Dowling dans le firmware Ornament & Crime.

Nouveau dans la version 6.16