mirror of
https://github.com/eliasstepanik/strudel-docker.git
synced 2026-01-11 13:48:34 +00:00
118 lines
4.2 KiB
Plaintext
118 lines
4.2 KiB
Plaintext
import { MiniRepl } from '../../../website/src/docs/MiniRepl';
|
|
|
|
# Gamepad
|
|
|
|
The Gamepad module allows you to integrate gamepad input functionality into your musical patterns. This can be particularly useful for live performances or interactive installations where you want to manipulate sounds using a game controller.
|
|
|
|
## Getting Started
|
|
|
|
Initialize a gamepad by calling the gamepad() function with an optional index parameter.
|
|
|
|
<MiniRepl
|
|
client:idle
|
|
tune={`// Initialize gamepad (optional index parameter, defaults to 0)
|
|
const gp = gamepad(0)
|
|
note("c a f e").mask(gp.a)`}
|
|
/>
|
|
|
|
## Available Controls
|
|
|
|
The gamepad module provides access to buttons and analog sticks as normalized signals (0-1) that can modulate your patterns.
|
|
|
|
### Buttons
|
|
|
|
| Type | Controls |
|
|
| ---------------- | ---------------------------------------------------------------------------------------------- |
|
|
| Face Buttons | `a`, `b`, `x`, `y` (or uppercase `A`, `B`, `X`, `Y`) |
|
|
| | Toggle versions: `tglA`, `tglB`, `tglX`, `tglY` |
|
|
| Shoulder Buttons | `lb`, `rb`, `lt`, `rt` (or uppercase `LB`, `RB`, `LT`, `RT`) |
|
|
| | Toggle versions: `tglLB`, `tglRB`, `tglLT`, `tglRT` |
|
|
| D-Pad | `up`, `down`, `left`, `right` (or `u`, `d`, `l`, `r` or uppercase) |
|
|
| | Toggle versions: `tglUp`, `tglDown`, `tglLeft`, `tglRight` (or `tglU`, `tglD`, `tglL`, `tglR`) |
|
|
|
|
### Analog Sticks
|
|
|
|
| Stick | Controls |
|
|
| ----------- | ------------------------------ |
|
|
| Left Stick | `x1`, `y1` (0 to 1 range) |
|
|
| | `x1_2`, `y1_2` (-1 to 1 range) |
|
|
| Right Stick | `x2`, `y2` (0 to 1 range) |
|
|
| | `x2_2`, `y2_2` (-1 to 1 range) |
|
|
|
|
### Button Sequence
|
|
|
|
| Stick | Controls |
|
|
| --------------- | --------------------------------------- |
|
|
| Button Sequence | `btnSequence()`, `btnSeq()`, `btnseq()` |
|
|
|
|
## Using Gamepad Inputs
|
|
|
|
Once initialized, you can use various gamepad inputs in your patterns. Here are some examples:
|
|
|
|
### Button Inputs
|
|
|
|
You can use button inputs to control different aspects of your music, such as gain or triggering events.
|
|
|
|
<MiniRepl
|
|
client:idle
|
|
tune={`const gp = gamepad(0)
|
|
// Use button values to control amplitude
|
|
$: stack(
|
|
s("[[hh hh] oh hh oh]/2").mask(gp.tglX).bank("RolandTR909"), // X btn for HH
|
|
s("cr*1").mask(gp.Y).bank("RolandTR909"), // LB btn for CR
|
|
s("bd").mask(gp.tglA).bank("RolandTR909"), // A btn for BD
|
|
s("[ht - - mt - - lt - ]/2").mask(gp.tglB).bank("RolandTR909"), // B btn for Toms
|
|
s("sd*4").mask(gp.RB).bank("RolandTR909"), // RB btn for SD
|
|
).cpm(120)
|
|
`}
|
|
/>
|
|
|
|
### Analog Stick Inputs
|
|
|
|
Analog sticks can be used for continuous control, such as pitch shifting or panning.
|
|
|
|
<MiniRepl
|
|
client:idle
|
|
tune={`const gp = gamepad(0)
|
|
// Use analog stick for continuous control
|
|
$: note("c4 d3 a3 e3").sound("sawtooth")
|
|
.lpf(gp.x1.range(100,4000))
|
|
.lpq(gp.y1.range(5,30))
|
|
.decay(gp.y2.range(0.1,2))
|
|
.lpenv(gp.x2.range(-5,5))
|
|
.cpm(120)
|
|
`}
|
|
/>
|
|
|
|
### Button Sequences
|
|
|
|
You can define button sequences to trigger specific actions, like playing a sound when a sequence is detected.
|
|
|
|
<MiniRepl client:idle tune={`const gp = gamepad(0)
|
|
// Define button sequences
|
|
const HADOUKEN = [
|
|
'd', // Down
|
|
'r', // Right
|
|
'a', // A
|
|
]
|
|
const KONAMI = 'uuddlrlrba' //Konami Code ↑↑↓↓←→←→BA
|
|
|
|
// Check butto-n sequence (returns 1 while detected, 0 when not within last 1 second)
|
|
$: s("free_hadouken -").slow(2)
|
|
.mask(gp.btnSequence(HADOUKEN)).room(1).cpm(120)
|
|
|
|
// hadouken.wav by Syna-Max
|
|
//https://freesound.org/people/Syna-Max/sounds/67674/
|
|
samples({free_hadouken: 'https://cdn.freesound.org/previews/67/67674_111920-lq.mp3'})
|
|
`} />
|
|
|
|
## Multiple Gamepads
|
|
|
|
Strudel supports multiple gamepads. You can specify the gamepad index to connect to different devices.
|
|
|
|
<MiniRepl
|
|
client:idle
|
|
tune={`const pad1 = gamepad(0); // First gamepad
|
|
const pad2 = gamepad(1); // Second gamepad`}
|
|
/>
|