Re: [linux-audio-dev] FW: LADPSA Freeverb - update?

New Message Reply About this list Date view Thread view Subject view Author view Other groups

Subject: Re: [linux-audio-dev] FW: LADPSA Freeverb - update?
From: Paul Barton-Davis (pbd_AT_Op.Net)
Date: Wed May 24 2000 - 17:49:14 EEST


> <skin plugin_name="gain">
> <pixmap src="foo.xpm" x="0" y="0" width="200" height="30"/>
> <scrollbar bauble="bauble.xpm" x1="10" y1="15" x2="190" y2="15"
> min_value="0" max_value="1"
> bauble_offset_x="5" bauble_offset_y="5"
>>
> <control port="0"/>
> </scrollbar>
> </skin>
>
>This example is obviously flawed in many ways, but
>I think it beats trying to design our own widget toolkit.

I'm speaking from some experience, having already done exactly what
you're describing. see the stuff at the bottom of this message.

I think you're missing something: you *are* designing a widget toolkit
with the above stuff. In the example above, you've defined a
scrollbar, and a pixmap. All you're saving on is actually writing the
code to implement these, since presumably you could map them down to a
GtkScrollbar or GtkPixmap or whatever a particular toolkit uses. But
in reality, you're defining an API for a toolkit, and unless that API
exactly matches the target one, there is real work involved. Worse,
there is no way to use the fine points of the native toolkit API
within the plugin if it needs to be clever.

The truth is that no existing Linux toolkit provides the widgets
needed for audio apps, so they have to be added. I've added several to
Gtk-- for Quasimodo, and yet each week or month, I manage to think of
another one, or a variant, that would be very useful. This is
particularly true of curve display/editing widgets.

>I'd like to point out that a lightweight widget toolkit
>suffers from the same "looks different in different hosts"
>problem. That's ok, most've us have become accustomed to this
>mode of operation (thanks html).

This is not true of vstGUI, because unlike traditional Unix (and
Windows and MacOS) widget-based libraries, all the elements are made
up of sets of pixmaps (they call them bitmaps over in la-la
land). They look the same on any system.

In vstGUI, there are no "scrollbars". There are control elements which
display a different pixmap when the value of their underlying variable
changes. Likewise for knobs, switches, buttons etc. Its cool. And, as
luck would have, Quasimodo is full of such Gtk-- widgets :)

I don't know how vstGUI handles things like draggable curves for EQ or
waveshaping. That can't be done with pixmaps.

--p

----------------------------------------------------------------------
The XML spec for the Quasimodo ADSR module GUI:

<interface height="5">
<label xpos="2.0" ypos="5.0">ADSR</label>

<controller type="knob"
        xpos="5.0"
        ypos="15.0"
        label="Attack"
        label_position="top"
        param="iattack"
        start="0.0"
        end="60.0"
        step="0.01"
        page="0.5"
/>

<controller type="knob"
        xpos="22.0"
        ypos="15.0"
        label="Decay"
        label_position="top"
        param="idecay"
        start="0.0"
        end="60.0"
        step="0.01"
        page="0.5"
/>

<controller type="knob"
        xpos="39.0"
        ypos="15.0"
        label="Sustain"
        label_position="top"
        param="isustain"
        start="0.0"
        end="1.0"
        step="0.001"
        page="0.01"
/>

<controller type="knob"
        xpos="56.0"
        ypos="15.0"
        label="Release"
        label_position="top"
        param="irelease"
        start="0.0"
        end="60.0"
        step="0.01"
        page="0.5"
/>

<controller type="knob"
        xpos="78.0"
        ypos="15.0"
        label="Amplitude"
        label_position="top"
        param="kamplitude"
        start="0.0"
        end="32000.0"
        step="1.0"
        page="100.0"
/>

<socket
        xpos="10.0"
        ypos="70.0"
        label="Trigger"
        label_position="top"
        param="ktrigger"
        direction="input"
        trigger="true"
>
</socket>

<socket
        xpos="80.0"
        ypos="70.0"
        label="Output"
        label_position="top"
        param="ksig"
        direction="output"
>
</socket>
</interface>

----------------------------------------------------------------------
The XML DTD for quasimodo modules:

<!ELEMENT quasi_module (table*, definition, interface, documentation*)>
<!ATTLIST quasi_module
        name CDATA #REQUIRED
        category CDATA #REQUIRED
>

<!ELEMENT table EMPTY>
<!ATTLIST table
        name CDATA #REQUIRED
        generator CDATA #REQUIRED
        time CDATA #REQUIRED
        size CDATA #REQUIRED
        param CDATA #REQUIRED
>

<!ELEMENT definition (#PCDATA)>
<!ATTLIST definition
        language CDATA "unknown"
>
        <!ELEMENT interface (label,
                (socket |
                controller |
                ftselector |
                sfselector |
                spinner |
                pushbutton |
                multiway |
                oscilloscope |
                enveloper |
                value_display
                )*)>

<!ATTLIST interface
        height CDATA "2"
>

<!ELEMENT label (#PCDATA)>
<!ATTLIST label
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
>

<!ELEMENT controller EMPTY>
<!ATTLIST controller
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
        start CDATA "0"
        end CDATA "1"
        step CDATA "0.01"
        page CDATA "0.1"
        type (knob | hslider | vslider | spinner) "knob"
>

<!ELEMENT ftselector EMPTY>
<!ATTLIST ftselector
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
>

<!ELEMENT sfselector EMPTY>
<!ATTLIST sfselector
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
>

<!ELEMENT pushbutton (state)+ >
<!ATTLIST pushbutton
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
        trigger CDATA #FIXED "restart"
>

<!ELEMENT multiway (state)+ >
<!ATTLIST multiway
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
        trigger CDATA #FIXED "restart"
>

<!ELEMENT state (#PCDATA)>
<!ATTLIST state
        number CDATA "0"
>

<!ELEMENT socket (flag)*>
<!ATTLIST socket
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
        trigger CDATA #FIXED "true"
        direction (input | output) "input"
        multin CDATA #FIXED "true"
>

<!ELEMENT flag (#PCDATA)>

<!ELEMENT oscilloscope EMPTY>
<!ATTLIST oscilloscope
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        sinkname CDATA #IMPLIED
>

<!ELEMENT enveloper EMPTY>
<!ATTLIST enveloper
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        duration CDATA #IMPLIED
        amplitude CDATA #IMPLIED
>

<!ELEMENT value_display EMPTY>
<!ATTLIST value_display
        xpos CDATA #REQUIRED
        ypos CDATA #REQUIRED
        label CDATA #IMPLIED
        label_position (top | bottom | left | right | upper_left | upper_right | lower_left | lower_right) "top"
        param CDATA #IMPLIED
        style (hmeter | vmeter) "vmeter"
>

<!ELEMENT documentation (description)>
<!ELEMENT description (#PCDATA)>


New Message Reply About this list Date view Thread view Subject view Author view Other groups

This archive was generated by hypermail 2b28 : Wed May 24 2000 - 18:33:09 EEST