Next
Previous
Table of Contents
GUI elements should be used to allow synthesis structures to interact with
the user. In the simplest case, the user should be able to modify some
parameters of a structure directly (such as a gain factor which is used
before the final play module).
In more complex settings, one could imagine the user modifying parameters
of groups of structures and/or not yet running structures, such as modifying
the ADSR envelope of the currently active midi instrument. Another thing
would be setting the filename of some sample based instrument.
On the other hand, the user could like to monitor what the synthesizer is
doing. There could be oscilloscopes, spectrum analyzers, volume meters and
"experiments" that figure out the frequency transfer curve of some given
filter module.
Finally, the GUI elements should be able to control the whole structure of
what is running inside Arts and how. The user should be able to assign
instruments to midi channels, start new effect processors, configure his
main mixer pult (which is built of aRts structures itself) to have one
channel more and use another strategy for its equalizers.
You see - the GUI elements should bring all possibilities of the virtual
studio aRts should simulate to the user. Of course, they should also
gracefully interact with midi inputs (such as sliders should move if they
get midi inputs which also change just that parameter), and probably even
generate events themselves, to allow the user interaction to be recorded
via sequencer.
Still experimental. Most things are described in the module reference
and should be more or less self explainatory (look at the examples). So
only some more complex things are explained below.
You can create panels, subpanels, sliders, knobs, windows and the famous
instrument mapper, that does everything by itself. Well, you can produce
nice GUIs with that, subpanels and parent-specification allow you to
combine the GUIs of structures very flexible.
As you see, this is somewhat experimental, to encourage you to experiment,
and - more important - get your feedback! ;) So don't hesitate to throw
your ideas/code into the development process... please also read "the
gui challenge" published on the homepage.
Arts has a somewhat working fashion of putting widgets into widgets. Every
widget that can contain other widgets will have an output port called id.
So for instance, since one would expect to be able to put some controls
inside a window, it will have an outgoing id port.
On the other hand, every widget that can (need to) be put into some other
widget has an incoming port called parent. This will for instance allow
you to put a Gui_SUB_PANEL inside a window.
One of the important components for making music are mixers. Of course, with
aRts you can build mixers by simply using houndrets of modules, which take
a few Synth_BUS_DOWNLINKs, mix them together (possibly providing a control
panel), and send them to an uplink or to the soundcard.
Anyway, this would mean that extending your structure from a ten channel mixer
to a sixteen channel mixer would be a lot of work (since you had to build
six more channels by hand).
To solve that problem, Gui_MIXER has been created. You give him a window,
and a structure that describes how one channel of your mixer
should look. You tell him how the busses should be called where it takes
the data from, and you tell him where he should put it (another bus).
Then, the important part: you tell him how many channels you want. And when
started, your Gui_MIXER will simply create one of your channel structures
for each channel you wanted. So you can go up from a ten channel mixer to
a sixteen channel mixer by changing one parameter.
Of course you need to know what parameters a channel gets: it's simply a
parent widget (so you can put your panel somewhere), and the name of the
bus you get the data from, and the name of the bus you put the data to.
The parameters need to be called parent, input and output. The Gui_MIXER
will simply number the channels from 01 to the maximum channel you specified.
See module reference for some more details.
Next
Previous
Table of Contents