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
