2016-10-16 3 views
0

Utilisation de la fonction oscil, je définis une banque d'oscillateur avec des fréquences et des amplitudes données:Comment inclure des durées dans une définition de l'instrument dans Csound

instr 1 
    a1 oscil .3, 110 
     outs a1,a1 
    a2 oscil .2, 220 
     outs a2,a2 
    a3 oscil .1, 330 
     outs a3,a3 
endin 

Je sais que je peux définir la durée dans la section orchestra. Mais comment puis-je donner des durées différentes aux différentes oscillations? Puis-je le faire dans la définition instrument? Parce que je veux être en mesure d'appeler l'instrument (3 oscillateurs) avec une ligne dans le orchestra:

;instr start duration 
i 1 0 ;duration of oscils defined under instr 1 
e 

Répondre

2

instances Opcode dans une instance d'instrument partagent tous le même contexte de traitement (à savoir, p3/durée). Il existe plusieurs stratégies différentes que vous pouvez utiliser pour obtenir différentes durées:

  1. Utilisez plusieurs instances d'instrument avec un oscillateur par instrument. C'est probablement le plus flexible, mais le plus bavard.
  2. Utilisez une forme d'enveloppe et multipliez-la par la sortie de chaque oscillateur. Par exemple:

    instr 1 
        p3 = 4 
        a1 oscil .3, 110 
        aenv1 linseg 1, 3, 1, 0.01, 0, 0.99, 0 
        a1 *= aenv1 
        outs a1,a1 
        ... 
    endin 
    

Dans # 2, la durée est fixée par l'instrument. Le linseg est utilisé comme une enveloppe et les durées écrites. On peut alors utiliser plusieurs paires linseg/oscil et écrire manuellement les durées pour chaque partie.

+0

Et dans l'orchestre, vous demandez une durée d'instrument qui est le maximum des durées fixées dans l'instrument. – Karlo

1

Quelque chose qui vient à l'esprit est d'appliquer différentes enveloppes à chaque sinusoïde. créer à l'intérieur d'un instrument:

0dbfs = 1 

instr 1 
kFirstEnvelope line 0, p3, 1 
kSecondEnvelope line 0.5, p3, 0.5 
kThirdEnvelope line 1, p3, 0 
aFirstSine oscili 1, 440 
aSecondSine oscili 1, 660 
aThirdSine oscili 1, 880 
aMix balance aFirstSine * kFirstEnvelope + aSecondSine * kSecondEnvelope + aThirdSine * kThirdEnvelope, a(0.15) 
outs aMix, aMix 
endin 

vous pouvez ensuite appeler instr 1 de la partition avec une seule ligne de code, et vous auriez probablement eu envie de venir avec des enveloppes plus intéressantes que celles ci-dessus.

i 1 0 10 

Cependant, si vous faites la synthèse additive, une approche plus élégante serait de déclencher plusieurs événements score d'un instrument distinct à l'aide event_i dans une boucle until.

instr 2 
seed 0 
iNoteIndex = 0 
iNoteCount = 30 
until iNoteIndex == iNoteCount do 
iRandomStart = random(0, p3) 
iRandomDuration = random(1.2, 0.5 * p3) 
event_i "i", 3, iRandomStart, iRandomDuration 
iNoteIndex += 1 
enduntil 
endin 

instr 3 
iAttack = .2 
iDecay = .2 
iSustain = .4 
iRelease = 0.6 
aSineWave oscili 0.1, random(200, 4000) 
kEnvelope adsr iAttack, iDecay, iSustain, iRelease 
outs aSineWave * kEnvelope 
endin 

Vous pouvez ensuite appeler instr 2 de la partition, et qui prendra soin d'appeler instr 3.

i 2 0 10 

Vive

+0

Un peu plus avancé que ce que je cherchais, mais merci pour la réponse informative. – Karlo