2016-10-16 12 views
0

Использование функции oscil, я определить банк осциллятора с заданными частотами и амплитудами:Как включить длительности в определении инструмента в 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 

Я знаю, что я могу установить длительность в разделе orchestra. Но как я могу дать разные времена для разных колебаний? Могу ли я это сделать в определении instrument? Потому что я хочу, чтобы иметь возможность вызвать инструмент (3) осцилляторов с одной линией в orchestra:

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

ответ

2

Opcode экземпляры в экземпляре инструмента всех один и тот же контекст обработки (то есть, р3/продолжительности). Существует несколько различных стратегий, которые можно использовать для получения различной продолжительности:

  1. Использование нескольких экземпляров приборов имеет один осциллятор на инструмент. Это, вероятно, самый гибкий, но самый многословный.
  2. Используйте какой-то вид конверта и умножьте его на выход каждого генератора. Например:

    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 
    

В # 2, длительность устанавливается прибором. Linseg используется в качестве конверта и продолжительности записи. Тогда можно использовать несколько пар linseg/oscil и вручную записать длительность для каждой части.

+0

И в оркестре, вы попросите длительности прибора, что является максимальным длительностей, установленных в приборе. – Karlo

1

Что-то, что приходит на ум, - это применить различные конверты к каждой синусоиде, которую вы создать внутри прибора:

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 

вы могли бы назвать instr 1 из партитуры с одной строки кода, и вы, вероятно, хотите, чтобы придумать более интересные конверты, чем те выше.

i 1 0 10 

Однако, если вы делаете аддитивный синтез, более элегантный подход будет вызывать множество событий оценки от отдельных инструмента с использованием event_i в 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 

Вы можете позвонить instr 2 из счета, и что будет заботиться о вызове instr 3.

i 2 0 10 

Приветствия

+0

Немного более продвинутый, чем то, что я искал, но спасибо за информативный ответ. – Karlo