csound-expression-4.1.0: library to make electronic music

Safe HaskellNone




GUI (Graphical User Interface) elements are handy to change the parameters of the sound in real time. It includes sliders, knobs, rollers, buttons and other widgets.

A GUI element consists of two parts. They are view (how it looks) and logic (what's going on with it). For example a slider can be horizontal or vertical or green or yellow or small or big. It's the view of the slider. And a slider can produce a continuous signal within the given interval. It's a logic of the slider.

Let's talk about the view. The view is divided on two parts:

  • where element is placed or Layout.
  • all other properties or just Properties.

The layout is defined with very simple functions. There are vertical and horizontal grouping of the elements. We can scale the element within the group and include an empty space in the group. Everything is aligned (see Csound.Gui.Layout). Other properties include colors, fonts (size and type), borders, specific properties of the widgets (see Csound.Gui.Props).

Let's consider the logic. The logic consists of three parts:

  • what is consumed (Output)
  • what is produced (Input)
  • what's going on inside (Inner)

A widget can react on values, produce values or do something useful. There are special types of widgets:

  • Source - they produce values only
  • Sink - they consume values only
  • Display - something is going on inside them (for example, it can show a hello world message)

Widgets can be simple and compound. Simple widgets are primitive elements (sliders, knobs, rollers, buttons). We have a special constructors that produce simple widgets (see Csound.Gui.Widget). Compound widgets glue together several widgets. That is the view contains several elements and all of them involved in the logic of the widget.



data Gui

type Widget a b = SE (Gui, Output a, Input b, Inner)

type Input a = a

type Output a = a -> SE ()

type Inner = SE ()

type Sink a = SE (Gui, Output a)

type Source a = SE (Gui, Input a)

type Display = SE Gui

widget :: SE (Gui, Output a, Input b, Inner) -> Widget a b

sink :: SE (Gui, Output a) -> Sink a

source :: SE (Gui, Input a) -> Source a

mapSource :: (a -> b) -> Source a -> Source bSource

Maps over the value of the source-widget.


panel :: Gui -> SE ()

panels :: [Gui] -> SE ()

panelBy :: String -> Maybe Rect -> Gui -> SE ()

keyPanel :: Gui -> SE ()

keyPanels :: [Gui] -> SE ()

keyPanelBy :: String -> Maybe Rect -> Gui -> SE ()