Some Hints for BUZZ machine writing Some Hints for BUZZ machine writing (version 0.3)
by vII

Contents
Introduction/Purpose

Generators:
    Generator note pitches
    Alternate tunings
    MIDI playability

Effects:
    Several separate inputs

General:
    Own Dialogs
    DirectX usage
    Maintaining version compatibility
    the Save/Init functions
    Positions
    Stop->Start?
    Event mechanism
    Accessing wave data on startup

Credits
Contacting the author

Introduction/Purpose
I've just started writing some machines for BUZZ, the first and only published being vMidiOut and vGraphity. In the BUZZ mailing list there are often questions regarding the machine programming and maybe the desire to have some kind of tutor. I'm not that expert (yet?) and don't want to or can cover every detail of programming the machines, especially I'm not experienced with DSP stuff and haven't written an effect machine yet nor used the dsplib of BUZZ. But I've found some things that aren't in the supplied sources or don't come into sight easily, which I think are worth to be summed up here (some of them are pure assumptions, marked with an "?"):

Starting the thing seems quite easy, just go as Jeskola explains and use the supplied sources as a start. Visual C++ 6.0 seems to work o.k., but the resulting machine DLL's have double the size than compiled with VC 5, so I'm mostly staying with the older version for the releases (any settings to cure this?).

Generators:

Effects:
  • Several separate inputs for an effect machine: BUZZ 2 shall bring the possibility of using several inputs for one effect without simply mixing them together first. This is needed for a real vocoder (not using the wavetable samples) or similar machines. But we don't have to wait for BUZZ 2 to achieve this and we also don't have to restrict to a limited bandwidth as in Ynzn's Multiplexer/Demultiplexer (which nonetheless is a nice idea to solve this basic task completely according to the BUZZ 1 machine interface; and it gave me the idea to avoid the interface for this one):

  • All machines of the same kind can share global data of the machine dll. So it would be easy to have several ringbuffers (several -> to allow more than one pair of inputs) of let's say 1k samples. Every machine now has a parameter, telling which buffer to use, and another, if it shall write to the buffer. A second machine can now use it's own input and the input from any of the ringbuffers (even from more than one) to do what it wants...

    For something like a vocoder this would look like:

                (output is set to zero,but also written into ringbuffer N)
    input 1 -------> vocoder 1  -------------|
                                                                  |
    input 2 ------------------------------vocoder 2---------> output
               (has access to input 2 and ringbuffer N)
     

    General:


    Credits:
    Found out some things myself, but others not:
    Thanks to Jeskola for the help, especially concerning the event mechanism (and of course for the source of all this pleasure -and sometimes trouble- BUZZ).
    And to Hagen: hooking the play button is just a too fine  idea to let it be unmentioned... I'm still thinking about OCR for the song position ;)

    contact me or mail contributions to: ( vII) or look at my Homepage