joystick
Prev | Orchestra Opcodes and Operators | Next

## joystick

joystick — Reads data from a joystick controller.

## Description

Plugin opcode in joystick.

Reads data from a Linux joystick controller

## Syntax

    kres joystick kdevice, ktab

## Performance

| Note
Please note that this opcode is currently only supported on GNU/Linux.

kdevice -- the index of the joystick device, either /dev/jsN or /dev/input/jsN.

ktab -- A table to hold input results, should be at least enough elements to store one value for each stick axis and one for each button + 2. The first two elements of the table are initialized with the number of axes and the number of buttons, respectively, when a joystick is opened. If a joystick is unplugged during performance, the opcode will repeatedly attempt to reopen the device with a delay between attempts.

## Examples

Here is an example of the joystick opcode. It uses the file joystick.csd.

See the sections Real-time Audio and Command Line Flags for more information on using command line flags.

    <CsoundSynthesizer>
    <CsOptions>
    ; Select audio/midi flags here according to platform
    -odac      ;;;realtime audio out
    ;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
    ; For Non-realtime ouput leave only the line below:
    ; -o joystick.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    sr = 44100
    ksmps = 32
    nchnls = 2
    ;0dbfs  = 1

    instr 1 ; gives information about your joystick in real time

    kmask    joystick   0, 1
    kidx     =  2
    kaxes    tab 0, 1 ; number of axes has been stored in position 0
    kbuttons tab 1, 1 ; number of buttons has been stored in position 1
             printf "this joystick has %d axes, %d buttons\n", kidx, kaxes, kbuttons
    kuniq    init 0

    reportaxis: ; first we see if we have any x/y input
    	kcheck    =  kmask & (1<<kidx)
    	if kcheck == 0 kgoto nexta
    	kres      tab       kidx, 1
    	kuniq     =  kuniq + 1 ; to be sure to make the printf print
    		  printf    "axis %d, value %6d\n", kuniq, kidx-2, kres
    nexta:
    	kidx      =  kidx+1
    	if kidx < (kaxes+2) kgoto reportaxis

    reportbutton: ; now we check for any buttons pressed
    	kcheck    =  kmask & 1<<kidx
    	if kcheck == 0 kgoto nextb
    	kres      tab       kidx, 1 ; a button has been pressed, get from table
    		  printf    "button %d, pushed\n", kidx*kres, (kidx-(kaxes+2))
    		  printf    "button %d, released\n", kidx*(1-kres), (kidx-(kaxes+2))

    nextb:
    	kidx      =  kidx+1
    	if kidx < (kaxes+kbuttons+2) kgoto reportbutton

    endin
    </CsInstruments>
    <CsScore>

    f1  0 32    7     0     7     0         ; will hold the joystick data

    i1  0  60000

    e
    </CsScore>
    </CsoundSynthesizer>

Here is another example of the joystick opcode. It uses the file joystick-2.csd.

    <CsoundSynthesizer>
    <CsOptions>
    ; Select audio/midi flags here according to platform
    -odac    ;;;realtime audio out
    ;-iadc    ;;;uncomment -iadc if realtime audio input is needed too
    ; For Non-realtime ouput leave only the line below:
    ; -o joystick-2.wav -W ;;; for file output any platform
    </CsOptions>
    <CsInstruments>

    sr = 44100
    ksmps = 32
    nchnls = 2
    ;0dbfs  = 1

    instr 1

    kmask   joystick   0, 1
    kaxes    init 0
    kbuttons init 0
    kx0      init 0 ; first two entries are # of axes and # of buttons,
    ky0      init 0 ; then axes, then buttons
             vtabk 0, 1, kaxes, kbuttons, kx0, ky0
    kidx     =  2+kaxes

    buttons:
      kcheck =  kmask & 1<<kidx   ; if the button was just now pressed and...
      kres   tab       kidx, 1    ; if button value is one, start a note
             schedkwhen  kres*kcheck, 1, 20, 2, 0, 60000, kidx, kx0, ky0
      kidx   =  kidx+1
    if kidx < (kaxes+kbuttons+2) kgoto buttons

    endin

    instr 2 ; play a tone until the button is released

    kstop   tab  p4, 1 ; when this button is released, we fade out
    ihz     init cpsoct(((p5+32767)/9362)+5) ; ~ 30 hz to 4khz
    print ihz
    ito     init ampdb(((p6+32767)/2184)+60) ; ~ 60 - 90 db
    kenv    init 0
    kdelta  init ito/(kr*10)
    if kstop == 1 kgoto output
    if kdelta < 0 kgoto output
    kdelta    =  kdelta*-1

    output:
      kenv =  kenv+kdelta
      kenv limit kenv, 0, ito
      aout oscils 1, ihz, 0
      aout =  kenv*aout
           outs aout, aout
    if kenv != 0 kgoto noexit
    if kdelta > 0 kgoto noexit
    turnoff
    noexit:

    endin
    </CsInstruments>
    <CsScore>
    f1  0 32    7     0     7     0         ; will hold the joystick data

    i1  0  60000

    e
    </CsScore>
    </CsoundSynthesizer>

## See also

Sensing and Control: Keyboard and mouse sensing

non-MIDI devices

## Credits

Author: Justin Glenn Smith
2010

New in version 5.17.12

Prev | Up | Next
jitter2 | Home | jspline