Как включить длительности в определение инструмента в Csound

#sound-synthesis #csound

#синтез звука #csound

Вопрос:

Используя функцию oscil , я определяю блок осцилляторов с заданными частотами и амплитудами:

 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
 

Ответ №1:

Все экземпляры кода операции в экземпляре инструмента используют один и тот же контекст обработки (т. Е. p3 / duration). Есть несколько разных стратегий, которые можно использовать для получения разных длительностей здесь:

  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 и вручную записывать длительности для каждой партии.

Комментарии:

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

Ответ №2:

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

 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
 

Приветствия

Комментарии:

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