@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.
Files changed (101) hide show
  1. package/LICENSE.md +64 -0
  2. package/README.md +103 -0
  3. package/generator-gorilla-engine-plugin/app/index.js +338 -0
  4. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/SKILL.md +295 -0
  5. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/effects-filters.md +186 -0
  6. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/indexing.md +129 -0
  7. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/instrument-files.md +547 -0
  8. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/key-rules.md +81 -0
  9. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/modulation.md +210 -0
  10. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-control.md +217 -0
  11. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-bus-effects.md +663 -0
  12. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-core.md +145 -0
  13. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-misc.md +59 -0
  14. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-modulation.md +85 -0
  15. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/module-reference-voice-effects.md +407 -0
  16. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/note-events.md +278 -0
  17. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/properties.md +230 -0
  18. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/script-patterns.md +494 -0
  19. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-dsp/references/time-tempo.md +209 -0
  20. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/SKILL.md +104 -0
  21. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/advanced-controls.md +194 -0
  22. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/base-props.md +167 -0
  23. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/basic-controls.md +230 -0
  24. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/bindings.md +183 -0
  25. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/composite-components.md +258 -0
  26. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/containers.md +149 -0
  27. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/editors.md +191 -0
  28. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/event-handlers.md +150 -0
  29. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/getting-started.md +143 -0
  30. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/gorilla-engine-api.md +147 -0
  31. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/instrument-api.md +250 -0
  32. package/generator-gorilla-engine-plugin/app/templates/.agents/skills/gorilla-engine-ui/references/visualization.md +209 -0
  33. package/generator-gorilla-engine-plugin/app/templates/.prettierignore +13 -0
  34. package/generator-gorilla-engine-plugin/app/templates/.vscode/settings.json +14 -0
  35. package/generator-gorilla-engine-plugin/app/templates/.vscode_input/launch.json +89 -0
  36. package/generator-gorilla-engine-plugin/app/templates/README.md +36 -0
  37. package/generator-gorilla-engine-plugin/app/templates/assets/fonts/OFL.txt +93 -0
  38. package/generator-gorilla-engine-plugin/app/templates/assets/fonts/Roboto-Bold.otf +0 -0
  39. package/generator-gorilla-engine-plugin/app/templates/assets/fonts/Roboto-Medium.otf +0 -0
  40. package/generator-gorilla-engine-plugin/app/templates/assets/fonts/Roboto-Regular.otf +0 -0
  41. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/Presets/Factory/Category 1/Init.preset +1 -0
  42. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/Presets/Factory/Category 1/Three Quarters.preset +1 -0
  43. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Horizontal Slider.png +0 -0
  44. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Horizontal Slider@2x.png +0 -0
  45. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary Bipolar.png +0 -0
  46. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary-Bipolar@2x.png +0 -0
  47. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary.png +0 -0
  48. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/Rotary@2x.png +0 -0
  49. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-default.png +0 -0
  50. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-default@2x.png +0 -0
  51. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-hover.png +0 -0
  52. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-hover@2x.png +0 -0
  53. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-pressed.png +0 -0
  54. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-down-pressed@2x.png +0 -0
  55. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-default.png +0 -0
  56. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-default@2x.png +0 -0
  57. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-hover.png +0 -0
  58. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-hover@2x.png +0 -0
  59. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-pressed.png +0 -0
  60. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/arrow-up-pressed@2x.png +0 -0
  61. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-default.png +0 -0
  62. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-default@2x.png +0 -0
  63. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-pressed.png +0 -0
  64. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/images/toggle-pressed@2x.png +0 -0
  65. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/instruments/Basic Synth Example_part1.blob +0 -0
  66. package/generator-gorilla-engine-plugin/app/templates/basic-synth/assets/instruments/Basic Synth Example_part2.blob +1 -0
  67. package/generator-gorilla-engine-plugin/app/templates/basic-synth/instrument/Basic Synth Example.inst +157 -0
  68. package/generator-gorilla-engine-plugin/app/templates/basic-synth/instrument/Basic Synth Example.txt +184 -0
  69. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/Root.tsx +35 -0
  70. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/components/ErrorBoundary.tsx +138 -0
  71. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/components/UserInterface.tsx +338 -0
  72. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/app/pluginConfig.ts +4 -0
  73. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/dialogsCustomStyle.ts +98 -0
  74. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/index.tsx +217 -0
  75. package/generator-gorilla-engine-plugin/app/templates/basic-synth/src/presetBrowserCustomStyle.ts +124 -0
  76. package/generator-gorilla-engine-plugin/app/templates/build.ugep +173 -0
  77. package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/01 - All The Way Down.preset +1 -0
  78. package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/02 - About Half.preset +1 -0
  79. package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/03 - Three Quarters.preset +1 -0
  80. package/generator-gorilla-engine-plugin/app/templates/effect/assets/Presets/Factory/Category 1/04 - All The Way Up.preset +1 -0
  81. package/generator-gorilla-engine-plugin/app/templates/effect/assets/images/Rotary.png +0 -0
  82. package/generator-gorilla-engine-plugin/app/templates/effect/assets/images/Rotary@2x.png +0 -0
  83. package/generator-gorilla-engine-plugin/app/templates/effect/assets/instruments/Reverb Example_part1.blob +0 -0
  84. package/generator-gorilla-engine-plugin/app/templates/effect/assets/instruments/Reverb Example_part2.blob +1 -0
  85. package/generator-gorilla-engine-plugin/app/templates/effect/instrument/Reverb Example.inst +73 -0
  86. package/generator-gorilla-engine-plugin/app/templates/effect/instrument/Reverb Example.txt +21 -0
  87. package/generator-gorilla-engine-plugin/app/templates/effect/src/app/Root.tsx +35 -0
  88. package/generator-gorilla-engine-plugin/app/templates/effect/src/app/components/ErrorBoundary.tsx +114 -0
  89. package/generator-gorilla-engine-plugin/app/templates/effect/src/app/components/UserInterface.tsx +85 -0
  90. package/generator-gorilla-engine-plugin/app/templates/effect/src/app/pluginConfig.ts +4 -0
  91. package/generator-gorilla-engine-plugin/app/templates/effect/src/dialogsCustomStyle.ts +101 -0
  92. package/generator-gorilla-engine-plugin/app/templates/effect/src/index.tsx +214 -0
  93. package/generator-gorilla-engine-plugin/app/templates/effect/src/presetBrowserCustomStyle.ts +124 -0
  94. package/generator-gorilla-engine-plugin/app/templates/gitignore +9 -0
  95. package/generator-gorilla-engine-plugin/app/templates/licence.txt +0 -0
  96. package/generator-gorilla-engine-plugin/app/templates/package.json +38 -0
  97. package/generator-gorilla-engine-plugin/app/templates/prettierrc +9 -0
  98. package/generator-gorilla-engine-plugin/app/templates/tsconfig.json +20 -0
  99. package/generator-gorilla-engine-plugin/package.json +17 -0
  100. package/index.js +72 -0
  101. 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
+ ```
@@ -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 |