Как включить длительности в определение инструмента в 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
2 ответа
Все экземпляры кода операции в экземпляре инструмента имеют общий контекст обработки (т. Е. P3/duration). Есть несколько разных стратегий, которые можно использовать для получения разной продолжительности:
- Использовать несколько экземпляров инструмента имеют по одному генератору на инструмент. Это, наверное, самый гибкий, но самый многословный.
Используйте некоторую форму огибающей и умножьте ее на выход каждого генератора. Например:
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 продолжительность задается прибором. Линсег используется в качестве конверта, а продолжительность записывается в. Затем можно использовать несколько пар линсег / осцилл и вручную записывать длительности для каждой части в.
Что-то, что приходит на ум, - это накладывать разные конверты на каждую синусоиду, которую вы создаете внутри инструмента:
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
ура