Skip to main content

Keyboard

keyboard will display a keyboard that will send MIDI information to your Csound instrument. This component can be used together with a hardware controller.

Properties (alphabetical)

Below is the full, alphabetical list of top-level widget properties for keyboard.

Active

"active": 0

Will deactivate a control if 0 is passed. Controls which are deactivated can still be updated from Csound.

Bounds

"bounds": {"left":0, "top":0, "width":100, "height":100}

Integer values that set position and size on screen(in pixels).

Channel

"channels": [
{
"id":"channelName",
"eventType": "valueChanged",
"range": {"min":0, "max":100, "value":0, "skew":1, "incr":0.1}
}
]

In Cabbage 3, widgets use an array of channels instead of a single channel string. Each channel object includes an id that defines a unique channel name. Widgets in Cabbage 3 can have any number of channels attached to them. An optional eventType property specifies the type of interaction. A range object can define the minimum, maximum, and default values, along with the skew and step increment.

If range is omitted, it defaults to a range from 0 to 1, with increments of 0.001 for widgets that use drag events (e.g., sliders, XY pads) and 1 for widgets that use click or toggle events (e.g., buttons, checkboxes).

A widget’s top-level id property defines the general communication channel for updating attributes, while the channels specified in the channels array are used for value and parameter updates.

Supported event types:

EventDescription
valueChanged (default)Tracks simple value changes
mousePressLeftTracks presses of left mouse button
mousePressRightTracks presses of right mouse button
mousePressMiddleTracks presses of middle mouse button
mouseMoveXTracks movement along X axis.
mouseMoveYTracks movement along Y axis.
mouseDragXTracks movement along X axis with mouse pressed
mouseDragYTracks movement along Y axis with mouse pressed
mouseInsideReturns max when any mouse button is within the bounds of the widget, min if outside.

In Cabbage 3, channels don't need to start with a letter and white spaces are permitted.

Id

"id": "widgetId"

This optional channel can be used to define a top-level line of communication between the instrument’s UI and Csound. It is reserved for UI updates only. If omitted, it defaults to the first id from the channels array. Its primary purpose is to help produce clearer code, especially for widgets with multiple channels.

Key Width

"keyWidth": 24

Set the width of the keys in pixels.

Value

"value":0

Value sets the initial state of the widget. In the case of a keyboard widget, it sets the leftmost key to appear.

Visible

"visible": 1

A value of 0 will cause the widget to become invisible. Widgets have their visibility set to 1 by default.

Style

"style": {
"opacity": 1
},
  • Keyboard visuals (white/black keys, keydown color) are configured under the color.* object on the widget, not in style.

Example

<Cabbage>
[
{"type": "form", "caption": "Combobox Example", "size": {"width": 580, "height": 500}, "pluginId": "def1"},
{
"type": "rotarySlider",
"bounds": {"left": 12, "top": 9, "width": 86, "height": 90},
"channels": [{"id": "att", "range": {"min": 0, "max": 1, "defaultValue": 0.01, "skew": 1, "increment": 0.001}}],
"text": "Att."
},
{
"type": "rotarySlider",
"bounds": {"left": 99, "top": 9, "width": 86, "height": 90},
"channels": [{"id": "dec", "range": {"min": 0, "max": 1, "defaultValue": 0.4, "skew": 1, "increment": 0.001}}],
"text": "Dec."
},
{
"type": "rotarySlider",
"bounds": {"left": 187, "top": 9, "width": 86, "height": 90},
"channels": [{"id": "sus", "range": {"min": 0, "max": 1, "defaultValue": 0.7, "skew": 1, "increment": 0.001}}],
"text": "Sus."
},
{
"type": "rotarySlider",
"bounds": {"left": 274, "top": 9, "width": 86, "height": 90},
"channels": [{"id": "rel", "range": {"min": 0, "max": 1, "defaultValue": 0.8, "skew": 1, "increment": 0.001}}],
"text": "Rel."
},
{
"type": "keyboard",
"bounds": {"left": 12, "top": 104, "width": 348, "height": 80},
"channels": [{"id": "keyboard"}]
},
{
"type": "comboBox",
"bounds": {"left": 260, "top": 188, "width": 100, "height": 30},
"channels": [{"id": "waveform"}],
"corners": 5,
"items": ["Saw", "Square", "Triangle"]
}
]
</Cabbage>
<CsoundSynthesizer>
<CsOptions>
-n -d -+rtmidi=NULL -M0 -m0d --midi-key=4 --midi-velocity-amp=5
</CsOptions>
<CsInstruments>
; Initialize the global variables.
ksmps = 32
nchnls = 2
0dbfs = 1


; Rory Walsh 2021
;
; License: CC0 1.0 Universal
; You can copy, modify, and distribute this file,
; even for commercial purposes, all without asking permission.

instr 1

vcoModes:i[] fillarray 0, 10, 12
att:i = cabbageGetValue("att")
dec:i = cabbageGetValue("dec")
sus:i = cabbageGetValue("sus")
rel:i = cabbageGetValue("rel")
env:k = madsr(att, dec, sus, rel)
vcoOut:a = vco2(env*p5*.5, cpsmidinn:k(p4), vcoModes[cabbageGetValue:i("waveform")])
outs(vcoOut, vcoOut)

endin


</CsInstruments>
<CsScore>
;causes Csound to run for about 7000 years...
f0 z
</CsScore>
</CsoundSynthesizer>