Input Devices

Strudel supports various input devices like Gamepads and MIDI controllers to manipulate patterns in real-time.

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.

// 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

TypeControls
Face Buttonsa, b, x, y (or uppercase A, B, X, Y)
Toggle versions: tglA, tglB, tglX, tglY
Shoulder Buttonslb, rb, lt, rt (or uppercase LB, RB, LT, RT)
Toggle versions: tglLB, tglRB, tglLT, tglRT
D-Padup, down, left, right (or u, d, l, r or uppercase)
Toggle versions: tglUp, tglDown, tglLeft, tglRight (or tglU, tglD, tglL, tglR)

Analog Sticks

StickControls
Left Stickx1, y1 (0 to 1 range)
x1_2, y1_2 (-1 to 1 range)
Right Stickx2, y2 (0 to 1 range)
x2_2, y2_2 (-1 to 1 range)

Button Sequence

StickControls
Button SequencebtnSequence(), 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.

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.

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.

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.

const pad1 = gamepad(0);  // First gamepad
const pad2 = gamepad(1);  // Second gamepad