1# @strudel/gamepad
2
3This package adds gamepad input functionality to strudel Patterns.
4
5## Install
6
7```sh
8npm i @strudel/gamepad --save
9```
10
11## Usage
12
13```javascript
14import { gamepad } from '@strudel/gamepad';
15
16// Initialize gamepad (optional index parameter, defaults to 0)
17const pad = gamepad(0);
18
19// Use gamepad inputs in patterns
20const pattern = sequence([
21  // Button inputs
22  pad.a,        // A button value (0-1)
23  pad.tglA,     // A button toggle (0 or 1)
24  
25  // Analog stick inputs
26  pad.x1,       // Left stick X (0-1)
27  pad.x1_2,     // Left stick X (-1 to 1)
28]);
29```
30
31## Available Controls
32
33### Buttons
34- Face Buttons
35  - `a`, `b`, `x`, `y` (or uppercase `A`, `B`, `X`, `Y`)
36  - Toggle versions: `tglA`, `tglB`, `tglX`, `tglY`
37- Shoulder Buttons
38  - `lb`, `rb`, `lt`, `rt` (or uppercase `LB`, `RB`, `LT`, `RT`)
39  - Toggle versions: `tglLB`, `tglRB`, `tglLT`, `tglRT`
40- D-Pad
41  - `up`, `down`, `left`, `right` (or `u`, `d`, `l`, `r` or uppercase)
42  - Toggle versions: `tglUp`, `tglDown`, `tglLeft`, `tglRight`(or `tglU`, `tglD`, `tglL`, `tglR`)
43- Stick Buttons
44  - `l3`, `r3` (or `ls`, `rs`)
45  - Toggle versions: `tglL3`, `tglR3` (or `tglLS`, `tglRS`)
46- System Buttons
47  - `start`, `back` (or uppercase `START`, `BACK`)
48  - Toggle versions: `tglStart`, `tglBack` (or `tglSTART`, `tglBACK`)
49
50### Analog Sticks
51- Left Stick
52  - `x1`, `y1` (0 to 1 range)
53  - `x1_2`, `y1_2` (-1 to 1 range)
54- Right Stick
55  - `x2`, `y2` (0 to 1 range)
56  - `x2_2`, `y2_2` (-1 to 1 range)
57
58## Examples
59
60```javascript
61// Use button values to control amplitude
62$: sequence([
63  s("bd").gain(pad.X),    // X button controls gain
64  s("[hh oh]").gain(pad.tglY),    // Y button toggles gain
65]);
66
67// Use analog stick for continuous control
68$: note("c4*4".add(pad.y1_2.range(-24,24))) // Left stick Y controls pitch shift
69  .pan(pad.x1_2);          // Left stick X controls panning
70
71// Use toggle buttons to switch patterns on/off
72
73// Define button sequences
74const HADOKEN = [
75  'd',               // Down
76  'r',               // Right
77  'a',               // A
78];
79
80const KONAMI = 'uuddlrlrba' //Konami Code ↑↑↓↓←→←→BA
81
82// Add these lines to enable buttons(but why?)
83$:pad.D.segment(16).gain(0)
84$:pad.R.segment(16).gain(0)
85$:pad.A.segment(16).gain(0)
86
87// Check button sequence (returns 1 when detected, 0 when not within last 1 second)
88$: sound("hadoken").gain(pad.checkSequence(HADOKEN))
89
90```
91
92## Multiple Gamepads
93
94You can connect multiple gamepads by specifying the gamepad index:
95
96```javascript
97const pad1 = gamepad(0);  // First gamepad
98const pad2 = gamepad(1);  // Second gamepad
99```