| Hi Csounders,
Here is (doc of) an opcode which starts new instrument events from
the orchestra at k-rate. Events are started every time a triggering
signal is non-zero. Event generation may be limited in two ways:
by setting a minimum time interval between generated events, or
by specifying a maximum number of simultaneous instruments instances.
Events may also be deferred.
This opcode may be useful for things like generating strumming gestures,
or for some types of algorithmic composition.
Unable to grasp the concept of "too large, stoopid", I just sent
the docs plus code files to the list server's dev/null twice
(and of course also to John, both times, for which I apologise).
This post therefore only contains the documentation of the opcode.
If somebody cooks his own Csound and wants to try it, you can
(temporarily) get the full post at
http://hem.passagen.se/rasmuse/triginstr.txt
(Note that it requires some changes to central files cs.h, Musmon.c,
and Insert.c - besides including new files and changing Entry.c -
but the instructions will be, I hope, clear enough.)
Regards,
re
========================
triginstr DOCUMENTATION:
------------------------
Ignite Instrument Events
triginstr ktrigger, kmintime, kmaxinst, kinstr, kwhen, kdur[, kp4, ... kpN]
triginstr adds new instrument events to the Csound performance
whenever the krate value ktrigger is non-zero. Event generation
may be limited by the kmintime and kmaxinst arguments.
This opcode may be useful eg for certain kinds of algorithmic composition.
PERFORMANCE
ktrigger - when non-zero, signal that an instrument instance
should be started.
kmintime - controls the minimal time which is to elapse between
generated events, in seconds. If kmintime <= 0, no time limit is
used. If the kinstr instrument number is negative (to turn off
an instrument), this test is bypassed.
kmaxinst - ceiling for the number of simultaneous instances of
instrument kinstr. If number of existant instances of kinstr
is >= kmaxinst, no event is generated. If kmaxinst is <= 0, it is
not used to limit event generation. If the kinstr instrument
number is negative (to turn off an instrument), this test is
bypassed.
kinstr, kwhen, kdur, ... - same arguments as in score i-statements.
The kwhen start time (p2) is measured from the time of the triggering
event, and must be a positive value (or zero).
If an event is deferred by a p2 offset value, the instrument will
not be initialized until the actual time when it should start performing.
If kdur (p3) is zero the instrument will only do an initialization
pass without performance. A negative kdur value will initiate a held note
(see also ihold and i-statements).
Note that while waiting for delayed events, the performance must
be kept going, or Csound may quit if no score events are expected.
To guarantee continued performance, the f0 statement may be used
in score (same as eg when playing midi files, or to pad score sections
with silence).
EXAMPLES
The offset value is useful for triggering multiple instruments
in fixed relations. Here, two alternating metronomes:
instr 5 ; tick-tock, tick-tock
iBPM init p4
; Instr's 6 and 7 could be eg simple sample players
triginstr 1, 60/iBPM, 0, 6, 0, .5
triginstr 1, 60/iBPM, 0, 7, 30/iBPM, .5
endin
;Score
; Generate events at 150 BPM for 10 secs
i1 0 10 150
e
This example will create a strumming gesture of p5 notes in p6 seconds
instr 10 ; Strummer
; Pass some values to the strummed instr
koct init p4
iamp init 12000
; Init strum delay so p5 events start in (roughly) p6 seconds
iNumEvts init p5
knum init 0
iDelBase init (p6 / sqrt(iNumEvts)) * 1.7
kdel init 0
; Generate p5 events in the first p5 k-cycles
knum = knum + 1
ktrig = (knum <= iNumEvts ? 1 : 0)
; Strum instr 11, passing pitch and "intended pitch" to pluck
; for some spectral variation. (knum is also passed for diagnostics)
triginstr ktrig, 0, 0, 11, kdel, .5, iamp, cpspch(koct), cpspch(koct) * (knum+2), knum
; Increase delay for next events
kdel = kdel + iDelBase / (knum+1)
; and play a chord (just to do something)
koct = koct +.03
; Don't need this instr after the evts generated, so turn off
if knum < iNumEvts kgoto continue
turnoff
continue:
endin
instr 11 ; Strummed instrument
; print p2, pchoct(octcps(p5)), p6, p7
kamp linseg p4, p3-.1, p4, .1, 0
ar pluck kamp, p5, p6, 0, 1
out ar
endin
; Score
i10 0 .1 6.10 6 .6
i10 1.5 .3 7.00 6 .7
i10 3 .3 6.03 11 1.5
f0 5
e
This example uses xyin to provide gestural control of event generation:
; Orchestra
sr = 22050
kr = 882
ksmps = 25
nchnls = 2
instr 9 ; Generate 1-50 events per sec (max 20 simultaneous)
kX, kY xyin .03, .02, 1, 0, 3000, 1, 100
triginstr 1, kX/2, 20, 2, 0, .7, kY, kY/(kX*.5)
endin
instr 12
kamp linseg 15000, p3-.05, 15000, .05, 0
kcps line p4, p3, p5
ar pluck kamp, p4, p5, 0, 1 pan
; Random stereo distribution
a1, a2 locsig ar, rnd(360), 1, 0
outs a1, a2
endin
; Score
f1 0 8192 10 1 ; Sine
i9 0 15 |