On Fri, Mar 11, 2011 at 8:47 AM, Henning Thielemann
<[email protected]> wrote:
>
> On Fri, 11 Mar 2011, Stephen Tetley wrote:
>
>> I still don't understand what Evan's reverse instrument models.
>>
>> Is it reversing the sound of a note so it is some function wrapping a
>> unit generator?
>>
>> Or is it reversing a sequence of notes according to pitch?
>
> I think he means reversing the signal generated by a part of the music,
> since this is a classical example of breaking the music-signal barrier.

Oh, sorry, I assumed your question was answered.  In nyquist, which
doesn't have a score/orchestra division, you can write something like
this:

(defun inst (pitch) (osc ... pitch)) ; osc is an oscillator unit generator
(defun inst2 (pitch) (reverse (inst pitch)))
(defun phrase () (seq (inst a) (inst2 b) (inst c)))
(defun score () (seq (phrase) (reverb (phrase)))
(play (transpose 5 (score))

Notice that you can interleave signal operations (reverse and reverb)
with musical operations (e.g. transpose, which does not modify the
signal but winds up asking the oscillators to produce a different
pitch).

In a divided world, you typically build a static signal graph and then
control it afterwards.  So signal level operations must be strictly
divided.  This means there is a fixed order for the signal operations
(e.g. many instruments -> flange -> reverb) and if you want to do it
differently (e.g. reverb only on certain notes, or reverb->flange for
a certain phrase), then you are out of luck unless you make a whole
new signal graph, one for every possible permutation in the score, and
then use a different instrument for that section.  Since polyphonic
instruments must have a dynamic signal graph for new notes, there is
usually a special case hack where there's some kind of poly-mix ugen
that will duplicate the graph above it for each incoming note, but it
really is a special case hack and otherwise the graph is static.  And
of course acausal operations like reverse are available at the score
level (reverse notes) but not on signals since the orchestra has a
single global implicit now.

In contrast, programming languages have a dynamically changing call
graph.  In nyquist there is no difference between a unit generator, a
note, an instrument, a phrase, or whatever you choose to define, since
they are all functions that generate sound.  This means that
synthesized signals can be used freely in the score, e.g. not just
reversed notes but instrument envelopes need not be hardcoded into the
instrument, or a low pass filter can be used to smooth a tempo or
pitch curve.

Separate score and orchestra is how acoustic music works (a roomful of
musicians is very much a static call graph) and computer music has
adopted that metaphor.  Back when computers were slow it made a lot of
sense to divide expensive signal computation on to a hard to program
but fast dsp, and the sequencer on a easier to program but slow cpu,
but I think those days have been mostly over for a while now.  Yet
still the metaphor persists, perhaps because that's what people are
used to.  Well, it's also true that there is significant value in a
score as a data structure, which can be transformed at that high
level.  There's definitely a tradeoff between code and data.
_______________________________________________
haskell-art mailing list
[email protected]
http://lists.lurk.org/mailman/listinfo/haskell-art

Reply via email to