如何在 Csound 中的乐器定义中包含持续时间

Posted

技术标签:

【中文标题】如何在 Csound 中的乐器定义中包含持续时间【英文标题】:How to include durations in an instrument definition in Csound 【发布时间】:2016-10-16 16:39:06 【问题描述】:

使用函数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 定义中执行此操作吗?因为我希望能够通过orchestra 中的一行调用仪器(3 个振荡器):

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

【问题讨论】:

【参考方案1】:

仪器实例中的操作码实例都共享相同的处理上下文(即 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 中,持续时间由仪器设置。 linseg 用作信封并写入持续时间。然后可以使用多个 linseg/oscil 对并手写每个部分的持续时间。

【讨论】:

而在管弦乐队中,您要求的乐器持续时间是乐器中设置的最长持续时间。【参考方案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

但是,如果您要进行加法合成,更优雅的方法是在until 循环中使用event_i 从一个单独的乐器触发多个乐谱事件。

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

干杯

【讨论】:

比我预期的要先进一点,但感谢您提供的信息丰富的答案。

以上是关于如何在 Csound 中的乐器定义中包含持续时间的主要内容,如果未能解决你的问题,请参考以下文章

Android 上 Csound 的非 UI 示例

如何在持续集成中包含谷歌基准

生成具有音高和持续时间的声音

出现语法错误,csound 中出现意外 T_IDENT 尝试使用 faustcompile

1.编写,定义一个类,类中包含一些属性,行为 如建立学生类

如何在 Angular 2 中包含打字稿自定义类型定义?