@gorilla-engine-sdk/create-gorilla-engine-plugin 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +64 -0
- package/README.md +103 -0
- package/generator-gorilla-engine-plugin/app/index.js +338 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/SKILL.md +295 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/effects-filters.md +186 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/indexing.md +129 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/instrument-files.md +547 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/key-rules.md +81 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/modulation.md +210 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-control.md +217 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-bus-effects.md +663 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-core.md +145 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-misc.md +59 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-modulation.md +85 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-voice-effects.md +407 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/note-events.md +278 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/properties.md +230 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/script-patterns.md +494 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/time-tempo.md +209 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/SKILL.md +104 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/advanced-controls.md +194 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/base-props.md +167 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/basic-controls.md +230 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/bindings.md +183 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/composite-components.md +258 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/containers.md +149 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/editors.md +191 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/event-handlers.md +150 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/getting-started.md +143 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/gorilla-engine-api.md +147 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/instrument-api.md +250 -0
- package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/visualization.md +209 -0
- package/generator-gorilla-engine-plugin/app/templates/.prettierignore +13 -0
- package/generator-gorilla-engine-plugin/app/templates/.vscode/settings.json +14 -0
- package/generator-gorilla-engine-plugin/app/templates/.vscode_input/launch.json +89 -0
- package/generator-gorilla-engine-plugin/app/templates/README.md +36 -0
- package/generator-gorilla-engine-plugin/app/templates/assets/fonts/OFL.txt +93 -0
- package/generator-gorilla-engine-plugin/app/templates/assets/fonts/Roboto-Bold.otf +0 -0
- package/generator-gorilla-engine-plugin/app/templates/assets/fonts/Roboto-Medium.otf +0 -0
- package/generator-gorilla-engine-plugin/app/templates/assets/fonts/Roboto-Regular.otf +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/Presets/Factory/Category 1/Init.preset +1 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/Presets/Factory/Category 1/Three Quarters.preset +1 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Horizontal Slider.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Horizontal Slider@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary Bipolar.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary-Bipolar@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-default.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-default@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-hover.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-hover@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-pressed.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-pressed@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-default.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-default@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-hover.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-hover@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-pressed.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-pressed@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-default.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-default@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-pressed.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-pressed@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/instruments/Basic Synth Example_part1.blob +0 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/instruments/Basic Synth Example_part2.blob +1 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/instrument/Basic Synth Example.inst +157 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/instrument/Basic Synth Example.txt +184 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/Root.tsx +35 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/components/ErrorBoundary.tsx +138 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/components/UserInterface.tsx +338 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/pluginConfig.ts +4 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/dialogsCustomStyle.ts +98 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/index.tsx +217 -0
- package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/presetBrowserCustomStyle.ts +124 -0
- package/generator-gorilla-engine-plugin/app/templates/build.ugep +173 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/01 - All The Way Down.preset +1 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/02 - About Half.preset +1 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/03 - Three Quarters.preset +1 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/04 - All The Way Up.preset +1 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/images/Rotary.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/images/Rotary@2x.png +0 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/instruments/Reverb Example_part1.blob +0 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/assets/instruments/Reverb Example_part2.blob +1 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/instrument/Reverb Example.inst +73 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/instrument/Reverb Example.txt +21 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/app/Root.tsx +35 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/app/components/ErrorBoundary.tsx +114 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/app/components/UserInterface.tsx +85 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/app/pluginConfig.ts +4 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/dialogsCustomStyle.ts +101 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/index.tsx +214 -0
- package/generator-gorilla-engine-plugin/app/templates/effect/src/presetBrowserCustomStyle.ts +124 -0
- package/generator-gorilla-engine-plugin/app/templates/gitignore +9 -0
- package/generator-gorilla-engine-plugin/app/templates/licence.txt +0 -0
- package/generator-gorilla-engine-plugin/app/templates/package.json +38 -0
- package/generator-gorilla-engine-plugin/app/templates/prettierrc +9 -0
- package/generator-gorilla-engine-plugin/app/templates/tsconfig.json +20 -0
- package/generator-gorilla-engine-plugin/package.json +17 -0
- package/index.js +72 -0
- package/package.json +42 -0
|
@@ -0,0 +1,209 @@
|
|
|
1
|
+
# Time & Tempo Reference
|
|
2
|
+
|
|
3
|
+
## Delay Functions
|
|
4
|
+
|
|
5
|
+
### delay(microseconds)
|
|
6
|
+
|
|
7
|
+
Pause the current callback. The callback resumes after the delay. Other callbacks can run during the wait.
|
|
8
|
+
|
|
9
|
+
```
|
|
10
|
+
on note
|
|
11
|
+
' trigger note, wait 500ms, then change pitch
|
|
12
|
+
delay(500000)
|
|
13
|
+
set_tune(EVENT_ID, 100000, 1) ' pitch up 1 semitone
|
|
14
|
+
end on
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### delay_msec(milliseconds)
|
|
18
|
+
|
|
19
|
+
Approximate delay (~1-2ms accuracy). More CPU efficient than `delay()`.
|
|
20
|
+
|
|
21
|
+
```
|
|
22
|
+
delay_msec(100) ' approximately 100ms
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
### delay_ppq(ppq)
|
|
26
|
+
|
|
27
|
+
Delay by musical time. 960 ppq = quarter note. Follows tempo changes.
|
|
28
|
+
|
|
29
|
+
| PPQ Value | Musical Duration |
|
|
30
|
+
|-----------|-----------------|
|
|
31
|
+
| 3840 | Whole note |
|
|
32
|
+
| 2880 | Dotted half |
|
|
33
|
+
| 1920 | Half note |
|
|
34
|
+
| 1440 | Dotted quarter |
|
|
35
|
+
| 960 | Quarter note |
|
|
36
|
+
| 720 | Dotted 8th |
|
|
37
|
+
| 480 | 8th note |
|
|
38
|
+
| 360 | Dotted 16th |
|
|
39
|
+
| 240 | 16th note |
|
|
40
|
+
| 120 | 32nd note |
|
|
41
|
+
|
|
42
|
+
Triplets: divide by 3 (e.g., quarter triplet = 640 ppq, 8th triplet = 320 ppq).
|
|
43
|
+
|
|
44
|
+
```
|
|
45
|
+
delay_ppq(480) ' wait one 8th note
|
|
46
|
+
delay_ppq(240) ' wait one 16th note
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
### end_delay(callbackID, andFutureDelays)
|
|
50
|
+
|
|
51
|
+
Cancel a delay in a specific callback. If `andFutureDelays` ≠ 0, future delays in that callback are also skipped.
|
|
52
|
+
|
|
53
|
+
```
|
|
54
|
+
' Store callback ID for later cancellation
|
|
55
|
+
seqCallback = CALLBACK_ID
|
|
56
|
+
while seqCallback = CALLBACK_ID
|
|
57
|
+
' do sequencer step...
|
|
58
|
+
delay_ppq(480)
|
|
59
|
+
end while
|
|
60
|
+
|
|
61
|
+
' To stop the sequence from another callback:
|
|
62
|
+
var temp = seqCallback
|
|
63
|
+
seqCallback = 0
|
|
64
|
+
end_delay(temp, 0)
|
|
65
|
+
```
|
|
66
|
+
|
|
67
|
+
## Time Variables
|
|
68
|
+
|
|
69
|
+
| Variable | Description |
|
|
70
|
+
|----------|-------------|
|
|
71
|
+
| `TIME_MSEC` | Elapsed time in milliseconds since audio started (always increasing) |
|
|
72
|
+
| `TIME_USEC` | Elapsed time in microseconds, sample-accurate. Reset with `reset_time_usec()` |
|
|
73
|
+
| `BEAT_USEC` | Duration of one quarter note in microseconds at current tempo |
|
|
74
|
+
| `BAR_USEC` | Duration of one bar in microseconds |
|
|
75
|
+
| `BAR_POS_PPQ` | Position within current bar in ppq |
|
|
76
|
+
| `BAR_POS_USEC` | Position within current bar in μs |
|
|
77
|
+
| `SONG_POS_PPQ` | Transport position in ppq (960 per quarter) |
|
|
78
|
+
| `SONG_PLAYING` | 0 = stopped, 1 = playing |
|
|
79
|
+
| `TIME_SIG_NUM` | Time signature numerator (beat type: 4=quarter, 8=eighth) |
|
|
80
|
+
| `TIME_SIG_DEN` | Time signature denominator (beats per bar) |
|
|
81
|
+
|
|
82
|
+
## Tempo Sync Pattern
|
|
83
|
+
|
|
84
|
+
Common pattern for switchable free/synced rate:
|
|
85
|
+
|
|
86
|
+
```
|
|
87
|
+
on init
|
|
88
|
+
prop_boolean LFO_Sync
|
|
89
|
+
prop_linear LFO_Rate(0, 1000, 10) = 500
|
|
90
|
+
|
|
91
|
+
prop_stepped LFO_Beats = 6
|
|
92
|
+
add_step(LFO_Beats, "1/1")
|
|
93
|
+
add_step(LFO_Beats, "1/2 D")
|
|
94
|
+
add_step(LFO_Beats, "1/1 T")
|
|
95
|
+
add_step(LFO_Beats, "1/2")
|
|
96
|
+
add_step(LFO_Beats, "1/4 D")
|
|
97
|
+
add_step(LFO_Beats, "1/2 T")
|
|
98
|
+
add_step(LFO_Beats, "1/4")
|
|
99
|
+
add_step(LFO_Beats, "1/8 D")
|
|
100
|
+
add_step(LFO_Beats, "1/4 T")
|
|
101
|
+
add_step(LFO_Beats, "1/8")
|
|
102
|
+
add_step(LFO_Beats, "1/16 D")
|
|
103
|
+
add_step(LFO_Beats, "1/8 T")
|
|
104
|
+
add_step(LFO_Beats, "1/16")
|
|
105
|
+
|
|
106
|
+
' Precomputed LFO rate values for each beat division at module param scale
|
|
107
|
+
var lfoLookup[13] = (650515, 619280, 606492, 575257, 544023, 531235, 500000,
|
|
108
|
+
468765, 455977, 424743, 393508, 380720, 349485)
|
|
109
|
+
end on
|
|
110
|
+
|
|
111
|
+
function SetLfoRate
|
|
112
|
+
if LFO_Sync
|
|
113
|
+
set_module_param(M_GROUP+0, M_MOD_SRC+1, 0, 3, lfoLookup[LFO_Beats])
|
|
114
|
+
else
|
|
115
|
+
set_module_param(M_GROUP+0, M_MOD_SRC+1, 0, 3, 1000 * LFO_Rate)
|
|
116
|
+
end if
|
|
117
|
+
end function
|
|
118
|
+
|
|
119
|
+
on LFO_Sync
|
|
120
|
+
set_module_param(M_GROUP+0, M_MOD_SRC+1, 0, 4, LFO_Sync) ' LFO Sync param
|
|
121
|
+
SetLfoRate()
|
|
122
|
+
end on
|
|
123
|
+
|
|
124
|
+
on LFO_Rate; SetLfoRate(); end on
|
|
125
|
+
on LFO_Beats; SetLfoRate(); end on
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
## Time Conversion
|
|
129
|
+
|
|
130
|
+
| Function | Description |
|
|
131
|
+
|----------|-------------|
|
|
132
|
+
| `usec_to_ppq(usec)` | Convert microseconds to ppq at current tempo |
|
|
133
|
+
| `ppq_to_usec(ppq)` | Convert ppq to microseconds at current tempo |
|
|
134
|
+
| `usec_to_samples(usec)` | Convert microseconds to sample frames |
|
|
135
|
+
| `reset_time_usec()` | Reset TIME_USEC to zero |
|
|
136
|
+
| `set_bar_start(ppq)` | Set custom position for beat-synced effects |
|
|
137
|
+
|
|
138
|
+
## Transport Callback
|
|
139
|
+
|
|
140
|
+
```
|
|
141
|
+
on transport
|
|
142
|
+
if SONG_PLAYING
|
|
143
|
+
' transport started
|
|
144
|
+
else
|
|
145
|
+
' transport stopped
|
|
146
|
+
release_note(ALL_EVENTS)
|
|
147
|
+
end if
|
|
148
|
+
end on
|
|
149
|
+
```
|
|
150
|
+
|
|
151
|
+
Also available via `on listener` (periodic polling):
|
|
152
|
+
|
|
153
|
+
```
|
|
154
|
+
on listener
|
|
155
|
+
if SONG_PLAYING
|
|
156
|
+
' playing
|
|
157
|
+
else
|
|
158
|
+
' stopped
|
|
159
|
+
end if
|
|
160
|
+
end on
|
|
161
|
+
```
|
|
162
|
+
|
|
163
|
+
## CC 123 — All Notes Off / Audio Restart
|
|
164
|
+
|
|
165
|
+
CC 123 is sent when the audio engine starts or restarts. Use it to initialize state:
|
|
166
|
+
|
|
167
|
+
```
|
|
168
|
+
on controller
|
|
169
|
+
if EVENT_CC = 123
|
|
170
|
+
numHeldNotes = 0
|
|
171
|
+
release_note(ALL_EVENTS)
|
|
172
|
+
' Also good place to report latency:
|
|
173
|
+
declare_latency(value)
|
|
174
|
+
end if
|
|
175
|
+
end on
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
## Seconds to Envelope Time Conversion
|
|
179
|
+
|
|
180
|
+
Envelope times are exponentially scaled. To convert seconds to parameter values, use a lookup table:
|
|
181
|
+
|
|
182
|
+
```
|
|
183
|
+
on init
|
|
184
|
+
prop_linear Attack(0, 10000, 1000)
|
|
185
|
+
set_prop_param(Attack, PROP_UNITS, "sec")
|
|
186
|
+
|
|
187
|
+
' Lookup table: 0.00 to 16.00 seconds in 0.01 steps → parameter values
|
|
188
|
+
const sec_to_envTime[1601] = (0, 10000, 103012, 157420, ...)
|
|
189
|
+
|
|
190
|
+
var value
|
|
191
|
+
var temp
|
|
192
|
+
end on
|
|
193
|
+
|
|
194
|
+
function convertToEnvTime
|
|
195
|
+
if value >= 16000000
|
|
196
|
+
value = 1000000
|
|
197
|
+
else
|
|
198
|
+
temp = value / 10000
|
|
199
|
+
value = sec_to_envTime[temp] + ...
|
|
200
|
+
((value mod 10000) * (sec_to_envTime[temp + 1] - sec_to_envTime[temp])) / 10000
|
|
201
|
+
end if
|
|
202
|
+
end function
|
|
203
|
+
|
|
204
|
+
on Attack
|
|
205
|
+
value = 1000 * Attack ' time in microseconds
|
|
206
|
+
convertToEnvTime()
|
|
207
|
+
set_module_param(M_GROUP+0, M_MOD_SRC+1, 0, 2, value) ' ADSR Attack
|
|
208
|
+
end on
|
|
209
|
+
```
|
package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/SKILL.md
ADDED
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gorilla-engine-ui
|
|
3
|
+
description: 'Write UI using the Gorilla Engine React implementation. Use when: building plugin UIs, creating GE components, using geKnob/geSlider/geButton/geToggle/geLabel/geComboBox, binding instrument properties, discovering concrete instrument parameters from .inst files, loadUI/createUI, useInstrument/useInstrumentProperty hooks, Gorilla React for native audio plugins.'
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Gorilla Engine React UI
|
|
7
|
+
|
|
8
|
+
Build native audio plugin UIs using a custom React reconciler that bridges React components to Gorilla Engine's C++ UI framework.
|
|
9
|
+
|
|
10
|
+
**Environment Constraints:**
|
|
11
|
+
|
|
12
|
+
- There is **NO browser DOM**. Do NOT use `div`, `span`, `input`, `html`, etc.
|
|
13
|
+
- There is **NO React Native**. Do NOT use `View`, `Text`, `TouchableOpacity`, etc.
|
|
14
|
+
- You may ONLY use the primitive components defined in this skill and component libraries that build on top of them.
|
|
15
|
+
|
|
16
|
+
## Architecture
|
|
17
|
+
|
|
18
|
+
- **Custom React Reconciler** — maps React lifecycle to native GE components
|
|
19
|
+
- **JSX intrinsic elements** — lowercase tags: `<geKnob />`, `<geSlider />`, `<geLabel />`
|
|
20
|
+
- **27 native components** wrapped as React elements
|
|
21
|
+
- **Declarative bindings** — bind UI to instrument parameters via `bindings` prop
|
|
22
|
+
- **Standard React** — hooks, state, conditionals, fragments all work normally
|
|
23
|
+
|
|
24
|
+
## Quick Start
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { createUI, useInstrument, useInstrumentProperty } from 'gorilla-engine-react';
|
|
28
|
+
|
|
29
|
+
function App() {
|
|
30
|
+
const [instrument] = useInstrument();
|
|
31
|
+
if (!instrument) return null;
|
|
32
|
+
return <PluginUI instrument={instrument} />;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
function PluginUI({ instrument }) {
|
|
36
|
+
const [volume, setVolume] = useInstrumentProperty(instrument, 'Volume');
|
|
37
|
+
return (
|
|
38
|
+
<geLabel x={0} y={0} width={400} height={300} backgroundColor="FF222222">
|
|
39
|
+
<geKnob
|
|
40
|
+
x={50}
|
|
41
|
+
y={50}
|
|
42
|
+
width={80}
|
|
43
|
+
height={80}
|
|
44
|
+
min={0}
|
|
45
|
+
max={100}
|
|
46
|
+
value={volume.value}
|
|
47
|
+
onChange={(v) => setVolume(v)}
|
|
48
|
+
filmstrip={{ path: 'knob.png', count: 128 }}
|
|
49
|
+
/>
|
|
50
|
+
<geLabel x={50} y={140} width={80} height={20} text={volume.text} textColor="FFFFFF" />
|
|
51
|
+
</geLabel>
|
|
52
|
+
);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
createUI(<App />, 400, 300);
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Concrete Instrument Parameters
|
|
59
|
+
|
|
60
|
+
When you need the actual parameter names for a specific instrument, do not guess them from the script or UI code. Query the compiled instrument directly:
|
|
61
|
+
|
|
62
|
+
```bash
|
|
63
|
+
blob-export --parameter-info <INST_FILE>
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
This returns JSON describing the parameters exposed by that `.inst` file. Use that output as the source of truth for control bindings, `useInstrumentProperty(...)`, and any parameter-specific UI generation.
|
|
67
|
+
|
|
68
|
+
Preferred `blob-export` locations:
|
|
69
|
+
|
|
70
|
+
- macOS: `/Applications/Gorilla Engine SDK/Tools/blob-export`
|
|
71
|
+
- Windows: `%SystemDrive%\\Program Files\\Gorilla Engine SDK\\Tools\\blob-export.exe`
|
|
72
|
+
- Fallback: `blob-export` from `PATH`
|
|
73
|
+
|
|
74
|
+
When binding by name, remember that instrument parameter identifiers in bindings are lowercase even if the instrument script declared them with uppercase letters.
|
|
75
|
+
|
|
76
|
+
## Reference Files
|
|
77
|
+
|
|
78
|
+
Load these as needed for detailed information:
|
|
79
|
+
|
|
80
|
+
| Topic | File | When to load |
|
|
81
|
+
| ----------------- | --------------------------------------------------------------- | -------------------------------------------------------------------------- |
|
|
82
|
+
| Getting Started | [getting-started.md](./references/getting-started.md) | Entry points, hooks, app structure |
|
|
83
|
+
| Base Props | [base-props.md](./references/base-props.md) | Common, Bounds, Background, Font, Clickable interfaces |
|
|
84
|
+
| Event Handlers | [event-handlers.md](./references/event-handlers.md) | onClick, onChange, onMouseDrag, etc. |
|
|
85
|
+
| Bindings | [bindings.md](./references/bindings.md) | Data binding syntax and view model integration |
|
|
86
|
+
| Basic Controls | [basic-controls.md](./references/basic-controls.md) | geLabel, geButton, geKnob, geSlider, geToggle, geTextBox |
|
|
87
|
+
| Advanced Controls | [advanced-controls.md](./references/advanced-controls.md) | geComboBox, geXYPad, geMidiKeyboard, gePad |
|
|
88
|
+
| Visualization | [visualization.md](./references/visualization.md) | geLevelMeter, geWaveform, geCurve, geAmpEnv, geLottieAnimation |
|
|
89
|
+
| Editors | [editors.md](./references/editors.md) | geSliceEditor, geListBox, geStepEditor, geBarStepEditor, geMappingEditor |
|
|
90
|
+
| Containers | [containers.md](./references/containers.md) | geScrollView, geDragContainer, geDragTarget, geDropZone, geRubberband |
|
|
91
|
+
| Tags & Composite | [composite-components.md](./references/composite-components.md) | geTagBrowser, geTagEditor, RadioGroup, LabelledKnob, LabelledSlider |
|
|
92
|
+
| GorillaEngine API | [gorilla-engine-api.md](./references/gorilla-engine-api.md) | GorillaEngine global namespace, UI utilities, File I/O, Preset, Licensing |
|
|
93
|
+
| Instrument API | [instrument-api.md](./references/instrument-api.md) | Blob, Instrument, InstrumentProperty, MIDI, path accessors, dynamic params |
|
|
94
|
+
|
|
95
|
+
## Key Rules
|
|
96
|
+
|
|
97
|
+
1. **All components use `Partial<Props>`** — every prop is optional
|
|
98
|
+
2. **JSX tag names are lowercase** — `geKnob`, not `GEKnob`
|
|
99
|
+
3. **Position is absolute** — use `x`, `y`, `width`, `height` (no CSS layout). Children are clipped to parent bounds.
|
|
100
|
+
4. **Colors are hex strings** — `"FF0000"` for red, prefix with alpha `"80FF0000"` for 50% opacity
|
|
101
|
+
5. **Assets are file paths** — relative to the plugin's resource path
|
|
102
|
+
6. **`geLabel` doubles as a container** — it has Background, so use it for panels/groups
|
|
103
|
+
7. **`createUI()`** for pure React entry, **`loadUI()`** when using a YAML layout
|
|
104
|
+
8. **Bindings** connect props to instrument parameters: `bindings={{ value: instrument.volume }}` (object preferred) or `bindings={{ value: 'instrument.volume' }}` (string). Be aware that the instrument parameters are always lowercase in both cases, even if defined in uppercase in the instrument script.
|
|
@@ -0,0 +1,194 @@
|
|
|
1
|
+
# Advanced Controls
|
|
2
|
+
|
|
3
|
+
## geComboBox
|
|
4
|
+
|
|
5
|
+
Dropdown selection list.
|
|
6
|
+
|
|
7
|
+
**JSX tag:** `<geComboBox />`
|
|
8
|
+
**Interfaces:** Common, Bounds, Background, Clickable, Font, Highlight
|
|
9
|
+
**Handlers:** ClickableHandlers, `onChange`
|
|
10
|
+
|
|
11
|
+
| Prop | Type | Description |
|
|
12
|
+
|------|------|-------------|
|
|
13
|
+
| `value` | `number` | Selected index |
|
|
14
|
+
| `items` | `string[]` | List of options |
|
|
15
|
+
| `levelSeperator` | `string` | Character for nested submenus (e.g. `"/"`) |
|
|
16
|
+
| `stretchText` | `boolean` | Stretch text to fit width |
|
|
17
|
+
| `scrollWheelEnabled` | `boolean` | Navigate items with scroll wheel |
|
|
18
|
+
| `styleSubmenu` | `boolean` | Apply distinct submenu styling |
|
|
19
|
+
| `backgroundColorClicked` | `string` | Color when popup is open |
|
|
20
|
+
| `backgroundColorHover` | `string` | Color on hover |
|
|
21
|
+
| `itemReselectedAction` | `string` | ViewModel action when same item is reselected |
|
|
22
|
+
| `padding` | `number \| object` | `{ left, top, right, bottom }` |
|
|
23
|
+
| `images` | `object` | Arrow/checkmark/submenu images (see below) |
|
|
24
|
+
| `popup` | `object` | Popup styling (see below) |
|
|
25
|
+
| `subPopup` | `object` | Sub-popup styling |
|
|
26
|
+
|
|
27
|
+
**Images object:**
|
|
28
|
+
```tsx
|
|
29
|
+
images={{
|
|
30
|
+
arrowIcon: 'arrow.png',
|
|
31
|
+
arrowIconPressed: 'arrow_pressed.png',
|
|
32
|
+
popupCheckmarkImage: 'check.png',
|
|
33
|
+
popupCheckmarkHighlightedImage: 'check_hl.png',
|
|
34
|
+
}}
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
**Popup styling object:**
|
|
38
|
+
```tsx
|
|
39
|
+
popup={{
|
|
40
|
+
backgroundColor: 'FF333333',
|
|
41
|
+
itemTextColor: 'FFFFFF',
|
|
42
|
+
itemSelectedTextColor: 'FFFF00',
|
|
43
|
+
itemSelectedBackgroundColor: 'FF555555',
|
|
44
|
+
itemHighlightedTextColor: 'FFFFFF',
|
|
45
|
+
itemHighlightedBackgroundColor: 'FF4444FF',
|
|
46
|
+
checkmarkFloat: 'left',
|
|
47
|
+
cornerRadius: 4,
|
|
48
|
+
padding: { left: 5, top: 5, right: 5, bottom: 5 },
|
|
49
|
+
}}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
<geComboBox x={10} y={10} width={150} height={30}
|
|
54
|
+
items={['Sine', 'Saw', 'Square', 'Triangle']}
|
|
55
|
+
value={waveform}
|
|
56
|
+
backgroundColor="FF333333" textColor="FFFFFF"
|
|
57
|
+
onChange={(index) => setWaveform(index)}
|
|
58
|
+
/>
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
**With submenus:**
|
|
62
|
+
```tsx
|
|
63
|
+
<geComboBox x={10} y={10} width={200} height={30}
|
|
64
|
+
items={['Oscillators/Sine', 'Oscillators/Saw', 'Filters/LowPass', 'Filters/HighPass']}
|
|
65
|
+
levelSeperator="/"
|
|
66
|
+
value={0}
|
|
67
|
+
onChange={(index) => setType(index)}
|
|
68
|
+
/>
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
---
|
|
72
|
+
|
|
73
|
+
## geXYPad
|
|
74
|
+
|
|
75
|
+
2D control surface for adjusting two parameters simultaneously.
|
|
76
|
+
|
|
77
|
+
**JSX tag:** `<geXYPad />`
|
|
78
|
+
**Interfaces:** Common, Bounds, Clickable, Background
|
|
79
|
+
**Handlers:** ClickableHandlers
|
|
80
|
+
|
|
81
|
+
| Prop | Type | Description |
|
|
82
|
+
|------|------|-------------|
|
|
83
|
+
| `valueX` | `number` | Current X value |
|
|
84
|
+
| `valueY` | `number` | Current Y value |
|
|
85
|
+
| `minX` / `maxX` | `number` | X axis range |
|
|
86
|
+
| `minY` / `maxY` | `number` | Y axis range |
|
|
87
|
+
| `stepSizeX` / `stepSizeY` | `number` | Step sizes |
|
|
88
|
+
| `snapsToMousePosition` | `boolean` | Snap thumb to click position |
|
|
89
|
+
| `thumbImage` | `string` | Path to thumb image |
|
|
90
|
+
|
|
91
|
+
```tsx
|
|
92
|
+
<geXYPad x={10} y={10} width={200} height={200}
|
|
93
|
+
valueX={64} valueY={64}
|
|
94
|
+
minX={0} maxX={127} minY={0} maxY={127}
|
|
95
|
+
backgroundColor="FF222222"
|
|
96
|
+
thumbImage="assets/xy_thumb.png"
|
|
97
|
+
bindings={{ valueX: 'Scripts/0/PanX', valueY: 'Scripts/0/PanY' }}
|
|
98
|
+
/>
|
|
99
|
+
```
|
|
100
|
+
|
|
101
|
+
---
|
|
102
|
+
|
|
103
|
+
## geMidiKeyboard
|
|
104
|
+
|
|
105
|
+
On-screen MIDI keyboard.
|
|
106
|
+
|
|
107
|
+
**JSX tag:** `<geMidiKeyboard />`
|
|
108
|
+
**Interfaces:** Common, Bounds, Background
|
|
109
|
+
|
|
110
|
+
| Prop | Type | Description |
|
|
111
|
+
|------|------|-------------|
|
|
112
|
+
| `lowKey` | `number` | First MIDI note to display |
|
|
113
|
+
| `highKey` | `number` | Last MIDI note to display |
|
|
114
|
+
| `disableNKSColors` | `boolean` | Disable NKS color mapping |
|
|
115
|
+
| `keys` | `object` | Key appearance configuration (see below) |
|
|
116
|
+
|
|
117
|
+
**Keys configuration:**
|
|
118
|
+
```tsx
|
|
119
|
+
keys={{
|
|
120
|
+
blackColor: 'FF333333',
|
|
121
|
+
blackHoverColor: 'FF555555',
|
|
122
|
+
blackPressedColor: 'FF777777',
|
|
123
|
+
blackOutlineColor: 'FF000000',
|
|
124
|
+
whiteColor: 'FFEEEEEE',
|
|
125
|
+
whiteHoverColor: 'FFCCCCCC',
|
|
126
|
+
whitePressedColor: 'FFAAAAAA',
|
|
127
|
+
whiteOutlineColor: 'FF888888',
|
|
128
|
+
whiteHeight: 80,
|
|
129
|
+
blackHeight: 50,
|
|
130
|
+
spacing: 1,
|
|
131
|
+
outlineWidth: 1,
|
|
132
|
+
cornerRadius: 2,
|
|
133
|
+
}}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
```tsx
|
|
137
|
+
<geMidiKeyboard x={0} y={400} width={800} height={100}
|
|
138
|
+
lowKey={36} highKey={84}
|
|
139
|
+
backgroundColor="FF111111"
|
|
140
|
+
keys={{
|
|
141
|
+
whiteColor: 'FFEEEEEE',
|
|
142
|
+
blackColor: 'FF333333',
|
|
143
|
+
whitePressedColor: 'FF4488FF',
|
|
144
|
+
blackPressedColor: 'FF4488FF',
|
|
145
|
+
}}
|
|
146
|
+
/>
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
---
|
|
150
|
+
|
|
151
|
+
## gePad
|
|
152
|
+
|
|
153
|
+
MIDI trigger pad — fires note on/off events on click.
|
|
154
|
+
|
|
155
|
+
**JSX tag:** `<gePad />`
|
|
156
|
+
**Interfaces:** Common, Bounds, Background, KeyboardFocus, Clickable, Skinnable, Font
|
|
157
|
+
**Handlers:** ClickableHandlers
|
|
158
|
+
|
|
159
|
+
| Prop | Type | Description |
|
|
160
|
+
|------|------|-------------|
|
|
161
|
+
| `midiNote` | `number` | MIDI note number (0-127) |
|
|
162
|
+
| `velocity` | `number` | Velocity when pressed (0-127) |
|
|
163
|
+
| `padState` | `boolean` | Visual pressed/playing state |
|
|
164
|
+
| `images` | `object` | `{ normal?, hover?, down? }` — image paths |
|
|
165
|
+
|
|
166
|
+
**Note:** gePad gets a default `keyboardFocus.color` of `"00000000"` (transparent).
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
<gePad x={10} y={10} width={60} height={60}
|
|
170
|
+
midiNote={60} velocity={100}
|
|
171
|
+
backgroundColor="FF444444"
|
|
172
|
+
images={{
|
|
173
|
+
normal: 'pad.png',
|
|
174
|
+
hover: 'pad_hover.png',
|
|
175
|
+
down: 'pad_down.png',
|
|
176
|
+
}}
|
|
177
|
+
onClick={() => console.log('pad hit')}
|
|
178
|
+
/>
|
|
179
|
+
```
|
|
180
|
+
|
|
181
|
+
**Pad grid example:**
|
|
182
|
+
```tsx
|
|
183
|
+
{[0, 1, 2, 3].map(row =>
|
|
184
|
+
[0, 1, 2, 3].map(col => (
|
|
185
|
+
<gePad key={`${row}-${col}`}
|
|
186
|
+
x={col * 70} y={row * 70}
|
|
187
|
+
width={60} height={60}
|
|
188
|
+
midiNote={36 + row * 4 + col}
|
|
189
|
+
velocity={100}
|
|
190
|
+
backgroundColor="FF444444"
|
|
191
|
+
/>
|
|
192
|
+
))
|
|
193
|
+
)}
|
|
194
|
+
```
|
|
@@ -0,0 +1,167 @@
|
|
|
1
|
+
# Base Props (Shared Interfaces)
|
|
2
|
+
|
|
3
|
+
All GE components compose their props from these base interfaces. Every property in every interface is optional (`Partial<T>`).
|
|
4
|
+
|
|
5
|
+
## Common
|
|
6
|
+
|
|
7
|
+
Shared by all components.
|
|
8
|
+
|
|
9
|
+
| Prop | Type | Description |
|
|
10
|
+
|------|------|-------------|
|
|
11
|
+
| `id` | `string` | Unique identifier |
|
|
12
|
+
| `visible` | `boolean` | Show/hide the component |
|
|
13
|
+
| `enabled` | `boolean` | Enable/disable user input |
|
|
14
|
+
| `wantsKeyboardFocus` | `boolean` | Request keyboard focus on activation |
|
|
15
|
+
| `clickGrabsKeyboardFocus` | `boolean` | Click transfers keyboard focus |
|
|
16
|
+
| `alpha` | `number` | Opacity 0.0 (transparent) to 1.0 (opaque) |
|
|
17
|
+
| `alwaysOnTop` | `boolean` | Render above siblings |
|
|
18
|
+
|
|
19
|
+
## Bounds
|
|
20
|
+
|
|
21
|
+
Position and size. Used by virtually all components.
|
|
22
|
+
|
|
23
|
+
| Prop | Type | Description |
|
|
24
|
+
|------|------|-------------|
|
|
25
|
+
| `x` | `number` | X position (from parent's left edge) |
|
|
26
|
+
| `y` | `number` | Y position (from parent's top edge) |
|
|
27
|
+
| `width` | `number` | Width in pixels |
|
|
28
|
+
| `height` | `number` | Height in pixels |
|
|
29
|
+
|
|
30
|
+
## Background
|
|
31
|
+
|
|
32
|
+
Visual background properties.
|
|
33
|
+
|
|
34
|
+
| Prop | Type | Description |
|
|
35
|
+
|------|------|-------------|
|
|
36
|
+
| `backgroundImage` | `string` | Image path (takes precedence over color) |
|
|
37
|
+
| `backgroundColor` | `string` | Solid color hex string |
|
|
38
|
+
| `cornerRadius` | `number` | Rounded corner radius |
|
|
39
|
+
| `border` | `object` | `{ width?, color?, focusColor? }` |
|
|
40
|
+
|
|
41
|
+
## Font
|
|
42
|
+
|
|
43
|
+
Text rendering properties.
|
|
44
|
+
|
|
45
|
+
| Prop | Type | Description |
|
|
46
|
+
|------|------|-------------|
|
|
47
|
+
| `font` | `string` | Font family name |
|
|
48
|
+
| `fontSize` | `number` | Font size |
|
|
49
|
+
| `fontKerning` | `number` | Character spacing adjustment |
|
|
50
|
+
| `textColor` | `string` | Hex color, e.g. `"FFFFFF"`. RGBA prefix: `"80FF0000"` |
|
|
51
|
+
| `textAlign` | `string` | One of: `'left'`, `'right'`, `'center'`, `'centered left'`, `'centered right'`, `'top left'`, `'top right'`, `'top center'`, `'bottom left'`, `'bottom right'`, `'bottom center'` |
|
|
52
|
+
|
|
53
|
+
## Clickable
|
|
54
|
+
|
|
55
|
+
Mouse interaction properties.
|
|
56
|
+
|
|
57
|
+
| Prop | Type | Description |
|
|
58
|
+
|------|------|-------------|
|
|
59
|
+
| `interceptsMouseClicks` | `boolean` | Process mouse events directly |
|
|
60
|
+
| `allowClicksOnChildren` | `boolean` | Let children process mouse events |
|
|
61
|
+
| `modifiedClickAction` | `string` | Action on Shift/Ctrl+click |
|
|
62
|
+
| `doubleClickAction` | `string` | Action on double-click (ViewModel) |
|
|
63
|
+
| `mouseEnterAction` | `string` | Action on mouse enter |
|
|
64
|
+
| `mouseExitAction` | `string` | Action on mouse exit |
|
|
65
|
+
| `clickMask` | `string` | Bitmask for clickable region |
|
|
66
|
+
| `mouseCursorType` | `string` | Cursor style: `'normal'`, `'pointing hand'`, `'IBeam'`, `'cross hair'`, `'wait'`, `'dragging hand'`, `'left right resize'`, etc. |
|
|
67
|
+
|
|
68
|
+
## Skinnable
|
|
69
|
+
|
|
70
|
+
Filmstrip animation/visual properties (used by knobs, sliders, toggles, pads, etc.).
|
|
71
|
+
|
|
72
|
+
| Prop | Type | Description |
|
|
73
|
+
|------|------|-------------|
|
|
74
|
+
| `filmstrip` | `object` | `{ path: string, count: number, direction?: string }` |
|
|
75
|
+
| `animation` | `LottieAnimation` | Reference to a linked Lottie animation |
|
|
76
|
+
|
|
77
|
+
## Margin
|
|
78
|
+
|
|
79
|
+
Text positioning within a component's container.
|
|
80
|
+
|
|
81
|
+
| Prop | Type | Description |
|
|
82
|
+
|------|------|-------------|
|
|
83
|
+
| `margin` | `number \| object` | Uniform number, or `{ left, top, right, bottom, other }` |
|
|
84
|
+
|
|
85
|
+
## KeyboardFocus
|
|
86
|
+
|
|
87
|
+
Visual appearance when a component has keyboard focus.
|
|
88
|
+
|
|
89
|
+
| Prop | Type | Description |
|
|
90
|
+
|------|------|-------------|
|
|
91
|
+
| `keyboardFocus` | `object` | `{ color?, lineWidth?, cornerRadius? }` |
|
|
92
|
+
|
|
93
|
+
## Scrollable
|
|
94
|
+
|
|
95
|
+
Scrollbar styling.
|
|
96
|
+
|
|
97
|
+
| Prop | Type | Description |
|
|
98
|
+
|------|------|-------------|
|
|
99
|
+
| `scrollbar` | `object` | `{ background?, track?, thumb? }` — hex color strings |
|
|
100
|
+
|
|
101
|
+
## MIDILearn
|
|
102
|
+
|
|
103
|
+
| Prop | Type | Description |
|
|
104
|
+
|------|------|-------------|
|
|
105
|
+
| `midiLearn` | `object` | `{ enabled: boolean }` |
|
|
106
|
+
|
|
107
|
+
## Highlight
|
|
108
|
+
|
|
109
|
+
Automation highlight (AAX only).
|
|
110
|
+
|
|
111
|
+
| Prop | Type | Description |
|
|
112
|
+
|------|------|-------------|
|
|
113
|
+
| `highlight` | `object` | `{ drawFilledCircle, lineWidth, x, y, width, height }` |
|
|
114
|
+
|
|
115
|
+
## Keyable
|
|
116
|
+
|
|
117
|
+
Keyboard event properties.
|
|
118
|
+
|
|
119
|
+
| Prop | Type | Description |
|
|
120
|
+
|------|------|-------------|
|
|
121
|
+
| `keyPressAction` | `string` | ViewModel action on key press |
|
|
122
|
+
| `consumeEvent` | `boolean` | Prevent event propagation |
|
|
123
|
+
|
|
124
|
+
## ReactElementProps
|
|
125
|
+
|
|
126
|
+
Added by the React reconciler to all components.
|
|
127
|
+
|
|
128
|
+
| Prop | Type | Description |
|
|
129
|
+
|------|------|-------------|
|
|
130
|
+
| `key` | `string \| number` | React list reconciliation key |
|
|
131
|
+
| `children` | `any` | Nested React child elements |
|
|
132
|
+
| `ref` | `RefObject` | Access the underlying `GEComponent` wrapper |
|
|
133
|
+
| `bindings` | `object` | `{ [nativePropName]: 'viewModelPath' }` — see [bindings.md](./bindings.md) |
|
|
134
|
+
|
|
135
|
+
## Interface Composition per Component
|
|
136
|
+
|
|
137
|
+
Each component type combines a subset of these interfaces:
|
|
138
|
+
|
|
139
|
+
| Component | Interfaces |
|
|
140
|
+
|-----------|-----------|
|
|
141
|
+
| geKnob | Common, Bounds, Clickable, Background, Skinnable, MIDILearn, Highlight |
|
|
142
|
+
| geSlider | Same as geKnob + `direction`, `thumbImage` |
|
|
143
|
+
| geLabel | Common, Bounds, Background, Font, Clickable, Margin, Keyable |
|
|
144
|
+
| geButton | Common, Bounds, Font, Clickable, Background, KeyboardFocus, Keyable |
|
|
145
|
+
| geToggle | Common, Bounds, Font, Clickable, Background, Highlight, MIDILearn, Margin |
|
|
146
|
+
| geTextBox | Font, Clickable, Bounds, Background, Margin, Keyable |
|
|
147
|
+
| geComboBox | Common, Bounds, Background, Clickable, Font, Highlight |
|
|
148
|
+
| gePad | Common, Bounds, Background, KeyboardFocus, Clickable, Skinnable, Font |
|
|
149
|
+
| geScrollView | Common, Bounds, Scrollable |
|
|
150
|
+
| geMidiKeyboard | Common, Bounds, Background |
|
|
151
|
+
| geLevelMeter | Common, Bounds, Background, Skinnable |
|
|
152
|
+
| geWaveform | Common, Bounds, Background, Font, Clickable, Margin |
|
|
153
|
+
| geCurve | Common, Bounds, Background, Font, Clickable |
|
|
154
|
+
| geAmpEnv | Common, Bounds, Background, Font |
|
|
155
|
+
| geListBox | Common, Bounds, Font, Clickable, Background, Scrollable, Highlight, MIDILearn |
|
|
156
|
+
| geLottieAnimation | Common, Bounds |
|
|
157
|
+
| geXYPad | Common, Bounds, Clickable, Background |
|
|
158
|
+
| geRubberband | Common, Bounds |
|
|
159
|
+
| geMappingEditor | Common, Bounds, Background, Clickable |
|
|
160
|
+
| geSliceEditor | Common, Bounds, Background, Clickable |
|
|
161
|
+
| geStepEditor | Common, Background, Bounds, Clickable |
|
|
162
|
+
| geBarStepEditor | Common, Bounds, Background, Clickable |
|
|
163
|
+
| geDragContainer | Common, Bounds, Clickable |
|
|
164
|
+
| geDragTarget | Common, Bounds, Clickable |
|
|
165
|
+
| geDropZone | Common, Bounds, Clickable |
|
|
166
|
+
| geTagBrowser | Common, Bounds, Background, Font |
|
|
167
|
+
| geTagEditor | Common, Bounds, Background, Font |
|